Forum: Compiler & IDEs Lauflicht anhalten und weiterlaufen lassen


von Tobias A. (tomabe)


Lesenswert?

Hallo,

programmieren in der Schule gerade ein Lauflicht, nun kennen wir uns 
damit nicht wirklich aus xD...

das ist unser Quellcode:

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



    main(viod)
    {
            int takt, takt2, takt3;
      DDRC = 0x00;
      DDRB = 0xFF;
      takt = 5000;
      takt2 = 2500;
      takt3 = 50;








      while (1)
      {


      _delay_ms(takt);
      PORTB =0x1F;
      _delay_ms(takt);
      PORTC = 0xF4;
      _delay_ms(takt);
      PORTC = 0x1F;
      _delay_ms(takt);
      PORTC = 0xF1;
      _delay_ms(takt);


//Taste S5
        if (!(PIND & (0<<PD6)) )

        {

        PORTB = 0xFF;
        _delay_ms(takt);
        PORTB = 0xFE;
        _delay_ms(takt);
        PORTB = 0xFD;
        _delay_ms(takt);
        PORTB = 0xFB;
        _delay_ms(takt);
        PORTB = 0xF7;
        _delay_ms(takt);
        PORTB = 0xEF;
                _delay_ms(takt);
        PORTB = 0xDF;
                _delay_ms(takt);
        PORTB = 0xBF;
        _delay_ms(takt);
        PORTB = 0xEF;
        _delay_ms(takt);
        PORTB = 0xF7;
        _delay_ms(takt);
        PORTB = 0xFB;
        _delay_ms(takt);
        PORTB = 0xFD;
        _delay_ms(takt);
        PORTB = 0xFE;
        _delay_ms(takt);
        PORTB = 0xFF;
        _delay_ms(takt);

        }
//Taste S6
                if (!(PIND & (1<<PD7)) )
        {

        PORTB = 0xFF;
        _delay_ms(takt2);
        PORTB = 0xFE;
        _delay_ms(takt2);
        PORTB = 0xFD;
        _delay_ms(takt2);
        PORTB = 0xFB;
        _delay_ms(takt2);
        PORTB = 0xF7;
        _delay_ms(takt2);
        PORTB = 0xEF;
                _delay_ms(takt2);
        PORTB = 0xDF;
                _delay_ms(takt2);
        PORTB = 0xBF;
        _delay_ms(takt2);
        PORTB = 0xEF;
        _delay_ms(takt2);
        PORTB = 0xF7;
        _delay_ms(takt2);
        PORTB = 0xFB;
        _delay_ms(takt2);
        PORTB = 0xFD;
        _delay_ms(takt2);
        PORTB = 0xFE;
        _delay_ms(takt2);
        PORTB = 0xFF;
        _delay_ms(takt2);
        }
//Taste S2
                if (!(PIND & (1<<PD3)) )
        {

            PORTB = 0xFF;
                _delay_ms(takt);
             PORTB = 0xEF;
                _delay_ms(takt);
            PORTB = 0xF7;
                _delay_ms(takt);
            PORTB = 0xFB;
                _delay_ms(takt);
            PORTB = 0xFD;
                _delay_ms(takt);
            PORTB = 0xFE;
                _delay_ms(takt);
            PORTB = 0xFE;
                _delay_ms(takt);
            PORTB = 0xFD;
                _delay_ms(takt);
            PORTB = 0xFB;
                _delay_ms(takt);
            PORTB = 0xF7;
                _delay_ms(takt);
            PORTB = 0xEF;
                _delay_ms(takt);


        }

        }

      return 0;

}


Nun fragen wir uns wie wir das machen können, dass wenn wir den Knopf 
PD4
drücken das Licht was gerade durchläuft angehalten werden kann.

Danke im vorraus.

von Johannes M. (johnny-m)


Lesenswert?

Das wird so sowieso nicht richtig fnktionieren. Die _delay_XX-Funktionen 
funktionieren nämlich nur dann richtig, wenn ihnen konstante, zur 
Compile-Zeit bekannte Parameter übergeben werden. Wenn das nicht 
zutrifft, wird erstens die float-lib ins Programm eingebunden, damit die 
Werte zur Laufzeit berechnet werden können, und außerdem funktioniert 
das Timing nicht mehr.

Variable delays macht man, wenn überhaupt, indem man ein _delay_XX mit 
fester länge in einer Schleife wiederholt aufruft.

Außerdem sorgen die delays dafür, dass sich das ganze nicht ohne 
weiteres und ohne softwaretechnische Verrenkungen anhalten lässt. Für so 
etwas nimmt man einen Timer, den kann man jederzeit einfach anhalten!

Abgesehen davon hast Du die Forenregeln, die Du beim Absenden 
bestätigen musstest, nicht beachtet! Es ist bei Anfragen im Betreff oder 
zumindest irgendwo im Text zu erwähnen, um welchen Controller es sich 
handelt! Da Du hier schreibst, gehe ich davon aus, dass Du auch des 
Lesens mächtig bist. Und für C-Code gibt es hier im Forum 
Formatierungsmöglichkeiten, die das ganze besser lesbar machen!

von STK500-Besitzer (Gast)


Lesenswert?

>Abgesehen davon hast Du die Forenregeln, die Du beim Absenden
>bestätigen musstest, nicht beachtet! Es ist bei Anfragen im Betreff oder
>zumindest irgendwo im Text zu erwähnen, um welchen Controller es sich
>handelt! Da Du hier schreibst, gehe ich davon aus, dass Du auch des
>Lesens mächtig bist. Und für C-Code gibt es hier im Forum
>Formatierungsmöglichkeiten, die das ganze besser lesbar machen!

Nu reg dich mal nicht so auf! Das ist für Leute in deinem Aletr gar 
nicht gut ;)

>programmieren in der Schule gerade ein Lauflicht, nun kennen wir uns
>damit nicht wirklich aus xD...

Wird inzwischen in der Schule gelehrt, dass Sätze kein Subjekt mehr 
haben müssen?

Habt Ihr schon mal etwas von Schleifen und Felder gelernt?
Die Kombination aus diesem beiden würde dein Programm wesentlich 
verkürzen und dei gewünschte Funktionalität problemlos ermöglichen.

von Johannes M. (johnny-m)


Lesenswert?

STK500-Besitzer wrote:
> Nu reg dich mal nicht so auf! Das ist für Leute in deinem Aletr gar
> nicht gut ;)
Ich rege mich nicht auf. Wenn ich mich aufrege, sieht das anders aus! 
Außerdem: Woher willst Du wissen, wie alt ich bin?

> Wird inzwischen in der Schule gelehrt, dass Sätze kein Subjekt mehr
> haben müssen?
Ach, aber anderen vorwerfen, sie regen sich auf. Hmmm...

von Skua (Gast)


Lesenswert?

>Habt Ihr schon mal etwas von Schleifen und Felder gelernt?
Aber erst den Oberlehrer machen.

von Johannes M. (johnny-m)


Lesenswert?

Übrigens immer wieder gern gelesen: AVR-GCC-Tutorial...

Finde es allerdings ein bisschen seltsam, dass die Betreuer solcher 
Schulversuche es nicht hinbekommen, ihren Schützlingen die Materie auf 
anschauliche Art nahezubringen. Und das mit den delays oben stimmt mich 
da ein bisschen nachdenklich...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Und das mit den delays oben stimmt mich da ein bisschen nachdenklich...
Ja, wenn das alles ist... :-/
Ich würde sowas sofort zur Erklärung einer for-Schleife hernehmen, wenn 
ich Lehrer wäre.

> dass wenn wir den Knopf PD4
> drücken das Licht was gerade durchläuft angehalten werden kann.
Also, so wie das Programm bisher aussieht, kann ein bisschen mehr Murks 
auch nicht schaden. Ich würde die Abfrage von PD4 in die _delay_ms() 
Routine einbauen, die wird ja dauernd aufgerufen. :-o

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.