Im main loop frage ich von einem Chip Daten ab. Der Chip bietet die
Möglichkeit via PIN L->H Übergang anzuzeigen, dass neue Daten vorhanden
sind. Das wollte ich auch nutzen, da ich nicht mehr die Register des
Chips poolen müsste. Nun ja, die ISR ist schnell erstellt und da wird
nur ein volatile u8 flag addressed auf 1 gesetzt.
1 | void intr_init(void) {
|
2 |
|
3 | // PCIE1: Pin Change Interrupt Enable 1
|
4 | PCICR |= (1 << PCIE1);
|
5 | // PCMSK1 Pin Change Mask Register 1
|
6 | PCMSK1 |= (1 << PCINT8);
|
7 | }
|
8 |
|
9 | ISR (PCINT1_vect) {
|
10 | if (PINE & (1 << PE0)) {
|
11 | addressed = 1;
|
12 | }
|
13 | // clear interrupt flag
|
14 | PCIFR |= (1 << PCIF1);
|
15 | }
|
In der Main Routine werden weiteren Sachen ausgeführt, die durch
addressed Flag ausgelöst werden müssen. Nur das will nicht wirklich,
habe es schon mit unterschiedlichen Compiler-Optimierungen ausprobiert.
Die Funktion xyz liefert ein anderes Ergebnis je nach dem, ob ich diese
abfrage wenn addressed Flag gesetzt ist oder nicht.
if(addressed) {
a = xyz();
}
a = xyz();
beide Sachen liefern unterschiedliche Ergebnisse. Gibt es da ein
bekanntes Problem? Anzumerken ist, dass xyz auf die weitere PCINT Pins
zugreift und diese abfragt, die jedoch nicht für die ISR freigegeben
sind.