Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Проблем с четене на UART-a на PIC16F628A
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=3882
Страница 1 от 1

Автор:  peterhr [ Чет Мар 15, 2007 10:33 am ]
Заглавие:  Проблем с четене на 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 към компютъра и си записва всичко точно и коректно каквото натисна на клавиатурата.

Автор:  plameniv [ Чет Мар 15, 2007 10:54 am ]
Заглавие:  Re: Проблем с четене на UART-a на PIC16F628A

peterhr написа:
Здравейте,
сглобих правилно хардуера за комуникация между 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 към компютъра и си записва всичко точно и коректно каквото натисна на клавиатурата.

Всичко трябва да е като ASCI кодове към телефона , и той връща същото .
А когато набираш даден телефонен номер на GSM-а му трябва следната комбинация !!!
ATD+35929XXX;
Зареди това и ще ти върне отговор OK :wink:
Не е лошо да изпробваш всички команди предварително с терминал всеки windows има :)

Автор:  Predator_MF [ Чет Мар 15, 2007 10:55 am ]
Заглавие: 

Бъркаш с писането в EEPROM-a, ако случайно не знаеш, един цикъл за запис е около 5ms, един байт на 9600 отнема 1ms...за първите 2ms PIC-a ти получава два байта във хардуерното FIFO, ти проверяваш с kbhit дали има нещо в него и по-надолу пишеш в EEPROM-а...в момента когато пишеш 3-тия байт във UART-a, PIC-a ти се занимава с писане в EEPROM а FIFO-то е пълно ...от там нататък става каша. Пробвай да пишеш резултата в RAM-а и след края на съобщението го драсни във EEPROM.

Автор:  ДедоБоре [ Чет Мар 15, 2007 11:00 am ]
Заглавие: 

за кръгови буфери не си ли чувал? с в указателя - единия за пълнене на буфера, другия за празнене? трябва да се учи в началните курсове още.

Автор:  peterhr [ Чет Мар 15, 2007 11:12 am ]
Заглавие: 

plameniv
Първоначално пробвах всички команди като вързах телефона към компютъра. И без кода на България също набира, не е това проблема.
Сега пробвам дори "АТ" само и трябва да даде "ОК", но няма.

Predator_MF
Не знаех че толкова е бавно писането в епрома. При мен и процесора работи на 4МХз, не на 20.
Ще ги пиша в някой стринг и накрая ще го запиша в епрома за да мога да го прочета после от програматара.

Мисля да вържа изхода на ГСМа към входа на МАХ232 да излиза това което той връща на компютъра.

ДедоБоре
Може и да сме го учили, не си спомням.

ПП: Свързах изхода на ГСМ-а към входа на МАХ232. ГСМа си плюе всички необходими данни. Само дето програмно не мога да ги прочета :(

Автор:  peterhr [ Чет Мар 15, 2007 12:15 pm ]
Заглавие: 

Правих още няколко опита.
Независимо колко дълъг стринг изпратя към ГСМа, единствено него прочитам без грешка.
Незнам обаче дали той реално е върнат от ГСМа като ехо.

Отговора от ГСМ-а (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:35 pm ]
Заглавие: 

http://www.vias.org/cppcourse/chap20_05.html
http://www.massmind.org/techref/microchip/language/c/S628.htm

и накрая http://forum.microchip.com/fb.aspx?m=228307

Автор:  peterhr [ Чет Мар 15, 2007 12:45 pm ]
Заглавие: 

OK, мерси. Сега ще ги разгледам.

Иначе програмата ми тръгна.
Оказа се че иска още един gets();
Незнам откъде идва, но като му сложих да прочита още един път и извади инфото връщано от ГСМа.

Мерси за помощта.

Автор:  valioman [ Чет Мар 15, 2007 2:19 pm ]
Заглавие: 

Не съм си играл с GSM ите ама не пускат ли символи за начало и край на пакета който връща.
с тези gets() дето си почнал....... не знам какво ще стане с непознат отговор ако има такъв де .

Поразгледай на някой терминал какво точно праща ГСМа като ASCII и виж дали няма еднакви символи в началото и в края на пакета.

Ако има просто в пика слагаш един while(getc()!='символа'){.....} и си готов . Така поне ще прихващаш съобщения от всякакъв тип и дължина.

ДА не говорим в ситуация с чексума на данните ако иам такива де .. :)


Поздрави!!!

Автор:  peterhr [ Чет Мар 15, 2007 2:35 pm ]
Заглавие: 

Няма чексума, няма и символи за начало и край.

Първото което направих преди да започна беше на терминал да видя какво може да прави ГСМа. Подавах му команди и гледах отговорите.

Извъртях вариантите, за които се сетих, че може да ми се случат и имам записана последователността на команди и отговори.

Автор:  setoy [ Чет Мар 15, 2007 3:03 pm ]
Заглавие: 

peterhr написа:
OK, мерси. Сега ще ги разгледам.

Иначе програмата ми тръгна.
Оказа се че иска още един gets();
Незнам откъде идва, но като му сложих да прочита още един път и извади инфото връщано от ГСМа.



CCS help написа:
Reads characters (using GETC()) into the string until a RETURN (value 13) is encountered


Ето оттука ти идва. Защото ГСМ-те (както и модемите) връщат "/r/n OK /r/n", а не просто ОК :D
Разгледай функциите за работа със стрингове. Можеш да ползваш strcpy за да сравняваш стрингове, strstr за търсене на един стринг в друг и така нататък.... продължавайки в тоя дух 16-ката твърде скоро ще ти се види тясна, ама тва е друга тема :D

Поне аз приемането винаги си го правя през прекъсване и със зададен таймаут, ама може би е просто въпрос на вкус

Автор:  peterhr [ Чет Мар 15, 2007 3:09 pm ]
Заглавие: 

Вярно е за таймаута, че иначе ще увисне програмата някъде.

Може би наистина "\n\r" е разликата, но ще го направя да чете char и така няма да има проблеми.

ПП: Телефона ми дава грешка когато му подам "\n\r", изпълнява командата, но дава грешка.
Иска да е само Return - "\r".

Автор:  valioman [ Чет Мар 15, 2007 3:28 pm ]
Заглавие: 

peterhr написа:
Вярно е за таймаута, че иначе ще увисне програмата някъде.

Може би наистина "\n\r" е разликата, но ще го направя да чете char и така няма да има проблеми.


Точно "\n\r" е това за което говорих по горе ама кой да ме чуе :)

и това не можеш да го видиш на терминал защото се прихваща и обработва от терминала.

Автор:  setoy [ Чет Мар 15, 2007 4:11 pm ]
Заглавие: 

Да, телефона чака само /r, но би трябвало да връща /n/r. Що не ползваш терминала дето е вграден в CCS-a? Той ги показва тези символи

Автор:  peterhr [ Чет Мар 15, 2007 4:22 pm ]
Заглавие: 

Не съм знаел че има терминал. 10х :)

ПП: Пробвах два пъти да настроя параметрите на СОМ порта, обаче два пъти ми рестартира компютъра. Има ли някакъв тънък момент при нагласяването или моята версия нещо се гъбарка? Версията ми е 3.168.

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/