Forum: Compiler & IDEs Lauflicht in C mit AVR - bei Tastendruck umkehren


von Dominik W. (Gast)


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

von Fabian O. (xfr)


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.

von Dominik W. (Gast)


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!

von C-Code (Gast)


Lesenswert?

Formatierung für C-Code
1
C-Code
macht deinen Code lesbarer.

http://www.mikrocontroller.net/articles/Formatierung_im_Forum

von C-Code (Gast)


Lesenswert?

Dann sieht das so aus:

1
while(1) {
2
3
  int x = 1;
4
5
  for(i=0; i<8; i++) {
6
7
      PORTC = x;
8
      x = x * 2;
9
      _delay_ms(500);
10
11
    }
12
13
  x = 1;
14
  i = 0;
15
16
}

von Fabian O. (xfr)


Lesenswert?

Dominik W. schrieb:
> Wenn ich das Ganze in eine for-Schleife setze und am Schluss die
> Variablen zurücksetze, sollte das Ganze doch unendlich weiter laufen,
> oder?

Ja. Aber warum probierst Du es nicht einfach auf dem Mikrocontroller 
aus? Wenn das Licht dann endlos läuft, dann funktioniert es ja 
offensichtlich ...

von Dominik W. (Gast)


Lesenswert?

Wollte erst einmal nachfragen, um sicher zu sein, dass ich die 
Grundlagen schon verstanden habe. :)
Ich werde mal schauen, ob ich den Code zu Laufen bekomme.

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.