1 | ;ausgangsspannungsregelung nach stepdown
|
2 | ;pwm an atmega16 für 3,906 khz
|
3 | ;bei 4mhz taktfrequenz
|
4 | ;mit timer0 im fast pwm mode, 8 bit aufloesung
|
5 | ;pwm-signal liegt auf pb3 oc0
|
6 | ;13.2.12
|
7 | .include "m16def.inc"
|
8 |
|
9 | ;.def v_panel = r14 ;Messwert PV-Spannung PA0
|
10 | .def v_akku = r12 ;Messwert Akku-Spannung PA0 (PA1)
|
11 | .def i_panel = r10 ;Messwert PV-Strom PA2 (spaeter)
|
12 | .def temp1 = r16 ;temporäre Variable
|
13 | ;.def wait1 = r17 ;Zähler
|
14 | ;.def wait2 = r18 ;Zähler
|
15 | .def v_akkupwm = r19 ;ermittellter Vorladewert ocr0 für 13.4v
|
16 | .def v_store = r20 ;gespeicherte Wunschspannung am PWM-Ausgang
|
17 |
|
18 |
|
19 |
|
20 | jmp RESET ;External Pin, Power-on Reset, Brown-out
|
21 | jmp noint ;INT0 ;External Interrupt Request 0
|
22 | jmp noint ;INT1 ;External Interrupt Request 1
|
23 | jmp noint ;TIMER2 COMP ;Timer/Counter2 Compare Match
|
24 | jmp noint ;TIMER2 OVF ;Timer/Counter2 Overflow
|
25 | jmp noint ;TIMER1 CAPT ;Timer/Counter1 Capture Event
|
26 | jmp noint ;TIMER1 COMPA ;Timer/Counter1 Compare Match A
|
27 | jmp noint ;TIMER1 COMPB ;Timer/Counter1 Compare Match B
|
28 | jmp timer1ini ;TIMER1 OVF ;Timer/Counter1 Overflow
|
29 | jmp timer0ini ;Timer/Counter0 Overflow
|
30 | jmp noint ;SPI, STC ;Serial Transfer Complete
|
31 | jmp noint ;USART, RXC ;USART, Rx Complete
|
32 | jmp noint ;USART, UDRE ;USART Data Register Empty
|
33 | jmp noint ;USART, TXC ;USART, Tx Complete
|
34 | jmp adpa0 ;ADC Conversion Complete
|
35 | jmp noint ;EE_RDY ;EEPROM Ready
|
36 | jmp noint ;ANA_COMP ;Analog Comparator
|
37 | jmp noint ;TWI ;Two-wire Serial Interface
|
38 | jmp noint ;INT2 ;External Interrupt Request 2
|
39 | jmp noint ;TIMER0 COMP ;Timer/Counter0 Compare Match
|
40 | jmp noint ;SPM_RDY ;Store Program Memory Ready
|
41 |
|
42 | .org 0x30 ;programm ab flashadresse 30h speichern
|
43 |
|
44 | ;=============== stackpointer ini ===========================
|
45 | reset:
|
46 |
|
47 | LDI temp1, high (RAMEND)
|
48 | OUT SPH, temp1 ;SPH am Ende phys. SRAM
|
49 | LDI temp1, low (RAMEND)
|
50 | OUT SPL, temp1 ;SPL am Ende phys. SRAM
|
51 | LDI temp1,0b11111000
|
52 | OUT DDRA, temp1 ;pa0-2 analoge eingaenge
|
53 | LDI temp1,0b11111100
|
54 | OUT DDRD, temp1 ;pd2-7 ausgabe
|
55 | ldi temp1, 0b11111111
|
56 | OUT DDRC, temp1 ;pc0-7 ausgabe
|
57 | LDI temp1, 0b00001111
|
58 | OUT DDRb, temp1 ;pb0-3 ausgabe
|
59 | ;ldi r21, 10 ;verstärkungsfaktor fuer ad ergebniss
|
60 | ldi v_store,134 ;max.ladespannung rechner.174
|
61 | call timer1ini ;TIMER 1 initialisieren
|
62 | call timer0ini ;Timer 0 initialisieren
|
63 | call adini ;A-D Wandler AD0 initialisieren
|
64 | hier stand noint:
|
65 | reti
|
66 | ;============== hauptprogramm ====================================
|
67 |
|
68 |
|
69 |
|
70 | adpa0:
|
71 | sbi ADCSR,ADSC ;Wandlung starten
|
72 | fertig:
|
73 | sbic ADCSR,ADSC ;warten bis wandlung
|
74 | rjmp fertig ;beendet
|
75 |
|
76 | in r17, ADCL ;ad lowbyte in r17 merken
|
77 | in r18, ADCH ;ad highbyte in r18 merken
|
78 | MOV v_akku, r18
|
79 | MOV v_akkupwm, v_akku
|
80 | main:
|
81 |
|
82 | ;auswahl
|
83 | cp v_store, v_akku ;vergleiche gespeicherte mit gemessener
|
84 | brsh up ;akkuspannung, wähle aus ob höher oder niedriger
|
85 | brlo down ;und springe zu up oder down
|
86 | jmp main
|
87 | down:
|
88 | dec v_akkupwm ;akkuspannung zu hoch, zaehle runter ;
|
89 | cp v_store, v_akkupwm ;und vergleiche mit gespeicherter spannung
|
90 | brne down ;noch nicht gleich? springe zu down
|
91 | breq sichern ;wenn gleich, sichern
|
92 | jmp main
|
93 | up:
|
94 | inc v_akkupwm
|
95 | ;cp v_store, v_akkupwm
|
96 | ;brne up
|
97 | jmp sichern
|
98 | jmp main
|
99 | sichern:
|
100 | sts 0x0072, v_akkupwm ;wert im sram gesichert, fuer spaeter
|
101 | ;add r19,r21 ;ergebnis mit r20 verstaerken
|
102 | ;mov r19, r0 ;und in r19 verschieben
|
103 | out ocr0, v_akkupwm ;als vorladewert nach ocr0
|
104 |
|
105 | ;out ocr0,r19 ;und ins vorladeregister von tc0 gespeichert
|
106 | ; lt. simulation klappt das nicht, ich weis
|
107 | ;mir keinen rat warum???
|
108 | jmp main
|
109 | ;======================== timer0ini =====================
|
110 | timer0ini:
|
111 | cli
|
112 | in temp1, tccr0
|
113 | ori temp1, 0b01101010 ;tccr0, fast pwm, prescaler 8, lösche oc0 bei gleichstand
|
114 | out tccr0, temp1
|
115 | in temp1, timsk
|
116 | ori temp1, 0b00000000
|
117 | out timsk, temp1 ;ohne irq
|
118 |
|
119 | ;ldi temp1, 28 ; 255 = 13,1V
|
120 | ;out ocr0, temp1 ;gewünschte PWM-Wert 128 für 3,906 khz
|
121 |
|
122 | sei
|
123 | ret
|
124 | ;====================== ad-wandler ini =================
|
125 | adini:
|
126 | cli
|
127 | ldi temp1, 0b01000000 ;;AREF, linkssbündig,pa0
|
128 | out ADMUX, temp1
|
129 | ldi temp1,0b10011101
|
130 | out ADCSR,temp1 ;adcen,adif,adie,teiler 32
|
131 | sei ;Interrupts global aktivieren
|
132 | ret
|
133 |
|
134 | ;====================== timer1ini ======================
|
135 | timer1ini:
|
136 | cli
|
137 | ldi temp1,(1<<CS12) ;Betriebsart Mode 0 (PB3 normal)
|
138 | ;4Mhz/1 Wave Form Generator Mode 0 (Normal)
|
139 | OUT TCCR1B, temp1 ;Prescaler 256 um bei TCNT1H + TCNT1L = 0
|
140 | in temp1, timsk ;auf ca. 235msek zu kommen
|
141 | ori temp1, (1<<TOIE1) ;Timer1 Overflow Interrupt aktiviert
|
142 | OUT TIMSK, temp1
|
143 | SEI ;Enble all Interrupt
|
144 | LDI temp1, 0b00000000 ;Lade High Byte des 16 bit Zählers
|
145 | OUT TCNT1H, temp1 ;in TCNT1H
|
146 | LDI temp1, 0b00000000 ;Lade High Byte des 16 bit Zählers
|
147 | OUT TCNT1L, temp1 ;in TCNT1L
|
148 | sei
|
149 | ret
|
150 |
|
151 | noint:
|
152 | reti
|