Forum: Mikrocontroller und Digitale Elektronik Dimmer über Seriell


von Stefan H. (stefanha)


Lesenswert?

Ich möchte gerne über den Seriellen anschluss mehrere LEDs an einem 
Atmega 8 dimmen.Ich habe da schon mal etwas zusammen gesucht. Dieses 
Programm geht aber nur halb. ICh kann die LEDs zwar dimemn aber nur wenn 
ich die Bytes im Programm festlege. Wenn ich über Seriell einen Byte 
schicke, dann geht die LED nur an. Und zwar gebe ich zu erst eien byte 
raus womit ich festlege welche led und dann nach einen zweiten um die 
Helligkeit festzulegen.
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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.