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