Forum: Compiler & IDEs LED einschalten Atmega16


von Walter Hildebrandt (Gast)


Lesenswert?

Hallo!

Ich hab hier ein kleines Anfängerproblem.

Ich verwende AVR Studio, WinAVR und PonyProg und möchte als ersten 
Gehversuch eine LED mit einem Atmega16 (PortD, Pin 5) einschalten.
Habe dazu folgenden Code geschrieben:

#include <avr/io.h>

int main (void)

{
#define outp (0xf0, DDRD);
PORTD |= _BV(PB5);
}

Aber die LED bleibt aus. Mach ich grundsätzlich was falsch oder an was 
liegts. Hab jetzt schon mehrere Stunden im Netz gesucht um überhaupt 
diese zwei Zeilen zusammenzubringen...

MfG
Walter

von Karl heinz B. (kbucheg)


Lesenswert?

Dein Pgm sollte so aussehen:

#include <avr/io.h>

int main( void )
{
  DDRD =  (1 << PB5);   // Den Port D, Pin 5 als Ausgang
  PORTD = (1 << PB5);   // Den Pin 5 auf 1 schalten

  // und den Prozessor durch eine Endlosschleife beschaeftigen
  while( 1 ) {
  }
}

Wenn die die Schreibweise 1 << PB5  noch nichts sagt,
kannst du auch schreiben

  DDRD = 0x20;     // Bit 5 gesetzt
  PORTD = 0x20;    // Ebenfalls Bit 5 gesetzt

Bei 0x20 sieht man halt nicht so gut, welches Bit gemeint
ist. Bei 1 << PB5  ist das klarer.

Eine andere Schreibweise wäre:

  DDRD  = 0b00100000;
  PORTD = 0b00100000;

auch hier sieht man wieder besser, welches Bit gemeint ist.
Aber am besten gewöhnst du dir gleich die 1. Schreibweise
an.


PS: Bist du sicher, dass deine LED leuchten, wenn eine
1 am Portausgang anliegt. Meist ist es nämlich umgekehrt:
Um die Led zum leuchten zu kriegen, muss man eine 0 ausgeben.
Probier mal folgendes:

  //
  // Sowohl Pin4 als auch Pin5 als Ausgang
  //
  DDRD = ( 1 << PB5 ) | ( 1 << PB4 );

  //
  // Aber nur an Pin5 eine 1
  //
  PORTD = ( 1 << PB5 );

eine der beiden Led, entweder die an Pin 4 oder die an Pin 5
muss jetzt leuchten. Wenn die an Pin5 leuchtet, dann muss
man eine 1 an den Pin geben. Wenn die an Pin 4 leuchtet,
dann muss man eine 0 ausgeben.

von Walter Hildebrandt (Gast)


Lesenswert?

Vielen Dank für die ausführliche Antwort!

Ist eigtl ziemlich einleuchtend dein Beispiel und gesehen hab ich sowas 
eigtl auch schonmal... ;)

Hat auf jeden Fall funktioniert, und die LED schalt ich wirklich mit 1 
ein.

So, dann mach ich mich mal ans "eintasten" :)

Gruß

von Walter Hildebrandt (Gast)


Lesenswert?

Da fällt mir noch ein, könnte mir vielleicht jemand erklären warum meine 
Variante nicht funktioniert?

von Karl heinz B. (kbucheg)


Lesenswert?

Weil in deiner Variante der Port niemals auf
Ausgang geschaltet wurde.

von Karl heinz B. (kbucheg)


Lesenswert?

Genauer:
Nach dem Einschalten sind alle Ports bei einem AVR als
Eingänge geschaltet. Erst durch das Setzen von Bits im DDRD
Register (DDRD für den D Port, für den A Port heist das dann
DDRA, B-Port: DDRB) wird der entsprechende Controllerpin als
Ausgang geschaltet.

Und an einem Port der als Eingang gechaltet ist, kannst du
Leds (nach GND wie bei dir) anschliessen, soviel du willst.
Die wird niemals leuchten, weil niemand da ist der genug
Strom durch die Led jagt, damit sie leuchtet.

von Walter Hildebrandt (Gast)


Lesenswert?

Aja, nochmals danke ;)

von Mathias O. (m-obi)


Lesenswert?

Karl heinz Buchegger wrote:
>...
>   DDRD =  (1 << PB5);   // Den Port D, Pin 5 als Ausgang
> ....
 müsste das nicht
1
DDRD = (1 << PD5);
heißen?

von Uwe .. (uwegw)


Lesenswert?

Müsste, macht aber hier ausnahmsweise nichts aus. Sowohl PB5 als auch 
PD5 sind als 5 definiert...
Man sollte sich allerdings angewöhnen,
DDRD |= (1 << PD5);
zu schreiben. Dann werden nicht die restlichen Pins wieder zum Eingang, 
falls sie vorher Ausgang waren.

von Zeitreisender (Gast)


Lesenswert?

Und Ihr solltet vielleicht mal auf das Datum achten. Der Thread war gut 
2 Jahre alt :-)

von Mathias O. (m-obi)


Lesenswert?

Zeitreisender wrote:
> Und Ihr solltet vielleicht mal auf das Datum achten. Der Thread war gut
> 2 Jahre alt :-)

Das macht doch nix, sobald eine neue Antwort da ist, ist er ganz oben in 
der Threadliste.
Und außerdem, es gibt welche die lernen grad C-Programmierung und nehmen 
dazu dieses Forum.
Da sollte doch vieles sein Richtigkeit haben, was hier steht, nicht das 
Missverständnisse entstehen.

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.