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
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.
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.
Und das Ganze 3 x nach Rechts schieben - dann haben die 5 Schalterstellungen den Wertbereich 0...31 (0x0....0x1f).
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.