www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR wird resetet


Autor: Karsten Sosna (scottyrebel)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.