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
Da gibt es ne Fallgrube bei aufeinander folgenden Bitbefehlen. Beim PIC immer das LAT-Register als Ausgang benutzen.
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.
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. ==============
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
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.
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!
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."
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.