Forum: Mikrocontroller und Digitale Elektronik PIC18F2520 Ports abfragen


von Daniel E. (everyday_fun69)


Lesenswert?

Hallo Forum, ich hoffe mir kann jemand zum Thema weiterhelfen.

Also, PIC18F mit Port B3 ..B7 als Eingang. B0- B2 als Ausgang.
An den  5 Eingängen ist ein DIL Schalter dran, wo ich 2 hoch 5 
Möglichkeiten abfragen kann. Eigentlich wollte ich den kompletten Port 
Einlesen aller x Ssekunden und mit dem vorhergehenden 8 bit Wert 
vergleichen. Ja ja die drei Ausgänge unterschiedlich sein können würde 
ich die ja auch je nach Zustand unterschiedlich einlesen. Diese würden 
meine festgelegten 2 hoch 5 Möglichkeiten durcheinander bringen. Ist 
mein Verständniss so richtig?

Es würde quasi nur Sinn machen, wenn sich die Ausgänge nicht ändern oder 
am besten unbenutzt sind. Richtig?

Ich müsste also am besten jeden der 5 DIL Schalter einzeln einlesen und 
durch Logik (UND) verknüpfen. Richtig?

Gibt es sonst noch eine mir unbekannte Möglichkeit auf die Logik zu 
verzichten und irgendwie den gesamten Portzustand doch zu vewenden?

Ich benutze MPLAB und C18 Compiler.

Danke.

Gruss

Daniel

von Michael (Gast)


Lesenswert?

Du hast an jedem Port 5 Schalter.
B3 bis B7. Sind 5 mal Low oder High.
Dann fragst du den Port einfach ab.
Also 3^2 = B3, 4^2 = B4 usw.
Dann hast du immer ein Wert vom Port, welcher
du nun weiter verarbeiten kannst.

von Stefan (Gast)


Lesenswert?

Wenn ich das richtig verstanden habe musst du nur die unteren drei Bits 
ausblenden.
1
keys = PORTB & 0xf8;

Bits 0, 1 und 2 sind dann immer 0. Dürfte effizienter sein als jedes Bit 
einzeln zu lesen.

von Chris B. (dekatz)


Lesenswert?

Und das Ganze 3 x nach Rechts schieben - dann haben die 5 
Schalterstellungen den Wertbereich 0...31 (0x0....0x1f).

von Michael L. (michaelx)


Lesenswert?

Daniel EGAL schrieb:
> Hallo Forum, ich hoffe mir kann jemand zum Thema weiterhelfen.
>
> Also, PIC18F mit Port B3 ..B7 als Eingang. B0- B2 als Ausgang.
> An den  5 Eingängen ist ein DIL Schalter dran, wo ich 2 hoch 5
> Möglichkeiten abfragen kann. Eigentlich wollte ich den kompletten Port
> Einlesen aller x Ssekunden und mit dem vorhergehenden 8 bit Wert
> vergleichen. Ja ja die drei Ausgänge unterschiedlich sein können würde
> ich die ja auch je nach Zustand unterschiedlich einlesen. Diese würden
> meine festgelegten 2 hoch 5 Möglichkeiten durcheinander bringen. Ist
> mein Verständniss so richtig?

Nein.

> Es würde quasi nur Sinn machen, wenn sich die Ausgänge nicht ändern oder
> am besten unbenutzt sind. Richtig?

Nein.

> Ich müsste also am besten jeden der 5 DIL Schalter einzeln einlesen und
> durch Logik (UND) verknüpfen. Richtig?

Wenn schon, dann mit ODER verknüpfen.

Und das macht man nur, wenn die Bits einen Zahlenwert ergeben, die 
DIP-Schalter aber aus irgendwelchen Gründen nicht auf benachbarten Bits 
und/oder in der richtigen Reihenfolge angeschlossen sind, oder gar auf 2 
oder mehr Ports verteilt werden mussten.

> Gibt es sonst noch eine mir unbekannte Möglichkeit auf die Logik zu
> verzichten und irgendwie den gesamten Portzustand doch zu vewenden?

In deinem Fall macht man so: Ganzen Port lesen, mit einer Bit-Maske 
UND-verknüpfen, wobei alle Bits der Maske auf 1 gesetzt werden, deren 
Zustand dich am Port interessiert. Danach ggf. noch 3x Shift oder 
Division durch 8.

> Ich benutze MPLAB und C18 Compiler.

Wie es beim C18 aussieht weiß ich nicht, aber z.B. der CC5X Compiler 
setzt Divisionen von 2er-Potenzen in Shift-Operationen um. Schau dir 
einfach mal den erzeugten Assembler-Code an.

HTH

von Daniel E. (everyday_fun69)


Lesenswert?

Hallo Gemeinde, super und Danke für die zahlreichen Antworten. Das mit 
dem links Schieben wird wohl das Beste sein. Ich werde mich gleich mal 
daran probiern.

Vielen Dank an alle!!

Grüße

Daniel

von Manuel K. (manuel1139)


Lesenswert?

rechts schieben - nicht links :-)

x >> 2;

: Bearbeitet durch User
von everyday_fun69 (Gast)


Lesenswert?

Genau, rechts schieben da ja das LSB rechts ist. Bin beim probieren 
drauf gekommen. Danke an alle !!

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
Noch kein Account? Hier anmelden.