реклама на сайте
подробности

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


Местный
***

Группа: Свой
Сообщений: 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% кода неизменно. А вот периферия sad.gif
Но как мы не старались запустить юарты у нас не получилось sad.gif
Из возможностей юарта используем только прерывание RX, при этом как только подключается устройство к порту контроллер падает и всё, помогает только передёргивание питания.


Если кто то уже использовал в свои разработках м162 с 2 юартами откликнитесь. Интересует участок инициализации.

С ув.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 13)
_dem
сообщение Nov 3 2008, 09:18
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 263
Регистрация: 2-02-07
Из: CN, Ukraine
Пользователь №: 24 970



Проверьте номера прерываний smile.gif
Go to the top of the page
 
+Quote Post
west329_
сообщение Nov 3 2008, 09:24
Сообщение #3


Местный
***

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



Цитата(_dem @ Nov 3 2008, 13:18) *
Проверьте номера прерываний smile.gif


У нас такая реализация, все на С по идее компилятор сам должен был подставить нужное, или я что то не понял ?
Код
#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
Go to the top of the page
 
+Quote Post
defunct
сообщение Nov 3 2008, 09:26
Сообщение #4


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Абсолютно никакой разницы в настройке УАРТов (только что сравнил WinMerge'м два проекта соотв. под m128 и под m162):

Код
#define BR_MACRO_FOR_AVR_PLATFORM(BR)  (((Fosc >> 4) / BR) - 1)


  temp = BR_MACRO_FOR_AVR_PLATFORM(UART0_BaudRate);
  UBRR0H = (temp >> 8) & 0x0F;
  UBRR0L = (temp & 0xFF);
  UCSR0B = 0xD8; // interrupt driven config
//  UCSR0B = 0x18; // not interrupt driven
  UCSR0C = 0x86; // 8 bit, 1 stop

Вектора прерываний называются одинаково.
Go to the top of the page
 
+Quote Post
west329_
сообщение Nov 3 2008, 09:35
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 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С, он так и остался пустым в ПониПрог
Go to the top of the page
 
+Quote Post
defunct
сообщение Nov 3 2008, 11:01
Сообщение #6


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(west329_ @ Nov 3 2008, 11:35) *
Возможно может проблема в режимах совместимости между 162 и 161 ?
Изначально при конфигурации фьюз битов я нетрогал флаг М161С, он так и остался пустым в ПониПрог

Да да, по умолчанию m162 в режиме совместимости.
Go to the top of the page
 
+Quote Post
west329_
сообщение Nov 3 2008, 11:25
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
defunct
сообщение Nov 3 2008, 12:08
Сообщение #8


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Возьмите мою инициализацию. Обратите особое внимание на порядок заправки регистров. и старший бит UCSRxC.

Цитата
UCSR1C = 0x06;

этой строчкой вы пишете в UBRRH.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 3 2008, 12:44
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 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; без даташита совершенно не читаемо. Ох, не любите вы себя, не бережете свое время... 01.gif


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
west329_
сообщение Nov 3 2008, 13:06
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 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; без даташита совершенно не читаемо. Ох, не любите вы себя, не бережете свое время... 01.gif


Согласен.
Но, я ещё не дорос, до таких сложных проектов, просто перед каждой процедурой инициализации я пишу что и как настроено.

to defunct

Вы оказались правы a14.gif это критическая ошибка для м162, юарт конечно на заработал но дышать стало немного легче, что найден ещё один баг.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 3 2008, 13:40
Сообщение #11


Гуру
******

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



Цитата(west329_ @ Nov 3 2008, 16:06) *
Но, я ещё не дорос, до таких сложных проектов, просто перед каждой процедурой инициализации я пишу что и как настроено.
Может пора начинать расти? wink.gif Писать комментарии конечно хорошо. Но кто даст гарантии, что эти комментарии действительно описывают следующий за ними код? Даже не специально, а вполне банальная описка в шестнадцатиричной константе может на приличное время затормозить вашу работу. Да что я рассказываю - вы же вот прямо сейчас с этим и боретесь. Пора начинать, поверьте, пора. Очень подходящий случай.
Код
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)
Go to the top of the page
 
+Quote Post
west329_
сообщение Nov 3 2008, 20:26
Сообщение #12


Местный
***

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



Всем кто помогал выражаю огромную благодарность, UART завижал как новенький smile.gif, и как говорят у меня на родине "Дякую всім!" smile.gif

Причина как всегда банальна лень читать даташиты smile.gif откуда шишки и растут sad.gif

Контроллер 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
Go to the top of the page
 
+Quote Post
Николай Иванович...
сообщение Nov 3 2008, 20:39
Сообщение #13


Частый гость
**

Группа: Новичок
Сообщений: 139
Регистрация: 26-09-08
Пользователь №: 40 510



Цитата(west329_ @ Nov 3 2008, 23:26) *
Контроллер mega162 имеет сдвоеные регистры, их аш 2.

Как у меги8.
Там тоже 2 регистра находятся по одному и тому же адресу.

А (стеняюсь спросить 05.gif ) что Вам мешало посмотреть на даташит на мегу162? Даже не на весь даташит, а на маленький раздельчик про UART. Религия не позволяла? Ведь в этом случае Вы бы решили свою суперсложную задачу в течении 15-ти секунд
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Nov 4 2008, 06:53
Сообщение #14


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(Николай Иванович Приходько @ Nov 3 2008, 23:39) *
...

Николай Иванович, хотите ли знать кто тут по Вам скучал пока Вы сидели в бане, а потом довольно долго паслись в оффтопике?
Никто!!!
А посему, раз уж Вы тут обьявились с явным оффтопом и ввиду неисправимого рецидивизма, прописываю Вам вечный бан.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th June 2025 - 15:07
Рейтинг@Mail.ru


Страница сгенерированна за 0.01532 секунд с 7
ELECTRONIX ©2004-2016