Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Atmega32 и USART
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Кonstantin
Пожалуйста подскажите как настроить USART в mega32. В 128 настраивал, в 64 настраивал, в 32 не могу понять, то ли мега не работает, то ли я?
Proton
Напиши как ты настраивал, слишком мало информации.
Кonstantin
Код
    ldi      Temp,$9c
    out     UCSRB,Temp
    ldi      Temp,2
    out     UBRRH,Temp       ; так указано
    ldi      Temp,$85            
    out     UCSRC,Temp       ; в даташите
    ldi      Temp,0
    out     UCSRA,Temp
    ldi     Temp,51
    out     UBRRL,Temp
    ldi     Temp,0
    out     UBRRH,Temp
Chupahabra
Для начала, объясни что ты хочешь получить от USART'а.
Какая тактовая частота процессора?
В соответствии с ней необходимо выбрать значения UBRRH, UBRRL и бита U2X.
Зачем два раза присваеваешь значения UBRRH (да, ещё и разные)?
Самое главное в твоём куске кода
Цитата
ldi      Temp,$9c
out    UCSRB,Temp
ldi      Temp,$85           
out    UCSRC,Temp      ; в даташите

задана недопустимая (зарезервированная) длинна символа.
У тебя значение битов UCSZ2:0 равно 110 - соответствует reserved, а необходимо (наверное, не знаю на что ты расчитываешь) должно быть 011, что соответствует 8 бит.
Вроде так, если не ошибся...
Кonstantin
Кварц 16.000.
Скорость 19200.
Длинна 9 бит.
На 64 работало так
(перевод с 64 на 32)

Код
ldi     Temp,51
    out     UBRRL,Temp
    ldi     Temp,0
    out     UBRRH,Temp
    ldi     Temp,$9c
    out     UCSRB,Temp
    ldi     Temp,$6
    out     UCSRC,Temp
    ldi     Temp,0
    out     UCSRA,Temp

Прошу прощения за
Цитата
ldi     Temp,$5
out     UCSRC,Temp

исправил, все равно не фурычит.
Цитата
ldi      Temp,2
out     UBRRH,Temp       ; так указано
ldi      Temp,$85            
out     UCSRC,Temp       ; в даташите

вставил из примера на всякий случай.
Karl
код для меги 32:

#define F_CPU 16000000 //частота кварца
#define UART_BAUD_RATE 115200 //скорость передачи
#define UART_BAUD_SELECT 8//(F_CPU/(UART_BAUD_RATE*16)-1)


/*
Инициализация UART. Разрешение прерывания по приему,
разрешение приемника, разрешение передатчика. 8 бит.
*/

void init_UART0()
{
outp(1<<RXCIE|1<<RXEN|1<<TXEN,UCSRB);
outp((UART_BAUD_SELECT&0xf00)>>8,UBRRH);
outp(UART_BAUD_SELECT&0xff,UBRRL);

}
Proton
По моему с учётом бита URSEL режим 9бит, 19200, 16МГц надо инициализировать так:

ldi Temp,51
out UBRRL,Temp
ldi Temp,0
out UBRRH,Temp

ldi Temp,$9c
out UCSRB,Temp

ldi Temp,$86
out UCSRC,Temp
ldi Temp,0
out UCSRA,Temp
Кonstantin
В том то и дело, что теоретически все должно работать. Хочу узнать
практически кто-нить пробовал? Может быть кроме URSEL еще есть нюансы?
Proton
Посмотри что показывает осцилограф при передаче. Если данные присутствуют посмотри по осцилографу режим работы и подкорректируй программу. А если уж данных совсем нет, попробуй смоделировать в Proteus там как раз есть Mega32 или поменяй режим.

P.S. Убедись что процессор вообще работает.
Бабай
Цитата(Кonstantin @ Aug 12 2005, 08:30)
В том то и дело, что теоретически все должно работать. Хочу узнать
практически кто-нить пробовал? Может быть кроме URSEL еще есть нюансы?
*


void Set_USART()
{
//UDR-USART I/O Data Register
//UCSRA=0x00;//(7)-USART Receive Complete Flag
//(6)-USART Transmit Complete Flag
//(5)-USART Data Register Empty Flag
//(4)-Frame Error
//(3)-Data OverRun
//(2)-Parity Error
//(1)-Double USART Transmission Speed
//(0)-Multi-Processor Communication Mode
UCSRB=0x18;//(7)-RX Complete Interrupt Enable
//(6)-TX Complete Interrupt Enable
//(5)-Data Register Empty Interrupt Enable
//(4)-Receiver Enable
//(3)-Transmitter Enable
//(2)-(UCSZ2):Character Size(with UCSZ1:0)
//(1)-Receive Data Bit 8
//(0)-Transmit Data Bit 8
UCSRC=0x86;//(7)(URSEL)-Register Select(=1 if write to UCSRC)
//(6)-Mode Select
//(5,4)-Parity Mode
//(3)-Stop Bit Select
//(2,1)-(UCSZ1:0)-Character Size
//(0)-Clock Polarity
UBRRH=0x00;//Baud Rate Registers(8->4bit(3:0),(7)-URSEL)
UBRRL=12;//(38,4kHz/0,16%)Baud Rate Registers(8bit)
}

void TransmitDataUart(char D)
{
while(!(UCSRA&0x20));//wait Data Register Empty
UDR=D;
}


попробуй у меня это работает в IARе и в WinAVR
triod647
Цитата(Proton @ Aug 12 2005, 13:46) *
Посмотри что показывает осцилограф при передаче. Если данные присутствуют посмотри по осцилографу режим работы и подкорректируй программу. А если уж данных совсем нет, попробуй смоделировать в Proteus там как раз есть Mega32 или поменяй режим.

P.S. Убедись что процессор вообще работает.


через много времени столкнулся с подобной проблеммой, делал термопринтер на меге32 собрал конструктор в дипе отладил, сделал платку под смд ни в какую, уарт, выдает, принимает мусор(но всеж выдает), оч может быть что мега запускается по умолчанию от встроенного генератора даже при подключеном кварце, 07.gif (ну эт мы проверим)
Nanobyte
Цитата(triod647 @ Nov 30 2008, 17:35) *
... в дипе отладил, сделал платку под смд ни в какую ...

А все-ли ноги GND/AGND и Vcc/AVcc в корпусе tqfp44 подсоединены?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.