Hey Leute Ich bin mal wieder auf eure Hilfe angewiesen ;D Wir steigen in der Schule grade in die praktische C ++ programmierung mit Microcontrollern ein. Ich bin grade bei den Grundlagen und lasse LEDs blinken.^^ Den Syntax für Ausgänge kenne ich also bereits: DDRD=0b01100000; PORTD = (1<<PD5); Wie würde den die Deklaration für Eingänge aussehen und wie ließt man sie ein. Am besten ganz einfach. Wenn man den Taster drückt soll PD5 1 werden. Ich danke euch jetzt schon mal ;D
Das entsprechende DDRx bit auf '0',
1 | if(PIND&(1<<PD5)) |
2 | {
|
3 | //Wird ausgeführt, wenn PD5 '1' ist
|
4 | }
|
Hallo, warum setzt Du auch Bit 6 als Ausgang und überschreibst bei der Portausgabe alle anderen Bits (=0)?
Danke für eure schnelle Antwort. Das war noch von anderen Versuchen...^^ Ging mehr erst mal um den reinen Syntax DANKE ;D
Hab das villeicht grade falsch verstanden.^^ Also Ich habe 2 LEDs die da wären an PD5, PD6 Und mein Taster Ist PD2. Macht dieses Programm schon mal in etwas Sinn.... #define F_CPU 20000000UL #include <util/delay.h> #include <avr/io.h> int main(void) { DDRD=0b01100000; while(1) { if (PIND& (1<<PD2) ) { PORTD = (1<<PD5); } else { PORTD = (0<<PD5); } } } ;D
Für C mit AVR gibt es doch genau hier ein Tutorial: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Eing.C3.A4nge_.28Wie_kommen_Signale_in_den_.C2.B5C.29 Da ist das eigentlich schon recht gut erklärt. Es gibt die 3 Register: DDRx = Data Direction Register -> setzt In oder Output richtung PORTx = Output Register wenn Out, Pullup-Widerstand ja/nein wenn pin als Input konfiguriert. PINx = Anliegende Inputdaten. PD5 etc. sind nur Hilfsdefinitionen die sagen welches Bit du ansprichst (schau dir bitweise Operationen und Shift-Operatoren an, das ist das <<) An sich müsste dein Code schon funktionieren, aber du schreibst das PORTD register mit einem festen Wert, das setzt auch die anderen Bits/Pins um! Normal macht man da:
1 | PORTB |= (1<<PB2); //oder ist gleich setzt genau das Bit PB2 und lässt die anderen unberührt. |
Arbeite das Tutorial zumindest in Abschnitten durch, hilft glaube ich sehr viel zum Verständnis.
Nachtrag: sry hab das Codebeispiel copy-pasted, in deinem Fall natürlich nicht B sondern PORTD, PD5. Zum löschen eines bits geht oder-istgleicht nicht, das ist Mathematik. Schau da am besten wie gesagt mal ins Tutorial.
Danke dir :) Ich werde mich mal durch das toturial durchlesen. Danke wie immer für die schnelle Hilfe
> Den Syntax
DIE SYNTAX
Die Syntax war dem Sterben nah.
"Ich bin, mein himmlischer Papa,"
so rief sie, tränenvoll unendlich,
"nun selbst Experten unverständlich.
Du kannst ja sonst doch jedem raten -
schick mir 'nen Doktor, Lizentiaten,
noch besser und für dich bequem:
schnür du mich selbst in ein System!"
Dem Herrn war dies Geschäft zu schwer,
er sandt' - Professor Chomski her.
Es gibt seitdem die Chomski-Klassen,
in die die meisten Sprachen passen.
(aus 'Palmström als Programmierer')
in memoriam KLEN
Matthias K. schrieb: > Also Ich habe 2 LEDs die da wären an PD5, PD6 > Und mein Taster Ist PD2. > > Macht dieses Programm schon mal in etwas Sinn.... Ich vermute, du hast noch nicht wirklich verstanden, was die Ausdrücke tun. > if (PIND& (1<<PD2) ) > { > > PORTD = (1<<PD5); > > } > else > { > PORTD = (0<<PD5); > } PORTD = (0<<PD5) ist das gleiche wie PORTD = 0. PORTD = (1<<PD5) ist das gleiche wie PORTD = 32. Kannst du erklären, warum, und was genau die Auswirkung ist?
Rolf Magnus schrieb: > Matthias K. schrieb: >> Also Ich habe 2 LEDs die da wären an PD5, PD6 >> Und mein Taster Ist PD2. >> >> Macht dieses Programm schon mal in etwas Sinn.... > > Ich vermute, du hast noch nicht wirklich verstanden, was die Ausdrücke > tun. > >> if (PIND& (1<<PD2) ) >> { >> >> PORTD = (1<<PD5); >> >> } >> else >> { >> PORTD = (0<<PD5); >> } > > PORTD = (0<<PD5) ist das gleiche wie PORTD = 0. > PORTD = (1<<PD5) ist das gleiche wie PORTD = 32. > > Kannst du erklären, warum, und was genau die Auswirkung ist? Hey Ho Also ich habe das so verstanden, dass ich hier die einzelnen Bits beeinflusse und nicht das ganze Byte. Mit dem Befehl PORTD = 0 würde ich doch 0..7 besteuern oder? Ich habe Eingänge und Ausgänge auf meinem PORTD und deswegen spreche ich da jedes Bit einzelt an... "Angaben ohne Gewähr"^^ So habe ich das bis jetzt verstanden ...korigiere mich wenn ich daneben liege. Danke für eure Zeit ..und das aufm Sonntag ;)
Matthias K. schrieb: > Also ich habe das so verstanden, dass ich hier die einzelnen Bits > beeinflusse und nicht das ganze Byte. Links steht "PORTD =", und das heißt, du beschreibst PORTD - und zwar den ganzen. In C kann man eigentlich gar keine einzelnen Bits beschreiben, deshalb muß man einen Trick anwenden. Was musst du tun, wenn du nur genau ein Bit ändern willst, aber immer nur den ganzen PORT auf einmal schreiben kannst? > Mit dem Befehl PORTD = 0 würde ich doch 0..7 besteuern oder? Ja, richtig. Jetzt mußt du also rausfinden, was (0<<PD5) bedeutet. > Ich habe Eingänge und Ausgänge auf meinem PORTD und deswegen spreche > ich da jedes Bit einzelt an... Das würdest du vielleicht gerne, aber du tust es nicht ;-)
Hier ist jetzt der Hinweis auf http://www.mikrocontroller.net/articles/Bitmanipulation bestimmt sehr sinnvoll ...
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.