Forum: Mikrocontroller und Digitale Elektronik Einsteigerfrage: Pin Toggeln in Assembler - PIC


von Martin (Gast)


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.

von Martin (Gast)


Lesenswert?

Achso, das TRISC Register habe ich auch auf Ausgang geschaltet.

von Sebastian H. (technik_freak)


Lesenswert?

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)

von Chris B. (dekatz)


Lesenswert?

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.

von Dieter W. (dds5)


Lesenswert?

Das PORTC Register lässt sich nur in der Bank 0 ansprechen, wenn eine 
andere Bank aktiv ist geht der Zugriff ins Leere.

von W.S. (Gast)


Lesenswert?

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.

von Ottmar K. (wil1)


Lesenswert?

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

von Martin (Gast)


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.

von Chris B. (dekatz)


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 !

von Martin (Gast)


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.

von Chris B. (dekatz)


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)

von W.S. (Gast)


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.

von Chris B. (dekatz)


Lesenswert?

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.

von Martin (Gast)


Lesenswert?

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.

von Chris B. (dekatz)


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

von W.S. (Gast)


Lesenswert?

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.

von ich (Gast)


Lesenswert?

Ja, seit mindestens 8 Jahren (da zu ersten mal PICs programmiert)...

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.