UART mit PC: Empfangen absurder Zeichen im PC

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

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Danke im Voraus für jede Art von Hilfe

Was ist Ihre Taktfrequenz und wie haben Sie Ihren Baudratendivisor berechnet?
Unsinnige Zeichen sind normalerweise das Ergebnis einer falschen Baudrateneinstellung. Sie haben nicht genügend Details angegeben, um diese Einstellungen zu überprüfen.

Antworten (1)

Ihr Baudratendivisor scheint eine Baudrate von 19200 anstelle von 9600 auszuwählen:

baud = (clock speed) / ( 16 * (UBRR + 1) )

Versuchen Sie, 103 einzustellen UBRR_VALUEund sehen Sie, ob Ihre Kommunikation besser wird.

Ein geeigneter Weg wäre , F_CPUand zu definieren BAUDund 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
}
Hallo ... Ich habe die Mikrocontroller-Platine gesehen ... es gab einen 12-MHz-Quarzoszillator ... also habe ich den Ubrr-Wert mit F_CPU als 12000000 berechnet und den Ubrr-Wert als 77 für eine Baudrate von 9600 erhalten ... Die Kommunikation funktioniert perfekt jetzt ... danke
@DebeshMohanty Ich bin froh, dass ich helfen konnte. Sie können meine Antwort "akzeptieren", wenn Sie Lust dazu haben: Das würde den anderen Benutzern sagen, dass die Informationen in der Antwort für sie relevant sind, wenn sie ein ähnliches Problem haben.
Übrigens, ich bin F_CPUvon 16MHz ausgegangen, indem ich mir den Einstellungsdialog in Ihren Screenshots angeschaut habe. Vielleicht sollten Sie auch dort Ihre Einstellungen mit der realen Taktfrequenz aktualisieren.