RA4 Falle umgekehrt

OP #1714068
Lesenswert?

Hallo,

hätte ich zwar nicht für möglich gehalten, aber irgendwie hab ich es 
doch geschafft^^

Ich habe mit dem PIC16f84 einen Temperatursensor ( den DS18b20) 
angesteuert, angeschlossen habe ich den 1-wire-bus an RA4.
Es funktioniert wunderbar.
Nun wollte ich den Pin ändern, aber bis jetzt habe ich es noch nicht 
geschafft das Programm an einem anderen (normalen) Pin zum Laufen zu 
bekommen.
Meine Vermutung ist, dass der RA4, der zum Unterschied zu allen anderen 
Pins ein Open-Drain Ausgang ist für das Problem verantwortlich ist.

Ist so ein Problem bekannt bzw hat jemand eine Idee was ich noch 
probieren kann?
Gast #1714079
Lesenswert?

>Ist so ein Problem bekannt bzw hat jemand eine Idee was ich noch
>probieren kann?

Klar, RA4 gibt ja nur 0 aktiv aus. 1 macht der Pullup.
Wenn du das mit einem anderen Portpin machen möchtest dann so:
Portpin im Portregister auf 0 setzen. Um dann 1 über den Pullup
zu bekommen den Portpin auf Eingang schalten. Willst du ne Null am
Ausgang, den Portpin auf Ausgang schalten. Du wackelst also nicht
am Port- sondern am Datenrichtungsregister.
OP #1714125
Lesenswert?

danke für eure schnellen Antworten.
ich verstehe jetzt wie ich es machen müsste, allerdings war das so auch 
im Protokoll von Microchip hinterlegt und ich hatte es direkt schon so 
umgesetzt, war dann aber wohl eher Zufall, dass es auch am RA4 
funktioniert hat:


PIN_HIGH:
     BSF  STATUS, RP0
     BSF  TRISA, 4       ; high impedance
     BCF  STATUS, RP0

     RETURN

PIN_LOW:
     BCF  PORTA, DATA_PIN
     BSF  STATUS, RP0
     BCF  TRISA, 4       ; low impedance zero
     BCF  STATUS, RP0

     RETURN
#1714309
Lesenswert?

Nein, bitte nicht so:

  BCF    PORTA,DATA_PIN

bcf ist ein read-modify-write Befehl. Es wird also erst PORTA 
eingelesen, dann das DATA_PIN Bit auf 0 gesetzt und dann wieder 
geschrieben.
Was dann in den anderen Bits von PORTA ausgegeben wird ist reine 
Glückssache!

  BCF    PORTA,DATA_PIN
   oder noch besser
  movlw   0                ; oder einen anderen Wert
  movwf   PORTA

nur einmal am Anfang des Programms machen.

Dann sollte es gehen.
Gast #1714377
Lesenswert?

Frank Schrader schrieb:
> nur einmal am Anfang des Programms machen.

Das wird auch nicht 100% funktionieren, da war Tobis Vorschlag
schon fast "richtiger", unter der Annahme das an PORTA sonst
kein Pin mehr die Richtung wechselt.

Wenn Du das so machst, also nur einmal am Programmstart
PORTA auf 0 setzt, sind ab diesem Zeitpunkt alle read modify
write Anweisungen auf dem kompletten(!) PORTA verboten.

Jeder bsf, bcf Befehl, angewandt auf jeden beliebigen PORTA Pin,
wird augenblicklich das DATA_PIN bit im latch auf 1 setzen,
falls DATA_PIN Eingang und nach Vdd gezogen ist.
Und dann geht bcf TRISA,DATA_PIN in die Hose...

Und falls im Interrupt irgendwo noch Befehle drin sind, die
PORTA verbiegen, kommt das Sperren des Ints noch dazu:

  <interrupt sperren>
  bcf PORTA,DATA_PIN
  banksel TRISA
  bcf TRISA,DATA_PIN
  banksel <whatever>
  <interrupt freigeben>

Andere Alternative ist das Mitschleppen eines PORTA shadow
registers, das eine aktuell gültige Kopie enthält.
Mach ab und zu auch mal Sinn...
Gast #1714387
Lesenswert?

>bcf ist ein read-modify-write Befehl. Es wird also erst PORTA
>eingelesen, dann das DATA_PIN Bit auf 0 gesetzt und dann wieder
>geschrieben.
>Was dann in den anderen Bits von PORTA ausgegeben wird ist reine
>Glückssache!

>Wenn Du das so machst, also nur einmal am Programmstart
>PORTA auf 0 setzt, sind ab diesem Zeitpunkt alle read modify
>write Anweisungen auf dem kompletten(!) PORTA verboten.

Sind hier eigentlich nur Idioten unterwegs?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren