-         

Ergebnis 1 bis 6 von 6

Thema: USART senden spinnt?!?!?

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    25.02.2007
    Beiträge
    44

    USART senden spinnt?!?!?

    Anzeige

    habe folgendes programm geschrieben zur ausgabe einzelner zeichen per
    USART!
    das problem liegt nun darin, dass die zeichen nicht nur einmal
    ausgegeben werden, sondern diese werden immer wiederholt! ????
    das ganze sieht dann so "123ABC123ABC123ABC...." keine Ahnung weshalb die zeichen immer wiederholt werden, sollten ja nur einmal eigentlich ausgegeben werden, oder???? vielen dank für eure antworten! habe ATmega128!

    #include <avr/io.h>

    #define FOSC 14745600 // Clock Speed
    #define BAUD 2400
    #define MYUBRR FOSC/16/BAUD-1

    void USART_Init(unsigned int ubrr);
    void USART_Transmit(unsigned char data);
    unsigned char USART_Receive(void);

    int main(void){
    USART_Init(MYUBRR);
    USART_Transmit('1');
    USART_Transmit('2');
    USART_Transmit('3');
    USART_Transmit('A');
    USART_Transmit('B');
    USART_Transmit('C');
    while(1);
    return 0;
    }

    void USART_Init( unsigned int ubrr )
    {
    /* Set baud rate */
    UBRR0H = (unsigned char)(ubrr>>;
    UBRR0L = (unsigned char)ubrr;
    /* Enable transmitter */
    UCSR0B = (1<<RXEN0)|(1<<TXEN0);
    /* Set frame format: 8data, 1stop bit */
    UCSR0C = (3<<UCSZ0);
    }

    void USART_Transmit( unsigned char data )
    {
    /* Wait for empty transmit buffer */
    while ( !( UCSR0A & (1<<UDRE0)) );
    /* Put data into buffer, sends the data */
    UDR0 = data;
    }

    unsigned char USART_Receive(void)
    {
    /* Wait for data to be received */
    while ( !( UCSR0A & (1<<RXC0)) );
    /* Put data into buffer, sends the data */
    return UDR0;
    }

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2005
    Ort
    Kaiserslautern
    Beiträge
    794
    Hi,

    würde vermuten, dass entweder
    - das while(1); wegoptimiert wird und er nach dem return 0; wieder an den anfang springt

    oder:
    - ein ungewollter interrupt ausgelöst wird, nicht behandelt wird und für einen pseudo-reset sorgt.

    gruß, CowZ

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    20.05.2006
    Ort
    Lippe
    Alter
    48
    Beiträge
    524
    Hallo,

    while (1); wird vermutlich vom Compiler wegoptimiert und das gesammte Programm startet nach return0; neu. Versuch es mal mit:

    Code:
    while(1){
    asm volatile ("nop");
    }

    Gruß
    Jens

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.11.2007
    Beiträge
    100
    Vielleicht kommt ein Reset durch den Watchdogtimer?

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    25.02.2007
    Beiträge
    44
    ich habe den watchodog nicht eingeschaltet! oder kann sich der wenn ich den nicht ausdrücklich ausschalte selber einschalten? ich glaube der schaltet sich nur nach einem unvorhergesehen reset automatisch ein! aber warum sollte es in meinem programm ein rest geben?

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2005
    Ort
    Kaiserslautern
    Beiträge
    794
    Guck doch einfach auf mikrocontroller.net im gleichen Thread...

    Gruß, CowZ
    PS: Ich mag diese "ich poste in allen Foren das gleiche"-Taktik nicht.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •