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
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.
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.