Библиотека USART AVR Atmega32a не работает

/*

* RC_Car_AVR.c * * Создано: 18.04.2018 19:55:07 * Автор: */

#define F_CPU 16000000
#define BAUD 9600
#define TUBRR (((F_CPU / 16) / BAUD) - 1)

#include <avr/io.h>
#include <util/delay.h>

char Read;

void USART_Init(void){

UBRRL = TUBRR;

UCSRB = (1<<TXEN)|(1<<RXEN);
UCSRC = (1<<UCSZ1)|(1<<UCSZ0);


}

char USART_Receive(void){

/* Wait for data to be received */
while (!(UCSRA & (1<<RXC)));

/* Get and return received data from buffer */
return UDR;
}



int main(void){

USART_Init();

DDRB |= (1<<0);

PORTB |= (1<<0); 

while (1){

    Read = USART_Receive();

    if(Read == 'F'){

        PORTB ^= (1<<0);
        _delay_ms(100);
    }

}
}

Я пытаюсь переключить светодиод, когда получаю определенный символ через модуль Bluetooth (HC05). Я написал библиотеку USART точно так же, как и техническое описание, но, похоже, она не работает (меня интересует только код инициализации и получения, так как я работаю над полудуплексной системой, поэтому мне не нужна часть передачи ). Я использую Atmega32a с внешним кварцевым генератором 16 МГц.

Пожалуйста, скажите мне, если вы обнаружите что-то не так.

Заранее спасибо.


person Havoc96    schedule 19.04.2018    source источник
comment
Код на первый взгляд выглядит нормально. Вам придется сузить круг вопросов. Действительно ли модуль BT принимает/работает? Совместим ли интерфейс HW (3,3 В/5 В UART или даже RS232?) Соответствуют ли формат кадра и скорость передачи данных? действительно ли контроллер работает на частоте 16 МГц или, может быть, внутренние часы (настройки Fuse)? И так далее.   -  person Rev    schedule 23.04.2018
comment
Модуль bluetooth по какой-то причине всегда получает 255 (11111111), поэтому я подключил его к микроконтроллеру PIC 18F4620, и он работал нормально. Аппаратное обеспечение совместимо с этим без проблем, и я настроил биты предохранителей для внешнего кристалла 16 МГц. Не могли бы вы уточнить соответствие Frame & Baud? Спасибо.   -  person Havoc96    schedule 25.04.2018
comment
Я просто хотел проверить, что модуль BT и контроллер используют одинаковую скорость передачи данных (отправляет ли модуль BT @9600?). Кроме того, существуют различные параметры кадра в отношении битов данных, четности и стоповых битов. Они также должны быть идентичными. Однако, скорее всего, в любом случае используется общий формат 8 данных, 1 стоп и отсутствие четности. Но дважды проверьте это.   -  person Rev    schedule 25.04.2018
comment
Разве это не должно быть UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);? В противном случае он будет записан в UBRRH   -  person KIIV    schedule 25.04.2018


Ответы (1)


Ваша инициализация неверна.

Попробуй это

void USART_Init(void){

UBRRL = TUBRR;
UBRRH = TUBRR >> 8;
UCSRB = (1<<TXEN)|(1<<RXEN);
UCSRC = (1<<UCSZ1)|(3<<UCSZ0);


}

Это следующий код инициализации, указанный в листе данных atmega32.

void USART_Init( unsigned int baud )
{
    /* Set baud rate */
    UBRRH = (unsigned char)(baud>>8);
    UBRRL = (unsigned char)baud;
    /* Enable receiver and transmitter */
    UCSRB = (1<<RXEN)|(1<<TXEN);
    /* Set frame format: 8data, 2stop bit */
    UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
}

Я знаю, что следующее техническое описание поначалу немного накладно, но в конце концов вы увидите, что все ваши ответы приведены там.

person Devjeet Mandal    schedule 30.05.2018