www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik C Verständnisfrage


Autor: Der Lars (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin Moin,

Ich habe mir für mein Entwicklerboard einen Testcode gedownloadet. es 
sieht so aus:
/*  Sample program for Olimex AVR-P28 with ATMega8 processor
 *  Blinks the led with a speed ~2Hz using a simple delay loop.
 *  Compile with AVRStudio+WinAVR (gcc version 3.4.6)
 */

#define  __AVR_ATmega8__  1

#include "avr/io.h"

void Initialize(void)
{
  PORTB = 0x0;
  PORTC = 1<<5;  /* turn the LED off */
  PORTD = 0x0;

  DDRB = 0x0;
  DDRC = 1<<5;  /* PC5 as output - the LED is there */
  DDRD = 0x0;

}

/*  state = 0 -> Led Off
 *  state = 1 -> Led On
 *  state !=[0,1] -> Led Toggle 
 */
void LedSet(unsigned char state)
{
  switch (state)
  {
    case 0:
      PORTC = 0xff;
      break;
    case 1:
      PORTC = 0x00;
      break;
    default:
      if (PORTC = 0xff) 
        PORTC = 0x00;
      else
        PORTC = 0xff;
  }
  
}


int main(void)
{
  int i;

  Initialize();

  while (1)
  {
    LedSet(1);
    for (i=60000;i;i--);
    LedSet(0);
    for (i=60000;i;i--);
  }
  return 0;
}

Effekt: meine LED auf dem Board blinkt. Ich verstehe ja auch warum die 
blinkt.
Was ich aber nicht verstehe... Wenn ich den Code wie folgt umänder, 
müsste sie, nach meinem verständnis dauerhaft leuchten. tut sie aber 
nicht. Um ehrlich zu sein macht die LED dann garnichts mehr.
(Geändert habe ich beim unteren LedSet die 1 in eine 0)
/*  Sample program for Olimex AVR-P28 with ATMega8 processor
 *  Blinks the led with a speed ~2Hz using a simple delay loop.
 *  Compile with AVRStudio+WinAVR (gcc version 3.4.6)
 */

#define  __AVR_ATmega8__  1

#include "avr/io.h"

void Initialize(void)
{
  PORTB = 0x0;
  PORTC = 1<<5;  /* turn the LED off */
  PORTD = 0x0;

  DDRB = 0x0;
  DDRC = 1<<5;  /* PC5 as output - the LED is there */
  DDRD = 0x0;

}

/*  state = 0 -> Led Off
 *  state = 1 -> Led On
 *  state !=[0,1] -> Led Toggle 
 */
void LedSet(unsigned char state)
{
  switch (state)
  {
    case 0:
      PORTC = 0xff;
      break;
    case 1:
      PORTC = 0x00;
      break;
    default:
      if (PORTC = 0xff) 
        PORTC = 0x00;
      else
        PORTC = 0xff;
  }
  
}


int main(void)
{
  int i;

  Initialize();

  while (1)
  {
    LedSet(0);
    for (i=60000;i;i--);
    LedSet(0);
    for (i=60000;i;i--);
  }
  return 0;
}


Meine Frage ist nun: Wieso leuchtet die LED nicht mehr???

Autor: Thomas K. (tomthegeek)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich das richtig sehe ist die Kathode der LED an deinem Pin 
angeschlossen. Du schaltest den Pin aber auf High -> Kein 
Spannungsabfall an der LED -> leuchtet nicht. Du musst den Pin auf Low 
setzten.

Autor: NurEinGast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Meine Frage ist nun: Wieso leuchtet die LED nicht mehr???

Weil Du Ihr gesagt hast, sie soll nicht mehr leuchten.


Oben bei LedSet steht's doch

    /*  state = 0 -> Led Off
     *  state = 1 -> Led On

Mit LedSet(0); schaltet sie also folgerichtig AUS.
Dann wartest Du (       for (i=60000;i;i--);   )
Dann schaltest Du sie AUS  (   LedSet(0);   )

usw.

Das Programm tut genau das was es soll.

Autor: Der Lars (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Taadaaaa die LED leuchtet :-) Recht herzlichen Dank.

Autor: NurEinGast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Glückwunsch !!

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.