Отговори на тема  [ 15 мнения ] 
Проблем с четене на UART-a на PIC16F628A 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Сеп 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
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Окт 10, 2004 9:55 am
Мнения: 1718
Мнение 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 има :)


Последна промяна plameniv на Чет Мар 15, 2007 10:56 am, променена общо 1 път



Чет Мар 15, 2007 10:54 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 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
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Сеп 27, 2004 8:48 pm
Мнения: 59
Местоположение: София
Мнение 
plameniv
Първоначално пробвах всички команди като вързах телефона към компютъра. И без кода на България също набира, не е това проблема.
Сега пробвам дори "АТ" само и трябва да даде "ОК", но няма.

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

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

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

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


Чет Мар 15, 2007 11:12 am
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Сеп 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
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Ное 21, 2004 11:31 pm
Мнения: 10088
Мнение 
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


Чет Мар 15, 2007 12:35 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Сеп 27, 2004 8:48 pm
Мнения: 59
Местоположение: София
Мнение 
OK, мерси. Сега ще ги разгледам.

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

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


Чет Мар 15, 2007 12:45 pm
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 17, 2005 5:07 pm
Мнения: 813
Местоположение: Сливен
Мнение 
Не съм си играл с GSM ите ама не пускат ли символи за начало и край на пакета който връща.
с тези gets() дето си почнал....... не знам какво ще стане с непознат отговор ако има такъв де .

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

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

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


Поздрави!!!


Чет Мар 15, 2007 2:19 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Сеп 27, 2004 8:48 pm
Мнения: 59
Местоположение: София
Мнение 
Няма чексума, няма и символи за начало и край.

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

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


Чет Мар 15, 2007 2:35 pm
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Фев 17, 2006 9:17 am
Мнения: 765
Местоположение: Стара Загора
Мнение 
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

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


Чет Мар 15, 2007 3:03 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Сеп 27, 2004 8:48 pm
Мнения: 59
Местоположение: София
Мнение 
Вярно е за таймаута, че иначе ще увисне програмата някъде.

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

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


Чет Мар 15, 2007 3:09 pm
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 17, 2005 5:07 pm
Мнения: 813
Местоположение: Сливен
Мнение 
peterhr написа:
Вярно е за таймаута, че иначе ще увисне програмата някъде.

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


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

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


Чет Мар 15, 2007 3:28 pm
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Фев 17, 2006 9:17 am
Мнения: 765
Местоположение: Стара Загора
Мнение 
Да, телефона чака само /r, но би трябвало да връща /n/r. Що не ползваш терминала дето е вграден в CCS-a? Той ги показва тези символи


Чет Мар 15, 2007 4:11 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Сеп 27, 2004 8:48 pm
Мнения: 59
Местоположение: София
Мнение 
Не съм знаел че има терминал. 10х :)

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


Чет Мар 15, 2007 4:22 pm
Профил ICQ
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 15 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 4 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни