Forum: Mikrocontroller und Digitale Elektronik Pins im delay Abfragen


von Peter K. (peterka2000)


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.

von Ulp (Gast)


Lesenswert?

warum willst du überhaupt ein Delay dort einbauen?

von Peter K. (peterka2000)


Lesenswert?

Weil dort eine Lampe blinken soll, z.B. so
1
...
2
while(1){
3
PORTB |= (1 << PB0);
4
_delay_ms(5000);
5
if ( !(PINB & (1<<PINB2)) ) {
6
  PORTB |= (1 << PB1);
7
}
8
PORTB &= ~(1 << PB0);
9
_delay_ms(1000) 
10
}
11
...

von HildeK (Gast)


Lesenswert?

Mit 'Delay' geht das nicht. Timer verwenden, dann kannst du während der 
läuft beliebiges machen.

von Ulp (Gast)


Lesenswert?

schalte deine "lampen" über die Timer die dein Prozessor hat!

das ist einfacher und besser! Da du dein Prozessor nicht komplett an 
hälst!

von TJ (Gast)


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.

von Peter K. (peterka2000)


Lesenswert?

Ah, OK
Dann muss ich mich mal mit Timern beschäftigen.
Zum Glück sind hier in Sachsen noch ein paar Wochen Ferien :-

von 6A66 (Gast)


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

von 6A66 (Gast)


Lesenswert?

Huch. zu lange mit dem Absenden gewartet.

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.