Forum: Mikrocontroller und Digitale Elektronik Phänomen bei PIC12F675 - ich versteh es nicht!


von Stefan P. (bonehead)


Angehängte Dateien:

Lesenswert?

Hallo.
Ich verstehe meinen PIC12F675 nicht.
Nachfolgendes Programm soll mir nach dem Start eine knappe Sekunde 
später den Ausgang GPIO 1 einschalten und dann immer eingeschaltet 
lassen und natürlich immer den restlichen Code abarbeiten. Der restliche 
Code hatte soweit problemlos funktioniert, es geht NUR um GPIO 1.
Ich habe viele Code-Varianten versucht, um dies zu erreichen, sollte ja 
eigendlich auch nicht schwer sein. ABER: Egal was ich mache, eine 
Zustandsänderung (also steigende oder fallende Flanke) von GPIO 5 löscht 
mir GPIO 1. Habe auch schon einen anderen PIC versucht, die Messung auf 
dem Programmier-Board gemacht, anstatt auf der eigendlichen Hardware. Es 
ist immer gleich. Was zum Geier mache ich falsch???

Im Anhang auch das Problemkind.

Danke schonmal für eure Hilfe, Stefan

von Peter D. (peda)


Lesenswert?

Da gibt es ne Fallgrube bei aufeinander folgenden Bitbefehlen.
Beim PIC immer das LAT-Register als Ausgang benutzen.

von Chris B. (dekatz)


Lesenswert?

Der Oldtimer hat leider noch keine LAT-Register.
Bei direkt aufeinanderfolgenden GPIO Zugriffen ein NOP einfügen oder ein 
Shadowregister als LAT-Ersatz verwenden.
Wenn GP1 involviert ist würde ich auch den Comparator abschalten .... 
mit CMCON = 0x07.

von Toxic (Gast)


Angehängte Dateien:

Lesenswert?

Peter D. schrieb:
> Beim PIC immer das LAT-Register als Ausgang benutzen.

PIC 12F675/PIC12F629 haben kein LAT-Register

1.Grundsaetzlich gilt: bei Modifikationen von GPIOs mit 
aufeinanderfolgenden Befehlen,immer ein paar uS Zeit lassen(NOP=Befehle 
einfuegen)ansonsten kann es sein,dass der erste Befehl zwar den 
entsprechenden Pin high setzt,aber der physikalische High-Pegel am Pin 
moeglicherweise noch gar nicht erreicht ist,(wegen einer Kapazitaet 
z.B.)
Was genau passiert kann man unter "Read-Modify-Problemen im Datenblatt" 
nachlesen...
2.wie man ein Shadowregister (sGPIO im Anhang)benutzt siehe in 
beigefuegter Datei
===============etwas was man verstehen und beachten sollte....
3.When the PIC reads a port register, it doesn’t read the value in the 
“output latch” (i.e. the value you wrote to it).  Instead, it reads the 
pins themselves – the voltages present in the circuit.
==============

von Bernd (Gast)


Lesenswert?

Du musst ANSEL löschen und in CMCON eine 7 schreiben. Sonst werden die 
GPIOs als analoge Eingänge konfiguriert. Beim Read-Modify-Write wird 
sonst eine 0 gelesen. Auch eine Bit-Set-Befehl ist intern ein 
RMW-Befehl. Ich hatte das Problem auch schon mal:
Beitrag "PIC 16F684 - Problem beim Setzen von Portpins"
Bernd

von Andreas M. (amesser)


Lesenswert?

Auf dem Oszibild sieht man ja das die Pegel ansich ja lang genug gesetzt 
sind, sollte eigentlich keine 0 für PB1 kommen. Aber ich denke auch das 
Problem liegt an Read-Modify-Write. Ich kannte PIC bisher nicht, wie 
kommt man bitte auf die Idee Input/Output in der Art umzusetzen? Da 
braucht von außen ja nur irgendein Puls zu kommen damit Unerwartetes 
passiert. Shadowregister ist m.M. damit zwingend notwendig.

von Teo D. (teoderix)


Lesenswert?

Andreas M. schrieb:
> wie
> kommt man bitte auf die Idee Input/Output in der Art umzusetzen? Da
> braucht von außen ja nur irgendein Puls zu kommen damit Unerwartetes
> passiert. Shadowregister ist m.M. damit zwingend notwendig.

Wenn das passiert, hast du ganz andere Probleme!

Ansonsten: Aus Kostengründen!

von Peter D. (peda)


Lesenswert?

Teo D. schrieb:
> Ansonsten: Aus Kostengründen!

Ich würde eher sagen, aus Gedankenlosigkeit. Sparen wird man nichts, das 
Latch ist ja vorhanden.
Beim 8051 gibt es auch keine extra Latchadresse, da wird automatisch bei 
RMW-Zugriffen aus dem Latch gelesen und bei allen anderen Lesezugriffen 
vom Eingang:
"Read-Modify-Write Feature
Some instructions that read a port read the latch and others read the 
pin. Read-modify-write instructions read the latch rather than the pin, 
and these instructions read a value, possibly change it, and then 
rewrite it to the latch."

von Stefan P. (bonehead)


Lesenswert?

Vielen Dank für eure Hilfe!

Folgendes habe ich nach euren Anreungen geändert und nun geht es:

......
PAUSE255ms3
    call  PAUSE1ms
    decfsz   anz_schleifen,1
    goto    PAUSE255ms3
    bsf  GPIO,1
    nop
    nop
    movlw  D'7'
    movwf  CMCON

;*********************************************************************** 
***
; Hauptprogramm
;*********************************************************************** 
***

HAUPT                      ; Beginn des Hauptprogramms

; Batteriespannung messen
; ***********************
    movlw  B'00000001'            ; AD0 auswählen
    movwf  ADCON0
    movlw  D'6'              ; Für Wandler benötigte Pause machen
    movwf  schleife
    call  PAUSEE

...

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.