mikrocontroller.net

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


Autor: Archie F..... (archie)
Datum:

Bewertung
0 lesenswert
nicht 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.
void intr_init(void) {

  // PCIE1: Pin Change Interrupt Enable 1
  PCICR  |=  (1 << PCIE1);
  // PCMSK1 Pin Change Mask Register 1
  PCMSK1  |=  (1 << PCINT8);
}

ISR (PCINT1_vect) {  
  if (PINE & (1 << PE0)) {
   addressed = 1;
  }
  // clear interrupt flag
  PCIFR |= (1 << PCIF1);
}

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.

Autor: rogie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wann wird adressed wieder zurückgesetzt?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: rogie (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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".

Autor: Archie F..... (archie)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Zwölf Mal Acht (hacky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann man das auf dem simulator durchlassen ?

Autor: Archie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was für Simulator?

Autor: Drehwurm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
addressed ist volatile deklariert?

Autor: Drehwurm (Gast)
Datum:

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

Autor: Anfängerfehler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ist "addressed" als volatile deklariert?

Autor: Archie (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.