PWM_PA0_Uvergleich-IVT2-239ms.asm


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
.org  0x000     
21
  rjmp RESET    ;External Pin, Power-on Reset, Brown-out
22
.org  INT0addr    
23
  reti      ;External Interrupt Request 0
24
.org  INT1    
25
  reti        ;External Interrupt Request 1
26
.org  OC2addr  
27
  reti        ;Timer/Counter2 Compare Match
28
.org  OVF2addr  
29
  reti        ;Timer/Counter2 Overflow
30
.org  ICP1addr  
31
  reti         ;Timer/Counter1 Capture Event
32
.org  OC1Aaddr  
33
  reti         ;Timer/Counter1 Compare Match A
34
.org  OC1Baddr  
35
  reti         ;Timer/Counter1 Compare Match B
36
.org  OVF1addr  
37
  rjmp timer1ini   ;TIMER1 OVF ;Timer/Counter1 Overflow  
38
.org  OVF0addr     
39
  rjmp timer0ini  ;Timer/Counter0 Overflow  
40
.org  SPIaddr    
41
  reti        ;Serial Transfer Complete
42
.org  URXCaddr  
43
  reti         ;USART, Rx Complete
44
.org  UDREaddr  
45
  reti       ;USART Data Register Empty
46
.org  UTXCaddr  
47
  reti         ;USART, Tx Complete
48
.org  ADCCaddr      
49
  rjmp adini    ;ADC Conversion Complete  
50
.org  ERDYaddr    
51
  reti        ;EEPROM Ready
52
.org  ACIaddr  
53
  reti        ;Analog Comparator
54
.org  TWIaddr  
55
  reti         ;Two-wire Serial Interface
56
.org  INT2addr    
57
  reti        ;External Interrupt Request 2
58
.org  OC0addr  
59
  reti        ;Timer/Counter0 Compare Match
60
.org  SPMRaddr    
61
  reti         ;Store Program Memory Ready
62
63
.org 0x30             ;programm ab flashadresse 30h speichern
64
65
;=============== stackpointer ini ===========================
66
reset:
67
  
68
      LDI temp1, high (RAMEND)
69
      OUT SPH, temp1  ;SPH am Ende phys. SRAM
70
      LDI temp1, low (RAMEND)
71
      OUT SPL, temp1  ;SPL am Ende phys. SRAM  
72
      LDI temp1,0b11111000  
73
      OUT DDRA, temp1    ;pa0-2 analoge eingaenge
74
      LDI temp1,0b11111100   
75
      OUT DDRD, temp1    ;pd2-7 ausgabe
76
      ldi temp1, 0b11111111      
77
      OUT DDRC, temp1    ;pc0-7 ausgabe
78
      LDI temp1, 0b00001111
79
      OUT DDRb, temp1    ;pb0-3 ausgabe
80
      ldi r21, 125  ;verstärkungsfaktor fuer ad ergebniss
81
      ldi v_store,225    ;max.ladespannung rechner.139
82
      call timer1ini ;TIMER 1 initialisieren
83
      call timer0ini ;Timer 0  initialisieren
84
      call adini     ;A-D Wandler AD0 initialisieren
85
86
;============== hauptprogramm ====================================
87
88
89
90
adpa0:     
91
      sbi  ADCSR,ADSC      ;Wandlung starten
92
fertig:      
93
      sbic ADCSR,ADSC      ;warten bis wandlung
94
        rjmp fertig        ;beendet    
95
    
96
      in r17, ADCL      ;ad lowbyte in r17 merken
97
      in r18, ADCH      ;ad highbyte in r18 merken
98
      MOV v_akku, r18
99
      MOV v_akkupwm, v_akku
100
    
101
102
;auswahl
103
      cp v_store, v_akku  ;vergleiche gespeicherte mit gemessener
104
      brsh up      ;akkuspannung, wähle aus ob höher oder niedriger
105
      brlo down    ;und springe zu up oder down
106
      jmp main
107
down:      
108
      dec v_akkupwm      ;akkuspannung zu hoch, zaehle runter  ;
109
      cp v_store, v_akkupwm  ;und vergleiche mit gespeicherter spannung
110
      brne down        ;noch nicht gleich? springe zu down
111
      breq sichern      ;wenn gleich, sichern
112
      jmp main
113
up:      
114
      inc v_akkupwm
115
      ;cp v_store, v_akkupwm
116
      ;brne up
117
      jmp sichern
118
      jmp main
119
sichern:
120
      sts 0x0072, v_akkupwm  ;wert im sram gesichert, fuer spaeter
121
      mul r19,r21        ;ergebnis mit r20 verstaerken
122
      mov r19, r0        ;und in r19 verschieben
123
      out ocr0, v_akkupwm      ;als vorladewert nach ocr0
124
      
125
      ;out ocr0,r19     ;und ins vorladeregister von tc0 gespeichert
126
main:                  ; lt. simulation klappt das nicht, ich weis
127
                  ;mir keinen rat warum???  
128
      jmp main
129
;======================== timer0ini =====================    
130
timer0ini:
131
  cli
132
  in temp1, tccr0
133
  ori temp1, 0b01101010    ;tccr0, fast pwm, prescaler 8, lösche oc0 bei gleichstand
134
  out  tccr0, temp1
135
  in temp1, timsk
136
  ori temp1, 0b00000000
137
  out timsk, temp1      ;ohne irq
138
139
  ;ldi temp1, 28      ; 255 = 13,1V
140
  ;out ocr0, temp1      ;gewünschte PWM-Wert 128 für 3,906 khz
141
    
142
  sei
143
  ret
144
;====================== ad-wandler ini =================
145
adini:  
146
    cli
147
    ldi temp1, 0b01000000  ;;AREF, linkssbündig,pa0
148
    out ADMUX, temp1
149
    ldi  temp1,0b10011101
150
    out  ADCSR,temp1         ;adcen,adif,adie,teiler 32
151
        sei            ;Interrupts global aktivieren                  
152
    ret
153
154
;====================== timer1ini ======================
155
timer1ini:
156
    cli
157
    ldi  temp1,(1<<CS12)  ;Betriebsart Mode 0 (PB3 normal) 
158
                ;4Mhz/1 Wave Form Generator Mode 0 (Normal)
159
    OUT TCCR1B, temp1    ;Prescaler 256 um bei TCNT1H + TCNT1L = 0
160
    in temp1, timsk            ;auf ca. 235msek zu kommen
161
    ori temp1, (1<<TOIE1)    ;Timer1 Overflow Interrupt aktiviert    
162
    OUT TIMSK, temp1
163
    SEI            ;Enble all Interrupt
164
    LDI temp1, 0b00000000    ;Lade High Byte des 16 bit Zählers
165
    OUT TCNT1H, temp1      ;in TCNT1H
166
    LDI temp1, 0b00000000    ;Lade High Byte des 16 bit Zählers
167
    OUT TCNT1L, temp1      ;in TCNT1L
168
    sei
169
    ret