Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: mega128 -> UART1,2 -> mega162
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
west329_
Отлаживался проект до полного завершения на м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 юартами откликнитесь. Интересует участок инициализации.

С ув.
_dem
Проверьте номера прерываний smile.gif
west329_
Цитата(_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;
}
defunct
Абсолютно никакой разницы в настройке УАРТов (только что сравнил 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

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

Да да, по умолчанию m162 в режиме совместимости.
west329_
Цитата(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, то он бы неработал адрес несовпадает.

Щас отключил инит юартов, подключаю внешний девайс, программа несбоит, думал может уровни коротят, всётаки что то с настройками юартов.
defunct
Возьмите мою инициализацию. Обратите особое внимание на порядок заправки регистров. и старший бит UCSRxC.

Цитата
UCSR1C = 0x06;

этой строчкой вы пишете в UBRRH.
Сергей Борщ
Цитата(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
west329_
Цитата(Сергей Борщ @ 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, юарт конечно на заработал но дышать стало немного легче, что найден ещё один баг.
Сергей Борщ
Цитата(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;
west329_
Всем кто помогал выражаю огромную благодарность, 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, 23:26) *
Контроллер mega162 имеет сдвоеные регистры, их аш 2.

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

А (стеняюсь спросить 05.gif ) что Вам мешало посмотреть на даташит на мегу162? Даже не на весь даташит, а на маленький раздельчик про UART. Религия не позволяла? Ведь в этом случае Вы бы решили свою суперсложную задачу в течении 15-ти секунд
IgorKossak
Цитата(Николай Иванович Приходько @ Nov 3 2008, 23:39) *
...

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