PWM_PA0_Uvergleich-3.9khz.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
jmp start             ;führe reset aus
9
10
11
;.def v_panel = r14    ;Messwert PV-Spannung PA0
12
.def v_akku = r12    ;Messwert Akku-Spannung PA0  (PA1)
13
.def i_panel = r10    ;Messwert PV-Strom PA2 (spaeter)
14
.def temp1 = r16    ;temporäre Variable
15
;.def wait1 = r17    ;Zähler
16
;.def wait2 = r18    ;Zähler
17
.def v_akkupwm = r19  ;ermittellter Vorladewert ocr0 für 13.4v
18
.def v_store = r20    ;gespeicherte Wunschspannung am PWM-Ausgang
19
20
.org 0x30             ;programm ab flashadresse 30h speichern
21
;=============== stackpointer ini ===========================
22
start:
23
  ldi r24, high(ramend) ;fetlegen des stack durch beladen von r24 mit
24
              ;der adresse für oberes ramend
25
  out sph, r24       ;auf das stackpointer-register sph (oberes Byte) schreiben
26
  ldi r24, low(ramend)  ;festlegen des unteren endes des stacks durch beladen des
27
              ;unteren bytes des stackpointer-registers spl
28
  out sph, r24         ;verwendet werden unter Rücksichnahme auf die Speichergröße
29
  LDI temp1, high (RAMEND)
30
      OUT SPH, temp1  ;SPH am Ende phys. SRAM
31
      LDI temp1, low (RAMEND)
32
      OUT SPL, temp1  ;SPL am Ende phys. SRAM  
33
      LDI temp1,0b11111000  
34
      OUT DDRA, temp1    ;pa0-2 analoge eingaenge
35
      LDI temp1,0b11111100   
36
      OUT DDRD, temp1    ;pd2-7 ausgabe
37
      ldi temp1, 0b11111111      
38
      OUT DDRC, temp1    ;pc0-7 ausgabe
39
      LDI temp1, 0b00001111
40
      OUT DDRb, temp1    ;pb0-3 ausgabe
41
      ;ldi r21, 75  ;verstärkungsfaktor fuer ad ergebniss
42
      ldi v_store,50    ;max.ladespannung
43
  call timer0ini ;Timer 0  initialisieren
44
  call adini    ;A-D Wandler AD0 initialisieren
45
46
             
47
48
;############################################################################
49
main:
50
51
;pa0     
52
    
53
    
54
    in r17, ADCL      ;ad lowbyte in r17 merken
55
    in r18, ADCH      ;ad highbyte in r18 merken
56
    nop
57
    nop
58
    nop
59
    nop
60
    ;sbi  ADMUX,adlar      ;linksbuendig, pa0
61
    sbi  ADCSR,ADSC      ;Wandlung starten
62
    
63
    MOV v_akku, r18
64
    nop
65
    MOV v_akkupwm, v_akku
66
    nop
67
68
;auswahl
69
      cp v_store, v_akku  ;vergleiche gespeicherte mit gemessener
70
      brsh up      ;akkuspannung, wähle aus ob höher oder niedriger
71
      brlo down    ;und springe zu up oder down
72
73
down:      
74
      dec v_akkupwm      ;akkuspannung zu hoch, zaehle runter  ;
75
      cp v_store, v_akkupwm  ;und vergleiche mit gespeicherter spannung
76
      brne down        ;noch nicht gleich? springe zu down
77
      breq sichern      ;wenn gleich, sichern
78
79
up:      
80
      inc v_akkupwm
81
      cp v_store, v_akkupwm
82
      brne up
83
      breq sichern
84
85
sichern:
86
      sts 0x0072, v_akkupwm  ;wert im sram gesichert, fuer spaeter
87
      nop
88
      nop
89
      out ocr0,v_akkupwm     ;und ins vorladeregister von tc0 gespeichert
90
                  ; lt. simulation klappt das nicht, ich weis
91
                  ;mir keinen rat warum???  
92
    
93
94
95
96
97
98
99
100
  
101
jmp main
102
;============== timer ini ====================================    
103
timer0ini:
104
  cli
105
  in r17, tccr0
106
  ori r17, 0b01101010    ;tccr0, fast pwm, prescaler 0, lösche oc0 bei gleichstand
107
  out  tccr0, r17
108
  in r18, timsk
109
  ori r18, 0b00000010
110
  out timsk, r18      ;ocie0-löst beim erreichen das ladewertes irq aus
111
112
  ;ldi r17, 28      ; 255 = 13,1V
113
  ;out ocr0, r17      ;gewünschte PWM-Wert 128 für 3,906 khz
114
  
115
   ldi r18,0b00001000     ;pwm pb3 ausgang, oc0
116
  out ddrb, r18
117
  sei
118
  ret
119
;====================== hauptprogramm =================
120
adini:  
121
    cli
122
    ldi temp1, 0b01000000  ;;AREF, linkssbündig,pa0
123
    out ADMUX, temp1
124
    ldi  temp1,0b11101101
125
    out  ADCSR,temp1     ;adcen,adcie,adcfr,teiler 32
126
        sei            ;Interrupts global aktivieren                  
127
    jmp main