mikrocontroller.net

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


Autor: Bastian F. (bastian_f)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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):
#define F_CPU 1000000
#include <avr/io.h>
#include <util/delay.h> 
#include "led_defines.h"

int main() {

int a;
int b;
int delay=150; 


DDRC |= (1 << PC5) | (1 << PC4) | (1 << PC3) | (1 << PC2) | (1 << PC1);
DDRB |= (1 << PB2) | (1 << PB6) | (1 << PB1);

while (1) {


if (Taster4 | Taster2 | Taster3 | Taster1) {
for (a=1, b=8; a<=4; a++, b--) {
  
  _delay_ms(delay);
  light(a);
  light(b);
  }

for (a=1, b=8; a<=4; a++, b--) {
  
  _delay_ms(delay);
  nolight(a);
  nolight(b);
  } 

}
}
}

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bastian F. (bastian_f)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: mr. mo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bastian F. (bastian_f)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.