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.