mega8 code

Gast #219227
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?!
Gast #219229
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.
Gast #219230
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.
Gast #219231
@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.
Gast #219232
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...
Gast #219234
@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.
Gast #219235
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?!

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.