PIC read modify write Problem

Gast #3231313
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 ?
Gast #3231351
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 ?
Gast #3231372
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
Gast #3231381
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.
Gast #3231419
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 ;-).
Gast #3231430
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
Gast #3231443
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.
Gast #3231482
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.
Gast #3231586
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.

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