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
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.
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ß
Da fällt mir noch ein, könnte mir vielleicht jemand erklären warum meine Variante nicht funktioniert?
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.
Karl heinz Buchegger wrote: >... > DDRD = (1 << PB5); // Den Port D, Pin 5 als Ausgang > .... müsste das nicht
1 | DDRD = (1 << PD5); |
heißen?
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.
Und Ihr solltet vielleicht mal auf das Datum achten. Der Thread war gut 2 Jahre alt :-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.