Forum: Mikrocontroller und Digitale Elektronik atmega8 ocr2


von Bolle (Gast)


Lesenswert?

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

von kein_assembler (Gast)


Lesenswert?

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.

von syn_error (Gast)


Lesenswert?

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.

von Bolle (Gast)


Lesenswert?

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:

von syn_error (Gast)


Lesenswert?

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

von syn_error (Gast)


Lesenswert?

Reihenfolge beachten. :)
1
in B_Out,OCR2
2
 cp b,B_Out
3
 breq  dfg
4
 brsh  b_d
5
...
6
...

von Bolle (Gast)


Lesenswert?

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:

von Steffen H. (avrsteffen)


Lesenswert?

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
Noch kein Account? Hier anmelden.