mikrocontroller.net

Forum: Compiler & IDEs LED einschalten Atmega16


Autor: Walter Hildebrandt (Gast)
Datum:

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

Autor: Karl heinz Buchegger (kbucheg)
Datum:

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

Autor: Walter Hildebrandt (Gast)
Datum:

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

Autor: Walter Hildebrandt (Gast)
Datum:

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

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weil in deiner Variante der Port niemals auf
Ausgang geschaltet wurde.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

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

Autor: Walter Hildebrandt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aja, nochmals danke ;)

Autor: Mathias O. (m-obi)
Datum:

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

Autor: Uwe ... (uwegw)
Datum:

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

Autor: Zeitreisender (Gast)
Datum:

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

Autor: Mathias O. (m-obi)
Datum:

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

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.