Forum: Mikrocontroller und Digitale Elektronik Assembler Anfängerfrage


von peg1 (Gast)


Lesenswert?

Hallo,

kann mir bitte jemand erklären, warum man folgenden Code verwendet um in 
einem PIC PORTA als Ausgang zu setzen ?
1
BSF 03h,5      ;Go to Bank 1
2
MOVLW 06h      ;Put 00110 into W
3
MOVWF 85h      ;Move 00110 onto TRISA
4
BCF 03h,5

Kann man alternativ auch einfach  mit dem BSF Befehl die einzelnen BITS 
in PORT A setzen anstatt zuerst ins W Register zu schreiben und dann das 
gesamte zu kopieren ?

Als Beispiel :
1
BSF 85h,1
2
BSF 85h,2
Damit wären doch auch die beiden BITs gesetzt ??

von Chris B. (dekatz)


Lesenswert?

Ja, kann man.

von peg1 (Gast)


Lesenswert?

Gibt es einen wichtigen Unterschied im Bezug auf Vor- und Nachteile der 
beiden Varianten ? Bzw. welche Variante ist eher zu empfehlen ?

von Peter II (Gast)


Lesenswert?

peg1 schrieb:
> Damit wären doch auch die beiden BITs gesetzt ??

aber nicht gleichzeitg. Eventuell braucht das ja die gegenstelle.

von Chris B. (dekatz)


Lesenswert?

wollte ich eigentlich noch schreiben, habe aber irrtümlich RETURN 
gedrückt.
Also:
Wenn zwischen den einzelnen "bsf" (und auch "bcf") Anweisungenen ein 
Interrupt auftritt und die Interruptroutine eine bestimmte Konfiguration 
von PortA voraussetzt, ist die 2. Methode nicht Optimal bzw. Fatal.

von peg1 (Gast)


Lesenswert?

ok, vielen Dank schonmal.

Ich dachte das hängt vielleicht damit oder auch damit zusammen, dass man 
immer erst in BANK 1 wechseln muss um die BITs so zu setzen.
Weil bei der zweiten Variante würde der Wechsel von BANK 0 zu BANK 1 ja 
wegfallen.

von Karl H. (kbuchegg)


Lesenswert?

Weiters.
So wie ich das sehe (ohne jetzt PIC Spezi zu sein)

Die erste Version setzt den kompletten TRISA, also alle 8 Bits. während 
die 2.te Version nur die beiden angesprochenen Bits bearbeitet.

von Chris B. (dekatz)


Lesenswert?

In die richtige Speicherbank musst du immer wechseln - egal welchen 
Befehl du anwendest!

Die korrekte Version lautet natürlich:

BSF 03h,5      ;Go to Bank 1
BSF 85h,1
BSF 85h,2
BCF 03h,5

von peg1 (Gast)


Lesenswert?

Alles klar. Danke für die schnelle Hilfe.

von Ottmar K. (wil1)


Lesenswert?

Es gibt noch einen guten Grund, nicht in jedem Falle mit
bsf, bcf, rlf, rrf
die PORT-Bits zu manipulieren, nämlich das "Read Modify Write Problem"!

Siehe dazu sehr ausführlich: 
[http://www.mikroe.com/download/eng/documents/compilers/mikroc/pro/pic/help/rmw.htm]
oder auf deutsch: 
[http://www.sprut.de/electronic/pic/fallen/fallen.html#inout]

Falls das Problem in bestimmten Fällen (siehe URL's) auftritt, ist die 
sicherste Lösung hierfür ein Schattenregister zu verwenden:
1
   movf  PORTx,W    ;zu ändernder PORTx
2
   movwf shdwPORT   ;PORTx in Schattenregister kopieren
3
   bsf   shdwPORT,3 ;z.B. Bit 3 setzen  = 1
4
   bcf   shdwPORT,6 ;z.B. Bit 6 löschen = 0
5
   movf  shdwPORT,W ;Portkopie mit geänderten Bits über das
6
   movwf PORTx      ;WREG wieder in den PORTx kopieren.
mfG Ottmar

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.