PWM_PA0_Uvergl.asm


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