Forum: Mikrocontroller und Digitale Elektronik Taster reagieren nach einiger Zeit nicht mehr


von Bastian F. (bastian_f)


Angehängte Dateien:

Lesenswert?

Hallo!

Ich habe ein einfaches Programm geschrieben (mit Hilfe der debounce 
Funktion die in den Tutorials beschrieben wird), um ein paar LEDs nach 
einem bestimmten Muster zum leuchten zu bringen.
Spaßeshalber habe ich versucht dieses mit vier verschiedenen Tastern 
auszulösen, was soweit auch funktioniert.
ABER, nach ein paar Aufrufen (Drücken der Taster) passiert nichts mehr.
Erst nach einer Weile (ca. 30sec) reagiert der Controller wieder auf die 
Tasten.
Kann mir das eventuell jemand erklären bzw was ich im Code falsch 
gemacht habe?

Danke!

Code (im Anhang ist die led_defines.h):
1
#define F_CPU 1000000
2
#include <avr/io.h>
3
#include <util/delay.h> 
4
#include "led_defines.h"
5
6
int main() {
7
8
int a;
9
int b;
10
int delay=150; 
11
12
13
DDRC |= (1 << PC5) | (1 << PC4) | (1 << PC3) | (1 << PC2) | (1 << PC1);
14
DDRB |= (1 << PB2) | (1 << PB6) | (1 << PB1);
15
16
while (1) {
17
18
19
if (Taster4 | Taster2 | Taster3 | Taster1) {
20
for (a=1, b=8; a<=4; a++, b--) {
21
  
22
  _delay_ms(delay);
23
  light(a);
24
  light(b);
25
  }
26
27
for (a=1, b=8; a<=4; a++, b--) {
28
  
29
  _delay_ms(delay);
30
  nolight(a);
31
  nolight(b);
32
  } 
33
34
}
35
}
36
}

von Karl H. (kbuchegg)


Lesenswert?

Ich seh nicht, dass du die Pullupwiderstände an den Eingabe (Tasten) 
Ports einschaltest.


_delay_ms immer nur mit einer Zahl aufrufen (keine Variable), sonst 
stimmt die Zeit nicht.

von Bastian F. (bastian_f)


Lesenswert?

Stimmt, das habe ich vergessen...
Funktioniert jetzt wie es soll - Vielen Dank!

Zu _delay_ms: Sorry, für die blöde Frage, aber würde es denn einen 
Unterschied machen, wenn ich delay nicht als Variable, sondern als 
Konstante definiere?

von mr. mo (Gast)


Lesenswert?

Sobald das Programm bei delay_ms ankommt, muss er natürlich erstmal 
nachgucken was in der Variable "delay" steht, dadurch vergeht natürlich 
auch wieder etwas zeit und wird unpräzise.

von Karl H. (kbuchegg)


Lesenswert?

Bastian F. schrieb:

> Zu _delay_ms: Sorry, für die blöde Frage, aber würde es denn einen
> Unterschied machen, wenn ich delay nicht als Variable, sondern als
> Konstante definiere?

_delay_ms ist darauf angewiesen, dass der Optimizer den kompletten delay 
sich vornehmen und optimieren kann. Da müssen dann 
Gleitkommaberechnungen vom Compiler durchgeführt und wieder wegoptimiert 
werden. Das geht aber nur, wenn der Compiler den Zahlenwert sieht.
Daher: keine Variablen.

von Bastian F. (bastian_f)


Lesenswert?

Das macht natürlich Sinn.
Ob das bei meinem kleinen Lichtspiel jedoch einen Unterschied macht, 
glaube ich zwar nicht, aber ich werde es mir jedenfalls für die Zukunft 
merken.

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.