Forum: Mikrocontroller und Digitale Elektronik Timer Overflow Interrupt AT90CAN128


von Christoph A. (paul87)


Lesenswert?

Hallo Leute,

ich habe folgendes Problem. Ich möchte in einer ISR eine Variable 
hochzählen. Und zwar ca. jede Sekunde einen Zähler hoch. Dazu habe ich 
folgenden Code:
1
#include <avr/interrupt.h>
2
3
int timer_ovl_cnt = 0;
4
5
void timer_init()
6
{
7
8
  TCCR3A  = 0;
9
  TCCR3B = (1 << CS32);
10
  TIMSK3 = (1 << TOIE3);
11
12
  sei();
13
  
14
}
15
16
int main (void)
17
{
18
19
  ctd_timer_init();
20
21
  while (1)
22
  {
23
    DisplayDecimal16(5, 30, timer_ovl_cnt);
24
  }
25
26
}
27
28
29
ISR(TIMER3_OVF_vect)
30
{
31
  timer_ovl_cnt++;
32
}

Die Ausgabe funktioniert auch. Allerdings nicht jede Sekunde einen 
Schritt weiter, sondern genau alle 16s. Meine F_CPU ist 16MHZ.

Das kuriose ist, dass es genau so schon funktioniert hat in einem 
anderen Programm, welches ich mit dem AVR Studio 4 geschrieben hatte. 
Jetzt benutze ich das Atmel Studio 6.

Also die ISR etc scheint ja auch zu funktionieren, sonst würde die 
Variable ja nicht hochzählen. Es ist halt irgendwo der Faktor 16 drin. 
Aber ich weiß nicht wo. Das Programm macht zu Testzwecken im Moment nur 
die eine Ausgabe. Also keine anderen Funktionen etc.

Wisst ihr vielleicht woran das liegen könnte?


Vielen Dank und viele Grüße,
Paul

von Joe S. (bubblejoe)


Lesenswert?

Fuses nicht auf externen 16Mhz Takt umgestellt, das passt nämlich genau 
mit Faktor 16.
Der µC läuft ausgeliefert mit 8Mhz / 8 = 1Mhz. Siehe Datenblatt S.38

von Christoph A. (paul87)


Angehängte Dateien:

Lesenswert?

Hallo Joe,

vielen vielen Dank für die tolle Hilfe. Ich bin immer wieder erstaunt, 
wie schnell einem hier geholfen wird und wie viel Wissen hier durch euch 
vereint ist. Daumen hoch.

Also, das Problem ist identifiziert. Jetzt habe ich nachgeschaut bei den 
FUSES. Ich habe diese noch nie geändert oder musste daran jemals etwas 
einstellen. Es gibt da zum einen das Häkchen bei CKDIV8 und dann 
SUT_CKSEL. Bei letzteren gibt es eine Liste wo ich den externen Quarz 
auswählen kann. Aber woher weiß ich, welchen ich da wählen muss. Ich 
habe ein externen 16MHZ Standardquarz dazu bekommen.

Danke noch einmal!

von Joe S. (bubblejoe)


Lesenswert?

http://www.engbedded.com/fusecalc

Da kann man seine Fuse-Einstellungen schön nachschauen.

CKDIV8 darf nicht gesetzt sein, sonst wird der Takt durch 8 geteilt.
Als Taktquelle gibst du External Crystal Oscillator an (entsprechend 
deiner Frequenz, Startup Time ist normalerweise nicht so kritisch).

von Christoph A. (paul87)


Lesenswert?

Hey Joe,

danke. Ich habe jetzt einfach bei CKDIV8 das Häkchen entfernt und einen 
externen 16MHZ Oscillator ausgewählt. Es funktionert. :) Aber mehr 
musste ich nicht ändern oder? Also damit weiterhin auch alles andere 
funktioniert.

Viele Grüße,
Paul

von Karl H. (kbuchegg)


Lesenswert?

> Ich habe ein externen 16MHZ Standardquarz dazu bekommen.

Der fällt definitiv schon unter 'High Frequency'

von Christoph A. (paul87)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Der fällt definitiv schon unter 'High Frequency'

Und das bedeutet? Muss ich da jetzt etwas spezielles einstellen?

von Karl H. (kbuchegg)


Lesenswert?

Christoph A. schrieb:
> Karl Heinz Buchegger schrieb:
>> Der fällt definitiv schon unter 'High Frequency'
>
> Und das bedeutet? Muss ich da jetzt etwas spezielles einstellen?

High Frequency :-)


Es gibt 3 Einstellungen
   Low Frequency
   Middle Frequency
   High Frequency


Hast du dir den bereits verlinkten Fuse Calculator nicht angesehen?

von Christoph A. (paul87)


Lesenswert?

Hallo,

Karl Heinz Buchegger schrieb:
> High Frequency :-)
>
>
> Es gibt 3 Einstellungen
>    Low Frequency
>    Middle Frequency
>    High Frequency
>
>
> Hast du dir den bereits verlinkten Fuse Calculator nicht angesehen?
>
>
>
>     Beitrag melden Bearbeiten Löschen  Markierten Text zitieren Antwort Antwort 
mit Zitat

Ja habe ich mir angesehen. Also das es ein 16MHZ Quarz ist, weiß ich ja. 
Von daher muss ich einen 16MHZ Quarz auswählen. Die Frage war nur, ob 
ich noch etwas anderes ändern muss und welche Startup Time?

von Karl H. (kbuchegg)


Lesenswert?

Christoph A. schrieb:

> Ja habe ich mir angesehen. Also das es ein 16MHZ Quarz ist, weiß ich ja.
> Von daher muss ich einen 16MHZ Quarz auswählen. Die Frage war nur, ob
> ich noch etwas anderes ändern muss und welche Startup Time?

Ne, passt schon.

Startup Time kannst du dir aussuchen.
Das ist einfach nur ein Zeitversatz, nachdem der µC dann eigentlich zu 
arbeiten anfängt. Sinn der Sache: damit sich die Spannungen und die 
Taktfrequenz nach dem Einschalten erst mal stabilisieren können.

d.h. die kann am erst mal auf die längste Zeit einstellen, dann kann auf 
jeden Fall nichts mehr schief gehen. Wenn mans sowieso nicht braucht, 
kann man natürlich auch entsprechend kleinere Werte nehmen.

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.