Pins im delay Abfragen

OP #2779608
Lesenswert?

Ich möchte während ein delay ist einen Pin abfragen.
Der Quelltext sieht in etwa so aus:
1
...
2
while(1){
3
PORTB |= (1 << PB0);
4
_delay_ms(5000);
5
if ( !(PINB & (1<<PINB2)) ) {
6
  PORTB |= (1 << PB1);
7
}
8
}
9
...
Wenn jetzt aber der Benutzer im delay drückt passiert ja nichts. Wie 
kann ich das umgehen. Ich habe schon überlegt Teil-Delays mit 20 ms zu 
machen und dazwischen immer den Pin abfragen, das ist aber Quatsch weil 
ich an anderen stellen auch Delays von 20 Sekunden verwende. Eine andere 
Lösung wäre zum Beispiel ein Interrupt das auf einen Pin hört - So wie 
ich das aver im AVR-GCC Tutorial gelesen hab geht das nicht.

Ich hoffe ihr könnt mir helfen.
Gast #2779621
Lesenswert?

Zuerst musst du verstehen was das Delay macht: Es sagt dem µC mal 
sinnbildlich gesprochen: Beschäftige dich mal irgendwie für x ms und 
gehe dann im Quelltext weiter.

Wenn du eine LED blinken lassen willst würde ich für das Blinken eher 
nen Timer nehmen und während dessen den schalter Pollen.
Gast #2779630
Lesenswert?

Hallo

Peter K. schrieb:
> Wenn jetzt aber der Benutzer im delay drückt passiert ja nichts. Wie
> kann ich das umgehen. Ich habe schon überlegt Teil-Delays mit 20 ms zu
> machen und dazwischen immer den Pin abfragen, das ist aber Quatsch weil
> ich an anderen stellen auch Delays von 20 Sekunden verwende. Eine andere
> Lösung wäre zum Beispiel ein Interrupt das auf einen Pin hört - So wie
> ich das aver im AVR-GCC Tutorial gelesen hab geht das nicht.

Wenn Du ein Delay nach der von Dir beschriebenen Art realisiert sagst Du 
dem Prozessor: "Jetzt Zähl mal erst ewig lange (z.B. bis 100000) und 
mache Nichts und dann wenn Du fertig bist melde Dich bei mir wieder".

Wenn Du abeer in dieser Zeit etwas gemacht haben wilst mußt Du Deinen 
Code anders strukturieren. Die von Dir vorgeschlagene Variante 
(Interrupt auf Pin) sollte schon gehen ist aber unüblich da dann solange 
Du drückst (und du das nicht extra abfängst) bei jeder Tastenprellung 
ein Interrupt passiert. Zudem wird der Prozessor danach auch das Delay 
ausführen bis er sich danach zurückmeldet.

Ich denke aber Du willst was anderes: Sobald der Pin den Zusatnd ändert 
solls sofort weitergehen. Das kannst Du mit der von die realiserten 
Weise nicht vernünftig realiseren. Lies Dich in Interrupts ein, bau 
einen Systemtick mit z.B. 1ms und eine Systemzeit die Du im Interrupt 
hochzählst (z.B. int32). Dann kannst Du bei Start des Delays die 
Systemzeit merken und solange die Systemzeit +5000ms noch nicht vorüber 
ist den Port prüfen und wenn der Port kommt aus der Schleife raus.

Ansonsten belibt Dir nur die 20ms Variante und die Anzahl der 20ms 
Durchläufe zu zählen.

Grüße

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren