Also deinen Code habe ich fast zur gänze verstanden, ich weiß nur nicht wofür ich solche Sachen wie JTAG oder .CSEG brauche. Ich habe meinen Code jetzt so verändert das man mithilfe zweier Taster die LED heller oder dünkler machen kann, zumindest mit dem Simmulator funktionierts schon mal. Das STK 500 bekomm ich hald erst in ein paar tagen.
Hier mal mein Code, wenn der funktioniert, dann is das ein richtig einfach verständlicher Code zum erlernen von PWM ^^
Code:
.include "m16def.inc"
.def temp = r16
.def PWMstatus = r17
.def Helligkeit = r18
.org 0x000
jmp main ; Reset Interupt Handler
jmp EXT_INT0 ; INT 0 Interupt Handler
jmp EXT_INT1 ; INT 1 Interupt Handler
jmp Kein_Interrupt ;TIM2_COMP ; Timer 2 Compare Interupt Handler
jmp Kein_Interrupt ;TIM2_OVF ; Timer 2 Overflow Interupt Handler
jmp Kein_Interrupt ;TIM1_CAPT ; Timer 1 Capture Interupt Handler
jmp Kein_Interrupt ;TIM1_COMPA ; Timer 1 Compare A Interupt Handler
jmp Kein_Interrupt ;TIM1_COMPB ; Timer 1 Compare B Interupt Handler
jmp Kein_Interrupt ;TIM1_OVF ; Timer 1 Overflow Interupt Handler
jmp Kein_Interrupt ;TIM0_OVF ; Timer 0 Overflow Interupt Handler
jmp Kein_Interrupt ;SPI_STC ; SPI Transfer Complete Interupt Handler
jmp Kein_Interrupt ;USART_RXC ; USART RX Complete Interupt Handler
jmp Kein_Interrupt ;USART_DRE ; USART UDR empty Interupt Handler
jmp Kein_Interrupt ;USART_TXC ; USART TX Complete Interupt Handler
jmp Kein_Interrupt ;ADC ; ADC Conversion Complete Interupt Handler
jmp Kein_Interrupt ;EE_RDY ; EEPROM Ready Interupt Handler
jmp Kein_Interrupt ;ANA_COMP ; Analog Comperator Interupt Handler
jmp Kein_Interrupt ;TWSI ; TWI Interupt Handler
jmp Kein_Interrupt ;EXT_INT2 ; INT 2 Interupt Handler
jmp TIM0_COMP ; Timer 0 Compare Interupt Handler
jmp Kein_Interrupt ;SPM_RDY ; Store Program Memory Ready Interupt Handler
main:
;Stackpointer
ldi temp, LOW(RAMEND)
out SPL, temp
ldi temp, HIGH(RAMEND)
out SPH, temp
;Aus/Eingänge
ldi temp, 0xFF
out DDRB, temp ; Ausgang
;PWM
ldi temp, (1<<WGM00) | (1<<CS00) ; Einstellungen siehe Seite 81-83
out TCCR0, temp
ldi Helligkeit, 0b00000000
out OCR0, Helligkeit ; Stellt die Einschaltzeit ein (Alles gesetzte --> immer ein, alles aus --> immer aus)
ldi temp, (1<<OCIE0)
out TIMSK, temp
;External Interrupt
ldi temp, 0b00001111
out MCUCR, temp ; Steigende Flanke löst Ext. Int. 0 und 1 aus
ldi temp, 0b11000000
out GICR, temp ; Ext. Int 0 und 1 aktivieren
;Interrupts freigeben
sei ; Interrupts allgemein aktivieren
Ende:
jmp ende
Kein_Interrupt:
reti
TIM0_COMP:
inc PWMstatus
ldi temp, 0b00000001
andi PWMstatus, 0b00000001
cp PWMstatus, temp
breq PC+3
cbi PortB, 0
reti
sbi PortB, 0
reti
EXT_INT0:
ldi temp, 0b11111111
cp Helligkeit, temp
breq PC+4
ldi temp, 0b00001111
add Helligkeit, temp
out OCR0, Helligkeit
reti
EXT_INT1:
ldi temp, 0b00000000
cp Helligkeit, temp
breq PC+4
ldi temp, 0b00001111
sub Helligkeit, temp
out OCR0, Helligkeit
reti
Ich habe jetzt noch vor den Ausgangsport auch per Taster verändern zu können, das Problem ist nur, jetzt habe ich nur noch einen EXT_int.
Sehr hilfreich war der Hinweis das meine Interruptvektortabelle nicht korrekt ist, die hab ich einfach aus dem tuturial von mikrocontroller.net abgeschrieben ^^, wusste nicht das das beim mega16 anders ist.
Für Verbesserungsvorschläge bin ich natürlich immer offen.
Grüße,
Gerko
Lesezeichen