H3llGhost
23.08.2008, 15:25
Hallo Leute,
ich habe mal eine Frage:
Ich habe eine LED, die an einem ATmega168 mit einem Vorwiderstand angeschlossen ist und möchte diese von 100 % Leistung runterdimmen.
Dazu habe ich hier schon die Suchfunktion benutzt aber nicht wirklich was gefunden.
Dann habe ich bei mikrocontroller.net gesucht und einen Artikel für Assembler gefunden, aber der ist für den ATmega8 geschrieben:
.include "m8def.inc"
.def temp = r16
.def PWMCount = r17
.def ocr_1 = r18 ; Helligkeitswert Led1: 0 .. 127
.def ocr_2 = r19 ; Helligkeitswert Led2: 0 .. 127
.def ocr_3 = r20 ; Helligkeitswert Led3: 0 .. 127
.def ocr_4 = r21 ; Helligkeitswert Led4: 0 .. 127
.def ocr_5 = r22 ; Helligkeitswert Led5: 0 .. 127
.def ocr_6 = r23 ; Helligkeitswert Led6: 0 .. 127
.org 0x0000
rjmp main ; Reset Handler
.org OVF0addr
rjmp timer0_overflow ; Timer Overflow Handler
main:
ldi temp, LOW(RAMEND) ; Stackpointer initialisieren
out SPL, temp
ldi temp, HIGH(RAMEND)
out SPH, temp
ldi temp, 0xFF ; Port B auf Ausgang
out DDRB, temp
ldi ocr_1, 0
ldi ocr_2, 1
ldi ocr_3, 10
ldi ocr_4, 20
ldi ocr_5, 80
ldi ocr_6, 127
ldi temp, 0b00000001 ; CS00 setzen: Teiler 1
out TCCR0, temp
ldi temp, 0b00000001 ; TOIE0: Interrupt bei Timer Overflow
out TIMSK, temp
sei
loop: rjmp loop
timer0_overflow: ; Timer 0 Overflow Handler
inc PWMCount ; den PWM Zähler von 0 bis
cpi PWMCount, 128 ; 127 zählen lassen
brne WorkPWM
clr PWMCount
WorkPWM:
ldi temp, 0b11000000 ; 0 .. Led an, 1 .. Led aus
cp PWMCount, ocr_1 ; Ist der Grenzwert für Led 1 erreicht
brlt OneOn
ori temp, $01
OneOn: cp PWMCount, ocr_2 ; Ist der Grenzwert für Led 2 erreicht
brlt TwoOn
ori temp, $02
TwoOn: cp PWMCount, ocr_3 ; Ist der Grenzwert für Led 3 erreicht
brlt ThreeOn
ori temp, $04
ThreeOn:cp PWMCount, ocr_4 ; Ist der Grenzwert für Led 4 erreicht
brlt FourOn
ori temp, $08
FourOn: cp PWMCount, ocr_5 ; Ist der Grenzwert für Led 5 erreicht
brlt FiveOn
ori temp, $10
FiveOn: cp PWMCount, ocr_6 ; Ist der Grenzwert für Led 6 erreicht
brlt SetBits
ori temp, $20
SetBits: ; Die neue Bitbelegung am Port ausgeben
out PORTB, temp
reti
(Quelle: http://www.mikrocontroller.net/articles/AVR-Tutorial:_PWM)
Da ich aber mit C arbeiten möchte hilft mir der Code nicht wahrlich weiter.
Ich würde mich freuen, wenn ihr mir Tipps geben könntet, die mir bei der Umsetzung helfen würden.
Danke im Voraus!
ich habe mal eine Frage:
Ich habe eine LED, die an einem ATmega168 mit einem Vorwiderstand angeschlossen ist und möchte diese von 100 % Leistung runterdimmen.
Dazu habe ich hier schon die Suchfunktion benutzt aber nicht wirklich was gefunden.
Dann habe ich bei mikrocontroller.net gesucht und einen Artikel für Assembler gefunden, aber der ist für den ATmega8 geschrieben:
.include "m8def.inc"
.def temp = r16
.def PWMCount = r17
.def ocr_1 = r18 ; Helligkeitswert Led1: 0 .. 127
.def ocr_2 = r19 ; Helligkeitswert Led2: 0 .. 127
.def ocr_3 = r20 ; Helligkeitswert Led3: 0 .. 127
.def ocr_4 = r21 ; Helligkeitswert Led4: 0 .. 127
.def ocr_5 = r22 ; Helligkeitswert Led5: 0 .. 127
.def ocr_6 = r23 ; Helligkeitswert Led6: 0 .. 127
.org 0x0000
rjmp main ; Reset Handler
.org OVF0addr
rjmp timer0_overflow ; Timer Overflow Handler
main:
ldi temp, LOW(RAMEND) ; Stackpointer initialisieren
out SPL, temp
ldi temp, HIGH(RAMEND)
out SPH, temp
ldi temp, 0xFF ; Port B auf Ausgang
out DDRB, temp
ldi ocr_1, 0
ldi ocr_2, 1
ldi ocr_3, 10
ldi ocr_4, 20
ldi ocr_5, 80
ldi ocr_6, 127
ldi temp, 0b00000001 ; CS00 setzen: Teiler 1
out TCCR0, temp
ldi temp, 0b00000001 ; TOIE0: Interrupt bei Timer Overflow
out TIMSK, temp
sei
loop: rjmp loop
timer0_overflow: ; Timer 0 Overflow Handler
inc PWMCount ; den PWM Zähler von 0 bis
cpi PWMCount, 128 ; 127 zählen lassen
brne WorkPWM
clr PWMCount
WorkPWM:
ldi temp, 0b11000000 ; 0 .. Led an, 1 .. Led aus
cp PWMCount, ocr_1 ; Ist der Grenzwert für Led 1 erreicht
brlt OneOn
ori temp, $01
OneOn: cp PWMCount, ocr_2 ; Ist der Grenzwert für Led 2 erreicht
brlt TwoOn
ori temp, $02
TwoOn: cp PWMCount, ocr_3 ; Ist der Grenzwert für Led 3 erreicht
brlt ThreeOn
ori temp, $04
ThreeOn:cp PWMCount, ocr_4 ; Ist der Grenzwert für Led 4 erreicht
brlt FourOn
ori temp, $08
FourOn: cp PWMCount, ocr_5 ; Ist der Grenzwert für Led 5 erreicht
brlt FiveOn
ori temp, $10
FiveOn: cp PWMCount, ocr_6 ; Ist der Grenzwert für Led 6 erreicht
brlt SetBits
ori temp, $20
SetBits: ; Die neue Bitbelegung am Port ausgeben
out PORTB, temp
reti
(Quelle: http://www.mikrocontroller.net/articles/AVR-Tutorial:_PWM)
Da ich aber mit C arbeiten möchte hilft mir der Code nicht wahrlich weiter.
Ich würde mich freuen, wenn ihr mir Tipps geben könntet, die mir bei der Umsetzung helfen würden.
Danke im Voraus!