ATmega328p, неправильный бод на асинхронном USART (ассеблер)

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 2
Зарегистрирован: Пн янв 25, 2021 20:11:01

Сообщение tsmx »

Всем привет. Ковыряю ардуину с алиэкспресса, решил по приколу передать что-нибудь через последовательный порт. Посмотрел по даташиту формулки для асинхронного режима, посчитал нужное значение UBRR для бода в 9600, прошил, а бод какой-то слишком большой получается (по осциллографу проверять пришлось, т.к. usb-ttl свисток, понятное дело, ничего прочитать не сумел). Выяснилось, что бод почему-то считается по формуле BAUD = f/(2(UBRR+1)), т.е. в знаменателе 2, как в синхронном режиме, а не 16, как должно быть в асинхронном. Хотя ставлю вроде как асинхронный, вон, старшие биты в UCSR0C нулевые...

ЧЯДНТ?

Прошивка следующая (тут бод как раз 9600 получается, потому что я UBRR по формуле для синхронного режима считал, usb-свисток послушно печатает "COCK\n" в терминал):

Код: Выделить всё

.set PINB, 0x03
.set DDRB, 0x04
.set PORTB, 0x05
.set SPL, 0x3d
.set SPH, 0x3e
.set SREG, 0x3f

.set UDR0, 0xc6
.set UBRR0H, 0xc5
.set UBRR0L, 0xc4
.set UCSR0C, 0xc2
.set UCSR0B, 0xc1
.set UCSR0A, 0xc0

.org 0x0000, 0xff
    rjmp start

.org 0x0032, 0xff
start:
    clr r1
    clr r2
    inc r2
    ser r16
    out SREG, r1
    out SPL, r16
    out SPH, r2

    sbi DDRB, 5

    call wait
    call blink
    call wait
    call blink

    ldi r17, 0x67
    ldi r18, 0x06
    ldi r19, 0x08
    sts UBRR0H, r1
    sts UBRR0L, r17
    sts UCSR0C, r18
    sts UCSR0B, r19
    
    call wait

    ldi r16, 0x43
    call send
    ldi r16, 0x4f
    call send
    ldi r16, 0x43
    call send
    ldi r16, 0x4b
    call send
    ldi r16, 0x0a
    call send

haltloop:
    sleep
    rjmp haltloop

wait:
    ldi r16, 0x0f
    ldi r17, 0x42
    ldi r18, 0x40
    
1:
    sub r18, r2
    sbc r17, r1
    sbc r16, r1
    brne 1b
    ret

blink:
    sbi PINB, 5
    ret

send:
    lds r17, UCSR0A
    sbrs r17, 5
    rjmp send
    sts UDR0, r16
    ret
Реклама
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

[uquote="tsmx",url="/forum/viewtopic.php?p=3967277#p3967277"]Выяснилось, что бод почему-то считается по формуле BAUD = f/(2(UBRR+1)), т.е. в знаменателе 2, как в синхронном режиме, а не 16, как должно быть в асинхронном. Хотя ставлю вроде как асинхронный, вон, старшие биты в UCSR0C нулевые...

ЧЯДНТ?
...
ldi r17, 0x67
...[/uquote]
Какая-то у вас математика странная. Наверное выспаться нужно.
0x67 = 103
16000000/(16(103+1)) = ~9615
Реклама
Родился
Сообщения: 2
Зарегистрирован: Пн янв 25, 2021 20:11:01

Сообщение tsmx »

NStorm, ой, и правда, спасибо.

Меня в заблуждение ввела таблица в конце главы про USART с заголовком "Examples of UBRRn Settings for Commonly Used Oscillator Frequencies". Там значатся значения f в 1, ~1.8 и 2 МГц. Вот я и подумал, что дефолтная частота этого МК 2 МГц.
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

tsmx, это ж "часто используемые частоты" и примеры для них. Ардуинка эта с кристаллом на 16 МГц обычно идет, реже бывают 8 МГц варианты.
Реклама
Эиком - электронные компоненты и радиодетали
Ответить

Вернуться в «AVR»