UART

Обсуждаем контроллеры компании Atmel.
Ответить
Открыл глаза
Сообщения: 66
Зарегистрирован: Чт окт 21, 2010 10:05:27

Сообщение Slavast »

Доброе время суток.
Прописываю работу USART на Atmega2561 и не работает команда SBIS во вседавно известном цикле отправке байта.

; Процедура отправки байта
uart_snt: SBIS UCSRA,UDRE ; Пропуск если нет флага готовности
RJMP uart_snt ; ждем готовности - флага UDRE

OUT UDR, R16 ; шлем байт
RET ; Возврат



Выдает ошибку:
D:\Slava\Atmel\Projects\UART1\UART1.asm(67): error: Operand 1 out of range: 0xc0

Подскажите что делать?
Контактная информация:
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18785
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

как обычно: читать даташит. Для регистров "больших" МК обращение, как к порту ввода-вывода, невозможно, остается только обращение. как к ячейке памяти. т.е. командами LD (LDS) и ST (STS), а битовые операции делать уже над считанным в регистр значением.

P.S. Интересно, откуда вы взяли UCSRA для микроконтроллера atmega2561, в котором аж 2 модуля USART и нет регистра UCSRA?!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Открыл глаза
Сообщения: 66
Зарегистрирован: Чт окт 21, 2010 10:05:27

Сообщение Slavast »

Подскажите: на Atmega 2561 в UBRR0H и UBRR0H надозаписать Baudrate для UARTa. А в какой из них записывать 9600 конкретно не написано. Что делать?

• Bit 11:0 – UBRR11:0: USART Baud Rate Register
This is a 12-bit register which contains the USART baud rate. The UBRRH contains the four
most significant bits, and the UBRRL contains the eight least significant bits of the USART baud
rate. Ongoing transmissions by the Transmitter and Receiver will be corrupted if the baud rate is
changed. Writing UBRRL will trigger an immediate update of the baud rate prescaler.

Помогите.
Контактная информация:
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Сообщение Vov123 »

Есть такая программа,CVAVR называется,там есть чудный генератор начального кода.В любой среде разработки можно использовать.
Реклама
Эиком - электронные компоненты и радиодетали
Опытный кот
Сообщения: 877
Зарегистрирован: Чт фев 18, 2010 13:51:56

Сообщение Murav »

В UBRR записывается делитель частоты кварца, который будет использоваться. Так что надо посчитать на сколько делить частоту МК, чтобы получить нужную(формула - Fuart = fosc/(UBRRn+1) ). Или можно посмотреть уже рассчитанные значения в таблице на странице 227 даташита.
Vov123 писал(а):Есть такая программа,CVAVR называется,там есть чудный генератор начального кода.В любой среде разработки можно использовать.
Крайне не рекомендую пользоваться всякими мастерами до того как разберёшься с программированием.
Реклама
Открыл глаза
Сообщения: 66
Зарегистрирован: Чт окт 21, 2010 10:05:27

Сообщение Slavast »

На Atmega 2561 я выбрал baudrate - 115200.
Частота тактирования микроконтроллера 16 МГц.
Коэффициент 8 получается надо записывать в UBRRL0?.
так?
Контактная информация:
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2584
Зарегистрирован: Вт сен 14, 2010 10:27:19

Сообщение radio-kot »

Формула расчета в даташите в разделе USART
Будете проходить мимо- проходите!
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Сообщение Vov123 »

Так то оно так,только ошибка 3,7%.
Собутыльник Кота
Аватара пользователя
Сообщения: 2584
Зарегистрирован: Вт сен 14, 2010 10:27:19

Сообщение radio-kot »

Мастер CVAVR сразу показывает ошибку и если она недопустимо велика то подсвечивает ее КРАСНЫМ цветом.
Будете проходить мимо- проходите!
Опытный кот
Сообщения: 877
Зарегистрирован: Чт фев 18, 2010 13:51:56

Сообщение Murav »

Slavast писал(а):На Atmega 2561 я выбрал baudrate - 115200.
Частота тактирования микроконтроллера 16 МГц.
Коэффициент 8 получается надо записывать в UBRRL0?.
так?
Да, коэффициент 8. И при этом получается ошибка -3,5%. А если поставить бит U2Xn в 1, то можно записать в UBRR 16 и получить ошибку 2,5%.
Vov123 писал(а):Так то оно так,только ошибка 3,7%.
Так то оно так,только ошибка 3,7%.
А от этой ошибки никуда и не деться - предделитель может делить частоту МК только на целое число. Так что либо ставить кварц с нужной частотой(для которой ошибка - 0) либо брать какой есть и читать страницу 221 в даташите, где сказано, какая ошибка допустима.
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Сообщение Vov123 »

Допустимая ошибка - 0,5%
Опытный кот
Сообщения: 877
Зарегистрирован: Чт фев 18, 2010 13:51:56

Сообщение Murav »

Vov123 писал(а):Допустимая ошибка - 0,5%
Это откуда такие сведения?
В даташите сказано, что допустимая - +3,9%/-4%. А рекомендуемая - не более +-1,5% (это для U2Xn=1 и 8 бит данных).
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Сообщение Vov123 »

А.В.Евстифеев "Микроконтроллеры AVR семейств Tiny и Mega фирмы ATMEL" стр.336 1-й абзац.Использую бумажную версию.
Опытный кот
Сообщения: 877
Зарегистрирован: Чт фев 18, 2010 13:51:56

Сообщение Murav »

Там сказано:
При UBRR = 0 ошибка = 0.0%. Рекомендуется использовать значения
регистра UBRR, при которых получаемая скорость передачи отличается от
требуемого значения меньше чем на 0.5%. Значения, дающие большее
отклонение также можно использовать, однако следует иметь в виду, что
при этом снижается помехозащищенность линии передачи.
Так что работать будет и с большим значением ошибки. А Atmel вообще приводит в качестве рекомендуемого диапазона +-1,5%.
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Сообщение Vov123 »

С праздником ВОСР!!!
Открыл глаза
Сообщения: 66
Зарегистрирован: Чт окт 21, 2010 10:05:27

Сообщение Slavast »

UART заработал!!
Но теперь вместо одного символа контроллер Atmega 2561 выводит мне в терминал бесконечный цикл этих символов. Без главного цикла все равно выводит миллион повторений того, что я нажму.
Вопрос - нужно ли здесь прерывания и какой их тогда будет смысл?
Заранее, низкий поклон!!

Главная программа у меня вот:



;-------Посылка байта----------

uart_rcv: lds r19, UCSR0A
SBRS r19,UDRE0 ; Пропуск если нет флага готовности,
RJMP uart_rcv ; вращаясь в цикле
lds R16,UDR0 ; байт пришел - забираем.
RET ; Выходим. Результат в R16


;-------Процедура отправки байта-------


uart_snt: lds r17, UCSR0A
SBRS r17,UDRE0 ; Пропуск если нет флага готовности,
; если 1 - то готов отправлять данные
RJMP uart_snt ; ждем готовности - флага UDRE
sts UDR0, R16 ; шлем байт 01010101 в UDR
RET ; Возврат


;------ Главный цикл --------


Main:
RCALL uart_rcv ; Ждем байта
INC R16 ; Делаем с ним что-то
RCALL uart_snt ; Отправляем обратно.
out PORTB, r18
JMP Main
Контактная информация:
Открыл глаза
Сообщения: 66
Зарегистрирован: Чт окт 21, 2010 10:05:27

Сообщение Slavast »

Все работает!!!!!
На приём надо проверять бит RXC0, а не UDRE0!!!
Контактная информация:
Открыл глаза
Сообщения: 66
Зарегистрирован: Чт окт 21, 2010 10:05:27

Сообщение Slavast »

А кто-нибудь знает, как в Ассемблере через UART вывести целую строку символов? Например фразу "Привет". Как определить символьный тип данных на переменную?
Спасибо.
Контактная информация:
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Сообщение Vov123 »

что-то типа этого
loop:
....

ldi ZL,words*2
rcall твоя программа вывода символов на UART
...

rjmp loop

words: .db Привет,0

Я хотел спросить,ты,в будущем,когда-нибудь,собираешься meg-у 256 заполнить asm-ом?
Открыл глаза
Сообщения: 66
Зарегистрирован: Чт окт 21, 2010 10:05:27

Сообщение Slavast »

Я пишу пока только на Ассемблере!
Контактная информация:
Ответить

Вернуться в «AVR»