Hallo,
ich habe gerade etwas merkwürdiges festgestellt. Ich betreibe eine
ATMega16 im PWM-Modus
LDI Temp0, 1<<WGM11 | 1<<COM1A0 | 1<<COM1A1 | 1<<COM1B0 |
1<<COM1B1
OUT TCCR1A, Temp0
LDI Temp0, 1<<WGM13 | 1<<WGM12 | 1<<CS10
OUT TCCR1B, Temp0
;Enable Timer1 interrupts
LDI Temp0, 1<<TOIE1 | 1<<OCIE1A| 1<<OCIE1B
OUT TIMSK, Temp0
Nun passiert es aber das der µC beim OverFlow Interrupt resetet wird und
ich nicht weiß warum. Hier die Interrupt-Routine:
TIMER1_Overflow:
SBRC MachineState, MachineStopped
RJMP TIMER1_Overflow_Exit
TIMER1_Overflow_Exit:
RETI
In der MainLoop wird nur auf ein Zeichen über den Usart empfangen, was
auch ohne diesen Interrupt funktioniert:
;Interruptvector-Table
.ORG 0x0000
RJMP Init ;Reset
.ORG OVF0addr
RJMP TIMER0_Overflow ;Timer0-Overflow-Interrupt
.ORG OC1Aaddr
RJMP TIMER1_CompA ;Interrupt Timer1 Compare Match A
.ORG OC1Baddr
RJMP TIMER1_CompB ;Interrupt Timer1 Compare Match B
.ORG OVF1addr
RJMP TIMER1_Overflow ;Interrupt Timer1 Overflow
.ORG URXCaddr
RJMP USART_RX ;USART Receive Complete
Init:
;Stack
LDI Temp0, HIGH(RAMEND)
OUT SPH, Temp0
LDI Temp0, LOW(RAMEND)
OUT SPL, Temp0
USART_Init:
;Set baud rate
LDI Temp0, 0x00
OUT UBRRH, Temp0
LDI Temp0, 0x07 ;Asynchron, 14.7456 MHz, 230400Baud
OUT UBRRL, Temp0
LDI Temp0, 0x00
LDI Temp0, 1<<U2X ;Set to asynchonius mode;
OUT UCSRA, Temp0
;Protocol: 8,N,1
LDI Temp0, 1<<URSEL | 1<<UCSZ1 | 1<<UCSZ0
OUT UCSRC, Temp0
;Enable receiver interrupt, receiver and transmitter
; LDI Temp0, 1<<RXCIE | 1<<RXEN | 1<<TXEN
LDI Temp0, 1<<RXEN | 1<<TXEN
OUT UCSRB, Temp0
Timer0_Init:
;No prescaling
; LDI Temp0, 1 << CS00
; OUT TCCR0, Temp0
;Enable Timer0 overflow interrupt
; LDI Temp0, 1 << TOIE0
; OUT TIMSK, Temp0
Timer1_Init:
LDI Temp0, 0x75
OUT OCR1AL, Temp0
LDI Temp0, 0x75
OUT OCR1BL, Temp0
LDI Temp0, 0xff
OUT ICR1H, Temp0
LDI Temp0, 0x75
OUT ICR1L, Temp0
;Mode 14, no prescaling
LDI Temp0, 1<<WGM11 | 1<<COM1A0 | 1<<COM1A1 | 1<<COM1B0 |
1<<COM1B1
OUT TCCR1A, Temp0
LDI Temp0, 1<<WGM13 | 1<<WGM12 | 1<<CS10
OUT TCCR1B, Temp0
;Enable Timer1 interrupts
LDI Temp0, 1<<TOIE1 | 1<<OCIE1A| 1<<OCIE1B
OUT TIMSK, Temp0
Initialize:
LDI ZH, HIGH(Bank0)
LDI ZL, LOW(Bank0)
LDI CommandState, 1 << CommandReceiving
LDI Temp0, 0xFF
OUT DDRC, Temp0
LDI Temp0,0x00
LDI MachineState, 1 << MachineStopped
SEI
;***********************************************************************
************************************************************************
********
MainLoop:
SBIC UCSRA, RXC
IN MachineState, UDR
OUT PORTC, MachineState
Mainloop_Exit:
RJMP MainLoop
;***********************************************************************
************************************************************************
********
Ich sehe auch das Byte empfangen wird, jedoch geht MachineState sofort
wieder auf MachineStopped, so gibt es die Initialisierungsroutine(Reset)
vor.
Danke für jede Hilfe
--
Gruß Karsten
Wenn ich dich richtig verstehe, dann hast du den funktionierenden Code vollständig gepostet, den nicht funktionierenden Code aber nur sehr bruchstückhaft. Insbesondere ohne die meisten Interrupt-Handler, und auch der verbleibende sieht etwas unvollständig aus.
Hi Woher weisst du, das der Controller beim Overflowinterrupt resettet? Du hast auch noch die Compareinterrupts freigegeben. Und da sehe ich keine ISRs. Außerdem vermisse ich die Initialisierung von ICR1,OCR1A und OCR1B. MfG Spess
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.