Hallo zusammen,
ich versuche gerade ein bestehendes Assembler Programm so umzuändern,
dass zu einem bestimmten Zeitpunkt ein Pin toggelt. Leider funktioniert
selbst dieses einfache Vorhaben nicht ganz. Alles, was ich mache ist,
diese beiden Zeilen an entsprechender Stelle einzufügen:
1
movlw.1
2
xorwfPORTC,1
Sind diese Zeilen falsch oder werden sie eher gar nicht aufgerufen?
Der Controller ist ein PIC1823. Das Programm ist einige 1000 Zeilen
lang. Das würde wenn möglich erstmal nicht schicken.
Meinst Du PIC16F1823 oder 18F23?
Ist ANSEL für diesen Pin ausgeschaltet?(Der Pin ist zwar ein Ausgang,
aber ich habe beim CCS-Compiler von dieser Problematik gehört/gelesen)
XORWF,F ist eine Read-modify-write Operation daher muss der
entsprechende PIN auf Digital konfiguriert werden. Beim 16F1823 ist das
ANSELC-Register dafür zuständig.
Martin schrieb:> movlw .1> xorwf PORTC,1
Schreib lieber, was du da eigentlich bezweckst - und schreib dazu, wieso
du auf den Gedanken kommst, daß es nicht funktioniert.
Sonst tappen alle Anderen im Dunkeln.
W.S.
Klipp und klar:
Es handelt sich wohl nur um den PIC16(L)F1823. Klar, wenn PORTC,1 ein
digitaler I/O ist, wird dieses Bit durch den Code des TO umgeschaltet.
Indem der PIC Output-Latches hat, ist es besserer Stil anstatt PORTC,1 -
LATC,1 zu verwenden (von PORT Lesen, in LAT schreiben).
mfG Ottmar
Hallo,
danke schon mal für die Antworten und Entschuldigung für die
Unklarheiten.
Gemeint war der PIC16(L)F1823.
Inzwischen habe ich es erfolgreich probiert den Pin mit BSF und BCF zu
setzen und zu löschen. Damit müssten doch die Register und die Bank
stimmen?
Das hier hat auch nicht zum Erfolg geführt:
1
movlw.1
2
xorwfLATC,1
W.S. schrieb:> Schreib lieber, was du da eigentlich bezweckst - und schreib dazu, wieso> du auf den Gedanken kommst, daß es nicht funktioniert.
Naja ich will den Pin 1 von Port C toggeln lassen, indem ich ihn mit
einer 1 im W-Register exclusiv-ODER-vergleiche und das Ergebnis im
selbigen Port ablege. Und es funktioniert nicht, weil sich am Ausgang
des Controllers nichts tut.
Martin schrieb:> Hallo,>> Und es funktioniert nicht, weil sich am Ausgang> des Controllers nichts tut.
Hast du PORTC auch auf DIGITAL konfiguriert??. Wenn du den im Analogmode
liest, kommt da immer "0" zurück - egal was du dort Hinschreibst.
BSF und BCF hat nichts mit einem <xorwf PORTC> zu tun.
Output auf einen Port im Analogmode funkteoniert im Gegensatz zum Input.
Bei deinem
.....
movlw .1
xorwf PORTC,1
.....
wird nun mal der Port zuerst GELESEN !
Das ANSELC Register ist auf 0 geschaltet, damit ist es ein I/O, wenn ich
jetzt nicht völlig falsch unterwegs bin.
Inzwischen habe ich mir so selbst geholfen:
1
btfssPORTC,0;Gesetzt?
2
gotoTOGGEL_SET;nein,alsosetzenundEnde
3
bcfPORTC,0;ja,alsolöschenundEnde
4
gotoTOGGEL_END
5
TOGGEL_SET;
6
bsfPORTC,0
7
TOGGEL_END;
Nicht Elegant, aber es funktioniert. Hier lese ich ja auch den Port aus,
also sollte es daran doch nicht liegen?
Die Funktion ist zwar jetzt da, aber falls mir jemand meinen Fehler
erklären kann, wäre ich trotzdem sehr dankbar.
Natürlich funkteoniert es wenn du ANSELC auf 0x00 geschaltet hast - da
funkteoniert auch die XORWF Version.
Lass das einfach mal am Simulator laufen, tut genau was es soll - ohne
die BSF/BCF Krücke ;-)
main
BANKSEL ANSELC
clrf ANSELC
BANKSEL PORTC
clrf PORTC
BANKSEL TRISC
clrf TRISC
BANKSEL PORTC
endlos
movlw b'00000001'
xorwf PORTC,F
goto endlos
END
(deinen Denkfehler habe ich oben schon erklärt)
Martin schrieb:> Naja ich will den Pin 1 von Port C toggeln lassen, indem ich ihn mit> einer 1 im W-Register exclusiv-ODER-vergleiche und das Ergebnis im> selbigen Port ablege.
Oh Mann, da wär ich nie drauf gekommen...
Nee, mal im Ernst: Dieses toggeln soll ja wohl einen Zweck haben und die
Chance, es anders hinzukriegen, ist bei Kenntnis des Zweckes größer als
ohne.
Ansonsten ist es so, daß ich mir NICHT merke (und merken will!) ob nun
mit ,1 oder ,0 beim originalen Microchip-Assembler das Ergebnis ins
W-Register oder in's File geschrieben wird. Ich benutze meinen eigenen
Kram, bin aber deswegen her schon mal von jemandem sinnlos vollgenölt
worden.
Auch dir kann ich nur raten, dir 'F' und 'W' geeignet zu definieren und
dann etwa so zu schreiben:
MOVLW 1
XORWF PortC,F
Das liest sich deutlich besser als das, was du gepostet hattest.
BTW: Mich haben diese Gedankenlosigkeiten von Microchip schon viel
früher geärgert. Das ist ja nicht nur
MOVF MyFile,1 oder MOVF MyFile,0
versus
MOVF MyFile,W oder MOVF MyFile,F
sondern auch
BTFSS aBit,aFile
BTFSC aBit,aFile
versus
MyBit: BIT aBit,Afile
SKIP MyBit
SKIP NOT MyBit
was ich viel besser finde, weil man ein bestimmtes Bit ja nur durch
Festlegung der Bitposition und des betreffenden Registers definiern
kann.
W.S.
W.S. schrieb:> Martin schrieb:> > Auch dir kann ich nur raten, dir 'F' und 'W' geeignet zu definieren und> dann etwa so zu schreiben:>>>> W.S.
Das braucht man nicht gesondert definieren weil der "originale
Microchip-Assembler " das ohnehin kann.
Danke nochmal für die Antworten. Ich konnte auch komplett folgen bis
auf...
Chris B. schrieb:> (deinen Denkfehler habe ich oben schon erklärt)
Wo denn? Banks, TRIS und ANSEL passen ja.
In deinem Eröffnungspost war aber offensichtlich ANSELC nicht richtig
konfiguriert oder keine/falsche Bank gewählt - weil sonst der 2-Zeiler
getan hätte was er sollte.
Und das mit dem "Denkfehler" bezog sich auf deine Annhame, wenn BSF/BCF
funkteonieren, auch XORWF funkteonieren muss....
Chris B. schrieb:> Das braucht man nicht gesondert definieren weil der "originale> Microchip-Assembler " das ohnehin kann.
Ach, kann der das inzwischen?
Bin beeindruckt.
W.S.