Hallo,
Ich habe zur Übung ein kleines Assembler-Programm für den Tiny15
geschrieben. Letztlich soll über einen Poti das PWM-Signal eingestellt
werden.
Den Code habe ich ganz unten angehängt.
Problem: Zunächst schein alles zu funktionieren, das PWM ändert sich mit
der Potieinstellung. Allerdings bekomme ich vier mal einen "Überlauf",
also das Signal hat DutyCycle 100% und danach 0% ?!
Das selbe würde (theoretisch) passieren, wenn der ADC im ADLAR=0
eingestellt und ausgelesen wird, also die beiden höchsten Bytes nicht
beachtet werden würden. Dies ist aber hier nicht der Fall!?
Gibt es noch weitere Einstellungen die ich nicht beachtet habe??
Danke für Eure Hilfe!
Timo
1 | ; PB1 Ausgang PWM
|
2 | ; PB4 Eingang ADC
|
3 |
|
4 |
|
5 |
|
6 |
|
7 | .include "tn15def.inc"
|
8 |
|
9 | .def WRegister = R16
|
10 | .def LEDNr = R17
|
11 | .def RDummy = R18
|
12 | .def RHelligkeit0 = R19
|
13 | .def RHelligkeit1 = R20
|
14 | .def RHelligkeit2 = R21
|
15 |
|
16 | .org $000
|
17 |
|
18 | rcall Init
|
19 | rjmp Main
|
20 |
|
21 | .org $003 ;Timer1 Compare Match
|
22 | nop
|
23 | .org $004 ;Timer1 Overflow handler
|
24 | rjmp TIM1_OVF
|
25 | .org $005 ;Timer0 Overflow handler
|
26 | nop
|
27 |
|
28 |
|
29 | .org $009
|
30 |
|
31 | Init:
|
32 |
|
33 | ldi WRegister,0x00|(1<<PB1)|(1<<PB2)|(1<<PB3) ; PB1 als Ausgang
|
34 | out DDRB,WRegister
|
35 |
|
36 | ;PWM einstellen
|
37 |
|
38 | ldi WRegister,(0<<CS13)|(1<<CS12)|(1<<CS11)|(1<<CS10)|(1<<PWM1)|(1<<COM1A1)|(1<<COM1A0) ; invertierte PWM einsschalten -> Geschwindigkeit CK
|
39 | out TCCR1,WRegister
|
40 |
|
41 | ldi WRegister,(0<<OCIE1A)|(1<<TOIE1)|(0<<TOIE0) ;Interruptregister schalten
|
42 | out TIMSK,WRegister
|
43 |
|
44 |
|
45 |
|
46 | ldi WRegister,0xFF ;Pulsweite einstellen; zähle bis hier her
|
47 | out OCR1B,WRegister
|
48 |
|
49 |
|
50 | ldi WRegister,0x80 ;Pulsweite einstellen
|
51 | out OCR1A,WRegister
|
52 |
|
53 | ;ADC
|
54 | ldi WRegister,(1<<REFS1)|(1<<REFS0)|(1<<ADLAR)|(0<<MUX2)|(1<<MUX1)|(1<<MUX0) ;mit ADLAR links reicht das HB zur Steuerung aus
|
55 | out ADMUX,WRegister
|
56 |
|
57 | ldi WRegister,(1<<ADEN)|(1<<ADSC)|(1<<ADFR)
|
58 | out ADCSR,WRegister
|
59 |
|
60 | sei
|
61 |
|
62 | ret ;zurückspringen
|
63 |
|
64 | Main:
|
65 |
|
66 | nop
|
67 |
|
68 | rjmp Main
|
69 |
|
70 |
|
71 | TIM1_OVF:
|
72 | in RDummy,ADCH ; von Poti lesen
|
73 | lsl RDummy
|
74 | lsl RDummy
|
75 | out OCR1A,RDummy ; und als PWM-Wert einstellen
|
76 |
|
77 | reti
|