Forum: Mikrocontroller und Digitale Elektronik Atmega32 Clock


von Joe S. (bubblejoe)


Lesenswert?

Hi Leute,

ich komme  nicht weiter.
Hab/ will meinen Atmega32 auf den 8Mhz Quarz umstellen.

Fuses
Low    0xFD
High   0xC9

Ich kann die Fuses eh umstellen wie ich will, er läuft anscheinend immer 
mit dem gleichen Takt.
Mit dem Oazi mess ich ca. 7,6 Mhz am Quarz, das dürfte also passen denke 
ich. C am Quarz sind 22pF nach Datenblatt.

Teste mit diesem Programm (LED toggeln)
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
ISR(TIMER1_COMPA_vect)
5
{
6
  PORTD ^= 0xff;
7
}
8
9
int main(void)
10
{
11
  DDRD = 0xff;
12
  PORTD = 0xff;
13
  
14
  TCCR1A = (1<<WGM12);
15
  TCCR1B = (1<<CS12) | (1<<CS10);  
16
  TIMSK = (1<<OCIE1A);
17
  OCR1A = 7812;
18
  
19
  sei();
20
  
21
    while(1)
22
    {
23
        //TODO:: Please write your application code 
24
    }
25
}

Nach meinen Berechnungen müsste er dann mit 8Mhz/(1024*7812) = ca. 1Hz 
toggeln.
Wenn ich messe sind es ca. 8s, also 1/8 Hz, was mich auf den internen 
Clock von 1Mhz schließen lässt.
Allerdings ist das komische, ich kann OCR1A ändern, aber die 
Toggelfrequenz bleibt gleich.

Steh ich jetzt also mit dem Programm auch noch auf dem Kopf?
Vielen Dank für eure Hilfe.

Grüße Joe

von amateur (Gast)


Lesenswert?

Kann es sein, dass Du die "div8-Sicherung" nicht rausgeschaubt hast?
Ich benutze die normale Entwicklungsumgebung und kann deine Fuses nicht 
"umrechnen".

von Joe S. (bubblejoe)


Lesenswert?

amateur schrieb:
> Kann es sein, dass Du die "div8-Sicherung" nicht rausgeschaubt hast?
> Ich benutze die normale Entwicklungsumgebung und kann deine Fuses nicht
> "umrechnen".

Wo "schraub" ich die denn raus, bzw wie?
Ich schreibe die Fuses mit dem STK600 und AVR Studio 6.

von Karl H. (kbuchegg)


Lesenswert?

amateur schrieb:
> Kann es sein, dass Du die "div8-Sicherung" nicht rausgeschaubt hast?
> Ich benutze die normale Entwicklungsumgebung und kann deine Fuses nicht
> "umrechnen".


Mega32 hat keine.
(War mir zwar ziemlich sicher, hab aber trotzdem nochmal nachgeschaut)


M.E. ist das Programm korrekt.
Sicher, dass es auch in den M32 gebrannt wird? Irgendwelche Warnungen 
beim Compilieren?

von Joe S. (bubblejoe)


Lesenswert?

Karl Heinz Buchegger schrieb:
> M.E. ist das Programm korrekt.
> Sicher, dass es auch in den M32 gebrannt wird? Irgendwelche Warnungen
> beim Compilieren?

Keine Warnungen beim Compilieren und der Atmega wird sicher beschrieben.

von Karl H. (kbuchegg)


Lesenswert?

Brenn mal das da rein
1
#define F_CPU 8000000
2
 
3
#include <avr/io.h>
4
#include <util/delay.h>
5
 
6
// Hier die tatsächlich verwendeten Parameter angeben
7
 
8
#define LED_PORT    PORTD
9
#define LED_DDR     DDRD
10
#define LED_PIN     PD0
11
 
12
int main()
13
{
14
   LED_DDR |= 1 << LED_PIN;
15
 
16
   while (1)
17
   {
18
      LED_PORT ^= 1 << LED_PIN;
19
      _delay_ms(1000);
20
   }
21
 
22
   return 0;
23
}

(damit sind mal alle Fehler, die durch falsche Timereinstellung oder 
falscher ISR-Name entstehen können vom Tisch.)

Led muss 1 Sekunde ein, 1 Sekunde aus. Dann läuft der µC mit 8Mhz. Wenns 
wieder nur 8 Sekunden sind, dann läuft der definitiv auf 1Mhz
(Kannst du auch verifizieren. Schreib bei F_CPU 1000000 rein, und du 
musst wieder die 1 Sekunde haben)

Optimierung auf -Os nicht vergessen!

von Karl H. (kbuchegg)


Lesenswert?

Ach, eines noch.


Der Watchdog ist ausgeschaltet?

von Joe S. (bubblejoe)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Brenn mal das da rein
> #define F_CPU 8000000
>
> #include <avr/io.h>
> #include <util/delay.h>
>
> // Hier die tatsächlich verwendeten Parameter angeben
>
> #define LED_PORT    PORTD
> #define LED_DDR     DDRD
> #define LED_PIN     PD0
>
> int main()
> {
>    LED_DDR |= 1 << LED_PIN;
>
>    while (1)
>    {
>       LED_PORT ^= 1 << LED_PIN;
>       _delay_ms(1000);
>    }
>
>    return 0;
> }
>
> (damit sind mal alle Fehler, die durch falsche Timereinstellung oder
> falscher ISR-Name entstehen können vom Tisch.)
>
> Led muss 1 Sekunde ein, 1 Sekunde aus. Dann läuft der µC mit 8Mhz. Wenns
> wieder nur 8 Sekunden sind, dann läuft der definitiv auf 1Mhz
> (Kannst du auch verifizieren. Schreib bei F_CPU 1000000 rein, und du
> musst wieder die 1 Sekunde haben)
>
> Optimierung auf -Os nicht vergessen!

Damit blinkt die LED mit 0,5Hz, passt also! 8Mhz Takt.
Watchdog ist aus.

Dann versteh ich bei meinem Programm die langsame Frequenz nur nicht...
Aber schon mal Danke Karl-Heinz :-)

von spess53 (Gast)


Lesenswert?

Hi

>Dann versteh ich bei meinem Programm die langsame Frequenz nur nicht...

>TCCR1A = (1<<WGM12);

WGM12 befindet sich in TCCR1B.

MfG Spess

von Joe S. (bubblejoe)


Lesenswert?

spess53 schrieb:
> WGM12 befindet sich in TCCR1B.
>
> MfG Spess

Ich Idi....!

Danke schön Spess, ich hätte noch Stunden gerätselt.
Fing schon an an mir zu zweifeln.

von amateur (Gast)


Lesenswert?

Vorsicht:
TCCR1A = (1<<WGM12);

bewirkt zufällig das Gleiche wie:
TCCR1A = (1<<FOC1A);

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.