|
Байт по RS232 |
|
|
|
May 14 2008, 15:00
|
Участник

Группа: Новичок
Сообщений: 47
Регистрация: 29-04-08
Пользователь №: 37 157

|
Помогите. Необходимо переслать байт данных по RS232 на компьютер (например регистр R16). Как это сделать на ATMega8 на ассемблере?
|
|
|
|
|
May 14 2008, 15:07
|
Участник

Группа: Новичок
Сообщений: 47
Регистрация: 29-04-08
Пользователь №: 37 157

|
Цитата(aaarrr @ May 14 2008, 19:04)  Можно так: Код tx_byte: in c, UCSRA sbrs c, UDRE rjmp tx_byte out UDR, a ret Ээ? И это всё? Честно говоря ожидал чего-то сложного  . А не подскажите где про эту коммуникацию AVR и ПК через RS232 можно прочитать? Спасибо.
|
|
|
|
|
May 14 2008, 15:13
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Kuznec9999 @ May 14 2008, 19:07)  Ээ? И это всё? Честно говоря ожидал чего-то сложного  Можно и сложно, но если стоит задача только передать байт, то зачем? Да, инициализация еще нужна: Код .equ fck = 7372800; Частота кварца .equ ubrv = (fck/(16*115200))-1; 115200 - битовая скорость UART
.def a = r16 .def c = r17
uart_ini: ldi a, low(ubrv) out UBRRL, a ldi a, high(ubrv) out UBRRH, a ldi a, 0x00 out UCSRA, a ldi a, (1<<RXEN) | (1<<TXEN) out UCSRB, a ldi a, (1<URSEL) | (1<<UCSZ1) | (1<<UCSZ0) out UCSRC, a ret
|
|
|
|
|
May 14 2008, 16:47
|
Участник

Группа: Новичок
Сообщений: 47
Регистрация: 29-04-08
Пользователь №: 37 157

|
Цитата(aaarrr @ May 14 2008, 19:13)  Можно и сложно, но если стоит задача только передать байт, то зачем? Да, инициализация еще нужна: Код .equ fck = 7372800; Частота кварца .equ ubrv = (fck/(16*115200))-1; 115200 - битовая скорость UART
.def a = r16 .def c = r17
uart_ini: ldi a, low(ubrv) out UBRRL, a ldi a, high(ubrv) out UBRRH, a ldi a, 0x00 out UCSRA, a ldi a, (1<<RXEN) | (1<<TXEN) out UCSRB, a ldi a, (1<URSEL) | (1<<UCSZ1) | (1<<UCSZ0) out UCSRC, a ret ------------------------------------------------------ .include "c:\asm\AvrAssembler2\Appnotes\m8def.inc" .equ fck = 1000000; Частота кварца .equ ubrv = (fck/(16*115200))-1; 115200 - битовая скорость UART .def a = r16 .def c = r17 ldi r20,0b11111111 out ddrd,r20 ldi a, low(ubrv) out UBRRL, a ldi a, high(ubrv) out UBRRH, a ldi a, 0x00 out UCSRA, a ldi a, (1<<RXEN) | (1<<TXEN) out UCSRB, a ldi a, (1<URSEL) | (1<<UCSZ1) | (1<<UCSZ0) out UCSRC, a ldi a,0b10101010 qwe: tx_byte: in c, UCSRA sbrs c, UDRE rjmp tx_byte out UDR, a rjmp qwe ------------------------------------------------------------- Скажите, такая программа выведет переменную "а" на компьютер? спасибо. Нашёл ошибку  . Отсутствие одного знака "<" ... Я уже чуть не умер в разборках в чём же дело
|
|
|
|
|
May 14 2008, 17:50
|
Участник

Группа: Новичок
Сообщений: 47
Регистрация: 29-04-08
Пользователь №: 37 157

|
Цитата(aaarrr @ May 14 2008, 21:18)  Должна, но 1MHz не лучший выбор для 115200, если используется RC - тем более. Пожалуйста, помогите мне с этим: ------------------------- .include "c:\asm\AvrAssembler2\Appnotes\m8def.inc" ldi r16,0b00000000 out ucsra,r16 ldi r16,0b00001000 out ucsrb,r16 ldi r16,0b10000110 out ucsrc,r16 ldi r16,0b00000110 out ubrrl,r16 ldi r16,0b00000000 out ubrrh,r16 ldi r16,0xFF qwe: sbis ucsra,udre rjmp qwe out udr,r16 ret ------------------ Прекрасно выводит FF в порт... Но если передаём число, например, 0x87, то передаётся 0x07... Тоже самое с 0x88 - передаётся 0x08... В чём дело? Спасибо.
|
|
|
|
|
May 14 2008, 18:48
|
Участник

Группа: Новичок
Сообщений: 47
Регистрация: 29-04-08
Пользователь №: 37 157

|
Цитата(aaarrr @ May 14 2008, 22:07)  Похоже что частоты очень сильно отличаются. Я правильно понимаю, что стоит кварц (или RC?) 1MHz и скорость UART 9600? Тогда ошибка будет 7%, а должна быть не более 1.5%. Спасибо, я об этом и не подумал даже... Скажите, а установка бита U2X (удвоение скорости обмена) может дать результат? Установка бита решила проблему (Дело действительно было в проценте ошибки - процент ошибки уменьшился до 0.2). Спасибо за помощь!  Цитата(Kuznec9999 @ May 14 2008, 22:31)  Спасибо, я об этом и не подумал даже... Скажите, а установка бита U2X (удвоение скорости обмена) может дать результат? Установка бита решила проблему (Дело действительно было в проценте ошибки - процент ошибки уменьшился до 0.2). Спасибо за помощь!  Кстати, скажите, а имеется какой-либо буфер данных приёма/передачи в ATMega8?
Сообщение отредактировал Kuznec9999 - May 14 2008, 18:28
|
|
|
|
|
May 14 2008, 18:59
|
Участник

Группа: Новичок
Сообщений: 47
Регистрация: 29-04-08
Пользователь №: 37 157

|
Цитата(aaarrr @ May 14 2008, 22:54)  Скажу: Есть UDR - по одному символу на прием и передачу. Но в следующий раз пошлю читать даташит  Прошу прощения, просто в английском не очень силён, спасибо! И ещё один вопрос, для чего нужны ножки RTS и CTS? (только пожалуйста, не посылайте в даташит, т.к там ничего не нашёл). Спасибо
|
|
|
|
|
May 14 2008, 19:07
|
Участник

Группа: Новичок
Сообщений: 47
Регистрация: 29-04-08
Пользователь №: 37 157

|
Цитата(aaarrr @ May 14 2008, 23:04)  Для аппаратного управления потоком - передатчик тормозить при заполнении буфера приемника выше некоторой границы. Для AVR были переводы даташитов, поищите. Но лучше заняться языком - для чтения технической документации не так уж много и надо. Спасибо! Т.е мне для передачи с МК требуется соединить TxD МК - с RxD компьютера. И землю. И всё?
Сообщение отредактировал Kuznec9999 - May 14 2008, 19:07
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|