-
        

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 19

Thema: Anfaengerproblem UART

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    19.01.2011
    Ort
    Franken
    Beiträge
    83

    Anfaengerproblem UART

    Anzeige

    Hallo,

    heute versuche ich mal meinen MAX232 zum kommunizieren zu bringen. Ich benutze einen ATMEGA16 Schaltplan siehe Anhang.

    F_CPU ist mit 16Mhz im Makefile definiert
    F_CPU = 16000000

    //---------------------------------------------------------
    #include <avr/io.h>
    #include <stdlib.h>
    #include <avr/interrupt.h>
    #include <util/delay.h>
    //---------------------------------------------------------
    #ifndef F_CPU
    #error "F_CPU is not defined"
    #endif
    //---------------------------------------------------------
    #define BAUD 38400
    #include <util/setbaud.h>
    #include <CLED.h>
    //---------------------------------------------------------
    CLED *tmpLED;

    void uart_init(void)
    {
    UBRRH = UBRRH_VALUE;
    UBRRL = UBRRL_VALUE;
    /* evtl. verkuerzt falls Register aufeinanderfolgen (vgl. Datenblatt)
    UBRR = UBRR_VALUE;
    */
    #if USE_2X
    /* U2X-Modus erforderlich */
    UCSRA |= (1 << U2X);
    #else
    /* U2X-Modus nicht erforderlich */
    UCSRA &= ~(1 << U2X);
    #endif

    // hier weitere Initialisierungen (TX und/oder RX aktivieren, Modus setzen
    UCSRB |= (1<<TXEN); // UART TX einschalten
    UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); // Asynchron 8N1
    }
    //---------------------------------------------------------
    int uart_putc( unsigned char c )
    {
    tmpLED->On();

    /* Wait for empty transmit buffer */
    while ( !( UCSRA & (1<<UDRE)) )
    ;

    /* Put data into buffer, sends the data */
    UDR = c; /* sende Zeichen */

    tmpLED->Off();
    return 0;
    }
    //---------------------------------------------------------
    void uart_puts( char *s )
    {
    while( *s )
    { /* so lange *s != '\0' also ungleich dem "String-Endezeichen(Terminator)" */
    uart_putc(*s);
    s++;
    }
    }
    //---------------------------------------------------------
    int main( void )
    {
    tmpLED = new CLED( ERegC, 3, false );

    tmpLED->Off();

    uart_init();

    tmpLED->Off();

    while (1)
    {
    uart_puts( "hallo" );

    _delay_ms( 4000 );
    tmpLED->On();
    _delay_ms( 1000 );
    tmpLED->Off();
    }

    return 0;
    }
    //---------------------------------------------------------
    Leider kommt bei mir am Rechner nur sporadisch irgendein Muell. Sporadisch heist, dass es nicht alle ~5 sec zu einem Byte kommt sondern ca. alle 20sec.

    Empfangen wird:
    FF FF F8 F8 FF FF F8 F8 FF FF FF FF F8 F8

    Empfangen habe ich mit einem USB2Serial converter und HTerm 0.8.1beta mit folgenden Einstellungen: COM4 (B:38400 d:8 s:1 p:None).

    Wie ich bereits nachgelesen habe sind die meisten Fehler in dem Bereich ungenauigkeiten mit der Baudrate. Lt. dieser Liste http://www.wormfood.net/avrbaudcalc.php sind 38400 okay. Das externe Quarz wird auch verwendet. Zumindest kann man das mit einem Blink Test der LED einigermasen kontrollieren.


    Kann mir wer nen Tip geben was ich noch kontrollieren kann?
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken Schaltplan.jpg  
    alle elektronischen Bauteile arbeiten mit Rauch in ihrem Inneren;
    Wenn der Rauch rauskommt , sind sie kaputt.

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied Avatar von masasibe
    Registriert seit
    21.01.2011
    Beiträge
    181
    Hast du es denn schon einmal Testweise mit einer niedrigeren Baud versucht?
    So unter 10000.
    Wenn es dann funktioniert, weißt du zumindest, dass es nicht am Programmm und nicht an der Beschaltung liegt.

    Bei den AVRs ist standardmäßig der interne 8-fach Taktteiler aktiviert. Hast du den auch abgeschaltet?


    mfg masasibe

  3. #3
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.186
    Wenn du deinen Mega16 steckbar hast, dann heraus nehmen, eine Brücke zwischen RX und TX machen, am Hterm was eingeben, es sollte als Echo zurück kommen.
    Wenn das klappt kannst du dich auf den Mega16 konzentrieren.
    Auf deinem Plan hast du Pin 15 und 16 nicht beschaltet.
    Woher hast du in deinem Programm UBRR_VALUE; ?
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  4. #4
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von Hubert.G Beitrag anzeigen
    Woher hast du in deinem Programm UBRR_VALUE; ?
    Code:
    #include <util/setbaud.h>
    MfG
    Stefan

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    19.01.2011
    Ort
    Franken
    Beiträge
    83
    Hast du es denn schon einmal Testweise mit einer niedrigeren Baud versucht?
    So unter 10000.
    Ich habe alle Baudraten die im HTerm angegeben sind ausprobiert - sogar die schon rein rechnerisch nicht gehen. Interessanter weise bekam ich nur bei rel. hohen Baudraten ueberhaupt eine Ausgabe in HTerm

    Bei den AVRs ist standardmäßig der interne 8-fach Taktteiler aktiviert. Hast du den auch abgeschaltet?
    welchen 8-Fach teiler meinst du? UBRR? der wird durch -siehe Beitrag sternst- berechnet und durch uart_init( uint baudrate ) gesetzt.

    Wenn du deinen Mega16 steckbar hast, dann heraus nehmen, eine Brücke zwischen RX und TX machen, am Hterm was eingeben, es sollte als Echo zurück kommen.
    Das mit der Bruecke probiere ich gleich mal aus.

    Auf deinem Plan hast du Pin 15 und 16 nicht beschaltet.
    Der MAX ist beschalten (siehe Anhang)
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken Unbenannt.png  
    alle elektronischen Bauteile arbeiten mit Rauch in ihrem Inneren;
    Wenn der Rauch rauskommt , sind sie kaputt.

  6. #6
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von tbasnoopy Beitrag anzeigen
    welchen 8-Fach teiler meinst du?
    Er meint damit die Fuse CKDIV8, die dein ATmega16 aber gar nicht hat.
    MfG
    Stefan

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied Avatar von masasibe
    Registriert seit
    21.01.2011
    Beiträge
    181
    Er meint damit die Fuse CKDIV8, die dein ATmega16 aber gar nicht hat.
    Oh du hast Recht! Ich sehe gerade, dass der ATmega16 den CKDIV8 wirklich nicht hat.
    Das habe ich dann mit dem ATmega48 verwechselt, den ich so gerne verwende.

    mfg masasibe

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    19.01.2011
    Ort
    Franken
    Beiträge
    83
    Ahhh okay.


    Ich habe die Pins 15 u. 14 des ATmegas ueberbrueckt (nachdem ich ihn rausgezogen habe). Aber wenn ich mit HTerm was schicke kommt nichts zurueck. Habe auch Strom auf die Platine gegeben aber keine Reaktion.

    Wenn ich mein Kabel welches ich auf die Platte stecke ueberbruecke funktioniert es. Also liegt mein Problem irgendwo auf der Platine. Wahrscheinlich sogar schon beim MAX232. Ich mess jetzt mal alle Kontakte durch und Suche den Fehler. Glaube inzwischen das ich den Mega "richtig" programmiert habe aber die "Verloetung" nicht stimmt.
    alle elektronischen Bauteile arbeiten mit Rauch in ihrem Inneren;
    Wenn der Rauch rauskommt , sind sie kaputt.

  9. #9
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    28
    Beiträge
    3.517
    Blog-Einträge
    9
    Zitat Zitat von tbasnoopy Beitrag anzeigen
    Ahhh okay.


    Ich habe die Pins 15 u. 14 des ATmegas ueberbrueckt (nachdem ich ihn rausgezogen habe). Aber wenn ich mit HTerm was schicke kommt nichts zurueck. Habe auch Strom auf die Platine gegeben aber keine Reaktion.

    Wenn ich mein Kabel welches ich auf die Platte stecke ueberbruecke funktioniert es. Also liegt mein Problem irgendwo auf der Platine. Wahrscheinlich sogar schon beim MAX232. Ich mess jetzt mal alle Kontakte durch und Suche den Fehler. Glaube inzwischen das ich den Mega "richtig" programmiert habe aber die "Verloetung" nicht stimmt.
    Sicher das du den Stecker auf der Platine richtig herum drauf hast? Wenn du ihn verdreht hast funktioniert die Kommunikation auch nicht.
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    19.01.2011
    Ort
    Franken
    Beiträge
    83
    Zitat Zitat von Kampi Beitrag anzeigen
    Sicher das du den Stecker auf der Platine richtig herum drauf hast? Wenn du ihn verdreht hast funktioniert die Kommunikation auch nicht.

    Sicher bin ich mir nicht aber ich habs jetzt mal umgepolt (also TX mit RX vertauscht) und beim Mega die Bruecke gesetzt. Und.... nichts -.-
    alle elektronischen Bauteile arbeiten mit Rauch in ihrem Inneren;
    Wenn der Rauch rauskommt , sind sie kaputt.

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. BASCOM 2te UART oder software UART
    Von Snecx im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 5
    Letzter Beitrag: 19.02.2009, 00:25
  2. Daten von Software UART nach Hardware UART weiterleiten
    Von kusli im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 8
    Letzter Beitrag: 06.10.2008, 22:24
  3. Pegelwandlung: 5V UART an 3,3V USB-to-UART Wandler
    Von Johannes G. im Forum Elektronik
    Antworten: 0
    Letzter Beitrag: 17.05.2007, 10:45
  4. Hardware UART + Software UART gleichzeitig möglich?
    Von eevox im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 22.04.2007, 19:54
  5. AT90USB1287 und Beispielprogramm CDC (UART --> USB-UART)
    Von Bumbum im Forum C - Programmierung (GCC u.a.)
    Antworten: 9
    Letzter Beitrag: 15.11.2006, 13:30

Berechtigungen

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