AVR wird resetet

OP #1936397
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
Gast #1936418
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.