1 | ;ausgangsspannungsregelung nach stepdown
|
2 | ;pwm an atmega16 für 2 khz
|
3 | ;bei 4mhz taktfrequenz
|
4 | ;mit timer0 im fast pwm mode, 8 bit aufloesung
|
5 | ;pwm-signal liegt auf pb3 oc0
|
6 | ;adc takt mittels aufruf in main
|
7 | ;werner / 16.2.12
|
8 | .include "m16def.inc"
|
9 |
|
10 | .def v_akku = r22 ;Messwert Akku-Spannung PA1
|
11 | .def temp1 = r16 ;temporäre Variable
|
12 | .def temp2 = r17 ;temporäre Variable
|
13 | .def v_store = r20 ;gespeicherte Wunschspannung am PWM-Ausgang
|
14 |
|
15 |
|
16 |
|
17 | .org 0x000
|
18 | rjmp RESET ;External Pin, Power-on Reset, Brown-out
|
19 | .org INT0addr
|
20 | reti ;External Interrupt Request 0
|
21 | .org INT1
|
22 | reti ;External Interrupt Request 1
|
23 | .org OC2addr
|
24 | reti ;Timer/Counter2 Compare Match
|
25 | .org OVF2addr
|
26 | reti ;Timer/Counter2 Overflow
|
27 | .org ICP1addr
|
28 | reti ;Timer/Counter1 Capture Event
|
29 | .org OC1Aaddr
|
30 | reti ;Timer/Counter1 Compare Match A
|
31 | .org OC1Baddr
|
32 | reti ;Timer/Counter1 Compare Match B
|
33 | .org OVF1addr
|
34 | reti ;TIMER1 OVF ;Timer/Counter1 Overflow
|
35 | .org OVF0addr
|
36 | reti ;Timer/Counter0 Overflow
|
37 | .org SPIaddr
|
38 | reti ;Serial Transfer Complete
|
39 | .org URXCaddr
|
40 | reti ;USART, Rx Complete
|
41 | .org UDREaddr
|
42 | reti ;USART Data Register Empty
|
43 | .org UTXCaddr
|
44 | reti ;USART, Tx Complete
|
45 | .org ADCCaddr
|
46 | reti ;ADC Conversion Complete
|
47 | .org ERDYaddr
|
48 | reti ;EEPROM Ready
|
49 | .org ACIaddr
|
50 | reti ;Analog Comparator
|
51 | .org TWIaddr
|
52 | reti ;Two-wire Serial Interface
|
53 | .org INT2addr
|
54 | reti ;External Interrupt Request 2
|
55 | .org OC0addr
|
56 | reti ;Timer/Counter0 Compare Match
|
57 | .org SPMRaddr
|
58 | reti ;Store Program Memory Ready
|
59 |
|
60 | .org 0x30 ;programm ab flashadresse 30h speichern
|
61 |
|
62 | ;=============== stackpointer ini ===========================
|
63 | reset:
|
64 |
|
65 | ldi temp1, high (RAMEND)
|
66 | out SPH, temp1 ;SPH am Ende phys. SRAM
|
67 | ldi temp1, low (RAMEND)
|
68 | out SPL, temp1 ;SPL am Ende phys. SRAM
|
69 | ldi temp1,0b11111000
|
70 | out DDRA, temp1 ;pa0-2 analoge eingaenge
|
71 | ldi temp1,0b11111111
|
72 | out DDRD, temp1 ;pd2-7 ausgabe
|
73 | ldi temp1, 0b11111111
|
74 | out DDRC, temp1 ;pc0-7 ausgabe
|
75 | ldi temp1, 0b00001111
|
76 | out DDRb, temp1 ;pb0-3 ausgabe
|
77 |
|
78 |
|
79 | ldi v_store,139 ;max.ladespannung rechner.139
|
80 | rcall timer0ini ;Timer 0 initialisieren
|
81 | rcall adini ;A-D Wandler AD0 initialisieren
|
82 |
|
83 | sei ;Interrupts global aktivieren?????????
|
84 | ;============== hauptprogramm ====================================
|
85 | main:
|
86 | rcall adwand
|
87 | rcall auswahl
|
88 | rcall warte
|
89 |
|
90 |
|
91 | jmp main
|
92 | ;============== auswahl+pwm ausgabe ====================================
|
93 | auswahl:
|
94 | cp v_store, v_akku ;vergleiche gespeicherte mit gemessener
|
95 | brsh up ;akkuspannung, wähle aus ob höher oder niedriger
|
96 | brlo down ;und springe zu up oder down
|
97 |
|
98 | down:
|
99 | dec v_akku ;akku wert zu hoch, zaehle runter ;
|
100 | jmp sichern ;sprung zum sichern/ausgabe ocr0
|
101 |
|
102 | up:
|
103 | inc v_akku ;akku wert zu niedrig, zaehle hoch
|
104 |
|
105 | jmp sichern ;sprung zum sichern/ausgabe ocr0
|
106 |
|
107 | sichern:
|
108 | out ocr0, v_akku ;als vorladewert nach ocr0
|
109 |
|
110 |
|
111 | ret
|
112 |
|
113 | ;======================== timer0ini =====================
|
114 | timer0ini:
|
115 |
|
116 | in temp1, tccr0
|
117 | ori temp1, 0b01101010 ;tccr0, fast pwm, prescaler 8, lösche oc0 bei gleichstand
|
118 | out tccr0, temp1
|
119 | in temp1, timsk
|
120 | ori temp1, 0b00000000
|
121 | out timsk, temp1 ;ohne irq
|
122 |
|
123 |
|
124 | ret
|
125 | ;====================== ad-wandler ini =================
|
126 | adini:
|
127 |
|
128 | ldi temp1,(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)
|
129 | out ADCSRA,temp1 ;adcen,
|
130 | ldi temp1,(1<<REFS0)|(1<<ADLAR) ;AVcc,linksbuendig,pa0
|
131 | out ADMUX,temp1
|
132 | ret
|
133 | ;======================== adwandlung pa0 ==================
|
134 | adwand:
|
135 | ;pa0
|
136 |
|
137 |
|
138 | sbi ADCSRA,ADSC ;Wandlung pa0 starten
|
139 | fertig:
|
140 | sbic ADCSRA,ADSC ;warten bis wandlung
|
141 | rjmp fertig ;beendet
|
142 |
|
143 | in v_akku, ADCH ;highbyte auslesen
|
144 |
|
145 | ret
|
146 | ;================== warte 5ms ===================
|
147 | warte:
|
148 |
|
149 |
|
150 | ldi temp1, $21
|
151 | WGLOOP0: ldi temp2, $C9
|
152 | WGLOOP1: dec temp2 ; 5ms Pause (bei 4 MHz)
|
153 | brne WGLOOP1
|
154 | dec temp1
|
155 | brne WGLOOP0
|
156 | ret
|