
Zitat von
Ceos
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 von
Ceos
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 von
Ceos
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
}
Lesezeichen