|
Трабл с 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 !
|
|
|
|
|
 |
Ответов
(1 - 50)
|
Aug 15 2006, 09:02
|
Частый гость
 
Группа: Свой
Сообщений: 131
Регистрация: 22-03-05
Из: Краснодар
Пользователь №: 3 600

|
Цитата(bgc @ Aug 15 2006, 12:05)  Ну это скорее всего классиaческая тема про фуз бит совместимости с Mega103 - с завода чипы приходят с установленным битом совместимости - второй UART не работате...
Надо просто перевернуть этот бит при прошвке Бит не установлен, компиляторы разные, процесор один, фузы устанавливались один раз.
|
|
|
|
|
Aug 15 2006, 09:48
|
Частый гость
 
Группа: Свой
Сообщений: 131
Регистрация: 22-03-05
Из: Краснодар
Пользователь №: 3 600

|
Цитата(WHALE @ Aug 15 2006, 13:29)  а работаете через putchar-getchar?Если да,то они для каждого usart свои-putchar0-getchar0 и putchar1-getchar1.Если нет,правильно указан вектор обработчиков USART1? Вот таблица векторов: 00003c 940c 00f1 JMP _usart1_rx_isr 00003e 940c 0000 JMP 0x00 000040 940c 0114 JMP _usart1_tx_isr 000042 940c 0000 JMP 0x00 000044 940c 0000 JMP 0x00 putchar - getchar - не пользуюсь вообще, пишу свои //*********************************************** interrupt [USART1_TXC] void usart1_tx_isr( void ) { char ch; ch = NextCharStep(); if ( ch ) UDR1 = ch; ; } //*********************************************** char NextCharStep( void ) { if ( ic2 < ls2 ) { ic2++; return Test[ic2]; } else return 0; }
|
|
|
|
|
Aug 15 2006, 11:10
|
Частый гость
 
Группа: Свой
Сообщений: 131
Регистрация: 22-03-05
Из: Краснодар
Пользователь №: 3 600

|
Цитата(WHALE @ Aug 15 2006, 14:43)  Вроде все правильно  Попробуй в обработчике поставить сh=0x55 и посмотри осцилом-есть посылка? В том то и прикол, первая посылка проходит, должно отработать прерывание и послать следущий байт, а оно не отрабатыват !?!?!?
|
|
|
|
|
Aug 15 2006, 14:58
|
Частый гость
 
Группа: Свой
Сообщений: 131
Регистрация: 22-03-05
Из: Краснодар
Пользователь №: 3 600

|
Цитата(WHALE @ Aug 15 2006, 16:17)  дык может у тебя NextCharStep() ноль присылает? Под IARом то работает.
|
|
|
|
|
Aug 16 2006, 06:34
|
Частый гость
 
Группа: Свой
Сообщений: 131
Регистрация: 22-03-05
Из: Краснодар
Пользователь №: 3 600

|
Цитата(WHALE @ Aug 15 2006, 19:32)  Щас поднял старый проект на меге128 с 2usart и вспомнил,что тоже была какая-то трабла с usart1/ Попробуй через прерывание по очистке буфера передачи-у меня такая конструкция работает interrupt [32] void USART_TX_EMP(void) { } А как быть с приемником, там тоже не работает прерывание ? Цитата(defunct @ Aug 16 2006, 00:25)  Цитата Попробовал часть кода перенести в IAR 4.12A, все работает !!! Перенесите весь код в IAR и забудьте про CV как про страшный сон, и все будет работать. IAR + JtagIce MkII - самодостаточное сочетание. Ну очень много переделывать придется
|
|
|
|
|
Aug 16 2006, 07:47
|
Местный
  
Группа: Новичок
Сообщений: 232
Регистрация: 24-06-06
Пользователь №: 18 332

|
Цитата(bodja74 @ Aug 16 2006, 01:24)  компиллер вполне логично выдал адресацию в словах ,тотя по факту в таблице указывается в байтах, и АВРстудийный компиллер тож адрессацию в листинге дает в байтах,зато результат компиляции в словах.
Короче тут черт голову попутает со всем этим. Но как происходят переходы прекрасно видно в симуляторе VMLAB или PROTEUS и ошибку сразу видно.
|
|
|
|
|
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
|
|
|
|
|
Aug 17 2006, 09:05
|
Частый гость
 
Группа: Свой
Сообщений: 131
Регистрация: 22-03-05
Из: Краснодар
Пользователь №: 3 600

|
Цитата(WHALE @ Aug 17 2006, 12:46)  Цитата(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. вы попадете вобработчик,и посмотрите,что там происходит Имитировать прерывание ?
|
|
|
|
|
Aug 17 2006, 09:29
|
Местный
  
Группа: Новичок
Сообщений: 232
Регистрация: 24-06-06
Пользователь №: 18 332

|
Цитата(srg_co @ Aug 17 2006, 12:27)  Цитата(Shurmas @ Aug 17 2006, 11:37)  ~PORTD.4; так тоже работает в CVAVR
Нет, не будет. "спешал фо ю" чичас проверил - работает! как и всегда это работало в CVAVR !
|
|
|
|
|
Aug 17 2006, 09:50
|
Частый гость
 
Группа: Свой
Сообщений: 131
Регистрация: 22-03-05
Из: Краснодар
Пользователь №: 3 600

|
Цитата(Shurmas @ Aug 17 2006, 13:29)  Цитата(srg_co @ Aug 17 2006, 12:27)  Цитата(Shurmas @ Aug 17 2006, 11:37)  ~PORTD.4; так тоже работает в CVAVR
Нет, не будет. "спешал фо ю" чичас проверил - работает! как и всегда это работало в CVAVR ! Понял, а версия CVAVR у Вас какая ?
|
|
|
|
|
Aug 17 2006, 10:04
|
Местный
  
Группа: Новичок
Сообщений: 232
Регистрация: 24-06-06
Пользователь №: 18 332

|
Цитата(srg_co @ Aug 17 2006, 13:50)  а версия CVAVR у Вас какая ? 1.24.8b фул и дема 1.25.1
|
|
|
|
|
Aug 17 2006, 10:33
|
Частый гость
 
Группа: Свой
Сообщений: 131
Регистрация: 22-03-05
Из: Краснодар
Пользователь №: 3 600

|
Цитата(WHALE @ Aug 17 2006, 13:53)  да,имитировать прерывание. Понял попробую вечерком. Цитата(Shurmas @ Aug 17 2006, 14:16)  Извините! я ошибся. он это компилит но выдает вонинг что код возможно не бкдет работать и действительно не работает.
Извините еще раз. Все мы человеки, все могут ошибаться, не ошибается тот кто ничего не делает.
|
|
|
|
|
Aug 18 2006, 07:03
|
Частый гость
 
Группа: Свой
Сообщений: 131
Регистрация: 22-03-05
Из: Краснодар
Пользователь №: 3 600

|
Цитата(WHALE @ Aug 17 2006, 13:53)  да,имитировать прерывание. Попробывал, USART0 - все ОК, USART1 - не фурычит !
|
|
|
|
|
Aug 18 2006, 09:37
|
Частый гость
 
Группа: Свой
Сообщений: 131
Регистрация: 22-03-05
Из: Краснодар
Пользователь №: 3 600

|
Цитата(arttab @ Aug 18 2006, 11:51)  Мегу 64 юзал под IAR - все OK! Оба UARTA. попробуйте в avrstudio посимулировать ваш код. В том то и дело, что в ИАР все гуд, а под CV - глюки. Симулировать пробовал, не работают прерывания.
|
|
|
|
|
Aug 20 2006, 08:50
|
Частый гость
 
Группа: Свой
Сообщений: 131
Регистрация: 22-03-05
Из: Краснодар
Пользователь №: 3 600

|
Цитата(defunct @ Aug 19 2006, 16:32)  Цитата(srg_co @ Aug 18 2006, 12:37)  В том то и дело, что в ИАР все гуд, а под CV - глюки. Симулировать пробовал, не работают прерывания.
Вы все еще возитесь с этой проблемой в CV? За это время можно было весь проект трижды перенести в IAR. Да  , видимо придется этим заняться.
|
|
|
|
|
Aug 20 2006, 09:36
|

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

|
Цитата(srg_co @ Aug 20 2006, 12:50)  Цитата(defunct @ Aug 19 2006, 16:32)  Цитата(srg_co @ Aug 18 2006, 12:37)  В том то и дело, что в ИАР все гуд, а под CV - глюки. Симулировать пробовал, не работают прерывания.
Вы все еще возитесь с этой проблемой в CV? За это время можно было весь проект трижды перенести в IAR. Да  , видимо придется этим заняться. И USART1 у вас в CV не работает,и прерывания не симулируются у меня в СV усе работало и в студии все симулировалось.явно что-то с векторами не то. Ну переносите,бог в помощь
--------------------
"Hello, word!" - 17 errors 56 warnings
|
|
|
|
|
Aug 24 2006, 12:08
|
Частый гость
 
Группа: Свой
Сообщений: 131
Регистрация: 22-03-05
Из: Краснодар
Пользователь №: 3 600

|
Цитата(WHALE @ Aug 20 2006, 13:36)  Цитата(srg_co @ Aug 20 2006, 12:50)  Цитата(defunct @ Aug 19 2006, 16:32)  Цитата(srg_co @ Aug 18 2006, 12:37)  В том то и дело, что в ИАР все гуд, а под CV - глюки. Симулировать пробовал, не работают прерывания.
Вы все еще возитесь с этой проблемой в CV? За это время можно было весь проект трижды перенести в IAR. Да  , видимо придется этим заняться. И USART1 у вас в CV не работает,и прерывания не симулируются у меня в СV усе работало и в студии все симулировалось.явно что-то с векторами не то. Ну переносите,бог в помощь  А какая версия CV у Вас ?
|
|
|
|
|
Aug 24 2006, 12:21
|
Знающий
   
Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32

|
Компилятор крайним оказался? ну-ну  Работаю в CV пять лет; со всей периферией он работает отлично, и с USART1 тоже. Ищите ошибку в программе. Проверьте настройки проекта.
Сообщение отредактировал vet - Aug 24 2006, 12:27
--------------------
Главная линия этого опуса ясна мне насквозь!
|
|
|
|
|
Aug 24 2006, 14:14
|
Частый гость
 
Группа: Свой
Сообщений: 131
Регистрация: 22-03-05
Из: Краснодар
Пользователь №: 3 600

|
Цитата(vet @ Aug 24 2006, 16:21)  Компилятор крайним оказался? ну-ну  Работаю в CV пять лет; со всей периферией он работает отлично, и с USART1 тоже. Ищите ошибку в программе. Проверьте настройки проекта. Я не говорил, что он кривой, а баги в нем есть, достаточно историю версий посмотреть.
|
|
|
|
|
Aug 25 2006, 08:09
|
Частый гость
 
Группа: Свой
Сообщений: 131
Регистрация: 22-03-05
Из: Краснодар
Пользователь №: 3 600

|
Цитата(vet @ Aug 25 2006, 10:04)  Как и в любой программе. За все время работы сталкивался с багами в CV один или два раза, оба проявились на нетипичных сишных конструкциях. Повторюсь, никаких багов при работе из CV с периферией меги128 не замечал. Просто отладьте программу; компилятор - последнее, что стоит рассматривать, как причину её неработоспособности. Вау, нашел в чем проблема ! Выключил прерывание Timer3 по переполнению и все заработало. Хотя прерывание от таймер работало исправно, идем дальше, по прерыванию таймер инициализировался значением: 0xFFFF, включаю таймер, ставлю значение: 0x1234, все продолжает работать Какие мысли у народа есть по этому поводу ?
|
|
|
|
|
Aug 25 2006, 14:02
|
Частый гость
 
Группа: Свой
Сообщений: 131
Регистрация: 22-03-05
Из: Краснодар
Пользователь №: 3 600

|
Цитата(vet @ Aug 25 2006, 13:26)  Разберитесь, с какой частотой возникало прерывание от таймера. У меня подозрение, что м/к из него не вылезал, и до обработки прерывания от USART1 дело просто не доходило.
Подсказка: обсуждаемые прерывания по убыванию приоритета - USART0_RX > TIMER3_OVF > USART1_RX. У меня была мысль по этому поводу, таймер генерит примерно 16800Hz В общем будем считать что проблема решена, всем огромное спасибо за помощь!
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|