Forum: Mikrocontroller und Digitale Elektronik Quarz 8 MHZ Atmega8


von Hans B. (hans_b92)


Angehängte Dateien:

Lesenswert?

Moin Moin,

derzeit versuche ich einen Quarz mit 8 MHZ an meinem Atmega8 zum laufen 
bringen. Die Fuses habe ich über das AVR Studio und anhand der Infos aus 
dem Datenblatt auf CKOPT 1 und die SUT_CKSEL auf "Ext. Crystal/Resonator 
High Freq: Start-up time 16K CK + 64 ,s" gestellt. Quarz ist wie im 
Tutorial beschalten.

Nun wollte einfach nur eine LED blinken lassen (im 1 Sekeundentakt - 
siehe Code) und erhalte nun ein viel zu schnelles blinken. Setze ich 
einen 4 MHZ Quarz ein reduziert sich das Blinkinterval, aber stellt 
immernoch kein Sekundentakt dar.

Liegt bei mir ein Verständnisproblem vor oder gebe ich dem Atmega8 
nötige Informationen nicht?

Viele Grüße

von Thomas E. (thomase)


Lesenswert?

>#define F_CPU           8000000

Da gehört noch ein UL (unsigned long) hinter. Sonst denkt der Compiler 
das ist Integer.

#define F_CPU           8000000UL

mfg.

von Hans B. (hans_b92)


Lesenswert?

Besten Dank schonmal für den Hinweis. Leider führt dies zu keinem 
Unterschied beim Blinkverhalten. Den nun aktuellen Code mit deinem 
Hinweis hänge ich an.
1
#include <stdlib.h>
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4
#include <util/delay.h>
5
6
#define F_CPU           8000000UL              
7
8
#define LED_PORT        PORTD
9
#define LED 2
10
11
void toggle_led()
12
{
13
  LED_PORT ^= (1 << LED);
14
} 
15
16
void main(void)
17
{
18
19
  DDRD=0xff;
20
21
  PORTD=0x00;
22
23
  while(1)
24
  {
25
  
26
  toggle_led();
27
  _delay_ms(250);
28
  _delay_ms(250);
29
  _delay_ms(250);
30
  _delay_ms(250);
31
32
  }  
33
34
}

von Helfer (Gast)


Lesenswert?

Kannst du Messwerte beschaffen - Wie oft blinkt es in 10s oder 100s? 
Damit könnte man vielleicht Rückschlüsse auf die Ursache ziehen.

Bei dem Wechsel auf 4 MHz Quarz: Hast du den Quarz als Bauteil getauscht 
und im Programm F_CPU auf 4000000 geändert?

Welche Version der avr-libc benutzt du (s. Datei avr/version.h)?

Mit dem gezeigten Code kannst du nicht gut unterschieden, ob dein 
Programm läuft oder der AVR dauernd resettet. Das kann wie eine 
blinkende LED aussehen. Füge an einem freien Pin ein Dauersignal ein. 
Wenn das toggelt, hast du ein Resetproblem.

von holger (Gast)


Lesenswert?

>#include <util/delay.h>
>
>#define F_CPU           8000000UL

Falsch, so ist es richtig:

#define F_CPU           8000000UL
#include <util/delay.h>


Und Optimierung einschalten nicht vergessen.

von Hans B. (hans_b92)


Lesenswert?

Danke an Helfer und Holger, die Reihenfolge #define und include hat den 
Ausschlag gegeben. Besten Dank für die Unterstützung!

von Thomas E. (thomase)


Lesenswert?

Hans B. schrieb:
> void main(void)

int main(void)

Sollte der Compiler auch anmeckern. Hat zwar nichts mit deinem Fehler zu 
tun aber...

Den Takt kannst du auch einstellen unter
>>Project >>Configuration Options >>General >> Frequenzy

mfg.

von Tüll (Gast)


Lesenswert?

und du kannst auc _delay_ms(1000) schreiben

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.