-         

Ergebnis 1 bis 7 von 7

Thema: Problem mit UART

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    15.01.2008
    Ort
    Siegen, Germany, Germany
    Beiträge
    441

    Problem mit UART

    Anzeige

    Hallo,
    habe vor kurzer Zeit angefangen Controller mit C zu programmieren. Ich arbeite gerade das Tutorial (http://www.mikrocontroller.net/artic...R-GCC-Tutorial) durch und bin bei UART angekommen.

    Mein Testboard hat einen Mega32 mit 16mhz Quarz. Und natürlich die übliche Beschaltung für den UART. Ich weiß, dass die Schaltung funktioniert, da ich früher einen Bascom Code drauf laufen hatte, der ebenfalls eine UART Ausgabe hatte.

    Mit folgendem Programm versuche ich ein Zeichen auszugeben:
    Code:
    #include <avr/io.h>
    #include <inttypes.h>
    
    
    #ifndef F_CPU
    #define F_CPU 1600000L    // Systemtakt in Hz, das L am Ende ist wichtig, NICHT UL verwenden! 
    #endif
     
    #define BAUD 9600L          // Baudrate, das L am Ende ist wichtig, NICHT UL verwenden!
     
    // Berechnungen
    #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
    #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
    
     
    
    
    
    
    
    
     
    
    int main(void) {
    
    
    
    	while(1) {
    
    	UCSRB |= 1<<(TXEN);                 // UART TX einschalten
        UCSRC |= 1<<(URSEL)|(3<<UCSZ0);     // Asynchron 8N1
    
    	UBRRH = UBRR_VAL >> 8;
        UBRRL = UBRR_VAL & 0xFF;
    
    	DDRA = 0xff;			// Test LEDs
    	PORTA = 0xff;
    
     	   while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich                   */
        {
        }
    	UDR = 'x'; 
    
    	}
    
    
    return 0;
    }
    Leider gibt das so kein Zeichen aus, nur wenn ich Spannung anlege erhalte ich kurz Buchstabensalat im Terminal. Woran könnte das liegen, was mache ich falsch?
    liebe Grüße
    Der Daniel
    -
    Meine Projektseite:
    http://projects.weber-itam.de

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

    Code:
       UCSRB |= 1<<(TXEN);                 // UART TX einschalten
        UCSRC |= 1<<(URSEL)|(3<<UCSZ0);     // Asynchron 8N1
    
       UBRRH = UBRR_VAL >> 8;
        UBRRL = UBRR_VAL & 0xFF;
    
       DDRA = 0xff;         // Test LEDs
       PORTA = 0xff;
    Das gehört nicht in die Endlosschleife. Die Einstellungen brauchen nur einmal durchlaufen werden.
    Der Fehler ist aber etwas komplizierter.
    Code:
       UBRRH = UBRR_VAL >> 8;
        UBRRL = UBRR_VAL & 0xFF;
    
       UCSRB |= 1<<(TXEN);                 // UART TX einschalten
        UCSRC |= 1<<(URSEL)|(3<<UCSZ0);     // Asynchron 8N1
    So sollte es klappen.

    Im Datenblatt steht bei der Beschreibung des Bit URSEL vom Register UCSRC:
    The UBRRH Register shares the same I/O location as the UCSRC Register...


    Sollte das dann noch nicht funktionieren, schau einmal, ob du eine Optimierung im Compiler eingestellt hast.

    Gruß

    Jens

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    15.01.2008
    Ort
    Siegen, Germany, Germany
    Beiträge
    441
    Hallo, danke ich habe das gestern Nacht noch einmal alles angepasst und nun funktioniert das, kannst du mir vielleicht eine fertige aber einfach gehaltene UART Bib empfehlen - man muss ja nicht immer das Rad neu erfinden

    Man sollte das aber schon verstehen können.
    Vielen Dank.
    liebe Grüße
    Der Daniel
    -
    Meine Projektseite:
    http://projects.weber-itam.de

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    20.05.2006
    Ort
    Lippe
    Alter
    48
    Beiträge
    524
    Hallo,
    kann ich leider nicht. Auch wenn du jetzt lachst, hier schlägt ein Bastlerherz und aus Pfadfinderehrgeiz schreibe ich 99,9% meiner Funktionen selber


    Ich lese aber immer wieder von Bibliotheken von Peter Fleury (?) vielleicht gibt es da was.

    Gruß

    Jens

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    15.01.2008
    Ort
    Siegen, Germany, Germany
    Beiträge
    441
    nein warum sollte ich da lachen, finde ich gut, wenn ich genügend mit der Materie vertraut wäre, würde ich das auch so machen.

    Auf die Bibliotheken von Peter Fleury bin ich vorhin gestoßen, als ich mich etwas über I2C mittels C informiert habe, da habe ich dann auch gesehen, dass er eine UART Bibliothek geschrieben hat.

    Finde es nur sehr, sehr schwierig da durch zu blicken, kann es sein, dass er auch teilweise Assembler in seinen Bibliotheken verwendet?

    Naja hilft alles nichts werde mich wohl da durch kämpfen müssen, will ja endlich weg von Bascom auch wenn Bascom wirklich einfach ist aber warum einfach, wenn es auch schwer geht :P
    liebe Grüße
    Der Daniel
    -
    Meine Projektseite:
    http://projects.weber-itam.de

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied Avatar von drew
    Registriert seit
    06.04.2005
    Beiträge
    150
    Hallo,
    ich finde die Idee mit der Bibliothek gar nicht so dumm. Wenn man eine Bibliothek hat, kann man sich auf das wesentliche Problem konzentrieren.
    Außerdem kann man seinen Code dann leichter auf andere Plattformen portieren, wenn die Schnittstelle immer gleich ist.

    Ich denke, dass
    SendByte('x');
    einfacher zu lesen ist als:
    UDR = 'x';

    Ich hab schon lange darüber nachgedacht sowas zu schreiben.
    Klar, etwas Offset in der Laufzeit ist bei sowas immer dabei. Aber viel kann das doch nicht sein, oder?

    Drew


  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    15.01.2008
    Ort
    Siegen, Germany, Germany
    Beiträge
    441
    naja da kann man sich drüber streiten, sicher sprechen viele Dinge für das Nutzen von fertigen Bibliotheken, allerdings würde ich nicht generell auf Bibliotheken verweisen, da man dadurch nicht so viel lernt. Man sollte mindestens mal verstehen, was die Bibliothek da macht. Sicher muss man nicht immer das Rad neu erfinden
    liebe Grüße
    Der Daniel
    -
    Meine Projektseite:
    http://projects.weber-itam.de

Berechtigungen

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