-
        

Ergebnis 1 bis 8 von 8

Thema: Interrupt - Beispielcode für ATMega 8 ebeten

  1. #1

    Interrupt - Beispielcode für ATMega 8 ebeten

    Anzeige

    Hallo Forum.
    Ich programmiere meinen neuen ATMega 8 erfolgreich mit AVR Studio 4.x.
    Doch bei den Interrupts gebe entweder ich oder der Compiler auf.

    Liebes Forum, ich würde mich sehr freuen über einen kleinen Beispielcode, der folgende Bedingungen erfüllt:

    - mit ISR arbeiten (und nicht mit den SIGNAL-Methoden)
    - per INT0 oder INT1 die Änderung eines PINS überwachen
    - in C geschieben sein

    Ich würde mich sehr freuen, wenn ich das Beispiel in ein C-Projekt einfügen kann um erstmalig zu sehen, dass die Interrupts ansprechbar sind.

    Mit freundlichem Gruß und vielen Dank im vorraus,
    Florian

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.383
    poste doch mal deinen code, dann versteht man deine fehler besser und kann dir besser helfen

    ausser dass du

    #include<avr/interrupt.h>
    vergessen

    oder bei den vektornamen der interrupts dich vielleicht in GROSS und kleinschreibung vertan hast

    gibts eigentlich keine anderen fehlerquellen

  3. #3
    Hallo Ceo,
    Danke für die Antwort. Den Quelltext habe ich natürlich zu liefern. Hier ist er.
    Das Resultat ist, dass PortB durchgehend low ist. Sprich: Die LEDS leuchten dauernd. Int0 (Pin 4) und Int1 (Pin5) sind von mir gebrückt. Eine Verbindung zu 5V oder Masse bringt keine Änderung auf Port B. Die LEDS leuchten dauernd.

    Weißt du zufällig, was ich ändern kann?

    Anbei der Quelltext, die Warnmeldungen des Compilers sind angefügt.

    ===========================================
    Code:
    #ifndef F_CPU
    #define F_CPU  8000000L
    #endif
    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/delay.h>
    
    void long_delay(uint16_t ms) {
        uint16_t i;
    	uint16_t b;
    	i = 0;
    	b = 0;
    	for(i; i < 65000; i++) {
    		_delay_loop_1(10);
    		b++;
    	}
    }
    
    int main()
    {
      cli();
    
      DDRB = 0xFF;
      PORTB = 0x00;
      MCUCR = 0b00000011;
      GICR = 0b11000000;
    
      sei();
      while(1)
      {
        PORTB = 0x00;
      }
    
    }
    
    ISR(INT0_vect)
    {
      PORTB = 0xFF;
      long_delay(20000);
    }
    ===========================================

    Jetzt die Warnmeldungen
    Build started 24.11.2008 at 20:37:10
    avr-gcc -mmcu=atmega8 -Wall -gdwarf-2 -O0 -Wp,-M,-MP,-MT,interrupts.o,-MF,dep/interrupts.o.d -c ../interrupts.c
    ../interrupts.c: In function `long_delay':
    ../interrupts.c:16: warning: statement with no effect
    ../interrupts.c: At top level:
    ../interrupts.c:42: warning: return type defaults to `int'
    ../interrupts.c: In function `ISR':
    ../interrupts.c:45: warning: control reaches end of non-void function
    avr-gcc -mmcu=atmega8 interrupts.o -o interrupts.elf
    avr-objcopy -O ihex -R .eeprom interrupts.elf interrupts.hex
    avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex interrupts.elf interrupts.eep
    Build succeeded with 3 Warnings...

    Vielen Dank für das Lesen meines Problems und vielen Dank im Vorraus für eine Antwort.
    Florian.

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.383
    ../interrupts.c:16: warning: statement with no effect

    das inkrementierender variable b , bzw. die variable b in dem kontext hat keine wirkung , nimm sie einfach raus

    ../interrupts.c:42: warning: return type defaults to `int'
    ../interrupts.c: In function `ISR':
    ../interrupts.c:45: warning: control reaches end of non-void function

    das bedeutet, dass er deine ISR als eine
    int ISR(...) Methode auffasst, du hast also irgendwas vergessen oder falsch gemacht

    allgemein würde ich DRINGEND dazu raten ISRs und methoden allgemein VOR der main zu schreiben, das hier ist kein c++ und du hast auch keine prozedurprototypen deklariert, vermutlich rührt daher der fehler

    prozedurales C mit nachgestellten methoden erfordert immer eine dekalration von prozedurprototypen und da ich ehrlich gesagt nicht unbedingt weis wie die interrupts nach den präprozessor aussehen würd ich sie immer über der main schreiben

    PS ein alter hut ich weis, aber sie zu dass deine codes NIE warnungen produzieren jede warnung kann zu undefiniertem verhalten führen und die fehlersuche wird dann sehr mühseelig

    PS mein nick heisst Ceos auch wenn er irrtumlich aus dem Wort Ceo entstammt ... altlast aus jüngeren jahren aber der hat sich so eingebrannt

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

    ohne die 0bxxxxxxxx jetzt genau auseinander zu pflücken. Wo ist die ISR für INT1. Wenn du den aktivierst und die ISR fehlt, resetet sich der Controller.

    Man ist immer versucht die ISR so kurz wie möglich zu halten und länger dauernde Dinge durch den Interrupt in der Hauptschleife zu veranlassen. Als Übung ist die long_delay Geschichte in der ISR ja okay, ansonsten tödlich.


    Gruß

    Jens

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    15.11.2004
    Ort
    Aachen
    Alter
    32
    Beiträge
    246
    Hi,

    welche Compiler Version benutzt du?

    Ich habe es gerade mit WinAVR-20071221 compiliert und ich bekomme nur diese Warnung:

    ../interrupts.c: In function `long_delay':
    ../interrupts.c:16: warning: statement with no effect

    Die kommt daher, dass in der for-Schleife nur i; und nicht i = 0; steht.

    Zitat Zitat von Ceos
    ../interrupts.c:16: warning: statement with no effect

    das inkrementierender variable b , bzw. die variable b in dem kontext hat keine wirkung , nimm sie einfach raus
    Das stimmt so nicht, ich stimme zwar zu, dass b keine Wrikung hier hat, aber diese Zeile produziert keine Warnung... (Die Nummerierung stimmt nicht mit dem geposteten Code überein...)

    Ich bekomme allerdings bei Optimierung O0 den Hinweis, dass die delay-Funktionen nur richtig funktionieren ab O1 ! (und dass man util/delay.h benutzen soll).

    Irgendwie erkennt er bei dir ISR nicht richtig an. Er denkt dies wäre eine Funktion mit dem Namen ISR....

    EDIT: Vielleicht hast du eine falsche/alte interrupt.h, und darin gibt es kein ISR(...)

  7. #7
    Hallo Forum.
    Es scheint an meiner Compilerversion zu liegen.
    Wie kann ich denn meine AVR Studio und WinAVR-Software auf den neuesten Stand bringen?
    Gibt es einen eleganteren Weg außer alles zu de- und wieder zu installieren?

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    15.11.2004
    Ort
    Aachen
    Alter
    32
    Beiträge
    246
    Du brauchst eigentlich nur WinAVR neu zu installieren. Das alte besser vorher deinstallieren, damit auch sicher der neue genutzt wird.

    http://winavr.sourceforge.net/download.html

Berechtigungen

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