PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Parallelport Datenbits schalten



Gho
27.10.03, 18:30
Einen wunderschönen guten Tag erstmal!

Im Moment habe ich ein Relais am Parallelport angeschlossen und schalte es einfach mit outb (0xff (bzw 0x00), 0x378). Doch damit schalte ich scheinbar immer alle Datenports auf high. Doch nun möchte ich noch nen Latch dazwischenschalten und dafür muss ich die Datenports einzeln schalten...
Ich hab in meinem Buch ("Steuerungsaufgaben unter Linux lösen") geschaut und
da stand nur das die Adresse 0x378 (0-7)
0x378 ist ja der I/O Bereich des ganzen Ports und ich weiß nun nicht wie ich diese 0-7 da noch einbauen soll.
Wahrscheinlich is es ganz einfach, aber mir war das nicht erkenntlich, wäre nett wenn einer versuchen würde mir das zu erklären.

geronet
27.10.03, 18:34
Du kannst dir ja mal mein Programm anschauen, da steht das genau so wie du es haben willst drin.

Edit: Huch in dem Programm war ein kleiner Fehler drin ;)

Grüsse, Stefan

E S
30.10.03, 21:10
Hi,

00hex = 00dez = 0000 0000 bin
ffhex = 255dez = 1111 1111 bin

Jedes Bit hat eine Wertigkeit. der einfachheithalber mal dezimal, muss man das 0x davor weglassen:

Bit 0: 1
Bit 1: 2
Bit 2: 4
Bit 3: 8
Bit 4: 16
Bit 5: 32
Bit 6: 64
Bit 7: 128

Die zu schaltenden Bits sind zu addieren. Beispiel: Bit 2,4,5 sollen geschaltet werden:
4 + 16 + 32 = 52
Also
outb (52, 0x378);
schaltet die gewünschten Bits.

man kann die passenden Bits auch einshiften. dazu addiert man eine 1 zu einem char, wenn man das bit setzen will. Dann mit
variable = variable<<1;
die gesetzten Bits einen schritt nach links schieben. Mit dem höherwertigsten Bit wird angefangen. Das ganze 8x und man hat alle 8 Bits eingeshiftet. Beim letzten Bit natürlixch nicht mehr shiften.

Gruß
Elmar

Matzetronic
30.10.03, 22:45
hi,

ES hat recht.
die bits setzt du am besten, indem du den aktuellen wert ausliest und mit dem neu_zu_setzenden verODERst (High) bzw. verNANDest (Low).

also z.b.

outb (inb(0x378) | 16, 0x378);
setzt bit 4 zusätzlich

outb (inb(0x378) & ~16, 0x378);
löscht bit 4 wieder
....

gruß,
matze


edit: evtl. muss man da noch mal klammern: outb ((inb(0x378) & ~16), 0x378);

E S
31.10.03, 11:05
Hi,

genau. Mit dem & Operator (logisches UND) kann man Bits herausschneiden. Das nennt man Maskieren.

0110 0101 Eingangswert
0000 1111 Maske
-------------
0000 0101 Ergebnis

So kann man bei Eingangswerten Sachen auswerten. Im beispiel wird dann nur das unterste Nibble (halbes Byte) ausgewertet, wärend das obere Nibbel immer auf 0 gesetzt wird. Somit kann man dann einen Teil eines Bytes mit switch() oder if() auswerten, ohne dass die anderen Bits stören.
Möchte man das andere Nibble auswerten, geht man genau so vor, sollte aber das interessante Nibble noch an den Niederwertigsten Teil zwecks einfacherer Auswertung schieben:

0110 0101 Eingangswert
1111 0000 Maske
-------------
0110 0000 Ergebnis
variable = variable>>4; // 4 Stellen nach rechts schieben
0000 0110

In diesem Fall kann man sich die Maske sogar sparen, da die links aufgefüllten Bits immer 0 sind und die rechts rausgeschobenen Bits verloren gehen.

Mit |, also logisches ODER kann man einzelne Bits zusätzlich setzen:

0011 0100 Eingangswert
1101 0110 Zu setzende Bits
-------------
1111 0110 Ergebnis


Einzelne Bits kann man löschen, indem man die Maskierung mit UND-Verknüpfung nimmt und diese invertiert:

0110 0000 zu löschende Bits
1001 1111 invertierte Maske. Maske = !Maske


1111 1000 Eingangswert
1001 1111 !Maske
-------------
1001 1000 Ergebnis

Gruß
Elmar

geronet
31.10.03, 16:38
Genau das was ihr da schreibt steht in meinem Programm schon drin ;)

E S
31.10.03, 18:12
Hi,

aber nicht so schön erklärt, oder? ;) ;) ;)

Gruß
Elmar