Страница 1 из 2
Ошибка чтения UART?
Добавлено: Вт ноя 02, 2010 13:59:20
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
Подскажите что делать?
Re: Ошибка чтения UART?
Добавлено: Вт ноя 02, 2010 17:14:00
ARV
как обычно: читать даташит. Для регистров "больших" МК обращение, как к порту ввода-вывода, невозможно, остается только обращение. как к ячейке памяти. т.е. командами LD (LDS) и ST (STS), а битовые операции делать уже над считанным в регистр значением.
P.S. Интересно, откуда вы взяли UCSRA для микроконтроллера atmega2561, в котором аж 2 модуля USART и нет регистра UCSRA?!
UART
Добавлено: Ср ноя 03, 2010 11:51:32
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.
Помогите.
Re: UART
Добавлено: Ср ноя 03, 2010 11:58:26
Vov123
Есть такая программа,CVAVR называется,там есть чудный генератор начального кода.В любой среде разработки можно использовать.
Re: UART
Добавлено: Ср ноя 03, 2010 12:10:56
Murav
В UBRR записывается делитель частоты кварца, который будет использоваться. Так что надо посчитать на сколько делить частоту МК, чтобы получить нужную(формула - Fuart = fosc/(UBRRn+1) ). Или можно посмотреть уже рассчитанные значения в таблице на странице 227 даташита.
Vov123 писал(а):Есть такая программа,CVAVR называется,там есть чудный генератор начального кода.В любой среде разработки можно использовать.
Крайне не рекомендую пользоваться всякими мастерами до того как разберёшься с программированием.
Re: UART
Добавлено: Ср ноя 03, 2010 16:15:11
Slavast
На Atmega 2561 я выбрал baudrate - 115200.
Частота тактирования микроконтроллера 16 МГц.
Коэффициент 8 получается надо записывать в UBRRL0?.
так?
Re: UART
Добавлено: Ср ноя 03, 2010 16:24:21
radio-kot
Формула расчета в даташите в разделе USART
Re: UART
Добавлено: Ср ноя 03, 2010 16:41:34
Vov123
Так то оно так,только ошибка 3,7%.
Re: UART
Добавлено: Ср ноя 03, 2010 16:44:30
radio-kot
Мастер CVAVR сразу показывает ошибку и если она недопустимо велика то подсвечивает ее КРАСНЫМ цветом.
Re: UART
Добавлено: Ср ноя 03, 2010 17:30:18
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 в даташите, где сказано, какая ошибка допустима.
Re: UART
Добавлено: Чт ноя 04, 2010 01:25:17
Vov123
Допустимая ошибка - 0,5%
Re: UART
Добавлено: Чт ноя 04, 2010 12:12:38
Murav
Vov123 писал(а):Допустимая ошибка - 0,5%
Это откуда такие сведения?
В даташите сказано, что допустимая - +3,9%/-4%. А рекомендуемая - не более +-1,5% (это для U2Xn=1 и 8 бит данных).
Re: UART
Добавлено: Чт ноя 04, 2010 12:57:49
Vov123
А.В.Евстифеев "Микроконтроллеры AVR семейств Tiny и Mega фирмы ATMEL" стр.336 1-й абзац.Использую бумажную версию.
Re: UART
Добавлено: Чт ноя 04, 2010 13:35:56
Murav
Там сказано:
При UBRR = 0 ошибка = 0.0%. Рекомендуется использовать значения
регистра UBRR, при которых получаемая скорость передачи отличается от
требуемого значения меньше чем на 0.5%. Значения, дающие большее
отклонение также можно использовать, однако следует иметь в виду, что
при этом снижается помехозащищенность линии передачи.
Так что работать будет и с большим значением ошибки. А Atmel вообще приводит в качестве рекомендуемого диапазона +-1,5%.
Re: UART
Добавлено: Чт ноя 04, 2010 13:43:09
Vov123
С праздником ВОСР!!!
Re: UART
Добавлено: Пт ноя 05, 2010 12:07:08
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
Re: UART
Добавлено: Пт ноя 05, 2010 12:53:54
Slavast
Все работает!!!!!
На приём надо проверять бит RXC0, а не UDRE0!!!
UART
Добавлено: Пт ноя 05, 2010 14:59:48
Slavast
А кто-нибудь знает, как в Ассемблере через UART вывести целую строку символов? Например фразу "Привет". Как определить символьный тип данных на переменную?
Спасибо.
Re: UART
Добавлено: Пт ноя 05, 2010 15:37:51
Vov123
что-то типа этого
loop:
....
ldi ZL,words*2
rcall твоя программа вывода символов на UART
...
rjmp loop
words: .db Привет,0
Я хотел спросить,ты,в будущем,когда-нибудь,собираешься meg-у 256 заполнить asm-ом?
Re: UART
Добавлено: Пт ноя 05, 2010 15:42:28
Slavast
Я пишу пока только на Ассемблере!