Forum: Compiler & IDEs Timer 3 Signal löst reset aus


von Peter (Gast)


Lesenswert?

Hallo Leute! Ich habe folgendes Problem mit Timer Counter 3 in einem 
Atmel Mega 128:
Wenn ich einen Interrupt durch den Vergleich mit OCIE3A auslöse, dann 
wird dieser ausgeführt. Nach einiger Zeit (ca. 2 Sekunden) führt der 
Prozessor einen Reset aus.
Die selbe Routine mit Timer Counter 1 funktioniert jedoch fehlerfrei.

Füge ich bei der Fehlerhaften Variante mit Timer 3 die Signalroutine von 
Timer Counter 1 ein, dann funktioniert diese  - führt allerdings beide 
Signalroutinen aus.

Mittlerweile gehn mir die Ideen aus, an was dies liegen kann.

Hier die drei Codevarianten:

Zuerst der funktionierende mit Timer 1:
1
#include "timing.h"
2
extern unsigned int msek;
3
4
void INITTIMING()             
5
{
6
  TCCR1A = 0b00000000;
7
  TCCR1C = 0b00000000;
8
  TCCR1B = 0b00000100;
9
  OCR1A =  4316;              //100mSek bei11,05 MgHz
10
  TIMSK |= (1<<OCIE1A);
11
  TCNT1 = 0;
12
 }
13
14
15
SIGNAL(SIG_OUTPUT_COMPARE1A)      
16
{
17
  TX0('T');
18
  TCNT1 = 0;
19
  msek++;             
20
}
Ausgabe: TTTTTTTTTTTTTTT

Der selbe Code mit Timer 3 löst in regelmäßigen Abständen einen Reset 
aus
1
#include "timing.h"
2
extern unsigned int msek;
3
4
void INITTIMING()          
5
 {
6
  TCCR3A = 0b00000000;
7
  TCCR3C = 0b00000000;
8
  TCCR3B = 0b00000100;
9
  OCR3A =  4316;            
10
  ETIMSK |= (1<<OCIE3A);
11
  TCNT3 = 0;
12
 }
13
14
SIGNAL(SIG_OUTPUT_COMPARE3A)       
15
{
16
  TX0('T');
17
  TCNT3 = 0;
18
  msek++;           
19
}

Ausgabe diese Codes:

TTTTTTTTTTTTTTTTTT - dann ein Reset - TTTTTTTTTTTTTT - Reset, ...


Wenn ich den Code so abändere, das die "Signalsprungadresse von 
Compare1a vorhanden ist, dann springt das Programm bei einem Macht mit 
Timer 3 zuerst in diese, und danach in die gewünschte mit Timer 3

So sieht das programm dann aus:
1
#include "timing.h"
2
extern unsigned int msek;
3
4
5
void INITTIMING()          
6
 {
7
  TCCR3A = 0b00000000;
8
  TCCR3C = 0b00000000;
9
  TCCR3B = 0b00000100;
10
  OCR3A =  4316;              
11
  ETIMSK |= (1<<OCIE3A);
12
  TCNT3 = 0;
13
 }
14
15
16
17
  
18
19
SIGNAL(SIG_OUTPUT_COMPARE1A)      
20
 {
21
  TX0('T');
22
  TCNT1 = 0;
23
  msek++;               
24
 } 
25
26
27
SIGNAL(SIG_OUTPUT_COMPARE3A)    
28
 {
29
  TX0('O');
30
  TCNT3 = 0;
31
  msek++;               
32
 }

Die Ausgabe über die Serielle Schnittstelle ist dan TOTOTOTOTO.....
Hier tritt kein Reset auf

Im Buildfenster vom AVR Studio treten keine Fehler oder Warnungen auf.

Hier die Meldung:
Build started 21.6.2007 at 11:04:09
avr-gcc.exe  -mmcu=atmega128 -Wall -gdwarf-2   -Os -fsigned-char -MD -MP 
-MT timing.o -MF dep/timing.o.d  -c  ../timing.c
avr-objcopy -O ihex -R .eeprom  maniptctrl.elf maniptctrl.hex
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" 
--change-section-lma .eeprom=0 -O ihex maniptctrl.elf maniptctrl.eep

AVR Memory Usage
----------------
Device: atmega128

Program:   15140 bytes (11.6% Full)
(.text + .data + .bootloader)

Data:        443 bytes (10.8% Full)
(.data + .bss + .noinit)


Build succeeded with 0 Warnings...
Ich Verwende AVR - Studio 4.12 Service Pack4, Build 498

Vielen Dank schon mal für Eure Hilfe!
 LG
 Peter

von Peter (Gast)


Lesenswert?

Hallo nochmal!
Ich vergass timing.h anzugeben!
1
#include <avr/io.h>
2
#include <stdio.h>
3
#include <avr/interrupt.h>
4
5
6
7
//Prototypendeklarationen:
8
void INITTIMING();

LG
 Peter

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.