У меня проблемы с последовательной связью. Я подключил 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;
}