Atmega168 передатчик USART с прерываниями - PullRequest
0 голосов
/ 01 января 2019

Я пытаюсь передать данные с моего Atmega168A-PU на мой компьютер с помощью USART.Для этого я написал следующий код:

#include <avr/io.h>
#include <stdlib.h>

#define F_CPU 8000000UL
#define USART_BAUD 9600
#define UBRR_VALUE (F_CPU/16/USART_BAUD - 1)

void
usart_init(void)
{
    UBRR0H = (unsigned char)(UBRR_VALUE >> 8);
    UBRR0L = (unsigned char)UBRR_VALUE;
    UCSR0B = _BV(TXEN0) | _BV(UDRIE0);
    UCSR0C = _BV(USBS0) | _BV(UCSZ00) | _BV(UCSZ01);
    //UCSR0C = _BV(UCSZ00) | _BV(UCSZ01);
}


ISR(USART0_UDRE_vect)
{
    UDR0 = '0';
    UCSR0A |= _BV(TXC0);
}

int main(void)
{
    usart_init();
    while(!(UCSR0A & _BV(UDRE0)));
    UDR0 = '0';
    while(1);
    return 0;
}

Я подключил конвертер Arduino USB2SERIAL для чтения значений на моем компьютере, однако конвертер сообщает, что он не получает данные, а мой компьютер не получаетdata либо.

Примечание: у меня lfuse 0xe2 (CLKDIV8 отключен), поэтому у меня 8 МГц F_CPU.
Примечание: я тоже пробовал без UCSR0A |= _BV(TXC0);.
Примечание: у меня есть конденсатормежду AVcc и AGnd.
Примечание: предохранители: (E: F9, H: DF, L: E2)

1 Ответ

0 голосов
/ 03 января 2019

Ну, проблема была довольно простой.Я забыл sei();, как указал @KIIV (также на это указал u / odokemono).Благодарю.

Также лучше использовать USART_TX_vect вместо USART0_UDRE_vect, потому что мой приемник отключен.Вот исправленный код:

#include <avr/io.h>
#include <stdlib.h>
#include <avr/interrupt.h>

#define F_CPU 8000000UL
#define USART_BAUD 9600
#define UBRR_VALUE (F_CPU/16/USART_BAUD - 1)

void
usart_init(void)
{
    UBRR0H = (unsigned char)(UBRR_VALUE >> 8);
    UBRR0L = (unsigned char)UBRR_VALUE;
    UCSR0B = _BV(TXEN0) | _BV(TXCIE0);
    UCSR0C = _BV(UCSZ00) | _BV(UCSZ01);
    //UCSR0C = _BV(UCSZ00) | _BV(UCSZ01);
    sei();
}


ISR(USART_TX_vect)
{
    UDR0 = '0';
    UCSR0A |= _BV(TXC0);
}

int main(void)
{
    usart_init();
    while(!(UCSR0A & _BV(UDRE0)));
    UDR0 = '0';
    while(1);
    return 0;
}

Кстати: я отключил второй стоп-бит, как указал u / odokemono, потому что мой USB2SERIAL, кажется, работает лучше без второго стоп-бита.

...