UART
Ошибка чтения UART?
Доброе время суток.
Прописываю работу 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
Подскажите что делать?
Прописываю работу 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?
как обычно: читать даташит. Для регистров "больших" МК обращение, как к порту ввода-вывода, невозможно, остается только обращение. как к ячейке памяти. т.е. командами LD (LDS) и ST (STS), а битовые операции делать уже над считанным в регистр значением.
P.S. Интересно, откуда вы взяли UCSRA для микроконтроллера atmega2561, в котором аж 2 модуля USART и нет регистра UCSRA?!
P.S. Интересно, откуда вы взяли UCSRA для микроконтроллера atmega2561, в котором аж 2 модуля USART и нет регистра UCSRA?!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
UART
Подскажите: на 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.
Помогите.
• 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
Есть такая программа,CVAVR называется,там есть чудный генератор начального кода.В любой среде разработки можно использовать.
Re: UART
В UBRR записывается делитель частоты кварца, который будет использоваться. Так что надо посчитать на сколько делить частоту МК, чтобы получить нужную(формула - Fuart = fosc/(UBRRn+1) ). Или можно посмотреть уже рассчитанные значения в таблице на странице 227 даташита.
Крайне не рекомендую пользоваться всякими мастерами до того как разберёшься с программированием.Vov123 писал(а):Есть такая программа,CVAVR называется,там есть чудный генератор начального кода.В любой среде разработки можно использовать.
- Реклама
Re: UART
На Atmega 2561 я выбрал baudrate - 115200.
Частота тактирования микроконтроллера 16 МГц.
Коэффициент 8 получается надо записывать в UBRRL0?.
так?
Частота тактирования микроконтроллера 16 МГц.
Коэффициент 8 получается надо записывать в UBRRL0?.
так?
Re: UART
Так то оно так,только ошибка 3,7%.
Re: UART
Мастер CVAVR сразу показывает ошибку и если она недопустимо велика то подсвечивает ее КРАСНЫМ цветом.
Будете проходить мимо- проходите!
Re: UART
Да, коэффициент 8. И при этом получается ошибка -3,5%. А если поставить бит U2Xn в 1, то можно записать в UBRR 16 и получить ошибку 2,5%.Slavast писал(а):На Atmega 2561 я выбрал baudrate - 115200.
Частота тактирования микроконтроллера 16 МГц.
Коэффициент 8 получается надо записывать в UBRRL0?.
так?
А от этой ошибки никуда и не деться - предделитель может делить частоту МК только на целое число. Так что либо ставить кварц с нужной частотой(для которой ошибка - 0) либо брать какой есть и читать страницу 221 в даташите, где сказано, какая ошибка допустима.Vov123 писал(а):Так то оно так,только ошибка 3,7%.
Так то оно так,только ошибка 3,7%.
Re: UART
Допустимая ошибка - 0,5%
Re: UART
Это откуда такие сведения?Vov123 писал(а):Допустимая ошибка - 0,5%
В даташите сказано, что допустимая - +3,9%/-4%. А рекомендуемая - не более +-1,5% (это для U2Xn=1 и 8 бит данных).
Re: UART
А.В.Евстифеев "Микроконтроллеры AVR семейств Tiny и Mega фирмы ATMEL" стр.336 1-й абзац.Использую бумажную версию.
Re: UART
Там сказано:
Так что работать будет и с большим значением ошибки. А Atmel вообще приводит в качестве рекомендуемого диапазона +-1,5%.При UBRR = 0 ошибка = 0.0%. Рекомендуется использовать значения
регистра UBRR, при которых получаемая скорость передачи отличается от
требуемого значения меньше чем на 0.5%. Значения, дающие большее
отклонение также можно использовать, однако следует иметь в виду, что
при этом снижается помехозащищенность линии передачи.
Re: UART
С праздником ВОСР!!!
Re: UART
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
Но теперь вместо одного символа контроллер 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
Все работает!!!!!
На приём надо проверять бит RXC0, а не UDRE0!!!
На приём надо проверять бит RXC0, а не UDRE0!!!
UART
А кто-нибудь знает, как в Ассемблере через UART вывести целую строку символов? Например фразу "Привет". Как определить символьный тип данных на переменную?
Спасибо.
Спасибо.
Re: UART
что-то типа этого
loop:
....
ldi ZL,words*2
rcall твоя программа вывода символов на UART
...
rjmp loop
words: .db Привет,0
Я хотел спросить,ты,в будущем,когда-нибудь,собираешься meg-у 256 заполнить asm-ом?
loop:
....
ldi ZL,words*2
rcall твоя программа вывода символов на UART
...
rjmp loop
words: .db Привет,0
Я хотел спросить,ты,в будущем,когда-нибудь,собираешься meg-у 256 заполнить asm-ом?
Re: UART
Я пишу пока только на Ассемблере!


