www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Port Verhalten PIC 16F6XX


Autor: Andreas Käberlein (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sebastian Hepp (sebihepp)
Datum:

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

Autor: Sascha (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sascha (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas Käberlein (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also es funktioniert!!!!!


Vielen Dank für die Unterstützung


mfg Andreas Käberlein

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.