- 3D-Druck Einstieg und Tipps         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 18

Thema: Einsteiger braucht UART Hilfe

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    19.11.2011
    Beiträge
    18

    Einsteiger braucht UART Hilfe

    Anzeige

    Praxistest und DIY Projekte
    Hallo Leute,

    sitze seit heute Mittag am UART (bin absoluter Neuling). Hab das Kapitel UART im Datasheet komplett abgearbeitet. Parallel dazu auch http://www.mikrocontroller.net/artic...orial/Der_UART hier reingeschaut (deutsche Übersetzung der Registerfunktionen). Nun alles angeschlossen Programmiert und es will einfach nicht funktionieren.

    meine Code:

    Code:
    /*
     * AVRGCC2.c
     *
     * Created: 20.04.2012 16:34:54
     *  Author: Administrator
     */ 
    #include <avr/io.h>
    #include <util/delay.h>
    
    
    
    
    #define F_CPU		16000000UL
    #define BAUD		9600UL
    
    #include <util/setbaud.h>
    
    
    int main(void)
    { 
    	//UART DEfinitionen
    	
    	UCSRB = (1<<TXEN);
    	UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
    	
    	UBRRL_VALUE;
    	UBRRL_VALUE;
    	
    	
    	int x;
    	
        while(1)
        {
    	    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich                   */
        {
        }
     
        UDR = 'x';                    /* schreibt das Zeichen x auf die Schnittstelle */
    	}
    }
    Als Hardware habe ich:
    RN-Control 1.4
    myAVR USBtoUART

    Software:
    AVRStudio
    HTerm

  2. #2
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Code:
        UBRRL_VALUE;
        UBRRL_VALUE;
    Das ist praktisch so, als würdest du schreiben:
    Code:
        42;
        42;
    Sieht irgendwie nicht wirklich sinnvoll aus, oder?
    MfG
    Stefan

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    19.11.2011
    Beiträge
    18
    Hoppla,
    da hat sich ein Tippfehler und ein Verständnisfehler eingeschlichen.

    Wollte schreiben:
    UBRRL_VALUE
    UBRRH_VALUE
    hatte es so verstanden, dass durch die gesetzte F_CPU und BAUD aus der setbaud.h mit den befehlen UBRRL_VALUE automatisch die richtigen Bits im Register gesetzt werden.

    Lange Rede kurzer Sinn, Danke für deine Hilfe

    LG
    Yunus

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    19.11.2011
    Beiträge
    18
    Hallo,

    also irgendwie will das immer noch nicht so funzen. Habe mittlerweile mittels Loopback die PC-Seite gecheckt, da scheint alles in Ordnung zu sein. Ausserdem habe ich erfahren, dass F_CPU vor dem delay.h header stehen soll, auch das habe ich geändert. Aber der µC sendet einfach nichts an meinen PC.

    Terminal: HTerm ist auf 8N1 9600Baud und Flow Control gestellt.



    #include <avr/io.h>
    #define F_CPU 16000000
    #define BAUD 9600

    #include <util/delay.h>
    #include <util/setbaud.h>



    int main(void)
    {
    //UART DEfinitionen

    UCSRA &= ~(1<<U2X);
    UCSRB = (1<<TXEN);
    UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);

    UBRRL = UBRRL_VALUE;
    UBRRH = UBRRH_VALUE;

    while(1)
    {
    while (!(UCSRA & (1<<UDRE))) /* warten bis Senden moeglich */
    {
    ;
    }
    UDR = 'x';

    }

  5. #5
    shedepe
    Gast
    Hey also als erstes musst du wissen welche Einstellungen du für den UART verwenden willst. Also wie viele Stopbits, Datenbits, Parity, Handshake usw.
    Die genauen Einstellungen findest du im Datenblatt zum verwendeten Atmega32 Controller, das Anfänger jedoch schnell erschlägt.
    Ich poste dir hier mal die Einstellungen die ich verwende:

    Code:
        UBRRH = ((F_CPU +BAUD*8 )/ (BAUD * 16L) - 1) >>8;
        UBRRL = ((F_CPU +BAUD*8 )/ (BAUD * 16L) - 1) & 0xFF;
    
        UCSRB = (1<<TXEN) | (1<<RXEN) | (1<<RXCIE);
        UCSRC = (1<<UCSZ0) | (1<<UCSZ1);
    Die Einstellungen schalten den Sender und Empfäger ein und schalten den Empfangsinterupt ein.
    Es sind 8 Datenbits eingestellt, Parität Disabled und ein Stopbit eingestellt.

    Die Baudrate musste du oben unter der F_CPU definition noch definieren.

  6. #6
    shedepe
    Gast
    PS. nur der vollständigkeit halber, hier noch das Datenblatt:
    www.atmel.com/Images/doc2503.pdf

    Die benötigten Informationen findest du ab Seite 159

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    19.11.2011
    Beiträge
    18
    Hallo shedepe,

    das Datenblatt habe ich mir bereits sehr geduldig zu Gemüte geführt und bin der Meinung, mir scheint was du da geschrieben hast unterscheidet sich auch nicht wesentlich von meiner Version. Ich sehe hier einen Unterschied bei der definition der register UBRRL und UBRRH (hier habe ich die header Datei verwendet um mir Arbeit zu ersparen, aber ich werde es morgen mal auf "manuellem" Wege probieren. Der zweite unterschied ist das du beim schreiben in das Register UCSRC nich das Bit URSEL gesetzt hast, im Datenblatt jedoch steht, dass dies notwendig ist?

    LG
    Yunus

  8. #8
    shedepe
    Gast
    Soweit ich mich entsinne ist es nicht nötig URSEL explizit zu setzen, da es bereits 0 ist. Probier es einfach noch mal so.

  9. #9
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    Hi,

    also ich habe jetzt auch zwei Stunden rumprobiert und mich gewundert warum bei mir nur Zeichenmüll rauskam. Ich hatte erst

    UCSRB = (1<<RXEN) | (1<<TXEN);
    UCSRC = (1<<UCSZ1) | (1<<UCSZ0);
    UCSRC = (1<<URSEL)

    da stehen und damit funktioniert es NICHT.
    Ändere ich es auf

    UCSRB = (1<<RXEN) | (1<<TXEN);
    UCSRC = (1<<URSEL)| (1<<UCSZ1) | (1<<UCSZ0);

    um funktioniert es (nur so am Rande).
    Hier hast du ein funktionierendes Programm was du verwenden kannst:

    Code:
    /*
     * Hallo Welt.c
     *
     * Created: 03.05.2012 20:46:19
     *  Author: Daniel
     */ 
    
    #define F_CPU 16000000UL                                                                            // CPU Takt für das delay
    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <string.h>
    #include <util/delay.h>
    #include <stdlib.h>
    
    char data[50] = "Hallo";                                                                            // Text der ausgegeben werden soll
    int lenght = 0x00;
    
    int main(void)
    {
        UART_Init();
        
        while(1)
        {
            Send_UART_Char(data);
            _delay_ms(500);
        }
    }
    
    void UART_Init()
    {    
        UCSRB = (1<<RXEN) | (1<<TXEN);                                                                    // Rx und Tx aktivieren
        UCSRC = (1<<URSEL)| (1<<UCSZ1) | (1<<UCSZ0);                                                    // 8 Bit Nachrichtenlänge einstellen
        
            
        UBRRH = 0x00;
        UBRRL = 0x33;                                                                                    // Baudrate auf 19200 festlegen
    }
    
    
    void Send_UART_Char(char data[])
    {
        char Counter;
        
        lenght = strlen(data);
        
        while(Counter < lenght)
        {
            while (!(UCSRA & (1<<UDRE)));
            UDR = data[Counter];    
            Counter++;
        }
            
        Counter = 0x00;    
        while (!(UCSRA & (1<<UDRE)));
        UDR = 0x0A;    
        while (!(UCSRA & (1<<UDRE)));
        UDR = 0x0D;    
    }
    Ich hab halt alles vom UART händlich gemacht (finde ich zum ersten lernen bischen besser als die "fertigen" Libs zu verwenden. Da versteht man den Ablauf bischen besser.
    Vergleich das mal mit deinem Programm. Von der void Send_UART_Char brauchst du dann nur die Zeilen nehmen die nur 1 Zeichen senden (der Rest ist eine Schleife womit ein ganzer String gesendet wird). Ein einzelnes Zeichen sendest du so:

    while (!(UCSRA & (1<<UDRE)));
    UDR = 0x0D;

    Ich denke du hast sicher nur eine Kleinigkeit verkehrt gemacht
    Geändert von Kampi (03.05.2012 um 23:27 Uhr)
    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
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von Kampi Beitrag anzeigen
    Ich hatte erst

    UCSRB = (1<<RXEN) | (1<<TXEN);
    UCSRC = (1<<UCSZ1) | (1<<UCSZ0);
    UCSRC = (1<<URSEL)

    da stehen und damit funktioniert es NICHT.
    Natürlich nicht. Die mittlere Zeile schreibt was nach UBRRH, und die letzte Zeile setzt die Datengröße auf 5-Bit.


    Zitat Zitat von Yunus64 Beitrag anzeigen
    Terminal: HTerm ist auf 8N1 9600Baud und Flow Control gestellt.
    "Flow Control"? Du hast doch gar kein "Flow Control".
    MfG
    Stefan

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Einsteiger braucht Hilfe bei Motorenwahl
    Von patteb im Forum Motoren
    Antworten: 2
    Letzter Beitrag: 21.04.2010, 16:50
  2. Einsteiger braucht einen Rat!
    Von PanicGamer im Forum Schaltungen und Boards der Projektseite Mikrocontroller-Elektronik.de
    Antworten: 2
    Letzter Beitrag: 16.12.2008, 19:22
  3. Antworten: 74
    Letzter Beitrag: 29.12.2006, 14:32
  4. Einsteiger braucht Expertenunterstützung
    Von Phil Connors im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 10.10.2006, 09:29
  5. Einsteiger braucht Hlfe
    Von bomberman_z im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 13
    Letzter Beitrag: 30.09.2006, 11:37

Berechtigungen

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

Labornetzteil AliExpress