Forum: Mikrocontroller und Digitale Elektronik Port Verhalten PIC 16F6XX


von Andreas Käberlein (Gast)


Lesenswert?

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

von Sebastian H. (sebihepp)


Lesenswert?

Wenn die Bits 2-7 als Eingägnge definiert sind, bekommst du den Pegel
am Port zurückgeliefert.

von Sascha (Gast)


Lesenswert?

> 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.

von Peter D. (peda)


Lesenswert?

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

von Sascha (Gast)


Lesenswert?

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.

von chris (Gast)


Lesenswert?

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.

von Andreas Käberlein (Gast)


Lesenswert?

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