Hallo,
ich möchte gerne bei meinem Pic16 ein Read-modify-write Problem beheben.
Es handelt sich um den PortB , bei dem ein paar der Ports als Eingang
und die restlichen als Ausgang dienen.
Über zwei der Ausgänge werden Led angesteuert.
Bsp. bsf portB,2
bsf portB,3
zuerst werden die zwei Led ein geschalten und danach wird eine
Warteschleife durchlaufen.
Mit bcf PortB2
bcf PortB3. werden sie nun nacheinander wieder abgeschalten. Bei mir
kommt es jedoch nun aufgrund der zwei direkt aufeinanderfolgenden bcf
Befehlen zu einem read-modify-write Problem.
Denn die zweite Led wird nur für einen Taktzyklus aus und schaltet sich
dann wieder ein.
Ich könnte ja nun ein delay zwischen die beiden befehle packen. Ich
wurde aber lieber beide Ports gleichzeitig schalten. Z.b. mit einer
Bitmaske ver-unden.
Dabei würde es zu keiner Verzögerung kommen und die led schalten
gleichzeitig. Nun hängen aber außer den beiden Ausgängen für die led
auch noch ein paar Eingänge mit dran. Funktioniert das dann überhaubt
oder kann ich den gesamten PortB mit seinen Ein- und Ausgängen nicht
ohne Probleme mit einer Bitmaske verunden ?
Nimm einen PIC18, der hat extra Latch-Register und Du bist den ganzen
Trödel los.
Ansonsten werden Dir die Designfehler alter PICs immer wieder auf die
Nase fallen.
Klaus schrieb:> Ein NOP zwischen den beiden bsf könnte helfen, oder möglicherweise> einen> Befehl, der eigentlich später im Programm steht, vorziehen.>> MfG Klaus
Ein NOP wäre möglich. Kann ich aber auch die Variante mit der bitmaske
wählen ? Oder führt das zu anderen Problemen ?
va.ku schrieb:> Ein NOP wäre möglich. Kann ich aber auch die Variante mit der bitmaske> wählen ? Oder führt das zu anderen Problemen ?
Man kann alles machen. Und alles kann zu Problemen führen. Steht vor
deinen bsf etwas wichtiges in W? Dann mußt du das freiräumen für deine
Maske. Haben die Prozessorflags einen wichtigen Wert vor der
Maskenoperation, mußt du sie dir merken.... halt alles was man beim
Assemblerprogrammieren so beachten muß
MfG Klaus
Klaus schrieb:> va.ku schrieb:>> Ein NOP wäre möglich. Kann ich aber auch die Variante mit der bitmaske>> wählen ? Oder führt das zu anderen Problemen ?>> Man kann alles machen. Und alles kann zu Problemen führen. Steht vor> deinen bsf etwas wichtiges in W? Dann mußt du das freiräumen für deine> Maske. Haben die Prozessorflags einen wichtigen Wert vor der> Maskenoperation, mußt du sie dir merken.... halt alles was man beim> Assemblerprogrammieren so beachten muß>> MfG Klaus
Flags und Register sind soweit in Ordnung. Ich wollte eher fragen, ob
ich denn das gesamte Register mit einer Bitmaske ver-unden kann. Denn es
sind sowohl Ein- als auch Ausgänge an dem Port. Also ob dann ein etwas
unerwünschtes mit einem Eingang passiert, wenn ich den mit 0 ver-unde.
va.ku schrieb:> Flags und Register sind soweit in Ordnung. Ich wollte eher fragen, ob> ich denn das gesamte Register mit einer Bitmaske ver-unden kann. Denn es> sind sowohl Ein- als auch Ausgänge an dem Port. Also ob dann ein etwas> unerwünschtes mit einem Eingang passiert, wenn ich den mit 0 ver-unde.
Wenn du etwas Speicher frei hast (genaugenommen ein byte) dann nimmst du
eine Zelle und machst dein R-M-W mit der. Dann schreibst du diese Zelle
in das Port Register.
Das funzt immer und ist unabhängig von der "Aussendarstellung".
Das r-m-w Problem ist übrigens ein rein "elektrotechnisches". Das lesen
des Ports hängt direkt am Pin. Wenn der nun aus irgendwelchen Gründen
nicht schnell genug umgeladen werden kann (z.B. wg. kapazitiver
Belastung) ist der kleine RISC Prozessor zu schnell mitdem einlesen.
Daher auch der Name RISC von Risiko ;-).
va.ku schrieb:> Ich> wurde aber lieber beide Ports gleichzeitig schalten. Z.b. mit einer> Bitmaske ver-unden.
warum schreibst Du dann nicht einfach
movlw 0x0C
iorwf PortB,F
...
movlw 0xF3
andwf PortB,F
oder auch beides mal
movlw 0x0C
xorwf PortB,F ; beide LEDS toggeln
Gruß Anja
Anja schrieb:> warum schreibst Du dann nicht einfach ...
Die Fragestellung war genau das nicht.
Wenn er einen Pic Port ohne LAT Register hat dann muss er selber
garantieren das kein r-m-w Problem auftreten kann.
Das ist bei Led's aber vom Prinzip her gegeben. Die ziehen den Port eh
nicht auf den Pic Low Pegel (> 0,8V Schwellenspannung) und die Zeiten
sind beim blinken langsam (beim dimmen muss man halt prüfen).
Das r-m-w Problem tritt bel Led blinken somit gar nicht auf.
Piccobello schrieb:> Anja schrieb:>> warum schreibst Du dann nicht einfach ...>> Die Fragestellung war genau das nicht.>> Wenn er einen Pic Port ohne LAT Register hat dann muss er selber> garantieren das kein r-m-w Problem auftreten kann.>> Das ist bei Led's aber vom Prinzip her gegeben. Die ziehen den Port eh> nicht auf den Pic Low Pegel (> 0,8V Schwellenspannung) und die Zeiten> sind beim blinken langsam (beim dimmen muss man halt prüfen).>> Das r-m-w Problem tritt bel Led blinken somit gar nicht auf.
Ja, genau. Es werden zwar Led angesteuert aber es hängt für diese noch
zusätzliche Elektronik mit dran, die ich der Einfachheit halber nicht
erwähnt habe.
va.ku schrieb:> Über zwei der Ausgänge werden Led angesteuert.> Bsp. bsf portB,2> bsf portB,3> zuerst werden die zwei Led ein geschalten und danach wird eine> Warteschleife durchlaufen.> Mit bcf PortB2> bcf PortB3. werden sie nun nacheinander wieder abgeschalten.
Versuche doch mal, ein wenig zu denken.
BSF PortB,2
BSF PortB,3
braucht 2 Befehle.
MOVLW 6
IORLW PortB,F
braucht auch bloß 2 Befehle.
W.S.
Die sicherste Lösung ist, sich im SRAM ein Shadow-Latch anzulegen. Man
macht alle Operationen mit dieser Variable und gibt sie aus. D.h keine
Ausgabe muß den Port einlesen.
Damit werden garantiert andere Pins des selben Ports nicht versehentlich
geändert.