PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hilfe: Programm übersetzen C -> BasCom



samson2
22.02.2009, 12:11
Hallo ihr Spezialisten,

ich habe auch mal eine Frage zum umsetzen von C-Code nach Bascom Basic. Und zwar gibt es in dem C-Code mehrere Zeilen in der Form:

PORTB |= (1<<ENC28J60_PIN_SCK);
Der zweite Teil ist mir bereits klar. Mit (1<<ENC28J60_PIN_SCK) werden alle bits von ENC28J60_PIN_SCK um eins nach links verschoben. Nur das |= krieg ich nicht gebacken. Was bewirkt das genau?

Cu,
Samson2

uwegw
22.02.2009, 12:29
Der Befehl setzt das Bit in PORTB mit der Nummer ENC28J60_PIN_SCK (müsste irgendwo als define stehen).

Könnte man so in Bascom umsetzen (das x steht für die Pinnummer)
Config Pinb.x = Output
ENC28J60_PIN_SCK Alias Portb.x

ENC28J60_PIN_SCK =1

samson2
22.02.2009, 15:08
Der Befehl setzt das Bit in PORTB mit der Nummer ENC28J60_PIN_SCK (müsste irgendwo als define stehen).

Könnte man so in Bascom umsetzen (das x steht für die Pinnummer)
Config Pinb.x = Output
ENC28J60_PIN_SCK Alias Portb.x

ENC28J60_PIN_SCK =1

Also hab ich das mit dem bit-Shiften falsch interpretiert?

Zum Vergleich, dass ich das richtig verstanden habe:

#define ENC28J60_DDR DDRB
#define ENC28J60_PIN_CS 4
ENC28J60_DDR |= (1<<ENC28J60_PIN_CS);

ENC28J60_DDR ist das Datenrichtungsregister für Port B.
ENC28J60_PIN_CS ist der Pin4 also wird Pinb.4 durch den Befehl auf 1 (also Ausgang) gesetzt.

Eine andere Sache:


#define ENC28J60_CS_HI() ENC28J60_PORT |= (1<<ENC28J60_PIN_CS);
#define ENC28J60_CS_LO() ENC28J60_PORT &= ~(1<<ENC28J60_PIN_CS);


Definiert die erste Zeile ein Makro (Funktion?), mit dem ich Pinb.4 auf 1 setze? Die zweite Zeile müßte dann ja das Pendant zum setzen auf 0 sein. Aber warum schreibt er dann nicht


#define ENC28J60_CS_LO() ENC28J60_PORT |= (0<<ENC28J60_PIN_CS);
???


Cu,
Samson2

Dirk
22.02.2009, 15:31
Aber warum schreibt er dann nicht
#define ENC28J60_CS_LO() ENC28J60_PORT |= (0<<ENC28J60_PIN_CS);
Für HI wird Bit 4 gesetzt durch eine ODER-Funktion:
ENC28J60_PORT |= (0b00010000);

Für LO wird Bit 4 gelöscht durch eine UND-Funktion:
ENC28J60_PORT &= (0b11101111);

Deine Version wäre dies:
ENC28J60_PORT |= (0b00000000);
... und würde nichts bewirken.

Gruß Dirk

samson2
22.02.2009, 16:22
Ahhh!

Danke, das hilft mir erstmal weiter.

Cu,
Samson2