Forum: Mikrocontroller und Digitale Elektronik Flag in ISR gesetzt in Main Flag abgefragt -> kein korrektes Resultat


von Archie F. (archie)


Lesenswert?

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.

von rogie (Gast)


Lesenswert?

Und wann wird adressed wieder zurückgesetzt?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Möglichkeit 1:
Der Pin E0 ist zu kurz aktiv.
Der Int wird zwar ausgelöst, die Abfrage geht aber in die Binsen, weil 
der Pin E0 schon wieder 0 ist...

Möglichkeit 2:
Der Fehler liegt ausserhalb des geposteten Codeabschnitts...

von rogie (Gast)


Lesenswert?

Lothar Miller schrieb:
> Möglichkeit 1:
> Der Pin E0 ist zu kurz aktiv.
> Der Int wird zwar ausgelöst, die Abfrage geht aber in die Binsen, weil
> der Pin E0 schon wieder 0 ist...
>
Ja, das könnte auch sein, das E0 "prellt".

von Archie F. (archie)


Lesenswert?

das geht
if(addressed) {
 printf("bla");
 addressed = 0;
}

das geht nicht:
if(addressed) {
 printf("bla");
 addressed = 0;
 a = xyz();
}


das geht:
if(addressed) {
 printf("bla");
 addressed = 0;
}
a = xyz();

Wie gesagt an sich funktioniert die xyz Funtion.

von Purzel H. (hacky)


Lesenswert?

Kann man das auf dem simulator durchlassen ?

von Archie (Gast)


Lesenswert?

Was für Simulator?

von Drehwurm (Gast)


Lesenswert?

addressed ist volatile deklariert?

von Drehwurm (Gast)


Lesenswert?

printf("bla");
kann sehr lange dauern, ändert sich währenddessen der Portzustand?

von Anfängerfehler (Gast)


Lesenswert?

ist "addressed" als volatile deklariert?

von Archie (Gast)


Lesenswert?

Ich habe doch oben geschrieben, dass addressed als volatile deklariert 
ist. Ich habe es jetzt so belassen wie es ist, weil ich mir das nicht 
erklären konnte und mir die nötige Zeit fehlt da jetzt noch just4fun 
weiter zu bohren.

Danke euch trotzdem!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.