как обычно: читать даташит. Для регистров "больших" МК обращение, как к порту ввода-вывода, невозможно, остается только обращение. как к ячейке памяти. т.е. командами LD (LDS) и ST (STS), а битовые операции делать уже над считанным в регистр значением.
P.S. Интересно, откуда вы взяли UCSRA для микроконтроллера atmega2561, в котором аж 2 модуля USART и нет регистра UCSRA?!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Подскажите: на 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.
В UBRR записывается делитель частоты кварца, который будет использоваться. Так что надо посчитать на сколько делить частоту МК, чтобы получить нужную(формула - Fuart = fosc/(UBRRn+1) ). Или можно посмотреть уже рассчитанные значения в таблице на странице 227 даташита.
Vov123 писал(а):Есть такая программа,CVAVR называется,там есть чудный генератор начального кода.В любой среде разработки можно использовать.
Крайне не рекомендую пользоваться всякими мастерами до того как разберёшься с программированием.
Slavast писал(а):На Atmega 2561 я выбрал baudrate - 115200.
Частота тактирования микроконтроллера 16 МГц.
Коэффициент 8 получается надо записывать в UBRRL0?.
так?
Да, коэффициент 8. И при этом получается ошибка -3,5%. А если поставить бит U2Xn в 1, то можно записать в UBRR 16 и получить ошибку 2,5%.
Vov123 писал(а):Так то оно так,только ошибка 3,7%.
Так то оно так,только ошибка 3,7%.
А от этой ошибки никуда и не деться - предделитель может делить частоту МК только на целое число. Так что либо ставить кварц с нужной частотой(для которой ошибка - 0) либо брать какой есть и читать страницу 221 в даташите, где сказано, какая ошибка допустима.
При UBRR = 0 ошибка = 0.0%. Рекомендуется использовать значения
регистра UBRR, при которых получаемая скорость передачи отличается от
требуемого значения меньше чем на 0.5%. Значения, дающие большее
отклонение также можно использовать, однако следует иметь в виду, что
при этом снижается помехозащищенность линии передачи.
Так что работать будет и с большим значением ошибки. А Atmel вообще приводит в качестве рекомендуемого диапазона +-1,5%.
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
А кто-нибудь знает, как в Ассемблере через UART вывести целую строку символов? Например фразу "Привет". Как определить символьный тип данных на переменную?
Спасибо.