Code:
.nolist
.include "m16def.inc"
.list
.def sregsave = r4 ; SREG Backup
.def ch_1 = r5 ; PWM Werte der LED's
.def ch_2 = r6
.def ch_3 = r7
.def ch_4 = r8
.def temp = r16 ; temporäre Daten
.def pwm_cnt = r17
.CSEG
.ORG 0
jmp isr_reset ; Reset Interupt Handler
jmp isr_not_used ; INT 0 Interupt Handler
jmp isr_not_used ; INT 1 Interupt Handler
jmp isr_not_used ; Timer 2 Compare Interupt Handler
jmp isr_not_used ; Timer 2 Overflow Interupt Handler
jmp isr_not_used ; Timer 1 Capture Interupt Handler
jmp isr_not_used ; Timer 1 Compare A Interupt Handler
jmp isr_not_used ; Timer 1 Compare B Interupt Handler
jmp isr_not_used ; Timer 1 Overflow Interupt Handler
jmp isr_not_used ; Timer 0 Overflow Interupt Handler
jmp isr_not_used ; SPI Transfer Complete Interupt Handler
jmp isr_not_used ; USART RX Complete Interupt Handler
jmp isr_not_used ; USART UDR empty Interupt Handler
jmp isr_not_used ; USART TX Complete Interupt Handler
jmp isr_not_used ; ADC Conversion Complete Interupt Handler
jmp isr_not_used ; EEPROM Ready Interupt Handler
jmp isr_not_used ; Analog Comperator Interupt Handler
jmp isr_not_used ; TWI Interupt Handler
jmp isr_not_used ; INT 2 Interupt Handler
jmp isr_t0_cp ; Timer 0 Compare Interupt Handler
jmp isr_not_used ; Store Program Memory Ready Interupt Handler
isr_reset:
ldi temp, high(RAMEND) ; STACK initialisieren
out SPH, temp
ldi temp, low(RAMEND)
out SPL, temp
in temp, MCUCSR ; Disable JTAG Interface
ori temp, (1<<JTD)
out MCUCSR, temp
out MCUCSR, temp
clr temp ; Ports konfigurieren:
ldi temp, (1<<DDA0) ; PIN A0, B0, C0, D0 -> Ausgang +H
; Rest: Eingang + Pullup
out DDRA, temp
out DDRB, temp
out DDRC, temp
out DDRD, temp
ldi temp, 0xFF
out PORTA, temp
out PORTB, temp
out PORTC, temp
out PORTD, temp
ldi temp, (1<<WGM01) | (1<<CS00) ; Timer 0 konfigurieren
out TCCR0, temp
ldi temp, 0x80
out OCR0, temp
ldi temp, (1<<OCIE0) ; Timerinterupts aktivieren
out TIMSK, temp
ldi temp, 0x80 ; Defaultwerte setzen
mov ch_1, temp
mov ch_2, temp
mov ch_3, temp
mov ch_4, temp
clr temp
sei ; Interupts Global aktivieren
main_loop:
; Irgendwelcher sonstiger Code
; Irgendwelcher sonstiger Code
; Irgendwelcher sonstiger Code
jmp main_loop
isr_not_used: ; Blanko für nicht genutzte Interupt Handler
reti
isr_t0_cp: ; Timer 0 Compare Interupt Handler
in sregsave, SREG ; Statusregister sichern
inc pwm_cnt ; Hilfszähler für die PWM um eins erhöhen
cp ch_1, pwm_cnt ; Vergleiche gewünschtes Tastverhältniss mit aktuellem PWM Hilfszählerstand
brlo PC+4
breq PC+3
sbi PORTA, 0
rjmp PC+2
cbi PORTA, 0
cp ch_2, pwm_cnt
brlo PC+4
breq PC+3
sbi PORTB, 0
rjmp PC+2
cbi PORTB, 0
cp ch_3, pwm_cnt
brlo PC+4
breq PC+3
sbi PORTC, 0
rjmp PC+2
cbi PORTC, 0
cp ch_4, pwm_cnt
brlo PC+4
breq PC+3
sbi PORTD, 0
rjmp PC+2
cbi PORTD, 0
out SREG, sregsave ; Statusregister wiederherstellen
reti
Eine Anmerkung zu diesem Code:
Lesezeichen