Forum: Mikrocontroller und Digitale Elektronik ATtiny45 delay doppelt so lang wie gewollt


von Stefan R. (Gast)


Lesenswert?

Hallo,

ich fange gerade an, mit einem ATtiny45 zu programmieren. Bei meinen 
Aufrufen der delay-Funktion wundert mich, dass die Zeiten doppelt so 
lang sind wie gewollt. Ich habe also zunächst noch einmal die Angaben 
zur clock rate im Quelltext und auch die Fuses auf dem µC selbst 
überprüft. Wenn ich meine Fuses mit avrdude auslese

avrdude: safemode: lfuse reads as 62
avrdude: safemode: hfuse reads as DF
avrdude: safemode: efuse reads as FF

und dann die Werte bei

http://www.engbedded.com/fusecalc/

eingebe, bekomme ich raus, der Chip laufe auf 8MHz, geteilt durch 8. Ich 
komme rechnerisch also auf 1MHz. Das habe ich dann im Quelltext auch so 
vermerkt.


#define F_CPU 1000000
#include <util/delay.h>
#include <avr/io.h>

int main(){
  while(1){
    PORTB |= (1<<PB1);
    _delay_ms(1000);
    PORTB ^= ~(1<<PB1);
    _delay_ms(1000);
  }
}



Trotzdem dauern die 1000ms aber jeweils 2 Sekunden—also 2 Sekunden LED 
an, dann2 Sekunden aus.

Wenn ich die Fuse für den 8-fach-Teiler mal rausnehme, passiert quasi 
das gleiche: dann blinkt die LED eben auch bei

#define F_CPU 8000000

doppelt so schnell wie sie soll. Klar, ich kann jetzt einfach 4000000 
bzw. 500000 eintragen, damit alles wieder stimmt, aber das kann ja nicht 
die Lösung sein.

Ich habe nun schon recherchiert, aber komme einfach nicht drauf. 
Vielleicht sehe ich auch den Wald vor lauter Bäumen nicht mehr.

Gruss,
Stefan

von edi_r (Gast)


Lesenswert?

Stefan R. schrieb:
> #define F_CPU 1000000

Stefan R. schrieb:
> doppelt so schnell wie sie soll.

Vermutlich meinst Du: halb so schnell wie sie soll.

Ich weiß nicht, ob's was bringt, aber schreib mal den Datentyp (das "UL" 
am Ende) zur Frequenz dazu:
1
#define F_CPU 1000000UL

: Bearbeitet durch Admin
von Stefan R. (Gast)


Lesenswert?

Oh, da hatte ich mich vertan. Ich meinte natürlich halb so schnell, wie 
sie soll.
Allerdings hat das Ändern auf

#define F_CPU 1000000UL

leider auch nichts geändert.

von Timmo H. (masterfx)


Lesenswert?

Hatte erst gedacht, dass es das Problem ist: 
Beitrag "Re: _delay_ms() läuft 4 Mal schneller als erwartet"
Aber vielleicht doch nicht?!

von avr_gast (Gast)


Lesenswert?

Hallo, ich glaube du must in delay.h nachgucken, was da für ein Wert für 
F_CPU eingegeben ist. Du redefinest nähmlich die Frequenz wenn du ,
#include <util/delay.h> nach #define F_CPU 1000000 setzt.

Gruß

von Michael (Gast)


Lesenswert?

Kann nicht das Problem sein, denn dann dürfte sich bei
    #define F_CPU 8000000
nichts ändern.

von Peter II (Gast)


Lesenswert?

avr_gast schrieb:
> Hallo, ich glaube du must in delay.h nachgucken, was da für ein Wert für
> F_CPU eingegeben ist. Du redefinest nähmlich die Frequenz wenn du ,
> #include <util/delay.h> nach #define F_CPU 1000000 setzt.

nein, so wir er es gemacht hat ist es richtig. F_CPU sollte vor den 
include stehen.

Wa sagt denn der Simualtor, lass den code doch mal darin laufen?

von Stefan R. (Gast)


Lesenswert?

Also ich habe beide Varianten probiert: F_CPU vor und auch nach den 
Includes. Bringt beides dasselbe Resultat. Zum Simulator: ich habe einen 
Mac und darauf habe ich avr-gcc und kompiliere und flashe das ganze aus 
der Kommandozeile heraus. Habe also keine IDE, die einen Simulator o.ä. 
anbieten würde..

von Stefan R. (Gast)


Lesenswert?

OK, also das Programm ist ohnehin etwas merkwürdig, aber wie es scheint, 
lag das mit den "doppelten delay-Zeiten", daran, dass ich

   PORTB ^= ~(1<<PB1);

anstatt

   PORTB &= ~(1<<PB1);

geschrieben hatte..
Stefan

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.