PWM_PA0_Uvergleich-3.9khz-neu.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
;11.2.12
7
.include "m16def.inc"
8
9
jmp reset           ;führe reset aus
10
11
12
jmp RESET ; Reset Handler
13
reti ;EXT_INT0 ; IRQ0 Handler
14
reti ;EXT_INT1 ; IRQ1 Handler
15
reti ;EXT_INT2 ; IRQ2 Handler
16
reti ;TIM2_COMP ; Timer2 Compare Handler
17
reti ;TIM2_OVF ; Timer2 Overflow Handler
18
reti ;TIM1_CAPT ; Timer1 Capture Handler
19
reti ;TIM1_COMPA ; Timer1 CompareA Handler
20
reti ;TIM1_COMPB ; Timer1 CompareB Handler
21
reti ;TIM1_OVF ; Timer1 Overflow Handler
22
reti ;TIM0_COMP ; Timer0 Compare Handler
23
jmp TIM0_OVF ; Timer0 Overflow Handler  +++++++++++++
24
reti ;SPI_STC ; SPI Transfer Complete Handler
25
reti ;USART_RXC ; USART RX Complete Handler
26
reti ;USART_UDRE ; UDR Empty Handler
27
reti ;USART_TXC ; USART TX Complete Handler
28
jmp ADC ; ADC Conversion Complete Handler  +++++++++++++
29
reti ;EE_RDY ; EEPROM Ready Handler
30
reti ;ANA_COMP ; Analog Comparator Handler
31
reti ;TWI ; Two-wire Serial Interface Handler
32
reti ;SPM_RDY ; Store Program Memory Ready Handler
33
34
;.def v_panel = r14    ;Messwert PV-Spannung PA0
35
.def v_akku = r12    ;Messwert Akku-Spannung PA0  (PA1)
36
.def i_panel = r10    ;Messwert PV-Strom PA2 (spaeter)
37
.def temp1 = r16    ;temporäre Variable
38
;.def wait1 = r17    ;Zähler
39
;.def wait2 = r18    ;Zähler
40
.def v_akkupwm = r19  ;ermittellter Vorladewert ocr0 für 13.4v
41
.def v_store = r20    ;gespeicherte Wunschspannung am PWM-Ausgang
42
43
.org 0x30             ;programm ab flashadresse 30h speichern
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, 75  ;verstärkungsfaktor fuer ad ergebniss
60
      ldi v_store,50    ;max.ladespannung
61
  
62
      call timer0ini ;Timer 0  initialisieren
63
      call adini    ;A-D Wandler AD0 initialisieren
64
65
             
66
67
;############################################################################
68
main:
69
70
;pa0     
71
    sbi  ADCSR,ADSC      ;Wandlung starten
72
fertig:
73
        sbis ADCSR,ADIF      ;warten bis wandlung
74
        jmp fertig        ;beendet    
75
    
76
    in r17, ADCL      ;ad lowbyte in r17 merken
77
    in r18, ADCH      ;ad highbyte in r18 merken
78
79
    ;sbi  ADMUX,adlar      ;linksbuendig, pa0
80
    sbi  ADCSR,ADSC      ;Wandlung starten
81
    MOV v_akku, r18
82
    MOV v_akkupwm, v_akku
83
    
84
85
;auswahl
86
      cp v_store, v_akku  ;vergleiche gespeicherte mit gemessener
87
      brsh up      ;akkuspannung, wähle aus ob höher oder niedriger
88
      brlo down    ;und springe zu up oder down
89
90
down:      
91
      dec v_akkupwm      ;akkuspannung zu hoch, zaehle runter  ;
92
      cp v_store, v_akkupwm  ;und vergleiche mit gespeicherter spannung
93
      brne down        ;noch nicht gleich? springe zu down
94
      breq sichern      ;wenn gleich, sichern
95
96
up:      
97
      inc v_akkupwm
98
      cp v_store, v_akkupwm
99
      brne up
100
      breq sichern
101
102
sichern:
103
      sts 0x0072, v_akkupwm  ;wert im sram gesichert, fuer spaeter
104
      out ocr0,v_akkupwm     ;und ins vorladeregister von tc0 gespeichert
105
                  ; lt. simulation klappt das nicht, ich weis
106
                  ;mir keinen rat warum???  
107
    
108
109
110
111
112
113
114
115
  
116
jmp main
117
;============== timer ini ====================================    
118
timer0ini:
119
  cli
120
  in r17, tccr0
121
  ori r17, 0b01101010    ;tccr0, fast pwm, prescaler 0, lösche oc0 bei gleichstand
122
  out  tccr0, r17
123
  in r18, timsk
124
  ori r18, 0b00000010
125
  out timsk, r18      ;ocie0-löst beim erreichen das ladewertes irq aus
126
127
  ;ldi r17, 28      ; 255 = 13,1V
128
  ;out ocr0, r17      ;gewünschte PWM-Wert 128 für 3,906 khz
129
  
130
   ldi r18,0b00001000     ;pwm pb3 ausgang, oc0
131
  out ddrb, r18
132
  sei
133
  ret
134
;====================== hauptprogramm =================
135
adini:  
136
    cli
137
    ldi temp1, 0b01000000  ;;AREF, linkssbündig,pa0
138
    out ADMUX, temp1
139
    ldi  temp1,0b11101101
140
    out  ADCSR,temp1     ;adcen,adcie,adcfr,teiler 32
141
        sei            ;Interrupts global aktivieren                  
142
    jmp main