|
|
  |
mega128 -> UART1,2 -> mega162, аппаратная несовместимость, можно ли обойти ? |
|
|
|
Nov 3 2008, 09:15
|

Местный
  
Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423

|
Отлаживался проект до полного завершения на м128, изначально конечно использовать такой контроллер из за двух аппаратных юартов глупо, как замену был остановлен выбор на м162 собственно из за тех же 2 апаратных юартов. Проект был закончен, вчера, попытались пересобрать на м162. Как мы и предпологали, заменой одной только строчки Код #include "iom128.h" на Код #include "iom162.h" не обойдётся. Сначало отказался работать таймер, пришлось коректировать Код void timer0_init(void) { #ifdef __ATmega128__ TCCR0 = 0x00; //stop //10mSec ASSR = 0x00; //set async mode TCNT0 = 0xB9; //set count OCR0 = 0x47; TCCR0 = 0x07; //start timer TIMSK |= 0x01; //ovf T0 active #endif
#ifdef __ATmega162__ TCCR0 = 0x00; //stop TCNT0 = 0xB9; //set count OCR0 = 0x47; //set compare value TCCR0 = 0x05; //start timer TIMSK |= 0x02; //timer interrupt sources #endif } А также немного в других частях, в целом весь проект на С то 95% кода неизменно. А вот периферия  Но как мы не старались запустить юарты у нас не получилось  Из возможностей юарта используем только прерывание RX, при этом как только подключается устройство к порту контроллер падает и всё, помогает только передёргивание питания. Если кто то уже использовал в свои разработках м162 с 2 юартами откликнитесь. Интересует участок инициализации. С ув.
|
|
|
|
|
Nov 3 2008, 09:24
|

Местный
  
Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423

|
Цитата(_dem @ Nov 3 2008, 13:18)  Проверьте номера прерываний  У нас такая реализация, все на С по идее компилятор сам должен был подставить нужное, или я что то не понял ? Код #ifndef InvertUART #pragma vector = USART0_RXC_vect __interrupt void USART0_RXC(void) #else
#pragma vector = USART1_RXC_vect __interrupt void USART1_RXC(void) #endif
{ .... ....
}
ifndef InvertUART
#pragma vector = USART1_RXC_vect __interrupt void USART1_RXC(void)
#else
#pragma vector = USART0_RXC_vect __interrupt void USART0_RXC(void)
#endif { Led_4on; #ifndef InvertUART DSR_char = UDR1; #else DSR_char = UDR0; #endif
Led_4off; }
Сообщение отредактировал west329_ - Nov 3 2008, 09:25
|
|
|
|
|
Nov 3 2008, 09:35
|

Местный
  
Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423

|
Код void uart1_init(void) { UCSR1B = 0x00; //disable while setting baud rate UCSR1A = 0x00; UCSR1C = 0x06; UBRR1L = 0x07; //set baud rate lo UBRR1H = 0x00; //set baud rate hi //UCSR1B = 0xB8; //UCSR1A = 0x00; //enable //??????????? UCSR1B = 0x98; //without UDR is now empty int
} Возможно может проблема в режимах совместимости между 162 и 161 ? Изначально при конфигурации фьюз битов я нетрогал флаг М161С, он так и остался пустым в ПониПрог
|
|
|
|
|
Nov 3 2008, 11:25
|

Местный
  
Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423

|
Цитата(defunct @ Nov 3 2008, 15:01)  Да да, по умолчанию m162 в режиме совместимости. тогдаб прогограмма для 162 не пошлаб, я то в ИАР чётко выбираю СРU Код #ifndef __IOM162_H #define __IOM162_H
/* SFRs are local in assembler modules (so this file may need to be */ /* included in more than one module in the same source file), */ /* but #defines must only be made once per source file. */
/*==============================*/ /* Interrupt Vector Definitions */ /*==============================*/
/* NB! vectors are specified as byte addresses */ #ifndef __M161C__ //Define __M161C__ when you want to run in Mega161 compability mode.
#define RESET_vect (0x00) #define INT0_vect (0x04) #define INT1_vect (0x08) #define INT2_vect (0x0C) #define PCINT0_vect (0x10) #define PCINT1_vect (0x14) #define TIMER3_CAPT_vect (0x18) #define TIMER3_COMPA_vect (0x1C) #define TIMER3_COMPB_vect (0x20) #define TIMER3_OVF_vect (0x24) #define TIMER2_COMP_vect (0x28) #define TIMER2_OVF_vect (0x2C) #define TIMER1_CAPT_vect (0x30) #define TIMER1_COMPA_vect (0x34) #define TIMER1_COMPB_vect (0x38) #define TIMER1_OVF_vect (0x3C) #define TIMER0_COMP_vect (0x40) #define TIMER0_OVF_vect (0x44) #define SPI_STC_vect (0x48) #define USART0_RXC_vect (0x4C) #define USART1_RXC_vect (0x50) #define USART0_UDRE_vect (0x54) #define USART1_UDRE_vect (0x58) #define USART0_TXC_vect (0x5C) #define USART1_TXC_vect (0x60) #define EE_RDY_vect (0x64) #define ANA_COMP_vect (0x68) #define SPM_RDY_vect (0x6C) #else #define RESET_vect (0x00) #define INT0_vect (0x04) #define INT1_vect (0x08) #define INT2_vect (0x0C) #define TIMER2_COMP_vect (0x10) #define TIMER2_OVF_vect (0x14) #define TIMER1_CAPT_vect (0x18) #define TIMER1_COMPA_vect (0x1C) #define TIMER1_COMPB_vect (0x20) #define TIMER1_OVF_vect (0x24) #define TIMER0_COMP_vect (0x28) #define TIMER0_OVF_vect (0x2C) #define SPI_STC_vect (0x30) #define USART0_RX_vect (0x34) #define USART1_RX_vect (0x38) #define USART0_UDRE_vect (0x3C) #define USART1_UDRE_vect (0x40) #define USART0_TX_vect (0x44) #define USART1_TX_vect (0x48) #define EE_RDY_vect (0x4C) #define ANA_COMP_vect (0x50) #define SPM_RDY_vect (0x54) #endif из #include "iom162.h" ключ __M161C__ я не определяю. и в программе паралельно работает таймер0, то он бы неработал адрес несовпадает. Щас отключил инит юартов, подключаю внешний девайс, программа несбоит, думал может уровни коротят, всётаки что то с настройками юартов.
Сообщение отредактировал west329_ - Nov 3 2008, 11:32
|
|
|
|
|
Nov 3 2008, 12:44
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(west329_ @ Nov 3 2008, 12:15)  Как мы и предпологали, заменой одной только строчки Код #include "iom128.h" на Код #include "iom162.h" не обойдётся. Код #include "ioavr.h" И менять строчку не нужно. Цитата(west329_ @ Nov 3 2008, 12:15)  Сначало отказался работать таймер, пришлось коректировать Код TCCR0 = 0x07; //start timer TIMSK |= 0x01; //ovf T0 active #endif
#ifdef __ATmega162__ TCCR0 = 0x05; //start timer TIMSK |= 0x02; //timer interrupt sources #endif } Вот до чего доводит CodeVision... С CCR0 есть сложности, действительно надо вводить условную компиляцию. Можно сделать так: Код #if defined(__ATmega128__) #define T0CLK_DIV1024 ((1<<CS02)|(1<<CS01)|(1<<CS00)) #elif defined (__ATmega162__) #define T0CLK_DIV1024 ((1<<CS02)|(0<<CS01)|(1<<CS00)) #else #error add T0CLK_DIV1024 for new mcu here #endif Тогда Код TCCR0 = T0CLK_DIV1024; //start timer TIMSK |= (1<<TOIE0); //timer interrupt sources И, о чудо! Снова никаких коррекций при переходе между кристаллами. Не говоря уже о том, что TCCR0 = 0x05; без даташита совершенно не читаемо. Ох, не любите вы себя, не бережете свое время...
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Nov 3 2008, 13:06
|

Местный
  
Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423

|
Цитата(Сергей Борщ @ Nov 3 2008, 16:44)  Код #include "ioavr.h" И менять строчку не нужно. Вот до чего доводит CodeVision... С CCR0 есть сложности, действительно надо вводить условную компиляцию. Можно сделать так: Код #if defined(__ATmega128__) #define T0CLK_DIV1024 ((1<<CS02)|(1<<CS01)|(1<<CS00)) #elif defined (__ATmega162__) #define T0CLK_DIV1024 ((1<<CS02)|(0<<CS01)|(1<<CS00)) #else #error add T0CLK_DIV1024 for new mcu here #endif Тогда Код TCCR0 = T0CLK_DIV1024; //start timer TIMSK |= (1<<TOIE0); //timer interrupt sources И, о чудо! Снова никаких коррекций при переходе между кристаллами. Не говоря уже о том, что TCCR0 = 0x05; без даташита совершенно не читаемо. Ох, не любите вы себя, не бережете свое время...  Согласен. Но, я ещё не дорос, до таких сложных проектов, просто перед каждой процедурой инициализации я пишу что и как настроено. to defunct Вы оказались правы  это критическая ошибка для м162, юарт конечно на заработал но дышать стало немного легче, что найден ещё один баг.
|
|
|
|
|
Nov 3 2008, 13:40
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(west329_ @ Nov 3 2008, 16:06)  Но, я ещё не дорос, до таких сложных проектов, просто перед каждой процедурой инициализации я пишу что и как настроено. Может пора начинать расти?  Писать комментарии конечно хорошо. Но кто даст гарантии, что эти комментарии действительно описывают следующий за ними код? Даже не специально, а вполне банальная описка в шестнадцатиричной константе может на приличное время затормозить вашу работу. Да что я рассказываю - вы же вот прямо сейчас с этим и боретесь. Пора начинать, поверьте, пора. Очень подходящий случай. Код UCSR1B = (1<<RXCIE1)|(0<<TXCIE1)|(0<<UDRIE1)|(1<<RXEN1)|(1<<TXEN1)|(0<<UCSZ12)|(0<<RXB81)|(0<<TXB81); // 0x98; UCSR1C = (1<<UMSEL1)|(0<<UPM11)|(0<<UPM10)|(0<<USBS1)|(1<<UCSZ11)|(1<<UCSZ10)|(0<<UCPOL1); //0x46;
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Nov 3 2008, 20:26
|

Местный
  
Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423

|
Всем кто помогал выражаю огромную благодарность, UART завижал как новенький  , и как говорят у меня на родине "Дякую всім!"  Причина как всегда банальна лень читать даташиты  откуда шишки и растут  Контроллер mega162 имеет сдвоеные регистры, их аш 2. На них и споткнулись. В итоге Код #ifdef __ATmega162__
UCSR1B = (1<<RXCIE1)|(1<<RXEN1)|(1<<TXEN1); UCSR1C = (1<<URSEL1)|(3<<UCSZ10); #elif defined __ATmega128__
UCSR1B = (1<<RXCIE1)|(1<<RXEN1)|(1<<TXEN1); UCSR1C = (3<<UCSZ10);
#else
#error init UART
#endif
Сообщение отредактировал west329_ - Nov 3 2008, 20:34
|
|
|
|
|
Nov 3 2008, 20:39
|
Частый гость
 
Группа: Новичок
Сообщений: 139
Регистрация: 26-09-08
Пользователь №: 40 510

|
Цитата(west329_ @ Nov 3 2008, 23:26)  Контроллер mega162 имеет сдвоеные регистры, их аш 2. Как у меги8. Там тоже 2 регистра находятся по одному и тому же адресу. А (стеняюсь спросить  ) что Вам мешало посмотреть на даташит на мегу162? Даже не на весь даташит, а на маленький раздельчик про UART. Религия не позволяла? Ведь в этом случае Вы бы решили свою суперсложную задачу в течении 15-ти секунд
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|