реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> UART не запскается, Ошибка команды SBIS на Atmega 2561
Slavast
сообщение Nov 2 2010, 11:08
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 81
Регистрация: 25-10-10
Пользователь №: 60 395



Доброе время суток.
Прописываю работу 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

Подскажите что делать?
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Nov 2 2010, 11:11
Сообщение #2


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(Slavast @ Nov 2 2010, 14:08) *
Выдает ошибку:
D:\Slava\Atmel\Projects\UART1\UART1.asm(67): error: Operand 1 out of range: 0xc0

Подскажите что делать?

Ну сколько уже раз говорено (и в даташите, кстати, есть, хоть и невнятно, в сносках к примерам с sbis/sbic) - раз регистры UART недоступны по in/out/sbi/cbi/sbis/sbic, используйте lds/sts. Ну да, рабочий регистр потребуется...
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Nov 2 2010, 11:15
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(Slavast @ Nov 2 2010, 14:08) *
Доброе время суток.
Подскажите что делать?


Uart_snt:
lds temp, UCSRA
sbis temp,UDRE
rjmp Uart_snt


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
Slavast
сообщение Nov 2 2010, 11:18
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 81
Регистрация: 25-10-10
Пользователь №: 60 395



Аа!
Век учись - на свои же грабли наступай!
Спасибо огромное!
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Nov 2 2010, 11:27
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(Slavast @ Nov 2 2010, 14:18) *
Аа!
Век учись - на свои же грабли наступай!
Спасибо огромное!

И учитывайте , что первый байт , проскакивает сразу в сдвиговый регистр и только 2-ой "задерживается" в буфере. Это к тому, что если после отсылки первго , Вам надо что-то принять.


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
Slavast
сообщение Nov 2 2010, 11:30
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 81
Регистрация: 25-10-10
Пользователь №: 60 395



Цитата(ILYAUL @ Nov 2 2010, 15:27) *
И учитывайте , что первый байт , проскакивает сразу в сдвиговый регистр и только 2-ой "задерживается" в буфере. Это к тому, что если после отсылки первго , Вам надо что-то принять.



В смысле - если я после отсылки первого байта ничего не приму, то я не увижу свой изначально отправленный байт?
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Nov 2 2010, 12:08
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(Slavast @ Nov 2 2010, 14:30) *
В смысле - если я после отсылки первого байта ничего не приму, то я не увижу свой изначально отправленный байт?

Всё зависит от Вашей скорости пердачи и приёма информации и Вашей программы . Т.е успеваете Вы переключатся между приёмом и передачей


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
Slavast
сообщение Nov 3 2010, 08:42
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 81
Регистрация: 25-10-10
Пользователь №: 60 395



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

• 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.
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Nov 3 2010, 09:01
Сообщение #9


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(Slavast @ Nov 3 2010, 11:42) *
Подскажите: в UBRR0H и UBRR0H надозаписать Baudrate для UARTa. А в какой из них записывать конкретно не написано. Что делать?

Там же все черным по белому сказано - 12-разрядный, в UBRR0H старшие четыре (остальные незначащие, нули), в UBRR0L - младшие восемь. Первым должен записываться старший, после записи младшего будут обновлены оба регистра.
Go to the top of the page
 
+Quote Post
Slavast
сообщение Nov 3 2010, 09:43
Сообщение #10


Частый гость
**

Группа: Участник
Сообщений: 81
Регистрация: 25-10-10
Пользователь №: 60 395



Т.е чтоб настроить UART на Baudrate = 115200
мне надо записать

ldi R16, 0x08 ; Baudrate = 115200
sts UBRR0H,R16 ;
ldi R16, 0x00 ;
sts UBRR0L,R16 ;

Т.е. мое число попадет получается только в UBBR0H? а в UBRR0L - попадет 0x00?
Так что ли?
Go to the top of the page
 
+Quote Post
Палыч
сообщение Nov 3 2010, 09:46
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Slavast @ Nov 3 2010, 11:42) *
Что делать?
Обратите внимание, что важен порядок записи в эти регистры: сначала старшую часть - в UBRR0H; затем младшую - в UBRR0L. Если программируете на С, то можно со всем этим не заморачиваться: оба этих регистра (старшая часть делителя и младший байт) объединены в один, который имеет идентификатор UBRR0. При этом запись делителя DIVISOR в регистры UBRR0H и UBRR0L с нужным порядком сделает за Вас транслятор:
Код
UBRR0= DIVISOR;
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Nov 3 2010, 09:48
Сообщение #12


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(Slavast @ Nov 3 2010, 12:43) *
Т.е. мое число попадет получается только в UBBR0H? а в UBRR0L - попадет 0x00?
Так что ли?

Нет, конечно. Делитель для 115200 (при тактовой 7.3728 MHz и U2X) равен 7 (а не 8 !). Соответственно, в UBRR0L должно быть записано 7, а в UBRR0H - 0 (в старший байт обычно ноль, за исключением совсем низких скоростей).
Go to the top of the page
 
+Quote Post
Slavast
сообщение Nov 3 2010, 10:01
Сообщение #13


Частый гость
**

Группа: Участник
Сообщений: 81
Регистрация: 25-10-10
Пользователь №: 60 395



Я работаю на ATmega 2561 с 16 Мгц частотой и U2X=0.
Высчитал вроде Baudrate=8.
А что вначале записывать - UBRR0H или UBRR0L? Есть принципиальное отдичие?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 3 2010, 10:12
Сообщение #14


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Slavast @ Nov 3 2010, 13:01) *
А что вначале записывать - UBRR0H или UBRR0L? Есть принципиальное отдичие?
Вот интересно, вы ответы принципиально не читаете?
Цитата(rx3apf @ Nov 3 2010, 12:01) *
Первым должен записываться старший, после записи младшего будут обновлены оба регистра.

Цитата(Палыч @ Nov 3 2010, 12:46) *
Обратите внимание, что важен порядок записи в эти регистры: сначала старшую часть - в UBRR0H; затем младшую - в UBRR0L.





--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Nov 3 2010, 10:37
Сообщение #15


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Чукча не читатель, Чукча - писатель:-)


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 5th July 2025 - 07:06
Рейтинг@Mail.ru


Страница сгенерированна за 0.01493 секунд с 7
ELECTRONIX ©2004-2016