Forum: Mikrocontroller und Digitale Elektronik PIC read modify write Problem


von va.ku (Gast)


Lesenswert?

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 ?

von Peter D. (peda)


Lesenswert?

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.

von va.ku (Gast)


Lesenswert?

Dafür ist es leider zu spät. Ich muss mit dem Pic16 auskommen

von Klaus (Gast)


Lesenswert?

Ein NOP zwischen den beiden bsf könnte helfen, oder möglicherweise einen 
Befehl, der eigentlich später im Programm steht, vorziehen.

MfG Klaus

von va.ku (Gast)


Lesenswert?

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 ?

von Klaus (Gast)


Lesenswert?

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

von va.ku (Gast)


Lesenswert?

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.

von Piccobello (Gast)


Lesenswert?

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

von Anja (Gast)


Lesenswert?

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

von Piccobello (Gast)


Lesenswert?

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.

von va.ku (Gast)


Lesenswert?

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.

von W.S. (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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.

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.