Port Verhalten PIC 16F6XX

Gast #1418663
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
Gast #1421832
> 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.
Gast #1422192
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.
Gast #1422224
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.