1 | .include "m8def.inc"
|
2 |
|
3 | .def temp = r16
|
4 | .def tempII = r17
|
5 |
|
6 |
|
7 | .def PWMCount = r24
|
8 |
|
9 | .def ocr_1 = r18 ; Helligkeitswert Led1: 0 .. 127
|
10 | .def ocr_2 = r19 ; Helligkeitswert Led2: 0 .. 127
|
11 | .def ocr_3 = r20 ; Helligkeitswert Led3: 0 .. 127
|
12 | .def ocr_4 = r21 ; Helligkeitswert Led4: 0 .. 127
|
13 | .def ocr_5 = r22 ; Helligkeitswert Led5: 0 .. 127
|
14 | .def ocr_6 = r23 ; Helligkeitswert Led6: 0 .. 127
|
15 |
|
16 |
|
17 | .org OVF0addr
|
18 | rjmp timer0_overflow ; Timer Overflow Handler
|
19 |
|
20 |
|
21 |
|
22 |
|
23 | .equ F_CPU = 4000000 ; Systemtakt in Hz
|
24 | .equ BAUD = 9600 ; Baudrate
|
25 |
|
26 | ; Berechnungen
|
27 | .equ UBRR_VAL = ((F_CPU+BAUD*8)/(BAUD*16)-1) ; clever runden
|
28 | .equ BAUD_REAL = (F_CPU/(16*(UBRR_VAL+1))) ; Reale Baudrate
|
29 | .equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000) ; Fehler in Promille
|
30 |
|
31 | .if ((BAUD_ERROR>10) || (BAUD_ERROR<-10)) ; max. +/-10 Promille Fehler
|
32 | .error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!"
|
33 | .endif
|
34 |
|
35 | .org 0x00
|
36 | rjmp main
|
37 |
|
38 | .org URXCaddr
|
39 | rjmp int_rxc
|
40 |
|
41 |
|
42 |
|
43 |
|
44 |
|
45 | main:
|
46 | ldi temp, LOW(RAMEND) ; Stackpointer initialisieren
|
47 | out SPL, temp
|
48 | ldi temp, HIGH(RAMEND)
|
49 | out SPH, temp
|
50 |
|
51 | ldi temp, 0xFF ; Port B auf Ausgang
|
52 | out DDRC, temp
|
53 |
|
54 | ldi ocr_1, 127-0
|
55 | ldi ocr_2, 127-0
|
56 | ldi ocr_3, 127-0
|
57 | ldi ocr_4, 127-0
|
58 | ldi ocr_5, 127-0
|
59 | ldi ocr_6, 127-0
|
60 |
|
61 | ldi temp, 1<<CS00 ; CS00 setzen: Teiler 1
|
62 | out TCCR0, temp
|
63 |
|
64 | ldi temp, 1<<TOIE0 ; TOIE0: Interrupt bei Timer Overflow
|
65 | out TIMSK, temp
|
66 |
|
67 |
|
68 |
|
69 | ; Port D = Ausgang
|
70 |
|
71 | ldi temp, 0xFF
|
72 | out DDRD, temp
|
73 |
|
74 |
|
75 | ; Baudrate einstellen
|
76 |
|
77 | ldi temp, HIGH(UBRR_VAL)
|
78 | out UBRRH, temp
|
79 | ldi temp, LOW(UBRR_VAL)
|
80 | out UBRRL, temp
|
81 |
|
82 | ; Frame-Format: 8 Bit
|
83 |
|
84 | ldi temp, (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)
|
85 | out UCSRC, temp
|
86 |
|
87 | sbi UCSRB, RXCIE ; Interrupt bei Empfang
|
88 | sbi UCSRB, RXEN ; RX (Empfang) aktivieren
|
89 |
|
90 | sei ; Interrupts global aktivieren
|
91 |
|
92 |
|
93 |
|
94 |
|
95 |
|
96 |
|
97 | loop: rjmp loop
|
98 |
|
99 |
|
100 |
|
101 | timer0_overflow: ; Timer 0 Overflow Handler
|
102 | inc PWMCount ; den PWM Zähler von 0 bis
|
103 | cpi PWMCount, 128 ; 127 zählen lassen
|
104 | brne WorkPWM
|
105 | clr PWMCount
|
106 |
|
107 | WorkPWM:
|
108 | ldi temp, 0b11000000 ; 0 .. Led an, 1 .. Led aus
|
109 |
|
110 | cp PWMCount, ocr_1 ; Ist der Grenzwert für Led 1 erreicht
|
111 | brlo OneOn
|
112 | ori temp, $20
|
113 |
|
114 | OneOn: cp PWMCount, ocr_2 ; Ist der Grenzwert für Led 2 erreicht
|
115 | brlo TwoOn
|
116 | ori temp, $10
|
117 |
|
118 | TwoOn: cp PWMCount, ocr_3 ; Ist der Grenzwert für Led 3 erreicht
|
119 | brlo ThreeOn
|
120 | ori temp, $08
|
121 |
|
122 | ThreeOn:cp PWMCount, ocr_4 ; Ist der Grenzwert für Led 4 erreicht
|
123 | brlo FourOn
|
124 | ori temp, $04
|
125 |
|
126 | FourOn: cp PWMCount, ocr_5 ; Ist der Grenzwert für Led 5 erreicht
|
127 | brlo FiveOn
|
128 | ori temp, $02
|
129 |
|
130 | FiveOn: cp PWMCount, ocr_6 ; Ist der Grenzwert für Led 6 erreicht
|
131 | brlo SetBits
|
132 | ori temp, $01
|
133 |
|
134 | SetBits: ; Die neue Bitbelegung am Port ausgeben
|
135 | out PORTC, temp
|
136 |
|
137 | reti
|
138 |
|
139 |
|
140 |
|
141 |
|
142 | int_rxc:
|
143 | push temp ; temp auf dem Stack sichern
|
144 | in temp, UDR ; empfangenes Byte lesen,
|
145 |
|
146 |
|
147 |
|
148 |
|
149 | ledwertI:
|
150 | cpi tempII, 1 ; if
|
151 | brne ledwertII ; if not
|
152 |
|
153 |
|
154 | ldi ocr_1, 127-UDR
|
155 |
|
156 |
|
157 | rjmp ende
|
158 |
|
159 | ledwertII:
|
160 |
|
161 | ledI:
|
162 | cpi temp, 1 ; if
|
163 | brne ledII ; if not
|
164 | ldi tempII, 1
|
165 |
|
166 | rjmp ende
|
167 |
|
168 | ledII:
|
169 |
|
170 |
|
171 | ende:
|
172 | pop temp ; temp wiederherstellen
|
173 | reti ; Interrupt beenden ; Interrupt beenden
|