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?
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.
>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.
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
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.
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...
>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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.