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
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.
> Den SyntaxDIE 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 ;-)
Eine eigene Frage?
Dieser Thread ist über 12 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.