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