hallo, ich dimme eine led, die werte zum dimmen kommen vom uart, das funktiniert auch. Nun komme ich grade nicht weiter,so dert wert den ich über uart empfange ist zb.100,der wert steht jetzt auch in OCR2 drin (siehe bd),wie kann ich nun die Routine bd so umschreiben das sie vom aktuellen wert runter dimmt also ich sende zuerst 100 OCR2 hat jetzt den wert100, dann sende ich 50 nun sollte vom wert 100 runter gedimmt werden auf 50. villeicht kann mir jemand weiterhelfen. bd: inc B_Out out OCR2,B_Out cp b,B_Out brne bd mfg
Hey, Ich kann leider so garkein Assembler. Hab das selbe Problem allerdings in C gelöst. Undzwar: Du nimmst einen Soll-Wert (50) und einen Ist-Wert (100). Der Ist-Wert ist praktischerweise ja gleich deinem OCR-Register. Jetzt vergleichst du, ob du größer oder kleiner bist und ziehst ab oder addierst zu. Das ganze dann mit einer Zählervariable, damit du auch die Fading-Dauer einstellen kannst.
1 | cp B_Out, b |
2 | breq bd2 |
3 | brsh bd1 |
4 | |
5 | bd: |
6 | inc B_Out |
7 | out OCR2,B_Out |
8 | cp b,B_Out |
9 | brne bd |
10 | ret |
11 | bd1: |
12 | dec B_Out |
13 | out OCR2,B_Out |
14 | cp b,B_Out |
15 | brne bd1 |
16 | |
17 | bd2: |
18 | ret |
Nicht sonderlich schön aber der Ablauf sollte daraus klar werden. Wie kein_assembler schon sagte musst du ist und soll Wert vergleichen.
so ich hab das ganze mal so probiert aber es wird zuerst hogedimmt dann wieder zurück auf den wert vom uart in B_Out,OCR2 cp b,B_Out brsh b_d bd: inc B_Out out OCR2,B_Out rcall delay cp b,B_Out brne bd ;nein -> Schleife rjmp dfg b_d: dec B_Out out OCR2,B_Out rcall delay cp b,B_Out brne b_d ;nein -> Schleife dfg:
Du musst den Fall mit Equal bedenken.
1 | in B_Out,OCR2 |
2 | cp b,B_Out |
3 | brsh b_d |
4 | breq dfg |
5 | ... |
6 | ... |
Reihenfolge beachten. :)
1 | in B_Out,OCR2 |
2 | cp b,B_Out |
3 | breq dfg |
4 | brsh b_d |
5 | ... |
6 | ... |
leider hauts nicht so richtig hin, mein OCR2-wert ist bei 50 und in b steht ein wert von 25 so sollte eigentlich der OCR2 wert runter gedimmt werden,es wird aber von 255 nach 25 gedimmt und andersum genau das gleiche soll der wert von 25 auf zb. 60 gdimmt werden. in B_Out,OCR2 cp b,B_Out breq dfg brsh b_d bd: inc B_Out rcall delay out OCR2,B_Out cp b,B_Out brne bd ;nein -> Schleife rjmp dfg b_d: dec B_Out rcall delay out OCR2,B_Out cp b,B_Out brne b_d ;nein -> Schleife dfg:
Ich glaub du hast up und down verwechselt. Versuchs mal damit:
1 | in B_Out, OCR2 |
2 | cp b, B_Out |
3 | breq no_dimm |
4 | brsh dimm_up |
5 | |
6 | dimm_down: |
7 | dec B_Out |
8 | out OCR2, B_Out |
9 | rcall delay |
10 | cp b, B_Out |
11 | brne dimm_down ; -> neuer Wert noch nicht erreicht |
12 | rjmp no_dimm |
13 | |
14 | dimm_up: |
15 | inc B_Out |
16 | out OCR2, B_Out |
17 | rcall delay |
18 | cp b, B_Out |
19 | brne dimm_up ; -> neuer Wert noch nicht erreicht |
20 | |
21 | no_dimm: |
Zu beachten ist noch der Zählerwert. Denn wenn der jetzt größer als dein neuer OCR2 Wert ist, dann gibt es kein Compare-Match und der Zähler zählt bis 255->0 ... bis neuer OCR2 Wert!
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.