Lauflicht in C mit AVR - bei Tastendruck umkehren

Gast #2958358
Lesenswert?

Hallo liebe community,

ich beschäftige mich derzeit mit dem Programmieren in C, bin jedoch noch 
nicht sonderlich gut darin. Ich benutze den Mikrocontroller AT90S8515 
und habe vor, ein Lauflicht zu programmieren, das durchgehend in eine 
Richtung läuft, bei einem Druck auf einen Schalter soll die Richtung 
dann geändert werden. Ich habe bereits angefangen, den Code zu 
schreiben, leider weiß ich jedoch weder, ob er richtig ist, noch, wie 
man die Richtung des Lauflichtes ändert. Ich hoffe, hier eine Antwort zu 
erhalten.
Vielen Dank für eure Hilfe!

Hier mein bisheriger Code (Ich hoffe, es ist erlaubt, ihn mit dieser 
Länge zu posten):

#include <avr/io.h>
#include <avr/delay.h>

int main (void) {

  int x,y;

  DDRC  = 0b11111111;
  PORTC = 0b00000000;

  x = 8;
  i = 1;

  while(x>=0) {

    PORTC = i;
    i = i * 2;
    x--;
    _delay_ms(500);

  }

  if(bit_is_set(PINA==1)) {

    PORTC = i;
    i = i / 2;
    x--;
    _delay_ms(500);

  }

  return 0;

}


Beste Grüße,

Gharex
#2958391
Lesenswert?

Nein, das Programm funktioniert nicht, vermutlich kompiliert es nicht 
mal. Es hat jetzt wenig Sinn, Dir ein fertiges Lauflicht-Programm zu 
schreiben, davon lernst Du nichts. Aber ein paar allgemeine Tipps zur 
Vorgehensweise könnten Dir vielleicht helfen:

- Versuche nicht alles auf einmal, sondern gehe schrittweise vor! Mach 
erstmal ein Lauflichtprogramm ohne Taster, das kontinuierlich 
durchläuft. Das ist bisher nicht der Fall. Dein Lauflicht läuft nur 
einmal durch, danach ist das Programm zu Ende. Du brauchst eine 
Endlossschleife, damit das Licht wieder von vorne anfängt.

- Danach machst Du ein neues Programm und versuchst per Taster eine 
LED ein- und auszuschalten.

- Wenn diese beiden Programme laufen, versuchst Du das Lauflicht mit 
Wechselrichtung. Dabei musst Du bedenken, dass der Taster jederzeit 
gedrückt werden kann, nicht nur am Ende eines Durchlauf des Lauflichts. 
Das sauber umzusetzen ist gar nicht so einfach, da die Taste ja auch 
während der delay_ms()-Funktion gedrückt werden kann und Du es in der 
Zeit nicht erkennst. Dazu kommt, dass Taster prellen ...

Da wäre dann ein guter Zeitpunkt, sich mit den Timern des 
Mikrocontrollers und Tasterentprellung zu beschäftigen. Das ist im 
Tutorial hier alles gut beschrieben, daher würde ich empfehlen, das mal 
durchzuarbeiten.

Ach ja, wenn Du Code postest sind die Formatierungsfunktionen hilfreich, 
die über dem Antworten-Formular beschrieben sind. Für C-Code also das 
[c]-Tag benutzen.
Gast #2958406
Lesenswert?

Hallo xfr,

danke für deine Antwort!
Wenn ich das Ganze in eine for-Schleife setze und am Schluss die 
Variablen zurücksetze, sollte das Ganze doch unendlich weiter laufen, 
oder?


Beispielsweise so:

while(1) {

  int x = 1;

  for(i=0; i<8; i++) {

      PORTC = x;
      x = x * 2;
      _delay_ms(500);

    }

  x = 1;
  i = 0;

}


Beste 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