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
|