Forum: Mikrocontroller und Digitale Elektronik Probleme bei Verwendung von RA4 als Ausgang (pic16f84)


von TIC (Gast)


Lesenswert?

Hallo alle zusammen,

da ich mit meinem Latein was PIC-Programmierung betrifft so langsam am
ende bin, dachte ich mir ich frag mal hier um Hilfe...
Womit ich dann auch direkt bei meinem Problem wäre:
Ich versuche beim PIC16F84A den PORT RA4 als Ausgang zu nutzen.
Da dieser Port aber ein open-drain-Ausgang besitz, hab ich nen 4,7K
Widerstand als pullup an RA4 verwendet.
Aber im Betrieb tut sich rein gar nichts... D.h. RA4 egal ob 0 oder 1
in PORTA steht ist stets auf Masse geschaltet???
Gibt es dafür ne logische Erklärung?

Wäre Euch für jeden Ratschlag sehr dankbar.

Anbei noch ein Programmbeispiel, mit dem ich die ganze Zeit am
ausprobieren bin, was sich an RA4 tut.
Das Programm macht nichts anderes als abwechselnd die Ausgänge RA3 und
RA4 zu setzen bzw rückzusetzen.

    list    P=16F84A
    include    <p16F84A.inc>
    ERRORLEVEL  -302,-305
    __config  _XT_OSC & _CP_OFF & _PWRTE_OFF & _WDT_OFF


;****************************** PIC Initialisieren
******************************
    org    0000
    goto    PICINIT

PICINIT
    org    0008
    clrf    PORTA    ; reset PORTA
    clrf    PORTB    ; reset PORTB
    bsf    STATUS, RP0  ; Bank 1
    clrf    TRISA    ; PortA Ausgang
    bcf    TRISB, 7  ; RB7 Ausgang
    bcf    OPTION_REG, NOT_RBPU  ; Pull-ups ein
    bcf    OPTION_REG, T0CS
    bcf    STATUS, RP0  ; Bank 0
    clrf    PORTA    ; reset PORTA
    clrf    PORTB    ; reset PORTB



;********************************* Programm-Start
********************************

START
    btfsc    PORTA, 3  ; Abfrage PORTA RA4 aktiv?
    goto    rueck
    bsf    PORTA, 4  ; Ausgang RA4 aktiv
    bsf    PORTA, 3
    call    Zeitschleife
    goto    START
rueck
    bcf    PORTA, 4  ; Ausgang RA4 aktiv
    bcf    PORTA, 3
    call    Zeitschleife
    goto    START


Vielen DANK für Eure Hilfe

Gruß

TIC

von Profi (Gast)


Lesenswert?

Rührt sich am RA3 etwas?
Versuche mal, eine interne Variable und nicht das Output-Register
selbst für die Abfrage zu verwenden.

RA4 ist auch noch T0CKI.
Was ist während Reset, geht da RA4 wegen des PullUps hoch?
Evtl. PullUp überprüfen.
Evtl. ist die Zeitschleufe so kurz, dass zu wenig Zeit bleibt, das Pin
über R hochzuladen (kapazitive Last).

von TIC (Gast)


Lesenswert?

Hallo Profi,
RA3 wechselt schön im sekundentakt den Pegel.
Den Timer0 hab ich vorsichtshalber mal dem internen Takt zugewisen,
damit es mit RA4 nicht zu irgendwelchen Problemen kommen kann... (auf
was für Ideen man kommt, wenn einfach keine logische Erklärung mehr
hat...)
Ich hab leider kein Oszi zur Hand, daher messe ich auch
mit nem Multimeter. Damit erkennt man aber auch ganz gut, dass sich was
an RA3 tut. RA4 hatte ich auch schon ohmisch (ohne pullup) durgemessen.
Dabei sollte ja eigentlich immer zwischen Hochohm- und
Nierderohmbereich gewechselt werden. Allerdings bestätig sich auch
heirbei mein geschildertes Problem, da ich immer nur nen niederohmigen
Zustand an RA4 messe.

Wie meinst du das mit der internen Variable? PORTA in bel. Register
schieben und von dort aus den Zustand überprüfen?

Vielen Dank für die Unterstützung!

Gruß

TIC

von Uwe Nagel (Gast)


Lesenswert?

Schreib mal ein nop zwischen die beiden bsf's.
bsf nutzt einen read-modify-write Zyklus.
Der erste bsf schreibt ganz am Ende des Zyklus und der zweite liest
ganz am Anfang des nächsten Zyklus die Pin-Werte aus, modifiziert das
Bitmuster und schreibt es wieder. Ist der letzte Zugriff noch nicht
wirklich an den Pins angekommen liest er 0.
Das hatte ich kürzlich auch, habe stundenlang gesucht...
Nie zwei solcher Befehle nacheinander schreiben!
Uwe

von TIC (Gast)


Lesenswert?

Diese verfixte nop war doch tatsächlich die Ursache meines Problems...
Wär ich nicht draufgekommen.
Nach Abändern des Programms hat tatsächlich auch RA4 ebenso wie RA3 den
Takt erzeugt.
Herzlichen Dank Uwe!!!

Für alle dies noch interessiert hier nun das funktionierde Programm:


;PIC Initialisieren
  org    0000
  goto    PICINIT

PICINIT
  org    0008
  clrf    PORTA      ; reset PORTA
  clrf    PORTB      ; reset PORTB
  bsf    STATUS, RP0    ; Bank 1
  clrf    TRISA      ; PortA Ausgang
  bcf    TRISB, 7    ; RB7 Ausgang
  bcf    OPTION_REG, NOT_RBPU  ; Pull-ups ein
  bcf    STATUS, RP0    ; Bank 0
  clrf    PORTA      ; reset PORTA
  clrf    PORTB      ; reset PORTB



; Programm-Start

START
  btfsc    PORTA, 3    ; PORTA RA3 aktiv?
  goto    rueck
  bsf    PORTA, 4    ; Ausgang RA4 aktiv
  nop          ; DAS WAR DER ÜBELTÄTER
  bsf    PORTA, 3    ; Ausgang RA3 aktiv
  call    Zeitschleife
  goto    START
rueck
  bcf    PORTA, 4    ; Ausgang RA4 inaktiv
  nop
  bcf    PORTA, 3    ; Ausgang RA3 inaktiv
  call    Zeitschleife
  goto    START


Gruß

TIC

von Schoaschi (Gast)


Lesenswert?

Kleiner Hinweis noch. Verwende das nächste mal die LAT-Register. Dadurch
verhindest du dieses PRoblem.

http://www.fernando-heitor.de/index.php?option=com_smf&Itemid=27&topic=1160.0

von TIC (Gast)


Lesenswert?

Der 16f84 hat leider kein LAT-Register.
Aber gut zu wissen, dass es sowas gibt...

von TIC (Gast)


Lesenswert?

achso, da fällt mir gerade ein:
tritt diese Problem nur bei bsf oder auch bei bcf auf?
Müsste doch vom logischen her, selbes Prinzip sein...

von Uwe Nagel (Gast)


Lesenswert?

Das Problem dürfte immer dann auftreten, wenn direkt nach dem Schreiben
ein Port wieder gelesen wird.
bsf PORTA,4
movf PORTA,w
wird auch nicht unbedingt eine 1 in Bit4 vom W-Register lesen
falls PORTA,4 vor dem bsf 0 war.
Das ganze ist wohl nicht nur ein Problem vom Open-Drain Ausgang PORTA,4
der ist allerdings besonders betroffen, weil sein Eins-Zustand ja über
einen externen Pullup erzeugt wird. Ist der zu groß oder eine hohe
Lastkapazität dran, dann bleibt der Ausgang noch eine ganze Weile nach
dem setzen auf logisch Null.
Ich hatte den gleichen Effekt neulich mit PORTA,2 und 3. Ich muss wohl
mal erforschen, ob das ein Problem an allen Leitungen ist. Wenn ja
frage ich mich allerdings warum meine LCD-Ansteuerung an POTB seit
Jahren unauffällig läuft, da gibt es mehrere solche kritischen
Stellen...

von Martin Neidig (Gast)


Angehängte Dateien:

Lesenswert?

Folgendes wir sollen in der Ausbildung die Leds laufen lassen doch
leider geht eine der Leds nicht da RA4 kein Signal an die LEDS schickt
bitte um Hilfe. Welchen Code oder Befehl brauchen wir dazu oder geht
dies garnet??

von Schoasch (Gast)


Lesenswert?

Wie habt ihr denn die LEDs angeschlossen?! Schau mal in die "Pinout
Discription". RA4 ist ein OD (Open Drain Ausgang). Das heist du musst
dieses LED im Sink-Mode.. also +5V---Widerstand---LED>--RA4..
anschliessen.

mfg Schoasch

von Martin Neidig (Gast)


Lesenswert?

Danke, aber Softwaretechnisch ist es also nicht möglich oder sehe ich
dies falsch!

von Schoasch (Gast)


Lesenswert?

Wie sollte das denn möglich sein wenn es ein Open Drain Ausgang ist? Du
könntest lediglich die Schaltung etwas "umpfuschen".Dazu müsstest du
die LED zwischen RA4 und GND hängen und einen Pull-Up mit 1k an RA4.
Aber Jedesmal wenn du RA4 auf 0 setzt fließt ein Strom in den PIC und
die LED wird kurz geschlossen.

http://www.sprut.de/electronic/pic/grund/ioports.htm

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.