mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik mega8 code


Autor: stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?!

Autor: stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hat keiner ne Idee, oder ist die Frage zu "doof" gestellt?

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: F01Qx (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
main()
{
   DDRC |= (1<<PC5);
   unsigned int i;
   while(1)
   {
      if(PINB & (1<<PB0)
      {
         if(i < 64000)
         {
            i++;
         }
         else
         {
            i = 0;
            PORTC ^= (1<<PC5);  //PC5 mit xor umschalten
         }
      }
      else
      {
         PORTC &= ~(1<<PC5);
      }
   }
}

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

Autor: F01Qx (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.