Hallo, wir benutzen in der Schule den Atmel90USB. in der ersten Stunde mussten wir einen Port ansteuern bei dem eine LED leuchtet. Nun wollte ich zu Hause einen Taster mit ins Programm aufnehmen. Leider weiß ich nicht wie man den Eingang richtig deklariert int main(void) { InitAT90(); // Anfangs-Initialisierung DDRA = 0b00100000; // am Port-D, bit-6 als Ausgang initialisieren PORTA = 0b00100000; // am Port-D, bit-6 = '1' = LED einschalten while(1 == 1) // Endlosschleife { ; } } wie muss ich die Zeile DDRA umbennenen, dass ich DDRA als Eingang benutzen kann? wo steht das im Datenblatt, unter welcher Überschrift muss ich da suchen? vielen Dank im voraus
Pin als Eingang --> entsprechendes Bit im passenden DDR-Register auf 0 setzen (Ist standardmässig schon gesetzt). Pin abfragen: Register PINx (x=A, B, ...) nutzen. hth
sorry, deine antwort check ich gerade nicht. könntest du mein Programmcode so anpassen dass DDRA als Eingang funkiert? vielen Dank
Tanja schrieb: Diese Zeile erklärt alle Pins bis auf Bit 5 ( Computer fangen bei 0 an zu zählen, der Port hat also Bit 0 bis Bit 7) als Eingang: > DDRA = 0b00100000; // am Port-D, bit-6 als Ausgang initialisieren Du fragst z.B. Bit 0 an Port A so ab:
1 | if ((PINA & 0b00000001)==1) { |
2 | // Bit is high
|
3 | // tue hier was, z.B. Port A Bit 5 high machen
|
4 | PORTA |= 0b00100000; |
5 | } else { |
6 | // Bit ist low
|
7 | // mach Bit 5 low
|
8 | PORTA &= ~(0b00100000); |
9 | }
|
Dein Bit 5 folgt so dem Zustand an Bit 0 des Port A. Besser ist es übrigens, Bits zu definieren, z.B. [c] #define LED 5 PortA |= (1 << LED); // mach LED high {/c]
Alle Bits von PortA also DDRA 0b00100000 die 0 sind, sind automatisch Eingang. Nur wenn du eine Taste anschaltest, dann musst du dafür sorgen, das wenn die Taste offen ist, ein eindeutiges Potential am Eingang anliegt. Dafür gibt es die internen PullUp. Lies dir das hier durch: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Zugriff_auf_IO-Ports
DDRA ist mehr als nur "ein Eingang". Es sind (je nach Controller) bis zu acht EA-Pins die man über DDRA, PORTA und PINA ansteuern bzw. auslesen kann. Schliess also Deinen Taster einfach an einen der anderen Pins von Port A an und schon bist Du fertig.
Halo nochmals, leider check ich die antwort von Matthias Sch. nicht. nach meiner Logik müsste es so heißen: if ((PORTA = 0b00000100)==1) { DDRA = 0b00100000; PORTA = 0b00100000; } else { DDRA = 0b10000000; PORTA = 0b10000000; } kann mir jemand sagen warum die if - anweisung nicht funktioniert? bzw kann mir jemand das von Matthias Sch. erklären: if ((PINA & 0b00000001)==1) was bedeutet das "&" danke im voraus
So wird das nix. Schau mal hier rein. Da stehen auch die Antworten auf deine nächsten Fragen drin: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Zugriff_auf_IO-Ports
Vielleicht wäre auch ein grundlegendes c++-Tutorial hilfreich.
Tanja schrieb: > if ((PINA & 0b00000001)==1) > was bedeutet das "&" Der Unterschied zwischen PINA und PORTA wird in dem schon zwei mal angeführten Tutorial sehr gut beschrieben. Was "&" und "&&" bedeutet steht dort auch drinnen.
Max TBA schrieb: > Vielleicht wäre auch ein grundlegendes c++-Tutorial hilfreich. Vielleicht wäre Brain 1.0 hilfreich?
Hier scheinen einige ziemlich Betriebsblind zu sein. Das Problem liegt doch wohl eher im Verständnis, was DDRA bedeutet. DDRA ist das D ata D irection R egister für den Port A. Das ist also kein Ein- oder Ausgang, sondern bestimmt, welcher Pin von Port A Ein- (Bit gesetzt) oder Ausgang (Bit gelöscht) sein soll. Jeder Port hat beim den AVR-Controllern 3 Register. DDRx, PINx und PORTx.
Bernhard Spitzer schrieb: > Hier scheinen einige ziemlich Betriebsblind zu sein. Das Problem liegt > doch wohl eher im Verständnis, was DDRA bedeutet. > DDRA ist das D ata D irection R egister für den Port A. Das ist > also kein Ein- oder Ausgang, sondern bestimmt, welcher Pin von Port A > Ein- (Bit gesetzt) oder Ausgang (Bit gelöscht) sein soll. Im Prinzip ja. Ausser dass es laut Datenblatt genau anders herum ist: wenn das Bit im DDRA gesetzt ist, ist der entsprechende Pin ein Ausgang, wenn das Bit gelöscht ist ein Eingang.
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.