Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Трабл с USART1 в Mega64
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Страницы: 1, 2
srg_co
Проект написан в 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, все работает !!!

Может кто-то сталкивался с подобными глюками help.gif

Как побороться, проект большой, не хотелось бы переписывать под IAR !
bgc
Ну это скорее всего классиaческая тема про фуз бит совместимости с Mega103 - с завода чипы приходят с установленным битом совместимости - второй UART не работате...

Надо просто перевернуть этот бит при прошвке
srg_co
Цитата(bgc @ Aug 15 2006, 12:05) *
Ну это скорее всего классиaческая тема про фуз бит совместимости с Mega103 - с завода чипы приходят с установленным битом совместимости - второй UART не работате...

Надо просто перевернуть этот бит при прошвке


Бит не установлен, компиляторы разные, процесор один, фузы устанавливались один раз.
WHALE
а работаете через putchar-getchar?Если да,то они для каждого usart свои-putchar0-getchar0 и putchar1-getchar1.Если нет,правильно указан вектор обработчиков USART1?
srg_co
Цитата(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;
}
WHALE
Вроде все правильно cranky.gif Попробуй в обработчике поставить сh=0x55 и посмотри осцилом-есть посылка?
srg_co
Цитата(WHALE @ Aug 15 2006, 14:43) *
Вроде все правильно cranky.gif Попробуй в обработчике поставить сh=0x55 и посмотри осцилом-есть посылка?

В том то и прикол, первая посылка проходит, должно отработать прерывание и послать следущий байт, а оно не отрабатыват !?!?!?
WHALE
дык может у тебя NextCharStep() ноль присылает?
srg_co
Цитата(WHALE @ Aug 15 2006, 16:17) *
дык может у тебя NextCharStep() ноль присылает?

Под IARом то работает.
WHALE
Щас поднял старый проект на меге128 с 2usart и вспомнил,что тоже была какая-то трабла с usart1/
Попробуй через прерывание по очистке буфера передачи-у меня такая конструкция работает
interrupt [32] void USART_TX_EMP(void)
{
}
defunct
Цитата
Попробовал часть кода перенести в IAR 4.12A, все работает !!!


Перенесите весь код в IAR и забудьте про CV как про страшный сон, и все будет работать.

IAR + JtagIce MkII - самодостаточное сочетание.
bodja74
Да не IAR нужно учить а ассемблер и знать разницу между командой rjmp и jmp.
jmp это абсолютный переход и занимает 4 байта
rjmp это относительный и занимает 2 байта

компиллер вполне логично выдал адресацию в словах ,тотя по факту в таблице указывается в байтах,
и АВРстудийный компиллер тож адрессацию в листинге дает в байтах,зато результат компиляции в словах.Короче тут черт голову попутает со всем этим.Ставте в таблице rjmp ,а то растянули ее в два раза и помните что в таблице всегда должна быть команда rjmp или reti и все.
srg_co
Цитата(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 - самодостаточное сочетание.


Ну очень много переделывать придется sad.gif
WHALE
нет,по приему все стандартно через interrupt [USART1_RXC] void usart1_rx_isr(void)
Попробуй,переделывается пара строчек кода-разреши прерывания по очистке буфера TX и поменяй
вектор обработчика.
Shurmas
Цитата(bodja74 @ Aug 16 2006, 01:24) *
компиллер вполне логично выдал адресацию в словах ,тотя по факту в таблице указывается в байтах,
и АВРстудийный компиллер тож адрессацию в листинге дает в байтах,зато результат компиляции в словах.

Короче тут черт голову попутает со всем этим.


Но как происходят переходы прекрасно видно в симуляторе VMLAB
или PROTEUS и ошибку сразу видно.
WHALE
Во блин,иногда они возвращаются help.gif Чур меня blink.gif
Щас пойдут ссылки на сайт с 3 буквами,где давно решены все проблемы человечества. santa2.gif
Изыди,нечистый. smile3009.gif
srg_co
Цитата(WHALE @ Aug 16 2006, 12:33) *
Во блин,иногда они возвращаются help.gif Чур меня blink.gif
Щас пойдут ссылки на сайт с 3 буквами,где давно решены все проблемы человечества. santa2.gif
Изыди,нечистый. smile3009.gif


Это Вы про что ??

VMLAB/PROTEUS ?
WHALE
Это я про господина Shurmas,вы не в курсе про происходившее здесь изгнание духов.
ну да бог с ним.
srg_co как дела с USART1?
srg_co
Цитата(WHALE @ Aug 16 2006, 15:25) *
Это я про господина Shurmas,вы не в курсе про происходившее здесь изгнание духов.
ну да бог с ним.
srg_co как дела с USART1?


Попробую поработать с USART_TX_EMP.

По приему то стандартно, но не мычит ведь, ввобще не принимает ни одного байта.
WHALE
так еще и прием не работает?не,че-то в консерватории не-то.Приведите текст приемного модуля.
srg_co
Цитата(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 подключен светодиодик, при приеме должен мигать, не мигает.
WHALE
можно несколько замечаний?
BuffStep[RecvStp] = ch;
RecvStp++;
можно обьединить BuffStep[RecvStp++] = ch;
PORTD.4 = ~PORTD.4;-по моему,так работать не будет
я делал по другому
bit morg;
morg ^= 1;PORTD.4 =morg;
а что за команда return из прерывания?В CV она не нужна,все делается автоматом по закрытии скобок
обработчика.
Да,а что вы принимаете?Там точно есть посылки и протокол совпадает с установленным вами?
srg_co
Цитата(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 и поменяй
вектор обработчика.


Попробовал, без измененей, отправляет один байт и усе.
WHALE
попробуй тогда действительно в симуляторе каком-нибудь-avr-studio,vmlab,proteus.
у тебя что-то не-то во внешних программных модулях.
srg_co
Цитата(WHALE @ Aug 17 2006, 10:30) *
попробуй тогда действительно в симуляторе каком-нибудь-avr-studio,vmlab,proteus.
у тебя что-то не-то во внешних программных модулях.

Пробовал в avr-studio+jtagicemk2, криминала не нашел, биты в конфигурации порта установлены правильно.
pokos
Похоже, застревает оно в прерывании, выйти не могёт.
aesok
Цитата(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, вы же находитесь а обработчике прерывания, и прерывыния запрещенны.

Анатолий.
Shurmas
Цитата(srg_co @ Aug 17 2006, 10:01) *
PORTD.4 = ~PORTD.4; - это работает в CVAVR


~PORTD.4; так тоже работает в CVAVR
srg_co
Цитата(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
WHALE
Цитата(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.
вы попадете вобработчик,и посмотрите,что там происходит
srg_co
Цитата(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.
вы попадете вобработчик,и посмотрите,что там происходит


Имитировать прерывание ?
Shurmas
Цитата(srg_co @ Aug 17 2006, 12:27) *
Цитата(Shurmas @ Aug 17 2006, 11:37) *

~PORTD.4; так тоже работает в CVAVR


Нет, не будет.



"спешал фо ю" чичас проверил - работает! как и всегда это работало в CVAVR !
srg_co
Цитата(Shurmas @ Aug 17 2006, 13:29) *
Цитата(srg_co @ Aug 17 2006, 12:27) *

Цитата(Shurmas @ Aug 17 2006, 11:37) *

~PORTD.4; так тоже работает в CVAVR


Нет, не будет.



"спешал фо ю" чичас проверил - работает! как и всегда это работало в CVAVR !


Понял, а версия CVAVR у Вас какая ?
WHALE
да,имитировать прерывание.
Shurmas
Цитата(srg_co @ Aug 17 2006, 13:50) *
а версия CVAVR у Вас какая ?


1.24.8b фул и дема 1.25.1
Shurmas
Извините! я ошибся. он это компилит но выдает вонинг что код возможно не бкдет работать и действительно не работает.

Извините еще раз.
srg_co
Цитата(WHALE @ Aug 17 2006, 13:53) *
да,имитировать прерывание.


Понял попробую вечерком.

Цитата(Shurmas @ Aug 17 2006, 14:16) *
Извините! я ошибся. он это компилит но выдает вонинг что код возможно не бкдет работать и действительно не работает.

Извините еще раз.


Все мы человеки, все могут ошибаться, не ошибается тот кто ничего не делает.
srg_co
Цитата(WHALE @ Aug 17 2006, 13:53) *
да,имитировать прерывание.

Попробывал, USART0 - все ОК, USART1 - не фурычит !
arttab
Мегу 64 юзал под IAR - все OK! Оба UARTA. попробуйте в avrstudio посимулировать ваш код.
srg_co
Цитата(arttab @ Aug 18 2006, 11:51) *
Мегу 64 юзал под IAR - все OK! Оба UARTA. попробуйте в avrstudio посимулировать ваш код.

В том то и дело, что в ИАР все гуд, а под CV - глюки.
Симулировать пробовал, не работают прерывания.
defunct
Цитата(srg_co @ Aug 18 2006, 12:37) *
В том то и дело, что в ИАР все гуд, а под CV - глюки.
Симулировать пробовал, не работают прерывания.

Вы все еще возитесь с этой проблемой в CV?
За это время можно было весь проект трижды перенести в IAR.
srg_co
Цитата(defunct @ Aug 19 2006, 16:32) *
Цитата(srg_co @ Aug 18 2006, 12:37) *

В том то и дело, что в ИАР все гуд, а под CV - глюки.
Симулировать пробовал, не работают прерывания.

Вы все еще возитесь с этой проблемой в CV?
За это время можно было весь проект трижды перенести в IAR.

Да sad.gif , видимо придется этим заняться.
WHALE
Цитата(srg_co @ Aug 20 2006, 12:50) *
Цитата(defunct @ Aug 19 2006, 16:32) *

Цитата(srg_co @ Aug 18 2006, 12:37) *

В том то и дело, что в ИАР все гуд, а под CV - глюки.
Симулировать пробовал, не работают прерывания.

Вы все еще возитесь с этой проблемой в CV?
За это время можно было весь проект трижды перенести в IAR.

Да sad.gif , видимо придется этим заняться.

И USART1 у вас в CV не работает,и прерывания не симулируются blink.gif
у меня в СV усе работало и в студии все симулировалось.явно что-то с векторами не то.
Ну переносите,бог в помощь biggrin.gif
srg_co
Цитата(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.

Да sad.gif , видимо придется этим заняться.

И USART1 у вас в CV не работает,и прерывания не симулируются blink.gif
у меня в СV усе работало и в студии все симулировалось.явно что-то с векторами не то.
Ну переносите,бог в помощь biggrin.gif

А какая версия CV у Вас ?
vet
Компилятор крайним оказался? ну-ну smile.gif
Работаю в CV пять лет; со всей периферией он работает отлично, и с USART1 тоже.
Ищите ошибку в программе. Проверьте настройки проекта.
srg_co
Цитата(vet @ Aug 24 2006, 16:21) *
Компилятор крайним оказался? ну-ну smile.gif
Работаю в CV пять лет; со всей периферией он работает отлично, и с USART1 тоже.
Ищите ошибку в программе. Проверьте настройки проекта.

Я не говорил, что он кривой, а баги в нем есть, достаточно историю версий посмотреть.
vet
Как и в любой программе.
За все время работы сталкивался с багами в CV один или два раза, оба проявились на нетипичных сишных конструкциях.
Повторюсь, никаких багов при работе из CV с периферией меги128 не замечал. Просто отладьте программу; компилятор - последнее, что стоит рассматривать, как причину её неработоспособности.
srg_co
Цитата(vet @ Aug 25 2006, 10:04) *
Как и в любой программе.
За все время работы сталкивался с багами в CV один или два раза, оба проявились на нетипичных сишных конструкциях.
Повторюсь, никаких багов при работе из CV с периферией меги128 не замечал. Просто отладьте программу; компилятор - последнее, что стоит рассматривать, как причину её неработоспособности.

Вау, нашел в чем проблема ! Выключил прерывание Timer3 по переполнению и все заработало. Хотя прерывание от таймер работало исправно, идем дальше, по прерыванию таймер инициализировался значением: 0xFFFF, включаю таймер, ставлю значение: 0x1234, все продолжает работать blink.gif

Какие мысли у народа есть по этому поводу ?
vet
Разберитесь, с какой частотой возникало прерывание от таймера.
У меня подозрение, что м/к из него не вылезал, и до обработки прерывания от USART1 дело просто не доходило.

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

Подсказка: обсуждаемые прерывания по убыванию приоритета - USART0_RX > TIMER3_OVF > USART1_RX.

У меня была мысль по этому поводу, таймер генерит примерно 16800Hz

В общем будем считать что проблема решена, всем огромное спасибо за помощь!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.