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