- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 8 von 8

Thema: USART - AT-Mega88 - Ist er zu schlau, bin ich zu blöd!

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    21.03.2008
    Beiträge
    9

    USART - AT-Mega88 - Ist er zu schlau, bin ich zu blöd!

    Moin Jungs,

    ich versuche grade mal eine einfache USART Verbindung zwischen meinem AT-Mega88 und Läppy hinzukriegen. Der Läppy hat nen echte RS232, also kein USB-> RS232 Wandler oder so drann.

    Hier meine Routine zum senden:
    Code:
    int USART_TX(char *TX_B, unsigned int TX_B_L) {
      
      while (!(UCSR0A & (1<<UDRE0))) { } // Warten bis Senden möglich
      
        for(int i=0; TX_B_L > i; i++)
      
      UDR0 = TX_B[i];
      
        return 0;
    }
    Es soll solange gesendet werden bis TX_B_L erreicht ist.

    Ausgeführt wird das ganze in der Main so:
    Code:
    char test[5] = "Hallo";
    USART_TX (test, sizeof(test));
    Ankommen tut genau garnichts, nada.

    Initialisiert wird mit 19.200 8-N-1.

    Es funktioniert wunderbar wenn ich in der main einfach ein Zeichen rüberschiebe:

    Code:
    while (!(UCSR0A & (1<<UDRE0))) { } // Warten bis Senden möglich
    UDR0 = 'X';
    Das ganze mal zum testen in nen Timer gepackt der mehrmals pro Sekunde ausgeführt wird und die X-chen rattern übern Bildschirm.

    Also an der Init. kanns wohl kaum liegen!? Was läuft hier falsch?

    Schönen Carfreitag, e-Ra

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Du mußt schon bei JEDEM Zeichen checken, Kollege. So eine UART is ja kein ICE
    Code:
      
      
        for(int i=0; TX_B_L > i; i++) 
       {
             while (!(UCSR0A & (1<<UDRE0))) { } // Warten bis Senden möglich 
             UDR0 = TX_B[i]; 
        }
        return 0;
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    21.03.2008
    Beiträge
    9
    Moin moin,

    also habs mal so abgeändert:

    Code:
    int USART_TX(char *TX_B, unsigned int TX_B_L) {
      
    	for(int i=0; TX_B_L > i; i++) {
    
    		while (!(UCSR0A & (1<<UDRE0))) { } // Warten bis Senden möglich
      
      		UDR0 = TX_B[i];
    	}
      
        return 0;
    }
    Aber kommt immer noch nix an. Noch weiter Ideen?

    Thx, e-Ra

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Zeig mal den aufruf der function her. Oder besser das ganze Programm.
    Da is wo der Wurm drin

    Du sagst, der Einzelaufruf in der main() funktioniert ?
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    21.03.2008
    Beiträge
    9
    Hi,

    hier mal der Code, mit dem ich teste:

    Code:
    #define F_CPU 7372800;
    
    #include <avr/io.h>
    
    
    // int USART_TX(char *, unsigned int);						// Prototyp
    
    static char test[5] = { 0x48, 0x41, 0x48, 0x41, 0x48, };
    
    
    
    int USART_TX(char *TX_B, int TX_B_L) {
      
    	for(int i=0; TX_B_L > i; i++) {
    
    		while (!(UCSR0A & (1<<UDRE0))) { } // Warten bis Senden möglich
      
      		UDR0 = TX_B[i];
    	}
      
        return 0;
    }
    
    
    int main( void ) {
    
       UCSR0B |= (1<<TXEN0) | (1<<UCSZ02);					// Tx Enable, 8 Datenbits
       UCSR0C |= (1<<UCSZ01) | (1<<UCSZ00) | (1<<USBS0);	// 8 Datenbits, 1 Stoppbit
       UBRR0H = 23 >> 8;									// HighByte, Baudrate = 19.200 bps
       UBRR0L = 23 & 0xFF;									// LowByte, Baudrate = 19.200 bps
    
    
       USART_TX (test, sizeof(test));
    
    
       return(0);
    }
    Wenn ich anstatt dem Funktionsaufruf in der Main einfach nur ein "UDR0 = 'X';" schreibe dann kommt auch ein X rüber.

    Vielleicht entdeckst du ja nen Fehler. Danke schonmal.

    e-Ra

  6. #6
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Egentlich sollte das ja gehen. *grmpf*
    Versuch mal, die Bedingung umzukehren
    Code:
      for(int i=0; i < TX_B_L; i++) 
      { 
           while (!(UCSR0A & (1<<UDRE0))) { } // Warten bis Senden möglich 
            UDR0 = TX_B[i]; 
       }
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

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

    wenn ich das richtig sehe ist 9N2 eingestellt. Da müsste Müll entstehen. Die Baudrate habe ich mir nicht angeschaut.
    Du solltest auch noch eine Endlosschleife in der Main vorsehen. Das Programm rennt ins Leere. Was dann passiert, wenn er noch am Senden ist, kann ich nicht sagen.


    Gruß

    Jens

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    21.03.2008
    Beiträge
    9
    @McJenso

    Entweder hatte ich an dem Abend zu viel gesoffen oder..... natürlich recht dumm wenn man den USART falsch initialisiert. Dann kanns auch schlecht funktionieren. Man man man, in Zukunft: programmieren > alc

    Danke an alle!

Berechtigungen

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

Labornetzteil AliExpress