| Автор |
Съобщение |
|
peterhr
Ранг: Минаващ
Регистриран на: Пон Сеп 27, 2004 8:48 pm Мнения: 59 Местоположение: София
|
 Проблем с четене на UART-a на PIC16F628A
Здравейте,
сглобих правилно хардуера за комуникация между PIC-а и GSM-a.
Сега проблем се появи при комуникацията между тях или по-точно PIC-a изпраща команди към GSM-a.
Самият GSM разбира правилно командите и ги изпълнява. Всичко което изпробвах работи.
Проблема е в обратната посока, т.е. четенето на резултата от командите от самия PIC.
Мисля че бъркам в програмата.
Ако му дам:
printf ("at\n\r"); gets(s2);
в s2 се записва моята команда. Което донякъде мисля е вярно, защото телефона връща ехо на това което пиша.
След това телефона трябва да върне:
OK.
Но това не се случва.
Пробвах с още един gets(s2) на 3-тия ред, но "ОК" няма.
Пробвах и това:
printf ("atd029xxx\n\r"); add = 1; while (kbhit()) { c = getc (); write_eeprom (add, c); if (add < 50) add++; }
но резултата е още по-зле. Прочита само "АТ" и след това спира да чете.
Как трябва да се чете правилно постъпващата информация?
За капак на всичко, като включа PICa към компютъра и си записва всичко точно и коректно каквото натисна на клавиатурата.
|
| Чет Мар 15, 2007 10:33 am |
|
 |
|
plameniv
Ранг: Форумен бог
Регистриран на: Нед Окт 10, 2004 9:55 am Мнения: 1718
|
 Re: Проблем с четене на UART-a на PIC16F628A
Всичко трябва да е като ASCI кодове към телефона , и той връща същото .
А когато набираш даден телефонен номер на GSM-а му трябва следната комбинация !!!
ATD+35929XXX;
Зареди това и ще ти върне отговор OK
Не е лошо да изпробваш всички команди предварително с терминал всеки windows има 
Последна промяна plameniv на Чет Мар 15, 2007 10:56 am, променена общо 1 път
|
| Чет Мар 15, 2007 10:54 am |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
Бъркаш с писането в EEPROM-a, ако случайно не знаеш, един цикъл за запис е около 5ms, един байт на 9600 отнема 1ms...за първите 2ms PIC-a ти получава два байта във хардуерното FIFO, ти проверяваш с kbhit дали има нещо в него и по-надолу пишеш в EEPROM-а...в момента когато пишеш 3-тия байт във UART-a, PIC-a ти се занимава с писане в EEPROM а FIFO-то е пълно ...от там нататък става каша. Пробвай да пишеш резултата в RAM-а и след края на съобщението го драсни във EEPROM.
|
| Чет Мар 15, 2007 10:55 am |
|
 |
|
ДедоБоре
Ранг: Форумен бог
Регистриран на: Нед Ное 21, 2004 11:31 pm Мнения: 10088
|
за кръгови буфери не си ли чувал? с в указателя - единия за пълнене на буфера, другия за празнене? трябва да се учи в началните курсове още.
|
| Чет Мар 15, 2007 11:00 am |
|
 |
|
peterhr
Ранг: Минаващ
Регистриран на: Пон Сеп 27, 2004 8:48 pm Мнения: 59 Местоположение: София
|
plameniv
Първоначално пробвах всички команди като вързах телефона към компютъра. И без кода на България също набира, не е това проблема.
Сега пробвам дори "АТ" само и трябва да даде "ОК", но няма.
Predator_MF
Не знаех че толкова е бавно писането в епрома. При мен и процесора работи на 4МХз, не на 20.
Ще ги пиша в някой стринг и накрая ще го запиша в епрома за да мога да го прочета после от програматара.
Мисля да вържа изхода на ГСМа към входа на МАХ232 да излиза това което той връща на компютъра.
ДедоБоре
Може и да сме го учили, не си спомням.
ПП: Свързах изхода на ГСМ-а към входа на МАХ232. ГСМа си плюе всички необходими данни. Само дето програмно не мога да ги прочета 
|
| Чет Мар 15, 2007 11:12 am |
|
 |
|
peterhr
Ранг: Минаващ
Регистриран на: Пон Сеп 27, 2004 8:48 pm Мнения: 59 Местоположение: София
|
Правих още няколко опита.
Независимо колко дълъг стринг изпратя към ГСМа, единствено него прочитам без грешка.
Незнам обаче дали той реално е върнат от ГСМа като ехо.
Отговора от ГСМ-а (ERROR или ОК) обаче немога да го прочета.
На СОМ порта на компютъра пристига отговора, но ПИКа не може да го разбере.
Пробвах по следния начин:
printf ("ATtydgsdfsdfa\r\n");
gets (s1); gets (s2); delay_ms (250);
for (add=1; add < 40; add++) write_eeprom (add, 0);
for (add=1; add < 15; add++) write_eeprom (add, s1[add]); for (add=1; add < 15; add++) write_eeprom (add+20, s2[add]);
Тук прочита целия стринг, но не прочита "ERROR".
Пробвах и само "АТ", на компютъра връща "ОК", но ПИКа нищо не разбира.
Как точно трябва да прочета данните от СОМ порта?
Аз не държа толкова да са записани в еепрома, може да проверявам дали първия символ е "О" и да ми светва някой LED.
|
| Чет Мар 15, 2007 12:15 pm |
|
 |
|
ДедоБоре
Ранг: Форумен бог
Регистриран на: Нед Ное 21, 2004 11:31 pm Мнения: 10088
|
|
| Чет Мар 15, 2007 12:35 pm |
|
 |
|
peterhr
Ранг: Минаващ
Регистриран на: Пон Сеп 27, 2004 8:48 pm Мнения: 59 Местоположение: София
|
OK, мерси. Сега ще ги разгледам.
Иначе програмата ми тръгна.
Оказа се че иска още един gets();
Незнам откъде идва, но като му сложих да прочита още един път и извади инфото връщано от ГСМа.
Мерси за помощта.
|
| Чет Мар 15, 2007 12:45 pm |
|
 |
|
valioman
Ранг: Почетен член
Регистриран на: Съб Сеп 17, 2005 5:07 pm Мнения: 813 Местоположение: Сливен
|
Не съм си играл с GSM ите ама не пускат ли символи за начало и край на пакета който връща.
с тези gets() дето си почнал....... не знам какво ще стане с непознат отговор ако има такъв де .
Поразгледай на някой терминал какво точно праща ГСМа като ASCII и виж дали няма еднакви символи в началото и в края на пакета.
Ако има просто в пика слагаш един while(getc()!='символа'){.....} и си готов . Така поне ще прихващаш съобщения от всякакъв тип и дължина.
ДА не говорим в ситуация с чексума на данните ако иам такива де ..
Поздрави!!!
|
| Чет Мар 15, 2007 2:19 pm |
|
 |
|
peterhr
Ранг: Минаващ
Регистриран на: Пон Сеп 27, 2004 8:48 pm Мнения: 59 Местоположение: София
|
Няма чексума, няма и символи за начало и край.
Първото което направих преди да започна беше на терминал да видя какво може да прави ГСМа. Подавах му команди и гледах отговорите.
Извъртях вариантите, за които се сетих, че може да ми се случат и имам записана последователността на команди и отговори.
|
| Чет Мар 15, 2007 2:35 pm |
|
 |
|
setoy
Ранг: Почетен член
Регистриран на: Пет Фев 17, 2006 9:17 am Мнения: 765 Местоположение: Стара Загора
|
Ето оттука ти идва. Защото ГСМ-те (както и модемите) връщат "/r/n OK /r/n", а не просто ОК
Разгледай функциите за работа със стрингове. Можеш да ползваш strcpy за да сравняваш стрингове, strstr за търсене на един стринг в друг и така нататък.... продължавайки в тоя дух 16-ката твърде скоро ще ти се види тясна, ама тва е друга тема
Поне аз приемането винаги си го правя през прекъсване и със зададен таймаут, ама може би е просто въпрос на вкус
|
| Чет Мар 15, 2007 3:03 pm |
|
 |
|
peterhr
Ранг: Минаващ
Регистриран на: Пон Сеп 27, 2004 8:48 pm Мнения: 59 Местоположение: София
|
Вярно е за таймаута, че иначе ще увисне програмата някъде.
Може би наистина "\n\r" е разликата, но ще го направя да чете char и така няма да има проблеми.
ПП: Телефона ми дава грешка когато му подам "\n\r", изпълнява командата, но дава грешка.
Иска да е само Return - "\r".
|
| Чет Мар 15, 2007 3:09 pm |
|
 |
|
valioman
Ранг: Почетен член
Регистриран на: Съб Сеп 17, 2005 5:07 pm Мнения: 813 Местоположение: Сливен
|
Точно "\n\r" е това за което говорих по горе ама кой да ме чуе
и това не можеш да го видиш на терминал защото се прихваща и обработва от терминала.
|
| Чет Мар 15, 2007 3:28 pm |
|
 |
|
setoy
Ранг: Почетен член
Регистриран на: Пет Фев 17, 2006 9:17 am Мнения: 765 Местоположение: Стара Загора
|
Да, телефона чака само /r, но би трябвало да връща /n/r. Що не ползваш терминала дето е вграден в CCS-a? Той ги показва тези символи
|
| Чет Мар 15, 2007 4:11 pm |
|
 |
|
peterhr
Ранг: Минаващ
Регистриран на: Пон Сеп 27, 2004 8:48 pm Мнения: 59 Местоположение: София
|
Не съм знаел че има терминал. 10х
ПП: Пробвах два пъти да настроя параметрите на СОМ порта, обаче два пъти ми рестартира компютъра. Има ли някакъв тънък момент при нагласяването или моята версия нещо се гъбарка? Версията ми е 3.168.
|
| Чет Мар 15, 2007 4:22 pm |
|
|