|
|
  |
Трабл с USART1 в Mega64, Не работают прерывания !!! |
|
|
|
Aug 16 2006, 09:51
|
Частый гость
 
Группа: Свой
Сообщений: 131
Регистрация: 22-03-05
Из: Краснодар
Пользователь №: 3 600

|
Цитата(WHALE @ Aug 16 2006, 12:33)  Во блин,иногда они возвращаются  Чур меня Щас пойдут ссылки на сайт с 3 буквами,где давно решены все проблемы человечества. Изыди,нечистый.  Это Вы про что ?? VMLAB/PROTEUS ?
|
|
|
|
|
Aug 16 2006, 11:47
|
Частый гость
 
Группа: Свой
Сообщений: 131
Регистрация: 22-03-05
Из: Краснодар
Пользователь №: 3 600

|
Цитата(WHALE @ Aug 16 2006, 15:25)  Это я про господина Shurmas,вы не в курсе про происходившее здесь изгнание духов. ну да бог с ним. srg_co как дела с USART1? Попробую поработать с USART_TX_EMP. По приему то стандартно, но не мычит ведь, ввобще не принимает ни одного байта.
|
|
|
|
|
Aug 16 2006, 12:22
|
Частый гость
 
Группа: Свой
Сообщений: 131
Регистрация: 22-03-05
Из: Краснодар
Пользователь №: 3 600

|
Цитата(WHALE @ Aug 16 2006, 16:15)  так еще и прием не работает?не,че-то в консерватории не-то.Приведите текст приемного модуля. interrupt [USART1_RXC] void usart1_rx_isr( void ) { char ch; PORTD.4 = ~PORTD.4; ch = UDR1; BuffStep[RecvStp] = ch; RecvStp++; //переполение буфера if ( RecvStp > BUFFSIZE-1 ) { RecvStp = 0; memset( BuffStep, 0x00, BUFFSIZE ); return; } //строка принята, выведем ее if ( ch == CRLF ) { PutStrCom( BuffStep ); } } void PutStrCom( char *str ) { strcpy( BuffSend, str ); strcat( BuffSend, CrLf ); ic = 0; ls = strlen( BuffSend ); UDR0 = BuffSend[ic]; К PORTD.4 подключен светодиодик, при приеме должен мигать, не мигает.
|
|
|
|
|
Aug 17 2006, 06:01
|
Частый гость
 
Группа: Свой
Сообщений: 131
Регистрация: 22-03-05
Из: Краснодар
Пользователь №: 3 600

|
Цитата(WHALE @ Aug 16 2006, 17:36)  можно несколько замечаний? BuffStep[RecvStp] = ch; RecvStp++; можно обьединить BuffStep[RecvStp++] = ch; PORTD.4 = ~PORTD.4;-по моему,так работать не будет я делал по другому bit morg; morg ^= 1;PORTD.4 =morg; а что за команда return из прерывания?В CV она не нужна,все делается автоматом по закрытии скобок обработчика. Да,а что вы принимаете?Там точно есть посылки и протокол совпадает с установленным вами? PORTD.4 = ~PORTD.4; - это работает в CVAVR return - что бы пропустить выполнение следующего кода. Посылки и протокол совпадает полностью. Цитата(WHALE @ Aug 16 2006, 10:41)  нет,по приему все стандартно через interrupt [USART1_RXC] void usart1_rx_isr(void) Попробуй,переделывается пара строчек кода-разреши прерывания по очистке буфера TX и поменяй вектор обработчика. Попробовал, без измененей, отправляет один байт и усе.
|
|
|
|
|
Aug 17 2006, 06:38
|
Частый гость
 
Группа: Свой
Сообщений: 131
Регистрация: 22-03-05
Из: Краснодар
Пользователь №: 3 600

|
Цитата(WHALE @ Aug 17 2006, 10:30)  попробуй тогда действительно в симуляторе каком-нибудь-avr-studio,vmlab,proteus. у тебя что-то не-то во внешних программных модулях. Пробовал в avr-studio+jtagicemk2, криминала не нашел, биты в конфигурации порта установлены правильно.
|
|
|
|
|
Aug 17 2006, 07:01
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(srg_co @ Aug 16 2006, 16:22)  Цитата(WHALE @ Aug 16 2006, 16:15)  так еще и прием не работает?не,че-то в консерватории не-то.Приведите текст приемного модуля.
interrupt [USART1_RXC] void usart1_rx_isr( void ) { char ch; ..... //строка принята, выведем ее if ( ch == CRLF ) { PutStrCom( BuffStep ); } } Вы и не сможете вывести более 1 смвола с помощю PutStrCom, вы же находитесь а обработчике прерывания, и прерывыния запрещенны. Анатолий.
|
|
|
|
|
Aug 17 2006, 07:37
|
Местный
  
Группа: Новичок
Сообщений: 232
Регистрация: 24-06-06
Пользователь №: 18 332

|
Цитата(srg_co @ Aug 17 2006, 10:01)  PORTD.4 = ~PORTD.4; - это работает в CVAVR ~PORTD.4; так тоже работает в CVAVR
|
|
|
|
|
Aug 17 2006, 08:27
|
Частый гость
 
Группа: Свой
Сообщений: 131
Регистрация: 22-03-05
Из: Краснодар
Пользователь №: 3 600

|
Цитата(Shurmas @ Aug 17 2006, 11:37)  Цитата(srg_co @ Aug 17 2006, 10:01)  PORTD.4 = ~PORTD.4; - это работает в CVAVR
~PORTD.4; так тоже работает в CVAVR Нет, не будет. Цитата(aesok @ Aug 17 2006, 11:01)  Цитата(srg_co @ Aug 16 2006, 16:22)  Цитата(WHALE @ Aug 16 2006, 16:15)  так еще и прием не работает?не,че-то в консерватории не-то.Приведите текст приемного модуля.
interrupt [USART1_RXC] void usart1_rx_isr( void ) { char ch; ..... //строка принята, выведем ее if ( ch == CRLF ) { PutStrCom( BuffStep ); } } Вы и не сможете вывести более 1 смвола с помощю PutStrCom, вы же находитесь а обработчике прерывания, и прерывыния запрещенны. Анатолий. Вот PutStrCom: void PutStrCom( char *str ) { strcpy( BuffSend, str ); strcat( BuffSend, CrLf ); ic = 0; ls = strlen( BuffSend ); UDR0 = BuffSend[ic]; } Она как раз и вывод один символ в другой порт, а продолжает выводить уже прерывание USART0
|
|
|
|
|
Aug 17 2006, 08:46
|

Знающий
   
Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768

|
Цитата(aesok @ Aug 17 2006, 11:01)  Цитата(srg_co @ Aug 16 2006, 16:22)  Цитата(WHALE @ Aug 16 2006, 16:15)  так еще и прием не работает?не,че-то в консерватории не-то.Приведите текст приемного модуля.
interrupt [USART1_RXC] void usart1_rx_isr( void ) { char ch; ..... //строка принята, выведем ее if ( ch == CRLF ) { PutStrCom( BuffStep ); } } Вы и не сможете вывести более 1 смвола с помощю PutStrCom, вы же находитесь а обработчике прерывания, и прерывыния запрещенны. Анатолий. При чем тут прерывание,он фукцию вызывает из обработчика,что конвенцией не запрещено,хоть и не желательно. Насчет return-по моему лучше будет else if ( ch == CRLF ) { и насчет проверки в симуляторе-то что регистры проинициализрованы правильно,понятно,но что происх одит в обработчиках?Отключите глаз,попробуйте в софтовом эмуляторе студии поставить галочку в usart1->ucsra->rxc. вы попадете вобработчик,и посмотрите,что там происходит
--------------------
"Hello, word!" - 17 errors 56 warnings
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|