Hallo Leute, aus Langerweile versuche ich mal wieder Assembler zu lernen :) Nun habe ich als "kleine" Übung mal versucht eine 10-Bit Software PWM zu programmieren. Leider funktioniert das nicht wirklich wie gewollt...quasi garnicht. Momentan ist es so dass alle drei Kanäle (LEDs) komplett hell leuchten. Vieleicht wäre ja einer von euch so nett mal nen kurzen Blick über mein Programm zu werfen. Danke schonmal
Verrätst du mir, was du eigentlich mit pwm_count1 und pwm_count2 bezweckst? Warum multiplizierst du die beiden? Und warum erhöhst du die beiden so seltsam im Compare Interrupt?
Ach, jetzt versteh ich. Du willst auch gleich noch ein Fading mit einbauen. Vorschlag: Bring erst mal die normale PWM zum laufen.
Ich hatte das so gedacht das ich pwm_count1 bis zum Überlauf zählen lasse also 255 und dann pwm_count2 erhöre das ganze 4 mal also 1023 => 10 Bit.
Normale PWM? Wenn du damit den Timer meinst das hab ich schon. Die 8 Bit Soft-PWM könnt ich mal machen haste recht.
Robin Tönniges schrieb: > Ich hatte das so gedacht das ich pwm_count1 bis zum Überlauf zählen > lasse also 255 und dann pwm_count2 erhöre das ganze 4 mal also 1023 => > 10 Bit. Äh nein. Deine Compare ISR macht ganz was anderes und wozu du dann in der anderen ISR die beiden miteinander multiplizierst erklärt das auch noch immer nicht. Lass doch den einen Counter von 0 bis 255 zählen. Wenn dann 255 überschritten wird, wird der Counter wieder auf 0 gesetzt und dafür der andere um 1 höher. Die beiden Register gehören zusammen! Nur gemeinsam bilden sie ein 16 Bit Register. Du brauchst nichts anderes tun als den Übertrag von einem Register in das andere mit einzurechnen und das wars. Gewöhnlich benutzt man dazu das Carry Bit, denn das wird von der inc bzw add Operation automatisch beim Überlauf gesetzt.
1 | timer1_compare: |
2 | push temp |
3 | in temp, SREG |
4 | push temp |
5 | |
6 | ; das 16 Bit Register pwm_count um 1 erhöhen |
7 | add pwm_count1, 1 |
8 | adc pwm_count2, 0 |
9 | |
10 | cpi pwm_count2, 4 ; Überlauf ins 'elfte' Bit? |
11 | bne int_ende ; wenn nein -> alles fertig |
12 | clr pwm_count1 ; wenn ja, zurücksetzen |
13 | clr pwm_count2 |
14 | |
15 | int_ende: |
16 | pop temp |
17 | out SREG, temp |
18 | pop temp |
19 | reti |
Du möchtest dir vielleicht auch überlegen, dass man beim Ausstieg aus einer Funktion den Stack wieder so hinerlassen sollte, wie man ihn vorgefunden hat. Insbesondere muss alles was man selber auf den Stack geschoben hat auch wieder von dort runterholen. Und zwar in allen Fällen!
Karl heinz Buchegger schrieb: > Lass doch den einen Counter von 0 bis 255 zählen. > Wenn dann 255 überschritten wird, wird der Counter wieder auf 0 gesetzt > und dafür der andere um 1 höher. Ich dachte das ich genau das tue :) Zumindest wollte ich das. Aber ok das mit dem Add with Carry leuchtet mir ein ich werde es versuchen. P.S.: Multipliziert habe ich die beiden Zahlen um die 10-Bit Zahl zu bekommen.
Robin Tönniges schrieb: > P.S.: Multipliziert habe ich die beiden Zahlen um die 10-Bit Zahl zu > bekommen. Die hast du doch schon. Die steht in den Registern pwm_count1 und pwm_count2 Wenn du im Dezimalsystem 2 Stellen hast 8 und 7, von denen das eine die Zehner und das andere die Einer sind, dann lautet die komplette Zahl 87 und nicht 8*7=56 Fass die beiden Register als 'Zehner' und 'Einer' auf. Bei dir laufen halt die Einer von 0 bis 255 und die Zehner von 0 bis 3. Aber das Prinzip ist dasselbe!
Hhmm. Stimmt ich hätte das ganze etwas Binärer betrachten sollen. Danke dir
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.