Forum: Mikrocontroller und Digitale Elektronik Mikrocontrollers Eingang bestimmten Impuls abfragen


von Hans B. (baggy)


Lesenswert?

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.

von holger (Gast)


Lesenswert?

>Kann mir jemand einen groben Programmablauf in c zeigen.

 timeoutTaster++;
 if(timeoutTaster > TIMEOUT) schalteausgang();

SCNR ;)

von Hans B. (baggy)


Lesenswert?

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?

von Tom M. (tomm) Benutzerseite


Lesenswert?

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"... ;-)

von Hans B. (baggy)


Lesenswert?

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;
      };
}

von Peter D. (peda)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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 ....

von Hans B. (baggy)


Lesenswert?

Wie kann ich denn mit dem Interrupt mein e aus dieser Funktion
auf 0 setzten?
while (1)
      {
      if (e < 60) e = e++;
      delay_ms(1000);
      if (e > 60) PORTC.5 = 1;
      else PORTC.5=0;
      };
}

von Hans B. (baggy)


Lesenswert?

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;
      };
}

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.