Forum: Mikrocontroller und Digitale Elektronik RA4 Falle umgekehrt


von Tobi D. (fanti)


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?

von Uwe .. (uwegw)


Lesenswert?

Damit der Bus funktioniert, musst du mit dem normalen IO-Pin das 
Verhalten eines open-collector-Pins nachbilden. Du darfst also nur auf 
low oder hochohmig schalten, und nicht aktiv high.

von holger (Gast)


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.

von Tobi D. (fanti)


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

von Frank S. (herrschrader)


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.

von AkkiSan (Gast)


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

von holger (Gast)


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?

von AkkiSan (Gast)


Lesenswert?

holger schrieb:
> Sind hier eigentlich nur Idioten unterwegs?

Nö. Ich glaube, Du warst der Erste...

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.