Pins im delay Abfragen

OP #2779608
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
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
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

Eine eigene Frage? Dieser Thread ist über 14 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.