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

|
Пожалуйста подскажите как настроить USART в mega32. В 128 настраивал, в 64 настраивал, в 32 не могу понять, то ли мега не работает, то ли я?
|
|
|
|
|
Aug 11 2005, 18:40
|
Группа: Новичок
Сообщений: 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
|
|
|
|
|
Aug 11 2005, 19:21
|
Участник

Группа: Новичок
Сообщений: 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 бит. Вроде так, если не ошибся...
|
|
|
|
|
Aug 11 2005, 19:47
|
Группа: Новичок
Сообщений: 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 ; в даташите вставил из примера на всякий случай.
|
|
|
|
|
Aug 12 2005, 04:35
|

Частый гость
 
Группа: Свой
Сообщений: 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
--------------------
Всяк хорошая мысля к нам приходит опосля.
|
|
|
|
|
Aug 12 2005, 05:30
|
Группа: Новичок
Сообщений: 4
Регистрация: 11-08-05
Пользователь №: 7 558

|
В том то и дело, что теоретически все должно работать. Хочу узнать практически кто-нить пробовал? Может быть кроме URSEL еще есть нюансы?
|
|
|
|
|
Aug 16 2005, 08:31
|
Участник

Группа: Новичок
Сообщений: 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
|
|
|
|
|
Nov 30 2008, 13:35
|
Группа: Новичок
Сообщений: 2
Регистрация: 14-11-08
Пользователь №: 41 618

|
Цитата(Proton @ Aug 12 2005, 13:46)  Посмотри что показывает осцилограф при передаче. Если данные присутствуют посмотри по осцилографу режим работы и подкорректируй программу. А если уж данных совсем нет, попробуй смоделировать в Proteus там как раз есть Mega32 или поменяй режим.
P.S. Убедись что процессор вообще работает. через много времени столкнулся с подобной проблеммой, делал термопринтер на меге32 собрал конструктор в дипе отладил, сделал платку под смд ни в какую, уарт, выдает, принимает мусор(но всеж выдает), оч может быть что мега запускается по умолчанию от встроенного генератора даже при подключеном кварце,  (ну эт мы проверим)
|
|
|
|
|
Nov 30 2008, 15:29
|

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

|
Цитата(triod647 @ Nov 30 2008, 17:35)  ... в дипе отладил, сделал платку под смд ни в какую ... А все-ли ноги GND/AGND и Vcc/AVcc в корпусе tqfp44 подсоединены?
--------------------
Курсор влево, курсор вправо - считается хакерством. FORMAT C: производится без предупреждения
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|