-         

Ergebnis 1 bis 4 von 4

Thema: Atmega48 Uart Wahnsinn

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    07.07.2005
    Beiträge
    232

    Atmega48 Uart Wahnsinn

    Anzeige

    Hallo,

    der UART des Atmega48 macht mich Wahnsinnig.
    ich bringen die Kiste einfach nicht dazu mir simple Characters an den PC zu senden.
    Mittlerweile habe ich sehr viele Beispiele getestet und mich durch das Datenblatt gehangelt. (Entsprechend auch selber mal Code dafür geschrieben).
    Fazit. Keiner der Codes funktioniert auch nur irgendwie.
    Es kommt absolut nichts an am Pc.
    Ich habe dann am Schluß den Code von dieser Seite probiert:
    http://derjulian.net/mikrocontroller#usart
    Enttsprechend eben die Registernamen für den Atmega48/88 geändert
    Betrifft:
    UBRRH in UBRR0H
    UBRRL in UBRR0L
    UCSRA in UCSR0A
    UCSRB in UCSR0B
    TXEN in TXEN0
    RXEN in RXEN0
    UDRE in UDRE0
    und UDR in UDR0

    in der UART.h hab ich folgendes verwendet
    #define F_CPU 16000000UL
    #define UART_BAUD_RATE 2400

    senden wollte ich dann mit folgendem Code:
    int main(void)
    {
    /* Programmcode */
    uart_init(1, 1);
    while(1){
    _delay_ms(1000);
    uart_puts("Hello World!\n");
    }
    return(0);
    }

    Fuses sind wie folgt:
    SPIEN programmed
    CKSEL3 programmed
    das ergibt dann:
    efuse 01
    lfuse DF
    hfuse F7

    und effektiv dann
    Programmierung über ISP
    externer Full Power Oszillator mit 0.4MHZ-20MHZ mit slow rising Power

    Als Quarz hängt ein 16MHZ dran.

    Ich wäre sehr dankbar wenn jemand mir helfen könnte den Fehler zu finden.
    Ich bin mir auch nicht sicher ob die Schnittstellenhardware (max232) funktioniert.

    Ich würde mich auch für den Test über ein funktionierendes hex Program für den Atmega48 oder 88 (sind ja fast gleich) freuen, dann kann ich die Hardware als Ursache vielleicht eliminieren

    Vielen Dank,

    Gruß Tim

  2. #2
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Ich würde mich auch für den Test über ein funktionierendes hex Program für den Atmega48 oder 88 (sind ja fast gleich) freuen, dann kann ich die Hardware als Ursache vielleicht eliminieren
    Du kannst die Hardware viel besser überprüfen, indem du direkt am Chip TX und RX verbindest (*). Im Terminalprogramm musst du dann ein Echo bekommen. Stell nur sicher, dass das kein lokales Echo ist.

    (*) Wenn DIP, Chip dafür einfach aus der Fassung nehmen. Ansonsten den Chip für den Test im Reset halten.

    SPIEN programmed
    CKSEL3 programmed
    das ergibt dann:
    efuse 01
    lfuse DF
    hfuse F7
    Die HEX-Werte stimmen nicht mit deiner Beschreibung überein, also checke das nochmal.
    EDIT: Du hast lfuse und hfuse vertauscht.
    MfG
    Stefan

  3. #3
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Wenns denn sein muß könnte ich schon einen Beispielcode beisteuern. Ein funktionieren der C Code sollte besser sein als ein .hex file. Ich hätte z.B. ein einfaches UART Echo.
    Sollte gehen, habe nur mein restliches Programm entfernt um den Code kurz zu halten. Gff die Datenrichtungen ein bischen anpassen, je nach Hardware.


    Code:
    #include <inttypes.h>
    #include <avr/io.h>
    
    #define BAUD        1200UL
    #define UBRR_BAUD   ((F_CPU/(16UL*BAUD))-1)
    
    // USART initialisieren
    void uart_init(void)
    {
        // Baudrate einstellen (Normaler Modus)
        UBRR0H = (uint8_t) (UBRR_BAUD>>8);
        UBRR0L = (uint8_t) (UBRR_BAUD & 0x0ff);
        // Aktivieren von receiver und transmitter
        UCSR0B = (1<<RXEN0)|(1<<TXEN0);
        // Einstellen des Datenformats: 8 Datenbits, 2 Stoppbit
        UCSR0C = (1<<UCSZ01)|(1<<UCSZ00)|(1<<USBS0);
    }
    
    void init_2(void)
    {
       DDRB = 63  ;   // LED Driver outputs
       DDRD = 254 ;   // outputs except RXD  
       DDRC = 3+32   ;   // PC0,PC1,PC5 outputs (LED Kathodes)
       sei();
    }
    
    int main(void)
    {
        uint8_t buffer;
    
        init_2();         // in/out initialisieren, interupts freigeben
        uart_init();      // USART initialisieren
     
        while ( !( UCSR0A & (1<<UDRE0)) ) ; // Warten bis der Sendepuffer frei ist
        UDR0 = 'A';
        while ( !( UCSR0A & (1<<UDRE0)) ) ; // Warten bis der Sendepuffer frei ist
        UDR0 = 'B';
    
        while (1)
        {
            // Warten bis Daten empfangen wurden
            while ( !(UCSR0A & (1<<RXC0)) )       ;
    
            // Empfangsregister auslesen
            buffer = UDR0;
    
            // Warten bis der Sendepuffer frei ist
            while ( !( UCSR0A & (1<<UDRE0)) )            ;
    
            // Daten in den Puffer schreiben und damit senden
            UDR0 = buffer;
        }
    }

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    07.07.2005
    Beiträge
    232
    Hallo,

    vielen Dank für die Flotte Hilfe. Der Fehler war lächerlich!
    Man sollte halt die Jumper richtig stecken, so dass die Pins auch mit dem Max232 verbunden sind. Dann gehts auch....

    Gruß Tim

Berechtigungen

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