Forum: Mikrocontroller und Digitale Elektronik STK 500 Atmega8 + Quarz Timer 0


von Anfänger (Gast)


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

von Peter R. (pnu)


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.

von Karl H. (kbuchegg)


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.

von spess53 (Gast)


Lesenswert?

Hi

>Summa-summarum: Der Code ist soweit in Ordnung.

Dann sollte man mal prüfen, ob man das richtige File flasht.

MfG Spess

von amateur (Gast)


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.

von Dietrich L. (dietrichl)


Lesenswert?

Anfänger schrieb:
> und einen externen Quarz mit
> 8Mhz. Bei den Fuses im AVR Studio 5 habe ich auf "EXTLOFXTAL_1KCK_64MS"
> eingestellt.

8MHz ist für den ATmega8 aber schon der High Frequency Bereich, und Du 
hast Low Frequency (EXT_LOF_XTAL) eingestellt. Vielleicht läuft der 
Quarz-Oszillator nicht (richtig).

Gruß Dietrich

von Spess53 (Gast)


Lesenswert?

Hi

>Vielleicht läuft der Quarz-Oszillator nicht (richtig).

Ist auf dem STK500 kein Problem. Da hat der Quarz einen eigenen 
Oszillator auf dem Board.

MfG Spess

von Anfänger (Gast)


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

von Karl H. (kbuchegg)


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.

von alfredo (Gast)


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.

von Spess53 (Gast)


Lesenswert?

Hi

>Somit ist der Prozessor auf externen Oszillator zu konfigurieren.

Funktioniert auch, wenn auf externen Quarz gefust ist.

MfG Spess

von Anfänger (Gast)


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

von Spess53 (Gast)


Lesenswert?

Hi

>Danke trotzdem für eure Hilfe

Wieso 'trotzdem'? Den Tip, das zu überprüfen, hast du schon vor sieben 
Stunden bekommen.

MfG Spess

von Anfänger (Gast)


Lesenswert?

Tut mir leid das ichs nicht gleich gecheckt habe...
wusste nicht das es überhaupt zwei verschiedene hex files gibt.

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.