ATmega2560 resests after configuring timer

Gast #3530709
Lesenswert?

Hallo zusammen,

ich versuche gerade einen Timer im CTC-Modus auf meinem ATmega2560 
(Arduino Mega 2560) ans Laufen zu kriegen. Allerdings startet der 
Control jedes Mal neu, wenn die Interrupts aktiviert wurden. Auf meinem 
ATmega644 hat der Code problemlos funktioniert und ich kann keine 
Unterschiede in den Datenblättern finden, was die Timerkonfiguration 
betrifft...
Hier ist mein Code:
1
#define F_CPU 16000000
2

3
#include <avr/interrupt.h>
4
#include <avr/io.h>
5
#include <util/delay.h>
6

7
int main(void)
8
{
9
  // initialize timer
10
  TCCR0A = (1<<WGM02);           // enable CTC mode
11
  TCCR0B = (1<<CS00)|(1<<CS02);  // set prescaler to 1024
12
  OCR0A = 255;
13
  TIMSK0 |= (1<<OCIE0A);         // enable timer interrupt
14
  sei();
15
  
16
  while(1) ;
17
}
18

19
ISR(TIMER0_COMPA_vect) {
20

21
}
Hat jemand eine Idee was falsch sein könnte?
#3530729
Lesenswert?

Irgendwelche Warnung zum Thema 'TIMER0_COMPA_vect'

Irgendwas in der Richtung .... does not appear to be correct vector name 
....?


Wenn der µC resettet, dann ist das ein Hinweis darauf, dass ein 
Interrupt freigegeben wurde (und auch auslöst), für den es keine ISR 
gibt. Das kann sein, weil es wirklich keine ISR dafür gibt, das kann 
aber auch sein, weil der Name falsch geschrieben ist. Leider sind die 
Namen bei unterschiedlichen Prozessoren da nicht ganz einheitlich, so 
dass man derartige Warnungen ernst nehmen muss.
Gast #3530765
Lesenswert?

Ich hab die ISR im Post nur zur besseren Übersicht leer gelassen, aber 
ich denke auch nicht dass das ein Problem ist. Ich könnte auch etwas wie 
PORTC = 0xFF rein schreiben, ändert aber nichts.
Könnte das Problem etwas mit dem Arduino zu tun haben?
Gast #3530810
Lesenswert?

Der Code ist korrekt, läuft ja im Simu einwandfrei.
Setz mal was in die ISR, Portpin loggeln oder LED an/aus, damit du 
siehst ober überhaupt was läuft. Mit Multimeter oder Oszi Pin checken.

Woher weißt du, dass der uc resettet? Woher weisst du, ob er überhaupt 
läuft?
Gast #3530873
Lesenswert?

Okay, hier nochmal der vollständige Code, ist in der Tat verständlicher:
1
#define F_CPU 16000000
2

3
#include <avr/interrupt.h>
4
#include <avr/io.h>
5
#include <util/delay.h>
6

7
int main(void)
8
{
9
  counter = 0;
10
  DDRC = 0xFF;
11
  
12
  PORTC = 0xFF;
13
  _delay_ms(500);
14
  PORTC = 0;
15
  _delay_ms(500);
16
  
17
  // initialize timer
18
  TCCR0A = (1<<WGM01);      // enable CTC mode
19
  TCCR0B = (1<<CS00)|(1<<CS02);  // set prescaler
20
  OCR0A = 255;
21
  TIMSK0 |= (1<<OCIE0A);      // enable timer interrupt
22
  sei();
23
  
24
    while(1) ;
25
}
26

27
ISR(TIMER0_COMPA_vect) {
28
  PORTC = 0xFF;
29
}
Wenn der Code korrekt ausgeführt wird, sollte eine Diode an PortC nur 
einmal am Anfang blinken und danach an bleiben. In der Praxis blinkt sie 
aber die Ganze Zeit (aber nur wenn ich die Interrupts aktiviere), woraus 
ich schließe dass der Controller resettet und die main() erneut 
ausführt.
#3530899
Lesenswert?

Womit compilierst du?
Bist du sicher, dass da ein Mega2560 bei mcu eingestellt ist?

In der Ausgabe (wie auch immer die bei dir aussieht), müsste eine 
Command Line aufscheinen, die ungefähr wie folgt aussieht:
1
avr-gcc.exe  -mmcu=atmega2560 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT ctc.o -MF dep/ctc.o.d  -c  ../ctc.c

wichtig ist das -mmcu

(das ist zb die Command Line, mit der AVR-Studio 4 dein Programm 
übersetzt)
Gast #3530955
Lesenswert?

Sorry, hab die Zeile vergessen zu löschen.
Ich kompiliere mit avr-gcc in AtmelStudio 6, als uc ist der ATmega2560 
ausgewählt und in der Ausgabe wird Folgendes angezeigt:

-mmcu=atmega2560

"C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 
GCC\Native\3.4.2.1002\avr8-gnu-toolchain\bin\avr-gcc.exe" 
-funsigned-char -funsigned-bitfields -DDEBUG  -O1 -ffunction-sections 
-fdata-sections -fpack-struct -fshort-enums -mrelax -g2 -Wall 
-mmcu=atmega2560 -c -std=gnu99 -MD -MP -MF "Test.d" -MT"Test.d" 
-MT"Test.o"   -o "Test.o" ".././Test.c"

Der ausgewählte uc sollte also der richtige sein. Ich habe den Code auch 
gerade nochmal auf meinem ATmega644 getestet (nach Anpassen des uc 
natürlich), da funktioniert alles...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren