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

 
 
 
Reply to this topicStart new topic
> Atmega32 и USART
Кonstantin
сообщение Aug 11 2005, 17:13
Сообщение #1





Группа: Новичок
Сообщений: 4
Регистрация: 11-08-05
Пользователь №: 7 558



Пожалуйста подскажите как настроить USART в mega32. В 128 настраивал, в 64 настраивал, в 32 не могу понять, то ли мега не работает, то ли я?
Go to the top of the page
 
+Quote Post
Proton
сообщение Aug 11 2005, 17:23
Сообщение #2


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

Группа: Свой
Сообщений: 185
Регистрация: 3-08-05
Из: Новосибирск
Пользователь №: 7 334



Напиши как ты настраивал, слишком мало информации.


--------------------
Всяк хорошая мысля к нам приходит опосля.
Go to the top of the page
 
+Quote Post
Кonstantin
сообщение Aug 11 2005, 18:40
Сообщение #3





Группа: Новичок
Сообщений: 4
Регистрация: 11-08-05
Пользователь №: 7 558



Код
    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
Go to the top of the page
 
+Quote Post
Chupahabra
сообщение Aug 11 2005, 19:21
Сообщение #4


Участник
*

Группа: Новичок
Сообщений: 18
Регистрация: 14-07-05
Пользователь №: 6 806



Для начала, объясни что ты хочешь получить от USART'а.
Какая тактовая частота процессора?
В соответствии с ней необходимо выбрать значения UBRRH, UBRRL и бита U2X.
Зачем два раза присваеваешь значения UBRRH (да, ещё и разные)?
Самое главное в твоём куске кода
Цитата
ldi      Temp,$9c
out    UCSRB,Temp
ldi      Temp,$85           
out    UCSRC,Temp      ; в даташите

задана недопустимая (зарезервированная) длинна символа.
У тебя значение битов UCSZ2:0 равно 110 - соответствует reserved, а необходимо (наверное, не знаю на что ты расчитываешь) должно быть 011, что соответствует 8 бит.
Вроде так, если не ошибся...
Go to the top of the page
 
+Quote Post
Кonstantin
сообщение Aug 11 2005, 19:47
Сообщение #5





Группа: Новичок
Сообщений: 4
Регистрация: 11-08-05
Пользователь №: 7 558



Кварц 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       ; в даташите

вставил из примера на всякий случай.
Go to the top of the page
 
+Quote Post
Karl
сообщение Aug 12 2005, 04:10
Сообщение #6


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

Группа: Свой
Сообщений: 179
Регистрация: 4-02-05
Пользователь №: 2 429



код для меги 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);

}
Go to the top of the page
 
+Quote Post
Proton
сообщение Aug 12 2005, 04:35
Сообщение #7


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

Группа: Свой
Сообщений: 185
Регистрация: 3-08-05
Из: Новосибирск
Пользователь №: 7 334



По моему с учётом бита 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


--------------------
Всяк хорошая мысля к нам приходит опосля.
Go to the top of the page
 
+Quote Post
Кonstantin
сообщение Aug 12 2005, 05:30
Сообщение #8





Группа: Новичок
Сообщений: 4
Регистрация: 11-08-05
Пользователь №: 7 558



В том то и дело, что теоретически все должно работать. Хочу узнать
практически кто-нить пробовал? Может быть кроме URSEL еще есть нюансы?
Go to the top of the page
 
+Quote Post
Proton
сообщение Aug 12 2005, 10:46
Сообщение #9


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

Группа: Свой
Сообщений: 185
Регистрация: 3-08-05
Из: Новосибирск
Пользователь №: 7 334



Посмотри что показывает осцилограф при передаче. Если данные присутствуют посмотри по осцилографу режим работы и подкорректируй программу. А если уж данных совсем нет, попробуй смоделировать в Proteus там как раз есть Mega32 или поменяй режим.

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


--------------------
Всяк хорошая мысля к нам приходит опосля.
Go to the top of the page
 
+Quote Post
Бабай
сообщение Aug 16 2005, 08:31
Сообщение #10


Участник
*

Группа: Новичок
Сообщений: 20
Регистрация: 15-08-05
Из: Свердловск
Пользователь №: 7 634



Цитата(К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
Go to the top of the page
 
+Quote Post
triod647
сообщение Nov 30 2008, 13:35
Сообщение #11





Группа: Новичок
Сообщений: 2
Регистрация: 14-11-08
Пользователь №: 41 618



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

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


через много времени столкнулся с подобной проблеммой, делал термопринтер на меге32 собрал конструктор в дипе отладил, сделал платку под смд ни в какую, уарт, выдает, принимает мусор(но всеж выдает), оч может быть что мега запускается по умолчанию от встроенного генератора даже при подключеном кварце, 07.gif (ну эт мы проверим)
Go to the top of the page
 
+Quote Post
Nanobyte
сообщение Nov 30 2008, 15:29
Сообщение #12


За битами по регистрам гоняюсь
***

Группа: Свой
Сообщений: 457
Регистрация: 24-04-06
Из: Таганрог
Пользователь №: 16 446



Цитата(triod647 @ Nov 30 2008, 17:35) *
... в дипе отладил, сделал платку под смд ни в какую ...

А все-ли ноги GND/AGND и Vcc/AVcc в корпусе tqfp44 подсоединены?


--------------------
Курсор влево, курсор вправо - считается хакерством. FORMAT C: производится без предупреждения
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 13:23
Рейтинг@Mail.ru


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