STK 500 Atmega8 + Quarz Timer 0

Gast #3224530
Lesenswert?

Hallo,
habe mir einige Threads im Forum über Timer etc. durchgelesen aber 
bekomm meinen Timer nicht so zum laufen wie ich will.

Ich arbeite mit dem STK500, einen Atmega8, und einen externen Quarz mit 
8Mhz. Bei den Fuses im AVR Studio 5 habe ich auf "EXTLOFXTAL_1KCK_64MS" 
eingestellt. Auf dem STK 500 sind die Jumper bei "XTAL1" gesteckt und 
bei "OSCSEL" auf 2 und 3.

Hier mein Programm:
1
#define F_CPU 8e6
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4

5
ISR (TIMER0_OVF_vect)
6
{  
7
  PORTB ^= (1 << PB0);    // PB0 togglen
8
}
9

10
int main()
11
{
12
  DDRB |= (1 << PB0);  // PB0 als Ausgang
13
  TIMSK |= (1 << TOIE0);  // Timerüberlauf -> Interrupt auslösen
14
  sei();        // Interrupt aktivieren
15
  TCCR0 |= (1 << CS02) | (1<<CS00);     // Teiler 1/1024 
16

17
  while (1);    // Endlosschleife
18

19
}

Ich habe bei mir auf dem STK 500 den kompletten PortB bei den LED´s 
angeschlossen. Wenn ich jetzt mein Programm laufen lasse blinken alle 
LED´s durcheinander obwohl ich nur PB0 als Ausgang geschalten habe.
Muss ich bei den Fuses bei der Taktquelle was anderes auswählen?
Wo ist mein Fehler?

Gruß Anfänger
#3225062
Lesenswert?

(eigentlich fühle ich mich in Assembler sicher, trotzdem ein paar 
Hinweise)

So wie ich das sehe, werden in der main Schleife Dinge ausgeführt, die 
zur Initialisierung gehören, z.B. portb Als Ausgang, TCCR0, SEI ständig 
gesetzt/rückgesetzt. Auch die Freigabe von Ints, OVL-int sollte in der 
Initialisierung stehen. Wenn die erst festgelegt sind, greift nur der 
Könner, der die zeitlichen Abläufe im Griff hat, in diese Freigaben ein.

All dieses Zeug gehört in eine Initialisierung, die nur einmal abläuft. 
Die (main-)Schleife sollte im Moment leer von irgendwelchen Aktionen 
bleiben.

Das FF für Timerüberlauf braucht nicht abgefragt zu werden: Im Fall 
eines Überlaufs wird dieses automatisch gesetzt und beim Ausführen des 
OVL-Int automatisch rückgesetzt.
#3225138
Lesenswert?

Peter R. schrieb:
>
> So wie ich das sehe, werden in der main Schleife Dinge ausgeführt, die
> zur Initialisierung gehören,

Ähm. nein.
Du siehst falsch.

> All dieses Zeug gehört in eine Initialisierung, die nur einmal abläuft.

hat er doch.

> Die (main-)Schleife sollte im Moment leer von irgendwelchen Aktionen
> bleiben.

Auch das ist der Fall. Das hier
1
  while (1);

IST seine main-Schleife.

>
> Das FF für Timerüberlauf braucht nicht abgefragt zu werden: Im Fall
> eines Überlaufs wird dieses automatisch gesetzt und beim Ausführen des
> OVL-Int automatisch rückgesetzt.

Wo siehst du das in seinem Code?


Summa-summarum: Der Code ist soweit in Ordnung.
Gast #3225154
Lesenswert?

@Anfänger

>Wenn ich jetzt mein Programm laufen lasse blinken alle
>LED´s durcheinander obwohl ich nur PB0 als Ausgang geschalten habe.

Da sollte der Fehler an anderer Stelle liegen. Geh' auf internen Takt, 
oder schau Dir die Jumper auf dem STK500 noch mal an, ob die Verbindung 
zum externen Oszillator steht.

Ansonsten: Siehe spess53.
Gast #3225593
Lesenswert?

Danke für eure Antworten.
Jetzt klappts...kann aber ned wirklich sagen warum :-)
Habs jetzt von meinem PC ausprobiert und nicht von meinem Laptop und 
jetzt funktionierts. Vll liegts ja an USB3.0 obwohl das ja 
abwährtskompatibel ist.

Wenn ich aber jetzt den Teiler von 1/1024 auf 1/8 ändere blinkt die Led 
in der gleichen Frequenz???
Ich habe nur CS01 gesetzt anstatt CS02 und CS00.

Und noch eine Frage. Muss dieses überhaupt im Programm stehen? Weil wenn 
ich es weglasse funktionierts genauso.
1
#define F_CPU 8e6

Gruß Anfänger
#3225599
Lesenswert?

Anfänger schrieb:

> Wenn ich aber jetzt den Teiler von 1/1024 auf 1/8 ändere blinkt die Led
> in der gleichen Frequenz???
> Ich habe nur CS01 gesetzt anstatt CS02 und CS00.

Das ist ein deutlicher Hinweis darauf, dass in deinem 
Programm-Erstellungs bzw. Brennprozess noch irgendwas nicht richtig 
funktioniert. Dein Programm landet anscheinend nicht zuverlässig auf dem 
µC.

> Und noch eine Frage. Muss dieses überhaupt im Programm stehen? Weil wenn
> ich es weglasse funktionierts genauso.
>
>
1
#define F_CPU 8e6

ein define ist nur eine Anweisung an den Präprozessor (ein Teil des 
Compilers) eine Textersetzung vorzunehmen. Mehr steckt da nicht 
dahinter.

Willst du dir zb basierend auf der Takfrequenz etwas ausrechnen, zb
1
#define F_CPU 8e6
2

3
....
4

5
    i = F_CPU / 8;
6
    j = F_CPU / 16;
so dass du nur eine Stelle hast, an der du bei einer veränderten 
Taktfrequenz den Zahlenwert verändern musst, dann brauchst du es. Denn 
der Präprozesser macht aus obigen ganz einfach
1
    i = 8e6 / 8;
2
    j = 8e6 / 16;

ehe er dann dieses Zwischenergebnis zum eigentlichen Compiler 
weiterreicht.

Daher: Basiert in deinem Programm irgendwas auf einem Makro namen F_CPU?
Nein?
Dann brauchst du es auch nicht.
Gast #3225604
Lesenswert?

HAllo

beim STK500 steckst Du nicht den Quarz direkt an den Prozessor. Vielmehr 
ist auf dem STK500 ein Quarzoszillator, der mit dem gesteckten Quarz 
arbeitet. Somit ist der Prozessor auf externen Oszillator zu 
konfigurieren.
Gast #3225639
Lesenswert?

So hab endlich meinen Fehler gefunden.

Hatte statt von diesem Pfad
    \Documents\Atmel Studio\Timer0\Timer0\Release\Timer0.hex
das Hexfile von diesem Pfad ausgewählt.
    \Documents\Atmel Studio\Timer0\Timer0\Debug\Timer0.hex

Danke trotzdem für eure Hilfe

Gruß Anfänger

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