Ich versuche, mit AVr-Studio 4.0 zu lernen. Ich hab eine Verständnisfrage DDRB: Damit bestimme ich die Richtung- ob Ein- oder Ausgang des Ports B PORTB: Damit lese ich den Status des Registers aus oder setze den Wert auf 0/1 PINB: Damit lese ich einen einzelnen PIN aus, also einen der acht einzelnen Bits von PortB (0...7)? Mein Problem, wie sage ich dem Programm, dass es z.B. bei PINB, das insgesamt 8 Bits breit sein kann, Bit 3 Verwenden soll (also Wert 2)? Davon hab ich versucht, es zu verstehen von dieser Seite. http://www.mikrocontroller.net/articles/AVR-Tutorial:_IO-Grundlagen
Wenn du es in C wissen willst solltest du hier nachsehen: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Zugriff_auf_IO-Ports
Ganz einfach /* Bit 2 ausmaskieren, dann könnten die anderen Pins als Ausgänge weiter*/ /* funktionieren. */ DDRB &= 0xFD (0b11111101) /**/ if(PINB & 0x02) /*Habe mal so etwas gesehen PINB.2 - aber selbst nicht ausprobiert*/ { /* Portpin gesetz */ } else { /* Portpin nicht gesetzt */ } Hilft Dir das?
cskulkw schrieb: > Hilft Dir das? Wird ihm wohl nicht helfen. Das ist ja Pin 1. Zumal er selbst auch noch ein bisschen durcheinander ist. A V R Fragender schrieb: > Bit 3 Verwenden soll (also Wert 2)? Bit 3 hat den Wert 8 Der erste Pin ist Pin0, der zweite Pin1 usw.. Entsprechend sind das dann die Bits 0, 1, 2... Um Bit3 auszumaskieren: if (PINB & 0x08){} Die übliche Schreibweise ist allerdings: if ((PINB &(1 << 3))){} Mit Wert 2 wird dann das 3. Bit nicht Bit3 ausmaskiert: if ((PINB &(1 << 2))){} In dieser Schreibweise passt es auch mit der Bitnummer zusammen. mfg.
Hi >DDRB: Damit bestimme ich die Richtung- ob Ein- oder Ausgang des Ports B >PORTB: Damit lese ich den Status des Registers aus oder setze den Wert >auf 0/1 >PINB: Damit lese ich einen einzelnen PIN aus, also einen der acht >einzelnen Bits von PortB (0...7)? >Mein Problem, wie sage ich dem Programm, dass es z.B. bei PINB, das >insgesamt 8 Bits breit sein kann, Bit 3 Verwenden soll (also Wert 2)? Nicht ganz: DDRB richtig PORTB : Wenn der Port Eingang ist schaltet ein gesetztes Bit den internen Pull-Up-Widerstand des Pins an. Als Ausgang setzt ein Bit den Zustand des Pins. PINB: Die Bits spiegeln den Zustand der Portpins wieder. >Mein Problem, wie sage ich dem Programm, dass es z.B. bei PINB, das >insgesamt 8 Bits breit sein kann, Bit 3 Verwenden soll (also Wert 2)? Z.B. mit sbi PortB,3 -> Pin setzen cbi PortB,3 -> Pin löschen MfG Spess
danke für den Link zu dem C-Tutorial, ich glaub, jetzt hab ich es verstanden, mit PIN... lese ich nur den Status aus, mit Port... schreibe ich auf das Register. Noch ne andere Frage - Port... macht ja nur Sinn, wenn ich vorher mit DDR... den Port als Ausgang gesetzt habe, also der Steuerbar ist. Angenommen, ich setze RegisterPortB so: DDRB = 0b0000 1111, also die ersten vier Kontakte sind Eingänge, die restlichen Ausgänge. Was passiert, wenn ich mit dem Befehl PortB auch auf die einzelnen Bits schreibe, die ich vorher als Eingang gesetzt habe, also die eigentlich von aussen auf ein Signal warten - werden die dann auch verändert? Also angenommen, es liegen draußen an drei Kontakten keine Spannungen an, an einem schon, dann müsste mit PINB rauskommen: 1110 0000 Angenommen, ich schreibe nun mit PortB rein: PortB = 0b1100 1111 Liefert mir im nachfolgenden PINB 1110 111 oder 1100 1111, Also die Frage, wenn ich mit DDRB vorher entsprechend Ein- und Ausgänge festgelegt hab, könnte dann PortB auch einen Eingang überschreiben oder wäre diese Operation dann wirkungslos???
A V R Fragender schrieb: > DDRB = 0b0000 1111, also die ersten vier Kontakte sind Eingänge, die > restlichen Ausgänge. Die ersten 4 sind Ausgänge. Gewöhn' dir diesen Scheiß ab. Es wird von rechts nach links mit 0 beginnend gezählt. Das ist zwar menschlich ein bisschen unlogisch, aber du bekommst einen Knoten im Kopf, wenn du dich nicht daran hälst. Mal abgesehen davon, daß man ständig aneinander vorbei redet. Mit Schreiben auf einen Eingang werden die Pullups gesetzt. Das braucht man z.B. um Taster abzufragen. A V R Fragender schrieb: > Also die Frage, wenn ich mit DDRB vorher entsprechend Ein- und Ausgänge > festgelegt hab, könnte dann PortB auch einen Eingang überschreiben oder > wäre diese Operation dann wirkungslos??? Wie schon gesagt, man setzt damit einen Pullup. mfg.
> Die ersten 4 sind Ausgänge. Gewöhn' dir diesen Scheiß ab. Es wird von > rechts nach links mit 0 beginnend gezählt. Das ist zwar menschlich ein > bisschen unlogisch, @Fragender Es wird ein bischen logischer, wenn man sich klarmacht, dass es sich auch nur um Zahlen handelt. Welches ist bei der Dezimalzahl 378 die 0.te Stelle? Ist es die 3 (also die Hunderter) oder ist es die 8 (also die Einer). Entscheidet man sich für die Hunderter, dann war das keine sehr gute Wahl. Denn dann sind die Einer die 2. Stelle. Und bei der Zahl 78234 ist die Einerstelle dann plötzlich die 4.te Stelle. Durchgängiger wird das ganze wenn man bei den Einern anfängt und die IMMER als die 0.te Stelle auffasst. Daher: von rechts nach links. Und das bei 0 zu zählen begonnen wird: Ist in C generell immer der Fall und ja, es gibt auch dafür gute Gründe. > aber du bekommst einen Knoten im Kopf, wenn du dich > nicht daran hälst. Mal abgesehen davon, daß man ständig aneinander > vorbei redet. Full Ack. Es gibt nichts Schlimmeres, als wenn in einer Gruppe ein Einzelner eine abweichende Nomenklatur benutzt. Aus welchem Grund auch immer. Daher beginnen alle technischen Dokumente erst mal damit, den Begriffen eine Bedeutung zuzuweisen.
gut, will ich mir das fuer die Zukunft merken mit der Reihenfolge und der richtigen Angabe von Binär-und Hexadecimalwerten. Was macht ein uC bei folgender Anweisung? ldi r16, 0xFF out PINB, r16 Nun schreibe ich auf PINB, aber nach der Definition ist PINB nur zum Lesen da. Ich habe probiert, es mit dem AVR-Studio 4.0 zu simulieren und es zeigt an, dass sich die Bits von PINB entsprechend in dem Anzeigefenster ändern, aber würde es auch im uC etwas ändern, weil doch PINB eigentlich nur zum Lesen dasein soll und wenn ich jetzt per Quellcode etwas an diese Speicherstelle reinschreiben würde, was passiert dann? Wird Real garnichts passieren oder würde ich so die Werte verändern?
Hi >Was macht ein uC bei folgender Anweisung? Das ist eine Sonderfunktion neuerer AVRs. Das Beschreiben eines Bits im PIN-Register bewirkt (wenn Port Ausgang ist) ein togglen des zugehörigen Pins. MfG Spess
A V R Fragender schrieb: > Nun schreibe ich auf PINB, aber nach der Definition ist PINB nur zum > Lesen da. 13.2.2 Toggling the Pin Writing a logic one to PINxn toggles the value of PORTxn, independent on the value of DDRxn. Note that the SBI instruction can be used to toggle one single bit in a port. Geht ein bisschen schneller als Read-Modify-Write, also lesen, umdrehen, wieder ausgeben. mfg.
hmm, das englische ist fuer mich leider ein großes problem, weil ich dieser sprache nicht gut mächtig bin :-(
A V R Fragender schrieb: > hmm, das englische ist fuer mich leider ein großes problem, weil ich > dieser sprache nicht gut mächtig bin :-( Was schon ein Problem darstellt. Du wirst nicht weiterkommen ohne Datenblätter lesen zu können, und diese sind meist auf Englisch. Allerdings durch Übung lernt man, also trotzdem die Datenblätter lesen und ggf. bei Leo nachschlagen. PS: Deutsch scheint aber auch nicht dein Steckenpferd zu sein.
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.