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

|
Проект написан в CodeWizardAVR V1.24.8d Professional, Инициализация портов USART: // USART0 initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART0 Receiver: On // USART0 Transmitter: On // USART0 Mode: Asynchronous // USART0 Baud rate: 4800 UCSR0A=0x00; UCSR0B=0xD8; UCSR0C=0x06; UBRR0H=0x00; UBRR0L=0x5F; // USART1 initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART1 Receiver: On // USART1 Transmitter: On // USART1 Mode: Asynchronous // USART1 Baud rate: 4800 UCSR1A=0x00; UCSR1B=0xD8; UCSR1C=0x06; UBRR1H=0x00; UBRR1L=0x5F; USART0 - работает без проблем USART1 - не отрабатывают прерывания: usart1_rx_isr, usart1_tx_isr Проверял через AVRStudio+JTAGICEmkII, регистры проиницализированы нормально. Попробовал часть кода перенести в IAR 4.12A, все работает !!! Может кто-то сталкивался с подобными глюками Как побороться, проект большой, не хотелось бы переписывать под IAR !
|
|
|
|
|
 |
Ответов
(15 - 29)
|
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
|
|
|