Einsteigerfrage: Pin Toggeln in Assembler - PIC

Gast #3304675
Lesenswert?

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
xorwf PORTC,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.
Gast #3305786
Lesenswert?

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
xorwf LATC,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.
#3305799
Lesenswert?

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 !
Gast #3305925
Lesenswert?

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
btfss  PORTC,0      ;Gesetzt?
2
goto  TOGGEL_SET    ;nein, also setzen und Ende
3
bcf  PORTC,0      ;ja, also löschen und Ende  
4
goto  TOGGEL_END
5
TOGGEL_SET;
6
bsf    PORTC,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.
#3306096
Lesenswert?

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)
Gast #3306509
Lesenswert?

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.
#3306749
Lesenswert?

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....

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren