PWM_PA0-16-3.9khz.asm


1
;pwm an atmega16/32 für  2 khz  (3,906) khz
2
;bei 4mhz taktfrequenz
3
;mit timer0 im fast pwm mode, 8 bit aufloesung
4
;pwm-signal liegt auf pb3 oc0
5
6
.include "m16def.inc"
7
8
;.def v_panel = r14    ;Messwert PV-Spannung PA0
9
.def v_akku = r12    ;Messwert Akku-Spannung PA0  (PA1)
10
.def i_panel = r10    ;Messwert PV-Strom PA2 (spaeter)
11
.def temp1 = r16    ;temporäre Variable
12
;.def wait1 = r17    ;Zähler
13
;.def wait2 = r18    ;Zähler
14
.def v_akkupwm = r19  ;ermittellter Vorladewert ocr0 für 13.4v
15
.def v_store = r20    ;gespeicherte Wunschspannung am PWM-Ausgang
16
17
jmp reset           ;führe reset aus
18
19
20
jmp RESET ; Reset Handler
21
reti ;EXT_INT0 ; IRQ0 Handler
22
reti ;EXT_INT1 ; IRQ1 Handler
23
reti ;EXT_INT2 ; IRQ2 Handler
24
reti ;TIM2_COMP ; Timer2 Compare Handler
25
reti ;TIM2_OVF ; Timer2 Overflow Handler
26
reti ;TIM1_CAPT ; Timer1 Capture Handler
27
reti ;TIM1_COMPA ; Timer1 CompareA Handler
28
reti ;TIM1_COMPB ; Timer1 CompareB Handler
29
reti ;TIM1_OVF ; Timer1 Overflow Handler
30
reti ;TIM0_COMP ; Timer0 Compare Handler
31
jmp timer0ini ; Timer0 Overflow Handler  +++++++++++++
32
reti ;SPI_STC ; SPI Transfer Complete Handler
33
reti ;USART_RXC ; USART RX Complete Handler
34
reti ;USART_UDRE ; UDR Empty Handler
35
reti ;USART_TXC ; USART TX Complete Handler
36
jmp adini ; ADC Conversion Complete Handler  +++++++++++++
37
reti ;EE_RDY ; EEPROM Ready Handler
38
reti ;ANA_COMP ; Analog Comparator Handler
39
reti ;TWI ; Two-wire Serial Interface Handler
40
reti ;SPM_RDY ; Store Program Memory Ready Handler
41
42
.org 0x30             ;programm ab flashadresse 30h speichern
43
;=============== stackpointer ini ===========================
44
reset:
45
  
46
      LDI temp1, high (RAMEND)
47
      OUT SPH, temp1  ;SPH am Ende phys. SRAM
48
      LDI temp1, low (RAMEND)
49
      OUT SPL, temp1  ;SPL am Ende phys. SRAM  
50
      LDI temp1,0b00000000  
51
      OUT DDRA, temp1    ;pa0-7 analoge eingaenge
52
      LDI temp1,0b11111100   
53
      OUT DDRD, temp1    ;pd2-7 ausgabe
54
      SER temp1      
55
      OUT DDRC, temp1    ;pc0-7 ausgabe
56
      LDI temp1, 0b00001111
57
      OUT DDRb, temp1    ;pb0-3 ausgabe
58
      ldi r20, 200
59
  
60
      call timer0ini ;Timer 0  initialisieren
61
      call adini    ;A-D Wandler AD0 initialisieren
62
63
             
64
65
;====================== hauptprogramm =================
66
main:
67
68
     sbi  ADCSR,ADSC      ;Wandlung starten
69
warte1:
70
    sbic ADCSR,ADIF      ;Warten bis Wandlung beendet ist
71
    rjmp warte1
72
    in r17, ADCL      ;adcl in r17 merken
73
    in r18, ADCH      ;adch in r18 merken
74
    mul r18,r20        ;ergebnis mit r20 verstaerken
75
    mov r19, r0        ;und in r19 verschieben
76
    out ocr0, r19      ;als vorladewert nach ocr0
77
78
    jmp main
79
;============== timer0ini ====================================    
80
timer0ini:
81
  cli
82
  in r17, tccr0
83
  ori r17, 0b01101010    ;tccr0, fast pwm, prescaler 0, lösche oc0 bei gleichstand
84
  out  tccr0, r17
85
  in r18, timsk
86
  ori r18, 0b00000000
87
  out timsk, r18      ;ocie0-löst beim erreichen das ladewertes irq aus
88
89
  ;ldi r17, 28      ; 255 = 13,1V
90
  ;out ocr0, r17      ;gewünschte PWM-Wert 128 für 3,906 khz
91
  
92
   ldi r18,0b00001000     ;pwm pb3 ausgang, oc0
93
  out ddrb, r18
94
  sei
95
  ret
96
;====================== adini =================
97
adini:  
98
    cli
99
    ldi temp1, 0b01000000  ;;AREF, linkssbündig,pa0
100
    out ADMUX, temp1
101
    ldi  temp1,0b11101101
102
    out  ADCSR,temp1     ;adcen,adcie,adcrf,teiler 32
103
        sei            ;Interrupts global aktivieren                  
104
    jmp main