- Labornetzteil AliExpress         
Seite 3 von 3 ErsteErste 123
Ergebnis 21 bis 30 von 30

Thema: [erledigt] globale Variable in ISR ändern + im Hauptprogramm

  1. #21
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    20.05.2006
    Ort
    Lippe
    Alter
    55
    Beiträge
    524
    Anzeige

    Powerstation Test
    Hallo,

    ich rufe gleich Scully und Mulder, das scheint ja ein Fall für die beiden zu werden. Bis die da sind, hast du mal innerhalb der ISR geprüft, ob Zeittick inkrementiert wird? Nimm mal die Optimierung raus, musst dann natürlich auch die delays löschen. Und kommentiere alles raus, was nicht gebraucht wird. Irgend eine Änderung?

    Gruß

    Jens

  2. #22
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Sorry,
    ich hatte irgendwie den Overflow interrupt im Kopf...
    ich wollte es genau wissen !
    Habe meinen Dragon ausgepackt und Tin draufgesteckt.
    Folgende Erkentnisse :

    SIGNAL (TIM1_COMPA_vect) wird garnicht angesprungen
    SIGNAL (TIM1_OVF_vect) wird genau 2 Mal angesprungen dabei wird Zeittick beim ersten mal 1 beim zweitem 2 und beim Verlassen des Interrupts macht der Tiny einen Reset und fängt in der main von vorne an ?
    Komisch das...

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  3. #23
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Ehm, sorry, ich bin irgendwie durch den Wind heute, es ist anders

    Zuerst Springt er in die Overflow, dann in die Comp, da kommt der wieder in die if Abfrage rein und danach macht es erst den reset ?
    Software is like s e x: its better when its free.
    Linus Torvald

  4. #24
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    So hier ist ein Programm, daß auch funktioniert
    Code:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <stdlib.h>
    #include <util/delay.h>
    
    volatile uint8_t Zeittick ;
    
    
    
    ISR (TIMER1_COMPA_vect)
    {
        PORTB ^= (1 << PB2)|(1<<PB3);   // loescht Bit 3 an PortB
    	Zeittick = Zeittick + 1;
    
    }
    
    int main (void) {
    DDRB = (1<<PB3)|(1<<PB2);
    TCCR1 = (1<<PWM1A)|(1<<COM1A1)|(1<<CS11);
    OCR1A = 0x80;
    OCR1C = 0xFF;
    TIMSK = (1<<OCIE1A);
    sei();
    
    while(1) {
        if (Zeittick >= 3)
        {
             PORTB ^= (1 << PB3);    // setzt Bit 3 an PortB auf 1
        }
    
    }
       
       return 0;
    }
    Was mir noch auffällt ist ist die Bunte Mischung aus SIGNAL und *_vect hier
    Code:
    SIGNAL (TIM1_OVF_vect)
    Ob das was zu sagen hat , weiß ich nicht
    Software is like s e x: its better when its free.
    Linus Torvald

  5. #25
    Benutzer Stammmitglied
    Registriert seit
    20.07.2007
    Beiträge
    38
    Guten Morgen,

    danke erst mal für euer Engagement, finde ich super. Die Sache mit der Optimierung werd ich mir ansehen, klingt garnicht schlecht.
    @Sebastian, danke für den Code werde ihn mal testen. So im ersten überfliegen seh ich keinen Unterschied zu meinem Code (ok er sieht ordentlicher aus , aber inhaltlich? ) Werd ihn mal genau vergleichen und studieren, danke erstmal.
    Ich melde mich mit den Ergebnissen....

    Internette Grüße
    Stefan

  6. #26
    Benutzer Stammmitglied
    Registriert seit
    20.07.2007
    Beiträge
    38
    Guten Abend,

    also so langsam gehen mir die Ideen aus. Ich hab mal deinen Code genommen und compiliert. Das Ergebnis ist das gleiche wie bei mir. Anscheinend wird der Zeittick nicht global verändert. Kannst du mir mal dein hex-File schicken, vielleicht liegts ja an meinem Compiler oder an meinen Einstellungen. Ich häng mal mein Makefile an. Seht ihr da einen Fehler ? Die *.txt Endung ist nur fürs Forum.
    Ich hab auch alle Optimierungsstufen durchprobiert, Ergebnis negativ. Das kann doch alles nicht sein. Ich glaub ich werd doch lieber Gärtner...

    Internette Grüße
    Stefan
    PS: hab grad was interessantes entdeckt. Schreibe ich in die Overflow ISR NUR meinen Zeittick rein, geht es. Die Variable wird im Hauptprogramm richtig erkannt. Steht noch eine weitere Zeile in der ISR geht es nicht ?! Es spielt auch keine Rolle wo der Zeittick steht, ist die Zeile allein - ok ; ist eine weitere Zeile dabei - nicht ok
    Angehängte Dateien Angehängte Dateien

  7. #27
    Benutzer Stammmitglied
    Registriert seit
    20.07.2007
    Beiträge
    38
    ich hab das Problem gelöst, auch wenn ich nicht weiß wieso. Wo liegt der Unterschied zwischen folgenden beiden Codes (außer dass ich in der ISR einen anderen Pin manipuliere)

    Dieser Code geht....
    Code:
    #include <../include/avr/io.h>
    #include <../include/avr/interrupt.h>
    #include <../include/stdlib.h>
    
    volatile uint16_t Zeittick ;
    
    // Eine nichtunterbrechbare Interrupt-Service-Routine
    SIGNAL (TIM1_COMPA_vect)
    {
    	 PORTB &= ~(1 << PB1);   // loescht Bit 1 an PortB
    }
    
    SIGNAL (TIM1_OVF_vect)
    {
    	 PORTB |= (1 << PB1);    // setzt Bit 1 an PortB auf 1
    	 Zeittick=Zeittick +1;
    }
    
    int main (void) {
    // allgemein
    		GTCCR 	= 0b11100001; 	// Timer anhalten
    		SREG 	 |= (1 << 7);
    		GIMSK   = 0b00100000;
    		PCMSK   = 0b00000100;
    // Timer 1
    		TCCR1   = 0b01001100;
    		OCR1A 	= 123;    //LED2
    		OCR1B 	= 200;  //LED4
    		OCR1C 	= 0b11111111;
    		TIMSK   = 0b01000100;
    
    		DDRB    = 0b11111111;   // PortB auf Ausgabe stellen
    		GTCCR 	= GTCCR & 0b11111110 ;// Timer starten
    while(1) {
    	 if (Zeittick==5)
    	 {
          PORTB ^= (1<<PB3);
    			Zeittick = 0;
    	 }
    }
       return 0;
    }
    und dieser geht nicht...
    Code:
    #include <../include/avr/io.h>
    #include <../include/avr/interrupt.h>
    #include <../include/stdlib.h>
    
    volatile uint16_t Zeittick ;
    
    // Eine nichtunterbrechbare Interrupt-Service-Routine
    SIGNAL (TIM1_COMPA_vect)
    {
    	 PORTB &= ~(1 << PB2);   // loescht Bit 2 an PortB
    }
    
    SIGNAL (TIM1_OVF_vect)
    {
    	 PORTB |= (1 << PB2);    // setzt Bit 2 an PortB auf 1
    	 Zeittick=Zeittick +1;
    }
    
    int main (void) {
    // allgemein
    		GTCCR 	= 0b11100001; 	// Timer anhalten
    		SREG 	 |= (1 << 7);
    		GIMSK   = 0b00100000;
    		PCMSK   = 0b00000100;
    // Timer 1
    		TCCR1   = 0b01001100;
    		OCR1A 	= 123;    //LED2
    		OCR1B 	= 200;  //LED4
    		OCR1C 	= 0b11111111;
    		TIMSK   = 0b01000100;
    
    		DDRB    = 0b11111111;   // PortB auf Ausgabe stellen
    		GTCCR 	= GTCCR & 0b11111110 ;// Timer starten
    while(1) {
    	 if (Zeittick==5)
    	 {
          PORTB ^= (1<<PB3);
    			Zeittick = 0;
    	 }
    }
       return 0;
    }
    Auch wenn ich nicht verstehe, warum. Aber immerhin kann ich jetzt weiterprogrammieren. Wenn es mir jemand erklären kann wäre ich etwas schlauer.

    Internette Grüße
    Stefan

  8. #28
    Benutzer Stammmitglied
    Registriert seit
    20.07.2007
    Beiträge
    38

    HEUREKA ich hab's gefunden

    Hai,

    das Problem hat mir einfach keine Ruhe gelassen. Jetzt viele Kaffee und wenig schlaf später hab ich es, glaube ich gefunden. Das kommt davon, wenn man so viele Dinge auf einmal testen will. Das Problem liegt in dem aktivierten PIN-Interrupt "PCMSK = 0b00000100; ". Den hatte ich auch mal getestet und leider aktiviert gelassen. Das Interrupt hab ich gelassen, die ISR allerdings gelöscht bzw. auskommentiert. Lege ich eine leere ISR an oder deaktiviere das Interrupt klappt alles wie erwartet.
    Danke an alle, die an der Lösungs dieses Problems mitgewirkt haben.

    Internette Grüße
    Stefan

  9. #29
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Hallo,
    Pin Change Interrupt ?
    hehe, das erklärt auch das verhalten beim Debuggen...
    Da hast Du Dir einen wirklich fiesen Fehler eingebaut

    Gruß Sebastian

    P.S. Brauchst Du immer noch meine hex Datei ?
    Software is like s e x: its better when its free.
    Linus Torvald

  10. #30
    Benutzer Stammmitglied
    Registriert seit
    20.07.2007
    Beiträge
    38
    Hai Sebastian,

    nein, danke. Ich brauch sie nicht mehr.

    Internette Grüße
    Stefan

Seite 3 von 3 ErsteErste 123

Berechtigungen

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

LiFePO4 Speicher Test