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 | ;11.2.12
|
7 | .include "m16def.inc"
|
8 | jmp start ;führe reset aus
|
9 |
|
10 |
|
11 | ;.def v_panel = r14 ;Messwert PV-Spannung PA0
|
12 | .def v_akku = r12 ;Messwert Akku-Spannung PA0 (PA1)
|
13 | .def i_panel = r10 ;Messwert PV-Strom PA2 (spaeter)
|
14 | .def temp1 = r16 ;temporäre Variable
|
15 | ;.def wait1 = r17 ;Zähler
|
16 | ;.def wait2 = r18 ;Zähler
|
17 | .def v_akkupwm = r19 ;ermittellter Vorladewert ocr0 für 13.4v
|
18 | .def v_store = r20 ;gespeicherte Wunschspannung am PWM-Ausgang
|
19 |
|
20 | .org 0x30 ;programm ab flashadresse 30h speichern
|
21 | ;=============== stackpointer ini ===========================
|
22 | start:
|
23 | ldi r24, high(ramend) ;fetlegen des stack durch beladen von r24 mit
|
24 | ;der adresse für oberes ramend
|
25 | out sph, r24 ;auf das stackpointer-register sph (oberes Byte) schreiben
|
26 | ldi r24, low(ramend) ;festlegen des unteren endes des stacks durch beladen des
|
27 | ;unteren bytes des stackpointer-registers spl
|
28 | out sph, r24 ;verwendet werden unter Rücksichnahme auf die Speichergröße
|
29 | LDI temp1, high (RAMEND)
|
30 | OUT SPH, temp1 ;SPH am Ende phys. SRAM
|
31 | LDI temp1, low (RAMEND)
|
32 | OUT SPL, temp1 ;SPL am Ende phys. SRAM
|
33 | LDI temp1,0b11111000
|
34 | OUT DDRA, temp1 ;pa0-2 analoge eingaenge
|
35 | LDI temp1,0b11111100
|
36 | OUT DDRD, temp1 ;pd2-7 ausgabe
|
37 | ldi temp1, 0b11111111
|
38 | OUT DDRC, temp1 ;pc0-7 ausgabe
|
39 | LDI temp1, 0b00001111
|
40 | OUT DDRb, temp1 ;pb0-3 ausgabe
|
41 | ;ldi r21, 75 ;verstärkungsfaktor fuer ad ergebniss
|
42 | ldi v_store,50 ;max.ladespannung
|
43 | call timer0ini ;Timer 0 initialisieren
|
44 | call adini ;A-D Wandler AD0 initialisieren
|
45 |
|
46 |
|
47 |
|
48 | ;############################################################################
|
49 | main:
|
50 |
|
51 | ;pa0
|
52 |
|
53 |
|
54 | in r17, ADCL ;ad lowbyte in r17 merken
|
55 | in r18, ADCH ;ad highbyte in r18 merken
|
56 | nop
|
57 | nop
|
58 | nop
|
59 | nop
|
60 | ;sbi ADMUX,adlar ;linksbuendig, pa0
|
61 | sbi ADCSR,ADSC ;Wandlung starten
|
62 |
|
63 | MOV v_akku, r18
|
64 | nop
|
65 | MOV v_akkupwm, v_akku
|
66 | nop
|
67 |
|
68 | ;auswahl
|
69 | cp v_store, v_akku ;vergleiche gespeicherte mit gemessener
|
70 | brsh up ;akkuspannung, wähle aus ob höher oder niedriger
|
71 | brlo down ;und springe zu up oder down
|
72 |
|
73 | down:
|
74 | dec v_akkupwm ;akkuspannung zu hoch, zaehle runter ;
|
75 | cp v_store, v_akkupwm ;und vergleiche mit gespeicherter spannung
|
76 | brne down ;noch nicht gleich? springe zu down
|
77 | breq sichern ;wenn gleich, sichern
|
78 |
|
79 | up:
|
80 | inc v_akkupwm
|
81 | cp v_store, v_akkupwm
|
82 | brne up
|
83 | breq sichern
|
84 |
|
85 | sichern:
|
86 | sts 0x0072, v_akkupwm ;wert im sram gesichert, fuer spaeter
|
87 | nop
|
88 | nop
|
89 | out ocr0,v_akkupwm ;und ins vorladeregister von tc0 gespeichert
|
90 | ; lt. simulation klappt das nicht, ich weis
|
91 | ;mir keinen rat warum???
|
92 |
|
93 |
|
94 |
|
95 |
|
96 |
|
97 |
|
98 |
|
99 |
|
100 |
|
101 | jmp main
|
102 | ;============== timer ini ====================================
|
103 | timer0ini:
|
104 | cli
|
105 | in r17, tccr0
|
106 | ori r17, 0b01101010 ;tccr0, fast pwm, prescaler 0, lösche oc0 bei gleichstand
|
107 | out tccr0, r17
|
108 | in r18, timsk
|
109 | ori r18, 0b00000010
|
110 | out timsk, r18 ;ocie0-löst beim erreichen das ladewertes irq aus
|
111 |
|
112 | ;ldi r17, 28 ; 255 = 13,1V
|
113 | ;out ocr0, r17 ;gewünschte PWM-Wert 128 für 3,906 khz
|
114 |
|
115 | ldi r18,0b00001000 ;pwm pb3 ausgang, oc0
|
116 | out ddrb, r18
|
117 | sei
|
118 | ret
|
119 | ;====================== hauptprogramm =================
|
120 | adini:
|
121 | cli
|
122 | ldi temp1, 0b01000000 ;;AREF, linkssbündig,pa0
|
123 | out ADMUX, temp1
|
124 | ldi temp1,0b11101101
|
125 | out ADCSR,temp1 ;adcen,adcie,adcfr,teiler 32
|
126 | sei ;Interrupts global aktivieren
|
127 | jmp main
|