PWM_PA0_Uvergleich-3.9khz-IRQ3.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
reti  ;INT0 ;External Interrupt Request 0
22
reti  ;INT1 ;External Interrupt Request 1
23
reti  ;TIMER2 COMP ;Timer/Counter2 Compare Match
24
reti  ;TIMER2 OVF ;Timer/Counter2 Overflow
25
reti  ;TIMER1 CAPT ;Timer/Counter1 Capture Event
26
reti  ;TIMER1 COMPA ;Timer/Counter1 Compare Match A
27
reti  ;TIMER1 COMPB ;Timer/Counter1 Compare Match B
28
reti  ;TIMER1 OVF ;Timer/Counter1 Overflow
29
jmp  timer0ini  ;Timer/Counter0 Overflow
30
reti  ;SPI, STC ;Serial Transfer Complete
31
reti  ;USART, RXC ;USART, Rx Complete
32
reti  ;USART, UDRE ;USART Data Register Empty
33
reti  ;USART, TXC ;USART, Tx Complete
34
jmp  adini ;ADC Conversion Complete
35
reti  ;EE_RDY ;EEPROM Ready
36
reti  ;ANA_COMP ;Analog Comparator
37
reti  ;TWI ;Two-wire Serial Interface
38
reti  ;INT2 ;External Interrupt Request 2
39
reti  ;TIMER0 COMP ;Timer/Counter0 Compare Match
40
reti  ;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
      
60
      ldi v_store,134    ;max.ladespannung rechner.174
61
  
62
      call timer0ini ;Timer 0  initialisieren
63
      call adini    ;A-D Wandler AD0 initialisieren
64
65
;============== hauptprogramm ====================================
66
67
main:
68
69
;pa0     
70
      sbi  ADCSR,ADSC      ;Wandlung starten
71
fertig:      
72
      sbic ADCSR,ADIF      ;warten bis wandlung
73
        rjmp weiter
74
      rjmp fertig        ;beendet    
75
weiter:        
76
    
77
      in r17, ADCL      ;ad lowbyte in r17 merken
78
      in r18, ADCH      ;ad highbyte in r18 merken
79
      MOV v_akku, r18
80
      MOV v_akkupwm, v_akku
81
    
82
83
;auswahl
84
      cp v_store, v_akku  ;vergleiche gespeicherte mit gemessener
85
      brsh up      ;akkuspannung, wähle aus ob höher oder niedriger
86
      brlo down    ;und springe zu up oder down
87
      jmp main
88
down:      
89
      dec v_akkupwm      ;akkuspannung zu hoch, zaehle runter  ;
90
      cp v_store, v_akkupwm  ;und vergleiche mit gespeicherter spannung
91
      brne down        ;noch nicht gleich? springe zu down
92
      breq sichern      ;wenn gleich, sichern
93
      jmp main
94
up:      
95
      inc v_akkupwm
96
      cp v_store, v_akkupwm
97
      brne up
98
      breq sichern
99
      jmp main
100
sichern:
101
      sts 0x0072, v_akkupwm  ;wert im sram gesichert, fuer spaeter
102
      out ocr0, v_akkupwm      ;als vorladewert nach ocr0
103
      
104
      ;out ocr0,r19     ;und ins vorladeregister von tc0 gespeichert
105
                  ; lt. simulation klappt das nicht, ich weis
106
                  ;mir keinen rat warum???  
107
      jmp main
108
;============== timer0ini ====================================    
109
timer0ini:
110
  cli
111
  in r17, tccr0
112
  ori r17, 0b01101010    ;tccr0, fast pwm, prescaler 8, lösche oc0 bei gleichstand
113
  out  tccr0, r17
114
  in r18, timsk
115
  ori r18, 0b00000000
116
  out timsk, r18      ;ohne irq
117
118
  ;ldi r17, 28      ; 255 = 13,1V
119
  ;out ocr0, r17      ;gewünschte PWM-Wert 128 für 3,906 khz
120
    
121
  sei
122
  ret
123
;====================== ad-wandler ini =================
124
adini:  
125
    cli
126
    ldi temp1, 0b01000000  ;;AREF, linkssbündig,pa0
127
    out ADMUX, temp1
128
    ldi  temp1,0b10010101
129
    out  ADCSR,temp1         ;adcen,adif,teiler 32
130
        sei            ;Interrupts global aktivieren                  
131
    jmp main