Forum: Mikrocontroller und Digitale Elektronik atmega16 UART


von avr noop (Gast)


Lesenswert?

Hallo,

ich bin relativ neu auf dem gebiet der avr Progrmmierung, hab bis jetzt 
durch das gute Tutorial alles verstanden. Als ich dann das senden mit 
dem UART probierte hab ich es aber nich zum laufen bekommen. Baudrate 
stimmt am Hyperterminal mit dem avr überein. Könnt ihr mir vieleicht 
sagen wo der Fehler liegt?

Code:

#include <avr/io.h>
#include <stdint.h>
#ifndef F_CPU
#define F_CPU 1000000
#endif
#define UART_UBRR_CALC(BAUD_,FREQ_) ((FREQ_)/((BAUD_)*16L)-1)
#define UART_BAUD_RATE 9600

int main(void)
{
    UBRRH = (uint8_t)( UART_UBRR_CALC( UART_BAUD_RATE, F_CPU ) >> 8 );
    UBRRL = (uint8_t)UART_UBRR_CALC( UART_BAUD_RATE, F_CPU );

    while (!(UCSRA & (1<<UDRE)))
  {}
  UDR = 'x';
}

von Basti (Gast)


Lesenswert?

haste in den registern UDR und USR die bits passend gesetzt? sieht ja 
nicht so aus

von avr noop (Gast)


Lesenswert?

Danke für den Tipp. Jetzt sendet er zwar an den PC aber nicht das was er 
sollte. stadt "x" sendet er nun eine "8".

Der Code sieht jetzt so aus:


int main(void)
{
    UCSRB |= (1<<TXEN);
    UCSRC |= (1<<URSEL)|(3<<UCSZ0);

    UBRRH = (uint8_t)( UART_UBRR_CALC( UART_BAUD_RATE, F_CPU ) >> 8 );
    UBRRL = (uint8_t)UART_UBRR_CALC( UART_BAUD_RATE, F_CPU );

    while (!(UCSRA & (1<<UDRE)))
  {}
  UDR = 'x';
}

von Stefan W. (wswbln)


Lesenswert?

...was für eine Taktquelle verwendest Du für den Mega16?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.