-         
+ Antworten
Ergebnis 1 bis 7 von 7

Thema: Atmega8 vs. Atmega32, UART Interrupt funzt bei 32 nicht

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    21.05.2004
    Beiträge
    275

    Atmega8 vs. Atmega32, UART Interrupt funzt bei 32 nicht

    Hi!
    Ich habe ein für mich unerklärbares Problem.
    Habe auf einem Atmega8 das UART (USART) genutzt, und wollte nun zum Atmega32 umsteigen
    (empfang mittels Interrupt).
    Nun ja, ich dachte ich würde einfach die Headerfiles austauschen und es funzt, aber so einfach scheint das nicht zu sein.
    Habe die Headerfile " iom8.h " durch "iom32.h" ausgetauscht, ansonsten ist das Programm das gleiche geblieben (An den Headerfiles kann es nicht liegen).
    Auch die Register die ich anspreche sind beim 8. und beim 32 die selben.
    Als Compiler nutze ich den avr-gcc.

    Ich bin echt ratlos, kann mir da irgendjemand helfen?

    MfG
    Batti

    ************************************************** *******************************
    #include <iom32.h>
    #include <interrupt.h>
    #include <sig-avr.h>


    SIGNAL(SIG_UART_RECV)
    {
    uart_send( inp(UDR) );
    }

    void init_uart()
    {
    outp( (CPU_Frequency / (UART_Baud_Rate*16L)) - 1 , UBRRL );
    outp( 0, UBRRH );
    outp( (1 << URSEL) | (3 << UCSZ0), UCSRC);
    outp( (1<<RXCIE) | (1<< TXEN) | (1<<RXEN), UCSRB);
    }

    void uart_send(char character)
    {
    loop_until_bit_is_set( UCSRA, UDRE );
    outp( character, UDR );
    }

    int main()
    {
    init_uart();
    uart_send('H');
    uart_send('a');
    uart_send('l');
    uart_send('l');
    uart_send('o');
    uart_send(10);
    uart_send(13);
    sei();
    while(1);



    return 0;
    }

    **********************************************

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    21.05.2004
    Beiträge
    275
    Huch ein sehr wichtiges Detail hab ich wohl vergessen. :-/
    Also das senden funktioniert auch beim 32 perfekt.
    Nur das Empfangen per Interrupt funktioniert nicht, habe schon probiert ob das "Global Interrupt Enable Flag" oder wie das heißt durch "sei()" richtig gesetzt wurde, dies scheint allerdings der Fall zu sein.

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    21.05.2004
    Beiträge
    275
    Problem ist gelöst....

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.11.2003
    Beiträge
    991
    Noch eine kleine Anmerkung : Du solltest das hier
    Code:
    #include <iom32.h>
    #include <interrupt.h>
    #include <sig-avr.h>
    durch das hier ersetzten:
    Code:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/signal.h>
    Dann müsstest du nichtmal das Headerfile ändern. Und außerdem funktioniert dein Code nach dem übernächsten Compilerupdate immer noch Das was du geschrieben hast ist als "deprecated" markiert ( also veraltet ), sollte deshalb nicht verwendet werden...

    MfG Kjion

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    21.05.2004
    Beiträge
    275
    Danke für den Tipp Kjion!
    Komme damit aber nicht ganz klar.
    Ich muss doch dem Compiler "mitteilen" um welchen µC es sich handelt...

    MfG
    Batti

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    27.08.2004
    Beiträge
    159
    das sagst du ihm doch im makefile, wenn ich mich nicht irre...

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.11.2003
    Beiträge
    991
    Genau. Einfach im Makefile einstellen, dann wird mit dem #include <avr/io.h> automatisch die richtige Definitionsdatei geladen...

    MfG Kjion

+ Antworten

Berechtigungen

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