- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 10 von 59

Thema: Interrupt-Abfrage >>> Routine vereinfachen

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    Beiträge
    3.416
    Das Problem ist hier aber, dass du beim Auslösen von PC4 keinen PCINT0 bekommst und deshalb das Drücken verpasst!

    Darum sage ich ja dass du schon wie üblich alle 4 PCINT ISRs schreiben musst aber statt deine Abfrage 4 mal ähnlich zu kopieren in den ISRs jeweils einfach eine Methode aufrufst (wie im Codebeispiel) in welcher du deine PIN Register, das Interrupt Register oder eine Variable als Indikator dazu benutzt um zu erfahren, welcher Input getriggert worden ist.

    die Lösung über Makro geht natürlich auch, einfch den code als reines Makro mit Platzhalter schreiben um die richtige Pin Zuordnung und die richtige Reaktion zu bekommen.
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    148
    Zitat Zitat von Ceos Beitrag anzeigen
    Das Problem ist hier aber, dass du beim Auslösen von PC4 keinen PCINT0 bekommst und deshalb das Drücken verpasst!
    Der ATtiny84 hat nur 2 Bänke; Bank0 mit 8* PAs und Bank1 mit 4* PBs. Zufällig liegen meine 4 Taster/Kontakte in Bank0.

    Zitat Zitat von Ceos Beitrag anzeigen
    Darum sage ich ja dass du schon wie üblich alle 4 PCINT ISRs schreiben musst aber statt deine Abfrage 4 mal ähnlich zu kopieren in den ISRs jeweils einfach eine Methode aufrufst (wie im Codebeispiel) in welcher du deine PIN Register, das Interrupt Register oder eine Variable als Indikator dazu benutzt um zu erfahren, welcher Input getriggert worden ist.
    Kannst du mir bitte zur Verdeutlichung einen Bsp-Code schreiben?

    Zitat Zitat von Ceos Beitrag anzeigen
    die Lösung über Makro geht natürlich auch, einfch den code als reines Makro mit Platzhalter schreiben um die richtige Pin Zuordnung und die richtige Reaktion zu bekommen.
    Kannst du mir bitte zur Verdeutlichung einen Bsp-Code schreiben?

    - - - Aktualisiert - - -

    Was hälst du von folgender Idee;

    1. direkt das ganze Register PINA auslesen und in eine Register-Variable (volatiles) speichern.
    2. sobald ein ISR(PCINT0_vect) kommt, mit der Reg-Var vergleichen.
    3. das veränderte Bit als PAx auslesen, entprellen und auf 0/1 überprüfen

    ?

    - - - Aktualisiert - - -

    DENKFEHLER!
    In dem Register sind Ein- und Ausgänge.
    Somit könnte ich zwar das ganze Register auf ein mal speichern, aber Bit-Veränderungen nur bei meinen 4 PA-Eingängen durchführen. (?)

    - - - Aktualisiert - - -

    Was hälst du von folgendem Lösungsansatz?

    Code:
    volatile uint8_t RegisterA = PINA;
    
    ISR (PCINT0_vect)					// Interrupt, ABFRAGE, aus Bank0, wird ausgelöst
    {
    	if(RegisterA & (1<<PINA2)) != 0)		// auf Zustandveränderung PA2/RESET abfragen
    	{
    		switch (Reset_Status())		// "Reset" entprellen // return 0=low, 1=high
    		{
    			case 0: RegisterA=PINA;	Reset_off();	break;  // Reset wird ausgeführt
    			case 1: RegisterA=PINA;	Reset_on();	break;  // Reset wird nicht ausgeführt
    		}
    	}
     
          // solch eine Abfrage noch für PA3, PA4, PA5 hintereinander gehangen
    }
    __________________________________________________ _
    | Sprache: C | Teensy 3.2 | Arduino 2.x | Status: EwigerAnfaenger |

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    Beiträge
    3.416
    oh okay, das sind bank interrupts, das manual was ich hatte war wohl für einen größeren Tiny, da waren das ganze einzelne pin interrupts (war ich auch von den noch größeren atmegas so gewohnt)

    sorry

    ich weis jetzt nicht genau was hinter Reset_Status steckt, aber solange ein mehrfachen aufrufen kein Probblem ist wäre das eine Lösung

    du könntest das Ergebnis in eine Variable packen und dann die Variable in den if's abfragen wenn der mehrfache Aufruf ein Problem ist
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    148
    Zitat Zitat von Ceos Beitrag anzeigen
    oh okay, das sind bank interrupts, das manual was ich hatte war wohl für einen größeren Tiny, da waren das ganze einzelne pin interrupts (war ich auch von den noch größeren atmegas so gewohnt)
    Bis auf die Interrupt-Vielfalt ist der kleine ATtiny84 sehr angenehm zu verarbeiten.

    Zitat Zitat von Ceos Beitrag anzeigen
    ich weis jetzt nicht genau was hinter Reset_Status steckt, aber solange ein mehrfachen aufrufen kein Probblem ist wäre das eine Lösung
    Reset_Status() entprellt (ohne _delay_ms()) einen Kontakt und gibt als steigende Flanke eine 1 und als fallende Flanke eine 0 zurück.
    In meinem Bsp wird erst einmal das "alte" Register nach Veränderung ausgewertet und "nur" der veränderte Kontakt entprellt und verarbeitet.
    Hoffentlich bin ich hier nicht auf dem Holzweg.

    Zitat Zitat von Ceos Beitrag anzeigen
    du könntest das Ergebnis in eine Variable packen und dann die Variable in den if's abfragen wenn der mehrfache Aufruf ein Problem ist
    Klinkt nach Vereinfachung
    Kannst du mir bitte ein Bsp-Code schicken der deine Idee verdeutlicht?
    __________________________________________________ _
    | Sprache: C | Teensy 3.2 | Arduino 2.x | Status: EwigerAnfaenger |

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    Beiträge
    3.416
    Code:
    volatile uint8_t RegisterA = PINA;
    
    ISR (PCINT0_vect)					// Interrupt, ABFRAGE, aus Bank0, wird ausgelöst
    {
            uint8_t resetVal = Reset_Status();
    	if(RegisterA & (1<<PINA2)) != 0)		// auf Zustandveränderung PA2/RESET abfragen
    	{
    		switch (resetVal)		// "Reset" entprellen // return 0=low, 1=high
    		{
    			case 0: RegisterA=PINA;	Reset_off();	break;  // Reset wird ausgeführt
    			case 1: RegisterA=PINA;	Reset_on();	break;  // Reset wird nicht ausgeführt
    		}
    	}
    	if(RegisterA & (1<<PINA3)) != 0)		// auf Zustandveränderung PA3/RESET abfragen
    	{
    		switch (resetVal)		// "Reset" entprellen // return 0=low, 1=high
    		{
    			case 0: RegisterA=PINA;	Reset_off();	break;  // Reset wird ausgeführt
    			case 1: RegisterA=PINA;	Reset_on();	break;  // Reset wird nicht ausgeführt
    		}
    	}
     
          // solch eine Abfrage noch für PA4, PA5 hintereinander gehangen
    }
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    148
    Ahhh - Missverständnis!

    Reset_Status() testet nur die "Reset"-Taste an PA2,
    PA3 heisst Start_Status(), usw.
    Alles eigenständige Funktionen, in dehnen entprellt und der letzte Zustand ausgegeben wird.

    Dann scheint mein Weg doch nicht so schlecht.

    Nur bei der Auswertung bin ich mir noch nicht sicher.
    Code:
    if(RegisterA & (1<<PINA2)) != 0)
    Die Zeile sollte die "alte, gespeicherte" Pinbelegung PA2 (RegisterA, vor dem Interrupt) mit dem "neuen, aktuellen" Zustand PA2 vergleichen um heraus zu finden, ob PA2 den Interrupt ausgelöst hat.
    1- Ist eine Veränderung zu erkennen, wird PA2 entprellt, danach Zustand 0/1 abfragen und weiter bearbeiten.
    2 -Wenn nicht, wird PA3 usw. abgefragt.

    - - - Aktualisiert - - -

    Müsste der alt/neu-Vergleich nicht eher folgend aussehen?
    Code:
    volatile uint8_t RegA_alt = PINA;
    
    ISR (PCINT0_vect)
    {
      uint8_t RegA_neu = PINA;
      uint8_t RegA_diff = RegA_alt ^ RegA_neu;  // hier sollte in jedem Reg.eintrag eine "1" stehen, wenn sich zum "alten" (Vor-Interrupt-Auslösung) eine Veränderung ergeben hat
      
      If((RegA_diff & (1<<PINA2)) != 1)
      {
        //wenn Ja, mach was
      {
    
      If((RegA_diff & (1<<PINA3)) != 1)
      {
        //wenn Ja, mach was
      }
    
      //usw. mit PA4, PA5
    __________________________________________________ _
    | Sprache: C | Teensy 3.2 | Arduino 2.x | Status: EwigerAnfaenger |

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    Beiträge
    3.416
    entweder machst du deine Variablen noch zusätzlich static oder legst sie global an, sonst wirst du nie einen unterschied sehen weil sie immer neu initialisiert werden

    ob das XOR da nicht lustige seiteneffekte auslöst würde ich gern prüfen, komme heute aber definitiv nicht mehr dazu mich da etwas tiefer reinzudenken oder zu antworten
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

Ähnliche Themen

  1. [ERLEDIGT] Interrupt Routine
    Von Saturas077 im Forum Assembler-Programmierung
    Antworten: 8
    Letzter Beitrag: 23.04.2014, 12:46
  2. Codebeispiel für Lesen von RC5 Code mit Interrupt-Routine
    Von -tomas- im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 19
    Letzter Beitrag: 25.05.2011, 12:54
  3. Interrupt Routine
    Von luvat im Forum Schaltungen und Boards der Projektseite Mikrocontroller-Elektronik.de
    Antworten: 4
    Letzter Beitrag: 16.03.2008, 20:54
  4. Interrupt in ISR-Routine freigeben
    Von dj5am im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 5
    Letzter Beitrag: 10.08.2007, 08:44
  5. uart interrupt routine
    Von Computerkora im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 25.11.2006, 13:45

Berechtigungen

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

Solar Speicher und Akkus Tests