Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Байт по RS232
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
Kuznec9999
Помогите. Необходимо переслать байт данных по RS232 на компьютер (например регистр R16). Как это сделать на ATMega8 на ассемблере?
aaarrr
Можно так:
Код
tx_byte:
    in    c, UCSRA
    sbrs    c, UDRE
    rjmp    tx_byte
    out    UDR, a
    ret
Kuznec9999
Цитата(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 можно прочитать? Спасибо.
Палыч
В ДШ на mega8 есть примеры программ на языке ассемблера.
USART неабходимо инициализировать (см. пример программы USART_Init в разделе USART: USART Initialization), затем передать байт (см. пример программы USART_Transmit в разделе USART: USART Transmission) Последний пример - перeдача байта именно из регистра r16
aaarrr
Цитата(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
Kuznec9999
Цитата(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
aaarrr
Должна, но 1MHz не лучший выбор для 115200, если используется RC - тем более.
Kuznec9999
Цитата(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... В чём дело? Спасибо.
aaarrr
Цитата(Kuznec9999 @ May 14 2008, 21:50) *
Прекрасно выводит FF в порт... Но если передаём число, например, 0x87, то передаётся 0x07... Тоже самое с 0x88 - передаётся 0x08... В чём дело? Спасибо.

Похоже что частоты очень сильно отличаются. Я правильно понимаю, что стоит кварц (или RC?) 1MHz и скорость UART 9600? Тогда ошибка будет 7%, а должна быть не более 1.5%.
Kuznec9999
Цитата(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?
aaarrr
Цитата(Kuznec9999 @ May 14 2008, 22:48) *
Кстати, скажите, а имеется какой-либо буфер данных приёма/передачи в ATMega8?

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

Прошу прощения, просто в английском не очень силён, спасибо! И ещё один вопрос, для чего нужны ножки RTS и CTS? (только пожалуйста, не посылайте в даташит, т.к там ничего не нашёл). Спасибо
aaarrr
Для аппаратного управления потоком - передатчик тормозить при заполнении буфера приемника выше некоторой границы.

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

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


Спасибо! Т.е мне для передачи с МК требуется соединить TxD МК - с RxD компьютера. И землю. И всё?
aaarrr
Да, этого вполне достаточно. Управление потоком используется сравнительно редко.
Kuznec9999
Цитата(aaarrr @ May 14 2008, 23:08) *
Да, этого вполне достаточно. Управление потоком используется сравнительно редко.

Понимаю, что совсем надоел своими вопросами. rolleyes.gif Если не трудно, скажите ещё, обязательно ли использовать MAX232 или подобную для согласования интерфейсов? Мне только попробовать в железе хочется, для этого не хотелось бы городить преобразователь. Можно ли для пробы просто соединить вышеуказанные порты напрямую, и проверить работу? Спасибо.
aaarrr
Цитата(Kuznec9999 @ May 14 2008, 23:11) *
Можно ли для пробы просто соединить вышеуказанные порты напрямую, и проверить работу? Спасибо.

Нельзя: во-первых, контроллеру вряд ли понравится сигнал +/-12V, а компьютеру - 0-5V. Во-вторых, сигналы нужно проинвертировать.

Можно взять схему на транзисторах из AN910.
Kuznec9999
Цитата(aaarrr @ May 14 2008, 23:17) *
Нельзя: во-первых, контроллеру вряд ли понравится сигнал +/-12V, а компьютеру - 0-5V. Во-вторых, сигналы нужно проинвертировать.

Можно взять схему на транзисторах из AN910.


Проинвертировать? Это обязательно? Никогда не слышал. Спасибо.
aaarrr
У RS232 логическая "1" от -3 до -15 вольт, "0" - от 3 до 15.
Kuznec9999
Цитата(aaarrr @ May 14 2008, 23:27) *
У RS232 логическая "1" от -3 до -15 вольт, "0" - от 3 до 15.

Спасибо! Вы мне очень помогли.
@Ark
Цитата(Kuznec9999 @ May 14 2008, 23:11) *
Понимаю, что совсем надоел своими вопросами. rolleyes.gif Если не трудно, скажите ещё, обязательно ли использовать MAX232 или подобную для согласования интерфейсов? Мне только попробовать в железе хочется, для этого не хотелось бы городить преобразователь. Можно ли для пробы просто соединить вышеуказанные порты напрямую, и проверить работу? Спасибо.

Для отладочных целей обойтись без преобразователя интерфейсов можно, при этом, немного отступив от стандарта.
Приемник COM-порта можно соединять с выходом МК напрямую. Передатчик COM-порта нужно соединять со входом МК через резистор 5К. На входе МК обязательно должны быть встроенные защитные диоды и к земле и к питанию. Проблема в том, что воспользоватся встроенным модулем UART не удастся, так как он рассчитан на работу через преобразователь, который еще и инвертирует сигналы. Придется все делать программно - побитный прием и передачу. Не особо это сложно, если знаете как. smile.gif
Как уже говорилось, чтобы выдерживать временные интервалы с нужной точностью, необходим кварц, либо откалиброванный RC-генератор.
Естественно, что программа работающая со стороны ПК, не должна использовать аппаратное управление потоком. Обычно - это режим по-умолчанию, но не всегда. Либо нужно соединить попарно выводы COM-порта CTS-RTS и DSR-DTR, чтобы "обмануть" драйвер ПК.
Так что нет ничего невозможного...
Нужно только подчеркнуть, что хотя данное решение без проблем будет работать с большинством современных COM-портов, использовать его можно только для отладочных целей. Так как стандарт RS232 при этом не соблюдается (по допустимым уровням сигналов).
Lepeksiy
Для отладки и домашних нужд использовал такую схемку, спаянную прямо на разъеме DB9.
Она не полностью соответствует спецификации RS232, но тем не менее работает для подключения и микроконтроллеров, и мобильников (тех что еще не USB).
Диоды любые (напр. 1n4148), транзисторы любые (напр. bc547), стабилитрон на напряжение чуть ниже питания контроллера, резисторы несколько кОм (рассчитаете).
Если пишете свой софт для компьютера - нужно включить RTS и/или DTR.
Нажмите для просмотра прикрепленного файла
VXDRV
Цитата(Lepeksiy @ May 15 2008, 16:12) *
Для отладки и домашних нужд использовал такую схемку, спаянную прямо на разъеме DB9.
Она не полностью соответствует спецификации RS232, но тем не менее работает для подключения и микроконтроллеров, и мобильников (тех что еще не USB).
Диоды любые (напр. 1n4148), транзисторы любые (напр. bc547), стабилитрон на напряжение чуть ниже питания контроллера, резисторы несколько кОм (рассчитаете).

Будут танцы с бубном! (или не будут - кто знает...)
Проще поставить MAX232 и не маяться с транзисторами-диодами! Он что ли дорого стоит?
Гарантировано получится рабочая аппаратная часть и не надо будет париться с "не подходящими" уровнями напряжений.
Цитата(Lepeksiy @ May 15 2008, 16:12) *
Если пишете свой софт для компьютера - нужно включить RTS и/или DTR.

Необязательно - можно обойтись таймаутами.
aaarrr
Цитата(VXDRV @ May 15 2008, 18:42) *
Проще поставить MAX232 и не маятся с транзисторами-диодами! Он что ли дорого стоит?
Гарантировано получится рабочая аппаратная часть и не надо будет маятся с "не подходящими" уровнями напряжений.

Вот именно. А то набежали с вредными советами, понимаешь smile.gif

Цитата(VXDRV @ May 15 2008, 18:42) *
Необязательно - можно обойтись таймаутами...

Это для питания имелось в виду.
@Ark
Цитата(aaarrr @ May 15 2008, 19:04) *
... А то набежали с вредными советами, понимаешь smile.gif

Какие запросы, такие и советы! smile.gif Вообще-то, конечно, для отладки лучше иметь "шнурок" RS232-TTL с нормальным с преобразователем внутри. Либо сваять самому, либо купить готовый. Всегда в хозяйстве пригодиться...
Lepeksiy
Цитата
Будут танцы с бубном! (или не будут - кто знает...)
Проще поставить MAX232 и не маяться с транзисторами-диодами!

Никаких бубнов. Проверено на телефонах (в свое время делал и дарил такие самодельные кабели для Сименс МЕ45, М55) и микроконтроллерах. А MAX232 - дело вкуса.
Цитата
Необязательно - можно обойтись таймаутами.

Обязательно. Как заметил уже aaarrr.
XVR
Цитата(Lepeksiy @ May 17 2008, 03:21) *
Никаких бубнов. Проверено на телефонах (в свое время делал и дарил такие самодельные кабели для Сименс МЕ45, М55) и микроконтроллерах.
Будут бубны, будут smile.gif Лично столкнулся с PC (правда это был сервер в rack 19"), которому пришлось подавать на вход RS232 отрицательное напряжение, т.к. на 0 (вместо -12) он реагировать отказался crying.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.