Ich arbeite an einem Projekt mit einem Atmega16-Mikrocontroller der AVR-Familie. Ich verwende UART für mein Projekt. Ich muss Daten über einen USB-TTL-Konverter an meinen PC mit einer Baudrate von 9600 senden und die Daten mit "Putty" anzeigen.
Ich erhalte absurde Daten in Putty. Ich bin kein Elektroniker, sondern ein Informatiker, also brauche ich ein bisschen Hilfe.
Ich denke, ich könnte die falschen Sicherungsbits oder etwas anderes schreiben. Bitte geben Sie wenn möglich die Fuse-Bits an
Das Programm für den Mikrocontroller ist unten
#include<avr/io.h>
#include<util/delay.h>
#define UBRR_VALUE 51
//function to initialize UART
void uart_init(void)
{
UBRRH=(UBRR_VALUE>>8);//shift the register right by 8 bits
UBRRL=UBRR_VALUE;//set baud rate
UCSRB|=(1<<TXEN)|(1<<RXEN);//enable receiver and transmitter
UCSRC|=(1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);//8 bit data format
}
//function to transmit data
void uart_transmit(unsigned char data)
{
while(!(UCSRA & (1<<UDRE)));
UDR=data;
}
void transmit_string(char *str_data)
{
while(*str_data)
{
uart_transmit(*str_data);
str_data++;
}
}
int main(void)
{
uart_init();
while(1)
{
//transmit_string("hello");
uart_transmit('h');
}
return 0;
}
Die Spezifikationen der Sicherungsbits sind unten angegeben
Danke im Voraus für jede Art von Hilfe
Ihr Baudratendivisor scheint eine Baudrate von 19200 anstelle von 9600 auszuwählen:
baud = (clock speed) / ( 16 * (UBRR + 1) )
Versuchen Sie, 103 einzustellen UBRR_VALUE
und sehen Sie, ob Ihre Kommunikation besser wird.
Ein geeigneter Weg wäre , F_CPU
and zu definieren BAUD
und die Makros von setbaud.h die Berechnung durchführen zu lassen:
#include <avr/io.h>
#define F_CPU 16000000
static void
uart_9600(void)
{
#define BAUD 9600
#include <util/setbaud.h>
UBRRH = UBRRH_VALUE;
UBRRL = UBRRL_VALUE;
#if USE_2X
UCSRA |= (1 << U2X);
#else
UCSRA &= ~(1 << U2X);
#endif
}
F_CPU
von 16MHz ausgegangen, indem ich mir den Einstellungsdialog in Ihren Screenshots angeschaut habe. Vielleicht sollten Sie auch dort Ihre Einstellungen mit der realen Taktfrequenz aktualisieren.
brhans
Andreas