Forum: Mikrocontroller und Digitale Elektronik Atmega128 clk_cpu stimmt nicht


von John S. (Gast)


Lesenswert?

ATMEGA128

Ich habe die Sicherungen (Fuses) für clk_cpu gemäß dem datasheet 
konfiguriert.Der CPU Takt stimmt nicht wie es beschrieben wurde. Für 
eine externale Krystal (16000) sollte die Frequenz einen Wert von 16MHz 
betragen.
(CKPOT:1, CKSEL:1111, Fuse Low: FF, High:99, Extended: FF, clk_cpu: 
2MHz, aber es sollte 16MHz sein.) Für internalen RC-Oszillator war es 
ebenfalss false (CKPOT:1, CKSEL:0100, Fuse Low: F4, High:98, Extended: 
FF, clk_cpu: 1MHz, aber es sollte 8MHz sein.)

s. Atmega datasheet pp. 40-41

Code
/*
configure cpu clock
ts8900-m128 board

*/

#include <avr/io.h>
#include <stdbool.h> // to use bool type

#define MS_COUNTS 1000

void main(){


//led initialization
DDRA=(1<<PA0);//led0 (PA0) is output
PORTA=0xff;//initialize leds, led0-led7 are turned off

DDRE=(1<<PE2);//enable LED driver by setting PE2, see circuit
PORTE=(1<<PE2);

/*F_CPU can be defined in project configuration
  but it is just an constant; it has no effect on the actual clock 
source,
  nor on the cpu frequency
*/
#ifdef F_CPU
PORTA &=~(1<<PA7); //led7 on pin7
#endif

//test cpu clock with led0
uint16_t ms =1000; //
uint16_t i,j;

bool led_on= false;//toggle led by negation

while (1){

  if (led_on)
    {PORTA&=~(1<<PA0);} //led0 is on
  else
    {PORTA|=(1<<PA0);}//led0 turn off

  for(i=0;i<ms;i++)
    {
    for(j=0;j<MS_COUNTS;j++){asm volatile ("nop"::);};
  }
    led_on= !led_on;
  /*
  led0: off-on-off-on-......
  a single off-on cycle is 2x10^6 (=2M) clock ticks
  one off-on takes 1 sec as measured by counting led switching in 1 min
  */
}
//test cpu

}

von fooo (Gast)


Lesenswert?

du wartest 1000 takte, nicht ms.
nenutze die delay.h

von John S. (Gast)


Lesenswert?

richtig, aber ms ist nur ein variable, ms mal MS_COUNTS gleich 1M takte.
wie lange dauert es für 1M takte wurde von Ein- und Ausschaltung von 
LED0 ermittelt.

von g457 (Gast)


Lesenswert?

> a single off-on cycle is 2x10^6 (=2M) clock ticks

Das glaube ich nicht, Tim. Du liegst um grob eine Größenordnung daneben.

von J. S. (hei)


Lesenswert?

g457 schrieb:
>> a single off-on cycle is 2x10^6 (=2M) clock ticks
>
> Das glaube ich nicht, Tim. Du liegst um grob eine Größenordnung daneben.

s. Overview auf seite 2 von Atmega128 datasheet.

von g457 (Gast)


Lesenswert?

> s. Overview auf seite 2 von Atmega128 datasheet.

Kuckst Du Kommandoreferenz (und ggf. falls wirklich nötig das 
Assemblerlisting Deines Compilers).

Oder Du glaubst mir einfach.

von J. S. (hei)


Lesenswert?

> Kuckst Du Kommandoreferenz (und ggf. falls wirklich nötig das
> Assemblerlisting Deines Compilers).
>
> Oder Du glaubst mir einfach.

ja, du hast vielleicht recht. Wie viel takte soll es sein hierbei?

von g457 (Gast)


Lesenswert?

> Wie viel takte soll es sein hierbei?

Mein gcc generiert mir mit O3 (ansonsten Standardeinstellungen) etwa 8 
Takte für die Schleife (darunter ein Branch, der in einem von 1000 
Fällen nur einen Takt braucht statt derer Zwei).

Wenn Du es Dir einfacher machen möchstest mit warten dann nimm die 
_delay_*() aus der util/delay.h ('nur' warten) oder einen der 
Hardwaretimer (Pinwacklen und regelmäßige Jobbearbeitung).

von g457 (Gast)


Lesenswert?

> _delay_*() aus der util/delay.h

..also testweise einfach(tm) mal sowas in der Art meine ich:
1
#include <util/delay.h>
2
[..]
3
led_initialisieren();
4
while (1)
5
{
6
    _delay_ms(500);
7
    led_an();
8
    _delay_ms(500);
9
    led_aus();
10
}

braucht F_CPU korrekt definiert.

HTH
</ingrid>

von J. S. (hei)


Lesenswert?

g457 schrieb:
>> _delay_*() aus der util/delay.h
>
> ..also testweise einfach(tm) mal sowas in der Art meine ich:
>
> [code]
> #include <util/delay.h>
xxxxxxxxxxxxx
>
> braucht F_CPU korrekt definiert.
>
> HTH
> </ingrid>


danke, g457
ich melde mich wieder am Abend.

von J. S. (hei)


Lesenswert?

danke, es ist gelungen.

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.