Mikrocontrollers Eingang bestimmten Impuls abfragen

OP #1609751
Hi,
würde gerne den Eingang eines Mikrocontrollers überwachen.
Dieser Eingang wird z.B. alle 60s durch einen Taster kurz auf low 
gesetzt. Wenn jetzt dieser Impuls eine Zeit ausbleibt, soll ein Ausgang 
auf high gesetzt.
Kann mir jemand einen groben Programmablauf in c zeigen.
Persönliche Seite
Ich würde den Taster an einen Pin anschliessen, der als Interruptquelle 
dienen kann. Dann ISR einrichten, welcher auf High-Low Übergang an 
diesem Pin reagiert und ein Flag setzt. Ggf. Timer für zweite ISR neu 
initialisieren, damit dieser asap feuert.

Eine weitere ISR könnte 1x/Sekunde auslösen (Timer verwenden) und die 
Sekunden hochzählen bzw. neu bei 0 beginnen, wenn das Flag gesetzt ist.

Im main wäre dann Schlafen angesagt. Wenn ISRs laufen, wacht die CPU auf 
(main loopt also einmal) und du testest kurz den Sekundenzähler und 
machtst abhängig davon $WASIMMERDUWILLST.

"programming left as an excercise to the reader"... ;-)
OP
Geht das so?
Solange e<60 ist wird hochgezählt. Also 60Sekunden.
Nach 60s wird PORTC.5 auf high gesetzt, falls nicht ein Interrupt 
ausgelöst wird, welcher e auf 0 setzt.

// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
int e;
e=0;
}


// Declare your global variables here
int t=1000;
int e=0;
while (1)
      {
      if (e < 60) e = e++;
      delay_ms(1000);
      if (e > 60) PORTC.5 = 1;
      else PORTC.5=0;
      };
}
Tom M. schrieb:
> Ich würde den Taster an einen Pin anschliessen, der als Interruptquelle
> dienen kann. Dann ISR einrichten, welcher auf High-Low Übergang an
> diesem Pin reagiert und ein Flag setzt.

So würde ich es gerade nicht machen!

Der Taster prellt und die Leitung zum Taster kann sich Störungen 
einfangen.
Man braucht eine Entprellsoftware, um den Taster abzufragen.

Den Interrupt (Pin-Change-Interrupt) könnte man bestenfalls bei 
Batteriebetrieb nur zum Aufwachen benutzen.


Peter
Hans Bernd schrieb:
> Dieser Ablauf zählt doch timeoutTaster hoch und sobald er > TIMEOUT ist,
> wird geschaltet.
> Bei diesem Ablauf wird doch die Zeit nicht berücksichtigt, oder?

Wenn der ganze Vorgang exakt jede 1 Sekunde abläuft, dann wird die Zeit 
sehr wohl indirekt berücksichtigt.
Der Wert in timeoutTaster ist dann ein direktes Mass für die Zeit, die 
verstrichen ist, seit timeoutTaster zuletzt auf 0 gesetzt wurde.
Hans Bernd schrieb:
> Geht das so?

Nein.
Das e in ext_int0_isr ist ein anderes e als das in ... ja wo eigentlich? 
Du hast keine main Funktion. Aber egal, das e in ext_int0_isr ist auf 
jeden Fall ein anderes als jedes andere e in deinem Programm.

Aber abgesehen davon würde das schon funktionieren.
Die Zeit wird unter Umständen nicht besonders genau sein, aber wenn es 
auf 1 Sekunde mehr oder weniger nicht ankommt ....
OP
Mit volatile müsste die Variable zaehler ja sowohl im Interrupt als auch 
im Programm die Gleiche sein.


volatile int zaehler;

// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
zaehler=0;
}

while (1)
      {
      if (zaehler < 60) zaehler++;
      delay_ms(1000);
      if (zaehler > 60) PORTC.2 = 1;
      else PORTC.5=0;
      };
}

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.