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 }
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.
> a single off-on cycle is 2x10^6 (=2M) clock ticks
Das glaube ich nicht, Tim. Du liegst um grob eine Größenordnung daneben.
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.
> 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.
> 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?
> 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).
> _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>
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.