Guten Tag, Ich verwende ein PIC16F648A. Dieser µC steuert zum einen eine 7-Segmentanzeige an und zum anderen besitzt er am PortA einige Eingänge die das Eingangssignal auf logisch 0 oder 1 überprüfen. Also die 7 Segmentanzeige hängt am PortB, die Treiberstufen am PortA (niedrigsten Bits, Bit 0 und Bit 1 sind Ausgänge, der Rest ist Eingang). Um das Multiplexing zu realisieren ist es leider erforderlich gewesen in das PortA ein komplettes Binärwort zu schreiben (Bsp.: porta=0B0000001), bei einzelner Bitmanipulation hat das multiplexing nicht funktioniert. Nun zu meinem Problem: Wenn ich nun versuche wenige Takte später die Bits 2-7 auszulesen, welches Ergebnis bekomm ich dann? Ist es der Wert denn ich kurz zuvor (einige µs) ins Register geschrieben habe oder den tatsächlichen Pegelzustand an den Eingängen? Hat diesbezglich jemand Erfahrungen, weil ich gern auf das "Try and Error"-Prinzip verzichten würde. Vielen Dank für die Antworten! mfg Andreas Käberlein
Wenn die Bits 2-7 als Eingägnge definiert sind, bekommst du den Pegel am Port zurückgeliefert.
> bei einzelner Bitmanipulation hat das > multiplexing nicht funktioniert. Dann hast du was falsch gemacht. Ich vermute mal Port gesetzt, aber nicht wieder gelöscht. Du kannst es auch so machen, dass du wie gehabt 0x01 in PORTA schreibst und dann zum Wechseln auf die jeweils andere Anzeige die folgenden Assemblerbefehle nimmst: movfw PORTA xorlw 0x03 movwf PORTA Das sorgt dafür, dass die beiden niedrigstwertigen Bits (also deine Anzeigentreiber) getoggelt werden. die eine Anzeige geht aus, die andere an. Es würde auch ein Pin von PORTA reichen, wenn du daran einen Push-Pull-Treiber anschliesst und je eine Common-Anode und eine Common-Cathode als Anzeige nimmst.
Andreas Käberlein schrieb:
> bei einzelner Bitmanipulation hat das multiplexing nicht funktioniert.
Ist das nicht die Fallgrube, zwischen 2 Bitbefehlen muß ein NOP sein?
Peter
Nur wenn er taktmäßig am Limit fährt und hochkapazitive Sachen treibt. Dann kann es Probleme geben, wenn er zb. von low auf high wechseln lässt und im nächsten Befehl auf den Port lesend zugreift. Da der Porttreiber die angeschlossene Kapazität nicht schnell genug umladen kann, wird ein low gelesen. Sofern er an PORTA nicht ständig von in nach out wechselt und somit in die in/out-Falle tappt macht das keine Probleme, da er nur Ports abfrägt die auch input sind und bleiben.
Wenn du vom Port liest, liest du immen den aktuellen Pegel, egal ob Ein oder Ausgang. Das kann bei Bit-Manipulationen dazu führen, daß Ausgänge den Pegel wechseln. Vom Timing her, wenn du den port ausgiebst, und gleich einliest, ist genau ein Clock inzwischen, und zwar OSC Clock, nicht Befehls-clock. Das kann zu wenig sein, das ist meistens auch das Problem bei bit-manipulating Befehlen, bzw da ist das Timing auch etwas anders. Bitbefehle, auf ein internes Register anwenden, und dann das Register auf den Port kopieren, dann bist du die Probleme los, daß es nicht funktioniert.
Also es funktioniert!!!!! Vielen Dank für die Unterstützung mfg Andreas Käberlein
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.