Forum: Mikrocontroller und Digitale Elektronik AVR wird resetet


von Karsten S. (scottyrebel)


Lesenswert?

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

von (prx) A. K. (prx)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.