- SF800 Solar Speicher Tutorial         
Ergebnis 1 bis 8 von 8

Thema: ATMEGA32 Interrupt CLI stoppt Interrupts nicht

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    22.12.2019
    Beiträge
    19
    Das werde ich doch gleich mal testen. Mein debuging zeigt mir gerade dass meine Variable "detect" irgendwie nie den
    Wert ändert ??? Warum auch immer. PA6 wird nämlich nicht aktiviert und das ist mehr als seltsam. Damit wird dann
    auch kein cli() aufgerufen und das Phänomen wäre erklärbar, dass damit der Interrupt aktiv bleibt. Die ISR wird allerings
    angesprochen. Die LED an PA0 ändert ihren Status. die While schleife wird auch erreicht. Schiebe ich die PA6 LED dort hin
    leuchtet sie.

    Code:
    #define MCU  atmega32
    #define F_CPU 16000000UL
    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <util/delay.h>
    #include <avr/interrupt.h>
    #include <inttypes.h>
    #include <avr/sleep.h>
    #include <avr/power.h>
    
    int detect = 0;
    
    int main(void){
       // Direction Registers
       DDRA = 0xff;            // LED Block A
       DDRC = 0xff;            // LED Block C
       
       DDRD &= ~(1 << PIND7);  // IR-LED to INPUT
       
       // Ports to LOW
       PORTA = 0x00;
       PORTC = 0x00;
       PORTD = 0x00;
       
       PORTD |= (1<<PD2);    // Pullup auf INT0 (PD2) an 
       GICR  |=(1<<INT0);    // INT0 bereitstellen
       MCUCR |=(2<<ISC00);   // INT0 für fallende Flanke einstellen
       sei();                // Interrupts aktivieren
       while(1){
          if (detect == 1){
             PORTA |= (1<<PA6);
             cli();               // Interrupts deaktivieren
          }
       }
    
       return 0;
    }
    
    // Interrupt INT0
    ISR(INT0_vect){
       detect = 1;
       PORTA ^= 1<<PINA0; //die LED wird umgeschaltet
    }
    - - - Aktualisiert - - -

    Ich habs geschafft, das ganze ist ein Compiler Bug sobald ich mit -Os übersetze ist es Buggy mit -O0 ist alles in Ordnung.

    Da kann ich ja ewig suchen. Ich hab jetzt ein paar mal hin und her probiert und es lässt sich reproduzieren

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.715
    Blog-Einträge
    133
    Zitat Zitat von Tux12Fun Beitrag anzeigen
    Ich habs geschafft, das ganze ist ein Compiler Bug sobald ich mit -Os übersetze ist es Buggy mit -O0 ist alles in Ordnung.
    Das ist kein Bug sondern ein Feature. detect muß als volatile markiert werden wenn es in der isr verändert werden können soll:
    https://rn-wissen.de/wiki/index.php/...e_mit_volatile

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  3. #3
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.093
    Das ist kein Bug. Die Variable wird wegoptimiert. Der compiler denkt das der Interrupt nicht ausgeführt wird und dadurch die Variable unnötig Platz verschwendet (weil diese nicht gesetzt wird). Du kannst dem Compiler aber sagen das er diese Variable nicht wegoptimieren darf indem du "volatile" verwendest.

    Z.B.: volatile int detect=0;

    Wenn du es so schreibst wird es funktionieren. Wenn du es debuggst, kannst du die Variable beobachten. Normalerweise steht dann "optimized away".

    MfG Hannes

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    22.12.2019
    Beiträge
    19
    Oh vielen Dank da habe ich echt etwas dazu gelernt.

Ähnliche Themen

  1. Interrupt während eines Interrupts
    Von tegtom im Forum Assembler-Programmierung
    Antworten: 10
    Letzter Beitrag: 21.11.2010, 09:19
  2. USART atmega32 mit Interrupt
    Von walterk im Forum C - Programmierung (GCC u.a.)
    Antworten: 12
    Letzter Beitrag: 07.12.2009, 11:14
  3. Atmega32 Interrupt Timing
    Von FoCus im Forum AVR Hardwarethemen
    Antworten: 12
    Letzter Beitrag: 12.02.2006, 01:44
  4. Externe Interrupts beim Atmega32
    Von Javik im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 11
    Letzter Beitrag: 23.11.2004, 15:04
  5. Atmega8 vs. Atmega32, UART Interrupt funzt bei 32 nicht
    Von batti112 im Forum C - Programmierung (GCC u.a.)
    Antworten: 6
    Letzter Beitrag: 21.09.2004, 12:03

Berechtigungen

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

12V Akku bauen