mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik RA4 Falle umgekehrt


Autor: Tobi D. (fanti)
Datum:

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

Autor: Uwe ... (uwegw)
Datum:

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

Autor: holger (Gast)
Datum:

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

Autor: Tobi D. (fanti)
Datum:

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

Autor: Frank Schrader (herrschrader)
Datum:

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

Autor: AkkiSan (Gast)
Datum:

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

Autor: holger (Gast)
Datum:

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

Autor: AkkiSan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
holger schrieb:
> Sind hier eigentlich nur Idioten unterwegs?

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

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.