Atmega32 Clock

OP #2805503
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
#2805567
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?
#2805581
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!
OP #2805597
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 :-)

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