hallo zusammen, ich habe eine Frage bezüglich AVR Porgrammierung. Wenn ich einen Pin als Output definiere, an dem eine LED angeschlossen ist, wird dieser ständig leuchten aufgrund dieser Zeile: LED_DDR = LED_DDR | LED_Bit; ? Gruß Judgin
kommt darauf an was du in LED_Bit reinschreibst, ist es die Bit-nummer (0-7) oder eine Bit maske (1,2,4,8,16,..)
Deine Frage lässt sich ohne mehr Wissen drumherum nicht beantworten (zumindest müsste man raten, und das ist etwas, was wir von vorne herein tunlichst vermeiden wollen). Was ist LED_DDR Was ist LED_Bit dafür muss es Definitionen in deinem Programm geben, denn das sind keine Standardausdrücke. Also: Zeig am besten alles. Dann braucht man nicht im Nebel stochern.
Den Anfang des AVR-GCC-Tutorials, dort wo es um einfache Pin I/O geht, hast du schon durchgearbeitet? Zusammen mit etwas Grundlagenwissen in C, sollte das dir eigentlich ermöglichen, dir deine Frage selbst zu beantworten.
Judgin F. schrieb: > LED_DDR = LED_DDR | LED_Bit; 1. Das kannst du auch so schreiben:
1 | LED_DDR |= LED_Bit; |
Das funktioniert so lange , wie du LED_Bit als z.B. 0x01 definierst. Allerdings ist es üblich , eine andere Schreibweise zu nehmen:
1 | #define LED_DDR DDRD
|
2 | #define LED_Bit 1
|
3 | LED_DDR |= ( 1 << LED_Bit) |
2. Du musst dann aber auch noch eine 1 in den Port schreiben, bis jetzt hast du nur das LED_Bit als Ausgang definiert:
1 | |
2 | #define LED_Port PORTD
|
3 | LED_Port |= ( 1 << LED_Bit); |
Karl Heinz Buchegger schrieb: Also: Zeig am besten alles. Dann braucht man nicht im Nebel stochern. Das Programm: /* Taster PD2 */ /* Leuchtdiode PD3 an/aus */ /*--------------------------------------*/ #include <avr/io.h> //---------------------------------- Hardware --------------- // LED an PORTD Bit3 (PD3) #define LED_Bit 0x08 // Bitadresse: // Bitnummer3 => 00001000 => 0x08 #define LED_PORT PORTD // PORT Ausgaberegister PORT D #define LED_DDR DDRD // PORT Data Direction Register // Taster an PD2 #define Taster_Bit 0x04 #define Taster_PIN PIND #define Taster_DDR DDRD //----------------------------------------------------------- // Data Direction-Bit 0: input, 1: output // All LEDs are open Collector Outputs => 0 is LED on //------------------------------------------------ main ----- int main (void) { // PIN Configuration LED_DDR = LED_DDR | LED_Bit; // 1 Bit to 1=output Taster_DDR = Taster_DDR & ~Taster_Bit; // Taster Bit input while (1) { if (!(Taster_PIN & Taster_Bit)) {LED_PORT = LED_PORT | LED_Bit;}//LED off else {LED_PORT = LED_PORT & ~LED_Bit;} //LED on } } Frage: was tut es genau? Grüße Judgin
Wenn wir jetzt mal die Entprellerei beiseite lassen , setzt das Programm die LED high wenn der Taster auf high ist und LED auf low wenn der Taster low ist. LED_DDR = LED_DDR | LED_Bit; // 1 Bit to 1=output ist wie LED_DDR |= LED_Bit; siehe oben . Und LED_PORT = LED_PORT | LED_Bit; ist wie LED_PORT |= LED_Bit; und LED_PORT = LED_PORT & ~LED_Bit; ist wie LED_PORT &= ~LED_Bit; Gewöhn dir das ruhig an. AVR Programmierer nehmen allerdings meistens die #define LED_Bit 3 LED_DDR |= ( 1 << LED_Bit) Syntax, da es damit sehr einfach und übersichtlich wird, wenn man bestimmte Bits in Registern setzen muss, z.B. UART, ADC oder Timer Register. Z.B. UCSR0A = (1 << USCZ0) | (1 << UCSZ1) ADCSRA |= (1 << ADSC) ; Start Conversion
hallo Matthias, danke Dir erstmal für Deine sehr schnellen und gut erklärten Antworten. ich habe eine andere Frage (hardwareseitig): Wieso leuchtet dann ständig die LED PD3 und wenn ich den Taster drücke, dann geht sie aus. Also genau anders, als Du mir vorhin eklärt hast. ich zitiere: setzt das Programm die LED high wenn der Taster auf high ist und LED auf low wenn der Taster low ist. ich kann Dir leider nicht die schaltung hochladen, da das png format anscheined zu groß ist. ich werde es Dir kurz in worten erklären. Tasterbeschaltung: +5V => R => LED (mit Anode zum R) => von LED gehts zum Taster (bei Betätigung zieht dieser auf GND) und außerdem gehts von der LED noch zum µC. LEDbeschaltung: +5V => R => LED (mit Anode zum R) => µC
Die LED Anode ist ja dauernd an + angeschlossen. Wenn nun der Kontroller die LED Kathode an Masse zieht ( also auf low) dann leuchtet die Diode . Das heisst negative Logik. Beim Taster ists vermutlich ähnlich. Er zieht gedrückt den Eingangspin auf low ( Masse) und wenn er offen ist, liegt der Eingangspin auf high ( über einen Pullup - Widerstand). Ich würde dir übrigens empfehlen, bei den Eingangspins den internen Pullup des AVR zu aktivieren. Das geht über das PORT Register. Wenn der Pin als Eingang definiert ist und du eine 1 ins entsprechende PORT register bit schreibst, wird der Pullup aktiviert, der irgendwo zwischen 20k und 50k liegt. Mehr findest du im Datenblatt ( Zwanglektüre :P )
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.