-         

Ergebnis 1 bis 2 von 2

Thema: UART Ein-Ausgabe mit mega168 klappt nicht

  1. #1

    UART Ein-Ausgabe mit mega168 klappt nicht

    Anzeige

    Hallo

    Um die UART Ein- und Ausgabe an einem mega168 zu testen habe ich mir Funktionen für UART Eingabe und Ausgabe in C zusammengstellt.

    In der Hauptschleife übergebe ich den Wert dann einfach.
    Der Test liefert dann allerding höchst merkwürdige Ergebnisse. Der Ausgabewert stimmt nicht mit dem Eingabewert überein. Ich schicke z.B. 0x47 und es kommt eine 0xF8 zurück.

    Woran liegt das? Wenn ich das Ganze auf Basis des mega8 mache, klappt es wunderbar.

    Was mache ich falsch?

    Nachfolgend das Programm in C

    Grüße
    Sven




    //-------------------------------------------------------------------------
    // Titel : Test UART mit 168
    //-------------------------------------------------------------------------
    // Funktion :
    // Schaltung :
    //-------------------------------------------------------------------------
    // Prozessor : ATmega168
    // Takt : 3686400 Hz
    // Sprache : C
    // Datum : 28.5.2010
    // Version : 1.0
    // Autor :
    // Programmer:
    // Port :
    //-------------------------------------------------------------------------
    // created by myAVR-CodeWizard
    //-------------------------------------------------------------------------
    //
    #define F_CPU 3686400
    #include <avr\io.h>
    #include <avr\interrupt.h>
    #define BAUD 9600
    //--------------------------------------------------------------------
    // USART_RX_vect - UART Interrupt bei Datenempfang komplett
    //--------------------------------------------------------------------
    ISR(USART_RX_vect)
    {
    // Hier Interruptbehandlung
    }
    //--------------------------------------------------------------------
    // USART_UDRE_vect - UART Interrupt bei Senderegister leer
    //--------------------------------------------------------------------
    ISR(USART_UDRE_vect)
    {
    // Hier Interruptbehandlung
    }
    //--------------------------------------------------------------------
    // USART_TX_vect - UART Interrupt bei Sendevorgang beendet
    //--------------------------------------------------------------------
    ISR(USART_TX_vect)
    {
    // Hier Interruptbehandlung
    }

    //----------------------------------------------------------------------
    // Titel : C-Funktion Zeichen zu UART senden.
    //----------------------------------------------------------------------
    // Funktion : ...
    // IN : char data
    // OUT : ...
    //----------------------------------------------------------------------
    void uartPutChar(char data)
    {
    //warte bis UDR leer ist UCSRA / USR bei z.B.: 2313
    while (!(UCSR0A&32));
    //sende
    UDR0=data;
    }
    //----------------------------------------------------------------------
    // Titel : C-Funktion Zeichen von UART holen.
    //----------------------------------------------------------------------
    // Funktion : ...
    // IN : ...
    // OUT : data
    //----------------------------------------------------------------------
    char uartGetChar()
    {
    char data=0;
    //warte bis RX-complete RXC UCSRA / USR bei z.B.: AT090S2313
    while (!(UCSR0A&12);
    //empfangen
    data=UDR0;
    return data;
    }
    //----------------------------------------------------------------------
    // Titel : C-Funktion Zeichenkette zu UART senden.
    //----------------------------------------------------------------------
    // Funktion : ...
    // IN : char *buffer, Zeichenkette mit NUll abgeschlossen
    // OUT : ...
    //----------------------------------------------------------------------
    void uartPutString(const char *buffer)
    {
    for (int i=0; buffer[i] !=0;i++) uartPutChar (buffer[i]);
    }
    //------------------------------------------------------------------------
    // Initialisierungen
    //------------------------------------------------------------------------
    void init()
    {
    // UART initialisieren
    sbi(UCSR0B,3); // TX aktiv
    sbi(UCSR0B,4); // RX aktivieren
    UBRR0=((F_CPU/BAUD)/16)-1; // Baudrate festlegen
    sbi(UCSR0B,7); // UART Interrupt bei Datenempfang komplett
    sbi(UCSR0B,5); // UART Interrupt bei Senderegister leer
    sbi(UCSR0B,6); // UART Interrupt bei Sendevorgang beendet
    //--- Interrupts erlauben ---
    sei();
    }

    /////////////////////////////////////////////////////////////////////////////
    // Main-Funktion
    /////////////////////////////////////////////////////////////////////////////
    main()
    {
    init(); // Initialisierungen
    while (true) // Mainloop-Begin
    {
    char zeichen;

    zeichen=uartGetChar();
    uartPutChar(zeichen);


    } // Mainloop-Ende
    }
    //---------------------------------------------------------------------------

  2. #2
    So...habs rausgefunden. Die Fuses waren falsch gesetzt.

Berechtigungen

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