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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Байт по RS232
Kuznec9999
сообщение May 14 2008, 15:00
Сообщение #1


Участник
*

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



Помогите. Необходимо переслать байт данных по RS232 на компьютер (например регистр R16). Как это сделать на ATMega8 на ассемблере?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 14 2008, 15:04
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Можно так:
Код
tx_byte:
    in    c, UCSRA
    sbrs    c, UDRE
    rjmp    tx_byte
    out    UDR, a
    ret
Go to the top of the page
 
+Quote Post
Kuznec9999
сообщение May 14 2008, 15:07
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 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


Ээ? И это всё? Честно говоря ожидал чего-то сложного smile.gif. А не подскажите где про эту коммуникацию AVR и ПК через RS232 можно прочитать? Спасибо.
Go to the top of the page
 
+Quote Post
Палыч
сообщение May 14 2008, 15:12
Сообщение #4


Гуру
******

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



В ДШ на mega8 есть примеры программ на языке ассемблера.
USART неабходимо инициализировать (см. пример программы USART_Init в разделе USART: USART Initialization), затем передать байт (см. пример программы USART_Transmit в разделе USART: USART Transmission) Последний пример - перeдача байта именно из регистра r16
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 14 2008, 15:13
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Kuznec9999 @ May 14 2008, 19:07) *
Ээ? И это всё? Честно говоря ожидал чего-то сложного smile.gif

Можно и сложно, но если стоит задача только передать байт, то зачем?

Да, инициализация еще нужна:
Код
    .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
Go to the top of the page
 
+Quote Post
Kuznec9999
сообщение May 14 2008, 16:47
Сообщение #6


Участник
*

Группа: Новичок
Сообщений: 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
-------------------------------------------------------------

Скажите, такая программа выведет переменную "а" на компьютер? спасибо.

Нашёл ошибку smile.gif. Отсутствие одного знака "<" ... Я уже чуть не умер в разборках в чём же дело smile.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 14 2008, 17:18
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Должна, но 1MHz не лучший выбор для 115200, если используется RC - тем более.
Go to the top of the page
 
+Quote Post
Kuznec9999
сообщение May 14 2008, 17:50
Сообщение #8


Участник
*

Группа: Новичок
Сообщений: 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... В чём дело? Спасибо.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 14 2008, 18:07
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Kuznec9999 @ May 14 2008, 21:50) *
Прекрасно выводит FF в порт... Но если передаём число, например, 0x87, то передаётся 0x07... Тоже самое с 0x88 - передаётся 0x08... В чём дело? Спасибо.

Похоже что частоты очень сильно отличаются. Я правильно понимаю, что стоит кварц (или RC?) 1MHz и скорость UART 9600? Тогда ошибка будет 7%, а должна быть не более 1.5%.
Go to the top of the page
 
+Quote Post
Kuznec9999
сообщение May 14 2008, 18:48
Сообщение #10


Участник
*

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



Цитата(aaarrr @ May 14 2008, 22:07) *
Похоже что частоты очень сильно отличаются. Я правильно понимаю, что стоит кварц (или RC?) 1MHz и скорость UART 9600? Тогда ошибка будет 7%, а должна быть не более 1.5%.

Спасибо, я об этом и не подумал даже...
Скажите, а установка бита U2X (удвоение скорости обмена) может дать результат?

Установка бита решила проблему (Дело действительно было в проценте ошибки - процент ошибки уменьшился до 0.2). Спасибо за помощь! beer.gif

Цитата(Kuznec9999 @ May 14 2008, 22:31) *
Спасибо, я об этом и не подумал даже...
Скажите, а установка бита U2X (удвоение скорости обмена) может дать результат?

Установка бита решила проблему (Дело действительно было в проценте ошибки - процент ошибки уменьшился до 0.2). Спасибо за помощь! beer.gif


Кстати, скажите, а имеется какой-либо буфер данных приёма/передачи в ATMega8?

Сообщение отредактировал Kuznec9999 - May 14 2008, 18:28
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 14 2008, 18:54
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Kuznec9999 @ May 14 2008, 22:48) *
Кстати, скажите, а имеется какой-либо буфер данных приёма/передачи в ATMega8?

Скажу: Есть UDR - по одному символу на прием и передачу.
Но в следующий раз пошлю читать даташит twak.gif
Go to the top of the page
 
+Quote Post
Kuznec9999
сообщение May 14 2008, 18:59
Сообщение #12


Участник
*

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



Цитата(aaarrr @ May 14 2008, 22:54) *
Скажу: Есть UDR - по одному символу на прием и передачу.
Но в следующий раз пошлю читать даташит twak.gif

Прошу прощения, просто в английском не очень силён, спасибо! И ещё один вопрос, для чего нужны ножки RTS и CTS? (только пожалуйста, не посылайте в даташит, т.к там ничего не нашёл). Спасибо
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 14 2008, 19:04
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Для аппаратного управления потоком - передатчик тормозить при заполнении буфера приемника выше некоторой границы.

Цитата(Kuznec9999 @ May 14 2008, 22:59) *
...просто в английском не очень силён

Для AVR были переводы даташитов, поищите. Но лучше заняться языком - для чтения технической документации не так уж много и надо.
Go to the top of the page
 
+Quote Post
Kuznec9999
сообщение May 14 2008, 19:07
Сообщение #14


Участник
*

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



Цитата(aaarrr @ May 14 2008, 23:04) *
Для аппаратного управления потоком - передатчик тормозить при заполнении буфера приемника выше некоторой границы.
Для AVR были переводы даташитов, поищите. Но лучше заняться языком - для чтения технической документации не так уж много и надо.


Спасибо! Т.е мне для передачи с МК требуется соединить TxD МК - с RxD компьютера. И землю. И всё?

Сообщение отредактировал Kuznec9999 - May 14 2008, 19:07
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 14 2008, 19:08
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Да, этого вполне достаточно. Управление потоком используется сравнительно редко.
Go to the top of the page
 
+Quote Post

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

 


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


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