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
|
|