Forum: Mikrocontroller und Digitale Elektronik AVR_ Lauflicht stoppen


von Serieousl L. (stephan2013)


Lesenswert?

Hallo

Ich habe ein Lauflicht und soll es um folgende Funktionen erweitern.
(1)

Stoppen des Lauflichtes wenn PortB/ Pin2 auf LOW gesetzt wird, soll das 
LL anhalten. Geht PortB.2 wieder auf High , läuft des LL weiter.

mit low meint man, wenn es auf 0 gesetzt wird oder ?

Code
1
         int16_t i=0;
2
         DDRB=0x00;   // input Port
3
         PORTB=0xFF;  // alles aus
4
    
5
         DDRA=0xFF;   // Port A als Output setzen
6
         PORTA=0x00;   // alles ausschalten
7
    while (i<=7)
8
    {
9
            PORTA = ~(0x01 << i);
10
            if (PINB &(0x01 <<1)==PINB2))
11
            {
12
                PORTA=0xFF;
13
            }
14
            else
15
                i++;
16
    }

von Eumel (Gast)


Lesenswert?

hisham moustafa schrieb:
> mit low meint man, wenn es auf 0 gesetzt wird oder ?

Ja

von Serieousl L. (stephan2013)


Lesenswert?

Und stimmt jetzt die Umsetzung(Code) ?

von Dennis Assenmacher (Gast)


Lesenswert?

Schau doch einfach ob es klappt :D. Muss da nicht irgendwo ein delay 
rein? Sonst wirds weniger Lauf mehr Standlicht

von Serieousl L. (stephan2013)


Lesenswert?

Das Problem ist dass ich es nur mit dem Simulator zuhause ausprobieren 
kann.

Ja Wartfunktion is auch dabei:
Aber mit dem Simulator hab ichs versucht aber da liegt irgendwo ein 
Fehler
1
   int16_t i=0;
2
    DDRB=0x00;   // input Port
3
    PORTB=0xFF;  // alles aus
4
    
5
    DDRA=0xFF;   // Port A als Output setzen
6
    PORTA=0xFF;   // alles ausschalten
7
    while (i<=7)
8
    {
9
      PORTA = ~(0x01 << i);
10
      WaitMs(500);
11
      if (PINB &(0x01 <<1)==0)
12
      {
13
        PORTA=0xFF;
14
      }
15
      else
16
      {
17
         i++;
18
      }         
19
    }

von Serieousl L. (stephan2013)


Lesenswert?

??????????

von Edi R. (edi_r)


Lesenswert?

Was passiert, wenn i größer als 7 geworden ist?

von Serieousl L. (stephan2013)


Lesenswert?

dann beginnt der lauflicht von vorne

von Eumel (Gast)


Lesenswert?

hisham moustafa schrieb:
> dann beginnt der lauflicht von vorne

Und welchen Wert hat i dann?

von Gerhard W. (gerhard86)


Lesenswert?

hisham moustafa schrieb:
> dann beginnt der lauflicht von vorne

Eher nicht, i muss auf 0 zurückgesetzt werden, sonst endet das Programm 
nach einem Durchlauf

von Serieousl L. (stephan2013)


Lesenswert?

ja stimmt:
1
while (i<=7)
2
    {
3
     PORTA = ~(0x01 << i);
4
     WaitMs(500);
5
      if (PINB &(0x01 <<1)==PINB2)
6
      {
7
        i++;
8
      }
9
      else
10
      {
11
        PORTA=0xFF;
12
         
13
      }
14
      if (i>7)
15
        i=0;         
16
    }

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Da erhebt sich jetzt natürlich sofort die Frage....
1
...
2
    while (i<=7)
3
    {
4
      ....
5
6
      if (i>7)
7
        i=0;         
8
    }

.... wie soll eigentlich i jemals größer als 7 werden, damit diese 
Abfrage hier
1
    while (i<=7)
jemals eine Chance hat, FALSE zu werden.

i kann durch dieses Konstukt hier
1
      if (i>7)
2
        i=0;
und dem Inkrement innerhalb der Schleife niemals größer als 7 werden. 
Das bedeutet aber auch, dass die Abfrage von i beim while eine sinnlose 
Abfrage ist, denn die Bedingung kann nie eintreten.
Was du aber machst, ist: du verwirrst dich selbst und einen Leser deines 
Programmcodes, indem du ihm durch die reine Anwesenheit der Abfrage 
suggerierst, da würde etwas dahinterstecken.

Tut es aber nicht
1
  while( 1 )
2
  {
3
4
     ....
5
6
  }

und gut ists. Jeder Programmierer erkennt das als Endlosschleife, für 
die es keine Abbruchbedingung gibt.



Und darüber
1
     if (PINB &(0x01 <<1)==PINB2)
solltest du auch noch mal nachdenken.
In C braucht es keinen expliziten Vergleich an dieser Stelle. Das if wil 
leinfach nur einen arithmetischen Ausdruck. Ergibt die Auswertung des 
Ausdrucks 0, dann gilt das als logisches FALSE. Ergibt die Auswertung 
etwas anderes als 0, dann gilt das als logisch TRUE. Fertig, Mehr 
braucht es nicht.
Der Ausdruck
1
     PINB & ( 1 << PB1 )
ergibt 0, wenn der Pin PB1 auf 0 liegt. Und er ergibt etwas anderes als 
0, wenn der Pin selber auf 1 liegt. Welcher Wert in letzterem Fall genau 
heraus kommt, interessiert uns nicht. Uns interessiert nur, dass da 
etwas rauskommt, was nicht 0 ist. UNd das reicht dann schon.

Abfrage auf Pin High
1
   if( PINB & ( 1 << PB1 ) )             // wenn Pin PB1 auf 1 ist

Abfrage auf Pin Low
1
   if( !( PINB & ( 1 << PB1 ) ) )       // wenn Pin PB1 auf 0 ist
2
  ...

oder auch so

Abfrage auf Pin High
1
   if( PINB & ( 1 << PB1 ) != 0 )       // ungleich 0, egal was - hauptsache ungleich 0

Abfrage auf Pin Low
1
   if( PINB & ( 1 << PB1 ) == 0 )       // wenn Pin PB1 auf 0 ist

Aber gewöhn dir diese Vergleich mit expliziten Zahlenwerten ausser 0 ab. 
Das sind Stolpersteine. Drücke deine Vergleiche als Vergleiche mit 0 
aus, oder lass sie überhaupt gleich weg - denn in Wirklichkeit braucht 
die keiner.

: Bearbeitet durch User
von Serieousl L. (stephan2013)


Lesenswert?

Vielen Dank.

Und wegen das Anhalten von dem lauflicht:
Wenns auf PINB2 auf Low ist schalte ich alle LEDS aus oder ??
sonst erhöhe ich den zähler um eins
1
                 if (PINB &(1 <<PINB2) == 0)
2
      {
3
        PORTA=0xFF;
4
      }
5
      else
6
      {
7
        i++; 
8
      }

von AVRfreak (Gast)


Lesenswert?

Hallo,

> Wenns auf PINB2 auf Low ist schalte ich alle LEDS aus oder ??

"Stoppen" würde ich als "nicht weiter schieben", aber nicht als 
"Ausschalten der LEDs" interpretieren ...

von Serieousl L. (stephan2013)


Lesenswert?

Ja wie soll ich dann das lauflicht anhalten

von Karl H. (kbuchegg)


Lesenswert?

hisham moustafa schrieb:
> Ja wie soll ich dann das lauflicht anhalten

indem zb i nicht mehr erhöht wird :-)

Wenn i nicht erhöht wird, dann gibt
1
     PORTA = ~(0x01 << i);

immer dasselbe Bitmuster aus. Wird immer dasselbe ausgegeben, dann 
änderen sich auch die LED nicht. LEDs an einem Port, die sich nicht 
verändern sehen für einen Betrachter wie aus?

(alternativ kannst du natürlich auch auf die Ausgabe in diesem Fall 
komplett verzichten. Denn wozu etwas an die Ports ausgeben, was sowieso 
schon an den Ports anliegt? Ein Ausgabe-Port behält ja ganz von alleine 
solange seinen Wert in allen Bits, solange bis du etwas anderes zuweist)

: Bearbeitet durch User
von Serieousl L. (stephan2013)


Lesenswert?

Ja stimmt ^^
Nochmals vielen Dank !

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.