PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : benötige Hilfe bei Register



Hansi41
17.01.2008, 19:50
Hallo,

ich benötige eure Hilfe bei der Konfigurierung der Ports.
Also ich besitze das Buch Mehr Spaß mit Asuro band 1, dort ist eben die Rede, dass man eben die Ports als Eigang ('0') oder Ausgang ('1') konfigurieren kann.
Nun ist in dem Buch geschrieben, dass man die StatusLED zum Aufleuchten bringen kann. Dazu wird folgendes Beispiel erwähnt:

Von Port B den Pin 0 auf Ausgang setzen: DDRB |= (1<<PB0)
Jetzt nur noch auf diesen Pin eine '1' achreiben: PORTB |= (1<<PB0)
Wieder ausschalten, falls gewünscht: PORTB &= ~(1<<PB0)

So ist es in diesem Buch beschrieben, allerdings verstehe ich dieses Beispiel nicht genau, vll könnt ihr mir ja es noch einmal kleinlich erklären.

Danke
mfg Hans

sloti
17.01.2008, 21:33
Hi Hans,

DDRB ist das Steuerregister für die I/O Ports in dem Fall für den Port B dort legt man nur fest, ob der Port ein bzw. Ausgang sein soll. Wenn
im Steuerregister der Port als Eingang konfiguriert ist, dann kann mann mit dem Register PORTX einen sog. Pull Up widerstand einschalten.

DDRB &= ~(1<<PB0)
PORTB|= (1<<PB0)
Den braucht man zum Beispiel um "unsaubere" Signale wie zum Beispiel Taster zu entprellen, d.h. es liegt quasi Strom auf der Leitung und der Taster zieht den Port dann auf Masse (logisch 0). Wenn im Steuerregister der Port als Ausgang konfiguriert ist, dann kann man mit dem PORTX Register den Port bzw auch den einzelnen Pin ein- und ausschalten.
DDRB |= (1<<PB0)
PORTB|= (1<<PB0) // PB.0 einschalten

DDRB |= (1<<PB0)
PORTB&= ~(1<<PB0) // PB.0 ausschalten



ich hoffe ich habs irgendwie verständlich erklärt.

mfg
Erik

Hansi41
18.01.2008, 09:30
Hi danke für deine erklärung, ich hatte auch sachon vorher verstanden, wie das so abläuft, allerdings war und ist mir leider immer noch nicht klar, warum ich nun
DDRB |= (1<<PB0)
PORTB|= (1<<PB0) // PB.0 einschalten
schreiben muss,
kannst du mir diese vorgehensweise mit der ich schätze bitverschiebung genauer erklären, irgendwie verstehe ich das noch nicht...

Danke aber trotzdem für deine mühe!!!

damaltor
18.01.2008, 13:48
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=341057

schau mal da und scroll etwas runter, da hab ich das mal erklärt.

Hansi41
18.01.2008, 22:09
aaahaalso.. =)

| bedeutet oder.
0|0 = 0
0|1 = 1
1|0 = 1
1|1 = 1

& bedeutet und.
0|0 = 0
0|1 = 0
1|0 = 0
1|1 = 1

~ bedeutet NICHT.

~1 = 0
~0 = 1


<< bedeutet linksschiebung, >> bedeutet rechtsschiebung.

1<<3 = 1000
1<<4 = 10000
1<<1 = 10
1<<0 = 1 usw.

das wort, ws dahinter steht ist eingentlich auch bloß eine zahl, die dem compiler vorher mitgeteilt wurde, oder eine variable.

0101 << 3 = 0101000

es werden also ganze zahlen verschoben. so kann man zB eine eins durch einen port wandern lassen mit einer einzigen schleife:

PORTB = 0x01 //00000001
PORTB = PORTB<<1 //00000010
PORTB = PORTB<<1 //00000100
PORTB = PORTB<<1 //00001000
PORTB = PORTB<<1 //00010000
PORTB = PORTB<<1 //00100000
usw. immer mit edm gleicheb befehl wird der wert nach links geschoben.

jetzt zu den kompleyxeren sachen.


stell dir vor, du hast ein register (zB PORTB), dessen inhalt du nicht exakt kennst bzw der veränderlich ist. du willst das bit 2 setzen. du könntest folgendes machen:
PORTB = 1<<2;
nachteil: alle anderen bits im register werden auf null gesetzt, denn 1<<2 = 00000100. das ist aber selten das ziel. folgendes ist besser:
PORTB = PORTB | (1<<2);
es wird also jedes bit aktiviert, was vorher schon aktiviert war ODER durch 1<<2 definiert wurde. die kurzvorm davon ist
PORTB |= (1<<2);

jetzt wollen wir das bit löschen. wir könnten scheiben:
PORTB = 0;
jetzt sind aber alle bits null.alternative:
PORTB = ~(1<<2);
wir schreiben hier also 00000100, invertieren das zu 11111011, und schreiben das rein. auch nicht besonders gut.besser so:
PORTB = PORTB & ~(1<<2);
es werden also nur die bits aktiv, die vorher aktiv waren UND duch ~(1<<2) definiert sind. das bit an stelle zwei wird also gelöscht, alle anderen bleiben. auch davon eine kurzform:
PORTB &= ~(1<<2);

also:

bit setzen:
REGISTER |= (1<<STELLE);
bit löschen:
REGISTER &= ~(1<<STELLE);

************************************************** ***********

Hallo,
vielen dank für deine Hilfe!!
Jetzt hab ichs verstanden.

damaltor
19.01.2008, 13:33
Du hättest es vielleicht nich nochmal komplett kopieren müssen... aber gut dass du es verstanden hast.