PWM_PA0-Uvergl.-Einfach-15kHZ.asm


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