Помогите с AVR и последовательными портами - PullRequest
0 голосов
/ 25 июля 2011

У меня проблемы с последовательной связью. Я подключил AtMega644 к последовательному ЖК-дисплею, который занимает 9600 8N1. Я просто получаю мусор. Из-за мусора я просто получаю немного U, P, T и @ вместо желаемого «U». Я использую внутренний 8 МГц RC Osc с предохранителями, перечисленными ниже. Я подозреваю, что проблема со временем, но я не уверен, где я ошибся. Я добавил мигающий светодиод, и время выглядит правильно (глазное яблоко и цифровой секундомер). Любая помощь приветствуется.

avrdude -pm644 -cavrisp2 -Pusb -b2400 -u -Uflash: ш: ImpactTarget.hex: а -Ulfuse: ш: 0xe2: м -Uhfuse: ш: 0xd8: м -Uefuse: ш: 0xff: м

#define F_CPU 8000000
#define BAUDRATE 9600
#define UBRRVAL (F_CPU/(BAUDRATE*16UL)) -1


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



/***************************************************** USART_Init()
*
*
**/
void USART_Init () {
    //Set baud rate
    UBRR0H = (unsigned char)(UBRRVAL>>8);   //high byte
    UBRR0L = (unsigned char) UBRRVAL;       //low byte

    //Asynchronous normal speed
    UCSR0A = (0<<U2X0);

    //Enable Transmitter and Receiver and Interrupt on receive complete
    UCSR0B = (1<<RXEN0) | (1<<TXEN0) | (1<<RXCIE0);

    //page 186 Set asynchronous mode,no parity, 1 stop bit, 8 bit size
    UCSR0C= (0<<UMSEL00)| (0<<UMSEL01)|             //Async
            (0<<UPM00)  | (0<<UPM01)  |             //Parity None
            (0<<USBS0)  |                           //Stop bits 1
            (0<<UCSZ02) | (1<<UCSZ01) |(1<<UCSZ00); //8 Bits

    //enable interrupts
    sei();
}


/******************************************** send_btye
* sends one byte to serial port
**/
void send_byte (char data) {
    while ( ! (UCSR0A & (1<<UDRE0)) )
        /* NOOP */;
    UDR0 = data;
}


/**
 * _delay_ms has a short time so this is an extension
 */
void delay_ms (int time) {
    for (int i = 0; i < time; i++) {
        _delay_ms(1);
    }
}

/****************************** main *********/
int main () {
    USART_Init();
    DDRA = 0xff;

    for (;;) {
        send_byte('U');
        delay_ms(500);
        PORTA ^=_BV(PA0);
    }

    return 0;
}

Ответы [ 3 ]

3 голосов
/ 02 августа 2011

Ваш UBRRVAL не заключает в скобки его выражение полностью, поэтому при расширении в контексте, подобном UBRRVAL >> 8, >> 8 не применяется так, как вы ожидаете.

0 голосов
/ 15 сентября 2013

это именно то, что заняло 3 дня моего проекта, просто попробуйте установить скорость передачи (9600) и установить опцию (X2) для скорости передачи. он должен работать.

0 голосов
/ 01 августа 2011

Я думаю, что вы правы - это, вероятно, проблема с синхронизацией: внутренний RC-генератор обычно слишком неточен, чтобы использовать его для USART.

Я бы попробовал прикрепить внешний кристалл (и соответственно установить предохранители)) и посмотрите, поможет ли это.

...