3xPWM.asm


1
.include "m8def.inc"
2
 
3
.def temp  = r16
4
 
5
.def PWMCount = r17
6
.def ZCount = r22
7
.def FrequOffset = r23
8
9
 
10
.def pulse_width_1 = r18              ;Festlegung der Pulsweitenregister       
11
.def pulse_width_2 = r19                      
12
.def pulse_width_3 = r20                     
13
.def pulse_width_4 = r21                      
14
15
.org 0x0000
16
        rjmp    main                  ; Reset Handler
17
.org OVF0addr
18
        rjmp    timer0_overflow       ; Timer Overflow Handler
19
20
21
22
daten:                  ; Werte für den Verlauf
23
           .db 10, 10, 10, 10, 10, 10, 10, 10
24
       .db 20, 20, 20, 20, 20, 20, 20, 20
25
       .db 30, 30, 30, 30, 30, 30, 30, 30
26
       .db 40, 40, 40, 40, 40, 40, 40, 40
27
       .db 50, 50, 50, 50, 50, 50, 50, 50
28
       .db 60, 60, 60, 60, 60, 60, 60, 60
29
       .db 70, 70, 70, 70, 70, 70, 70, 70
30
       .db 80, 80, 80, 80, 80, 80, 80, 80
31
       .db 90, 90, 90, 90, 90, 90, 90, 90
32
       .db 100, 100, 100, 100, 100, 100, 100, 100
33
       .db 110, 110, 110, 110, 110, 110, 110, 110
34
       .db 120, 120, 120, 120, 120, 120, 120, 120
35
       .db 120, 120, 120, 120, 120, 120, 120, 120
36
       .db 120, 120, 120, 120, 120, 120, 120, 120
37
       .db 120, 120, 120, 120, 120, 120, 120, 120
38
       .db 120, 120, 120, 120, 120, 120, 120, 120
39
40
41
42
main:
43
        ldi     temp, LOW(RAMEND)     ; Stackpointer initialisieren
44
        out     SPL, temp
45
        ldi     temp, HIGH(RAMEND)
46
        out     SPH, temp
47
  
48
        ldi     temp, 0xFF            ; Port B auf Ausgang
49
        out     DDRB, temp
50
 
51
  
52
        ldi     temp, 0b00000001      ; CS00 setzen: Teiler 1 (kein Vorteiler)
53
        out     TCCR0, temp
54
 
55
        ldi     temp, 0b00000001      ; TOIE0: Interrupt Enable bei Timer Overflow e
56
        out     TIMSK, temp
57
58
  
59
        ldi ZL, LOW(daten*2)          ; Low-Byte der Adresse in Z-Pointer
60
        ldi ZH, HIGH(daten*2)         ; High-Byte der Adresse in Z-Pointer
61
62
    ldi    FrequOffset, 0        ; Einstellen der Timer-Startwerts
63
    
64
  
65
 
66
        sei
67
 
68
loop:   rjmp    loop
69
 
70
timer0_overflow:                      ; Timer 0 Overflow Handler
71
72
    out   TCNT0, FrequOffset    ; Offset in timer Register laden
73
74
    
75
        inc     PWMCount              ; den PWM Zähler von 0 bis
76
        cpi     PWMCount, 128         ; 127 zählen lassen
77
        brne    WorkPWM
78
        clr     PWMCount
79
80
    
81
    inc    ZCount
82
    cpi    ZCount,128
83
    brne    load_value
84
    ldi    ZCount, 0
85
    ldi ZL, LOW(daten*2)              ; Low-Byte der Adresse in Z-Pointer
86
        ldi ZH, HIGH(daten*2)             ; High-Byte der Adresse in Z-Pointer
87
88
load_value:
89
    lpm    pulse_width_1,Z+      ; Signalwerte laden 
90
    lpm    pulse_width_2,Z
91
    lpm    pulse_width_3,Z
92
    lpm    pulse_width_4,Z
93
    
94
 
95
WorkPWM:
96
        ldi     temp, 0b11110000      ; 0 .. Led an, 1 .. Led aus
97
 
98
        cp      PWMCount, pulse_width_1       ; Ist der Grenzwert für Puls 1 erreicht
99
        brlt    OneOn
100
        ori     temp, 0x01
101
 
102
OneOn:  cp      PWMCount, pulse_width_2       ; Ist der Grenzwert für Puls 2 erreicht
103
        brlt    TwoOn
104
        ori     temp, 0x02
105
 
106
TwoOn:  cp      PWMCount, pulse_width_3       ; Ist der Grenzwert für Puls 3 erreicht
107
    brlt    ThreeOn
108
        ori     temp, 0x04
109
 
110
ThreeOn:cp      PWMCount, pulse_width_4       ; Ist der Grenzwert für Puls 4 erreicht
111
        brlt    SetBits
112
        ori     temp, 0x08
113
 
114
115
 
116
SetBits:                              ; Die neue Bitbelegung am Port ausgeben
117
        out     PORTB, temp
118
 
119
        reti