Forum: Mikrocontroller und Digitale Elektronik mega8 code


von stefan (Gast)


Lesenswert?

hallo, ich habe ein kleines (Anfänger)Problem bei der Programmierung und
zwar möcht ich eine LED blinken (an PC5 angeschlossen) blinken lassen.
Das funktioniert auch. Danach hab ich einen Schalter eingelötet (Active
High) an PB0. Die LED soll jetzt nur blinken wenn der Schalter gedrückt
wird.
Mein Code:

/*enable PC5 as output*/
DDRC|= _BV(PC5);
/* enable PB0 as input*/
DDRC &= ~_BV(PB0);


/*while (PINB & (1<<0)) */  (hier leuchtet die LED IMMER)
while (PINB0!=_BV(PB0)) (hier blinkt sie IMMER)
{
Blinkroutine (funktioniert)
}

Find mich in der Syntax noch nicht so ganz zu recht. Wo liegt denn da
wohl der Fehler?!

von stefan (Gast)


Lesenswert?

hat keiner ne Idee, oder ist die Frage zu "doof" gestellt?

von A.K. (Gast)


Lesenswert?

Falschen Port erwischt:
   DDRC &= ~_BV(PB0);
ist aber nur ein Problem, wenn woanders PB= als Output definiert wird.

Und
  while (PINB0!=_BV(PB0))
ist nichts anderes als
  while (0 != 1)

Während
  while (PINB & (1<<0))
durchaus ok aussieht. Kann man auch schöner als
  while (PINB & _BV(PB0))
schreiben, ändert aber nichts.

von F01Qx (Gast)


Lesenswert?

Der Fehler in deinem Code ist, dass du in der ersten Version die
Hauptschleife verlässt, wenn der Schalter nicht gedrückt ist.
In deiner zweiten Version vergleichst du den ganzen Port B mit einem
Wert, was auch nicht richtig funktioniert.
1
main()
2
{
3
   DDRC |= (1<<PC5);
4
   unsigned int i;
5
   while(1)
6
   {
7
      if(PINB & (1<<PB0)
8
      {
9
         if(i < 64000)
10
         {
11
            i++;
12
         }
13
         else
14
         {
15
            i = 0;
16
            PORTC ^= (1<<PC5);  //PC5 mit xor umschalten
17
         }
18
      }
19
      else
20
      {
21
         PORTC &= ~(1<<PC5);
22
      }
23
   }
24
}

Der Code ist nicht getestet, müsste aber funktionieren.

von F01Qx (Gast)


Lesenswert?

@A.K.:
Die Hauptschleife eines µC-Programmes muss immer eine Endlosschleife
sein, also while(1), weil sonst der Programcounter immer weiter läuft,
in andere Funktionen springt und der Controler deshalb nicht mehr das
macht, was er eigentlich soll.

von stefan (Gast)


Lesenswert?

stimmt, hatte echt den falschen Port erwischt, aber habe jetzt immernoch
das Verhalten das die Lampe dauerhaft leuchtet, egal ob ich Taster
drücke oder nicht...
Habe mal die Spannung an Pin 14 gemessen. Ist 0 V bzw 5,0 V wenn
gedrückt, es scheint also an der software zu liegen.
Code:
/* INITIALIZE */
        /* enable PC5 as output */
        DDRC|= _BV(PC5);

  /* enable PB0 as input*/
  DDRB &= ~_BV(PB0);


        /* BLINKEN */

        while (PINB & _BV(PB0))
  {
            "Blinken"
         }

Hat zumindest jemand eine Idee wie ich weiter testen sollte? Ich weiß
leider nichts...

von stefan (Gast)


Lesenswert?

oh, hatte den neuen Post noch nicht gesehn. Danke für den Tipp, das mit
while(1) hört sich logisch an, test ich gleich mal...

von A.K. (Gast)


Lesenswert?

@F01Qx: Klar muss da eine Schleife rein. Aber muss man die unbedingt als
while (PINB0!=_BV(PB0)) formulieren? Zumal das eigentlich als while(1) {
if (...) { ... }} gedacht war.

von stefan (Gast)


Lesenswert?

super, jetzt läuft es, lag wirklich nur an der Endloßschleife. Hab ich
das eigentlich bei allen Faq überlesen, oder wird das höchstens
nebenbei erwähnt?!

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.