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.
Ein NOP zwischen den beiden bsf könnte helfen, oder möglicherweise einen Befehl, der eigentlich später im Programm steht, vorziehen. MfG Klaus
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.