UART

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

Ошибка чтения UART?

Сообщение 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
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Ошибка чтения UART?

Сообщение ARV »

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

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

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

UART

Сообщение 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.

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

Re: UART

Сообщение Vov123 »

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

Re: UART

Сообщение Murav »

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

Re: UART

Сообщение Slavast »

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

Re: UART

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

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

Re: UART

Сообщение Vov123 »

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

Re: UART

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

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

Re: UART

Сообщение 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 в даташите, где сказано, какая ошибка допустима.
Vov123
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Re: UART

Сообщение Vov123 »

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

Re: UART

Сообщение Murav »

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

Re: UART

Сообщение Vov123 »

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

Re: UART

Сообщение Murav »

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

Re: UART

Сообщение Vov123 »

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

Re: UART

Сообщение 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
Slavast
Открыл глаза
Сообщения: 66
Зарегистрирован: Чт окт 21, 2010 10:05:27
Контактная информация:

Re: UART

Сообщение Slavast »

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

UART

Сообщение Slavast »

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

Re: UART

Сообщение Vov123 »

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

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

rjmp loop

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

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

Re: UART

Сообщение Slavast »

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

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