Forum: Mikrocontroller und Digitale Elektronik Attiny läuft langsam


von Florian I. (fbeek)


Lesenswert?

Hi Leute hab mal ne kleine Frage.

Und zwar habe ich hier einen Attiny 13 der mit 9.6 Mhz läuft.
Nun wollte ich testweise mal eine LED blinken lassen und nutze dafür die 
funktion:

void long_delay(uint16_t ms)
{
    for(; ms>0; ms--) _delay_ms(1);
}

damit die LED nach 10 Sekunden aus geht nutze ich den aufruf 
long_delay(10000).

das problem ist nun das sie aber erst nach 1minute20 ausgeht.

Stelle ich den CPU Tackt auf 4.8 geht sie erst nach 40 Sekunden aus.Habe 
die Frequenz auch korrekt in AVR Studio eingegeben.

Weiss einer woran es liegen kann?

Gruss Flo

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Hi Flo,

hast Du F_CPU richtig definiert und die Compiler-Optimierung 
eingeschalten? Falls ja, vielleicht stimmt etwas mit Deinem Oszillator 
nicht? Fuses oder Aufbau? Haeng mal einen Schaltplan an.

lg,
Michael

von Florian I. (fbeek)


Lesenswert?

Also ich habe F_CPU in den Projekt einstellungen definiert und benutze 
den internen Takt. Sonst hängt nur die LED dran das Funktioniert aber 
hatte das problem schon bei einigen Tiny Projekten.

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Projekteinstellungen? Verwendest Du BASCOM oder sowas?
Naja der interne Oszillator ist recht ungenau und ausserdem laeuft der 
sowieso nur bis maximal 8MHz, was man aber per Fuses einstellen muss. 
Nur durch das Aendern von F_CPU passiert am Systemtakt garnichts. Ich 
hoffe das ist Dir klar? ;)

von Hannes (Gast)


Lesenswert?

9.6 Mhz 1minute20

4.8 40 Sekunden

das kann nicht sein.

von crazy horse (Gast)


Lesenswert?

Div/8-Fuse? Kommt prima hin :-)
10s->80s

von Florian I. (fbeek)


Lesenswert?

Oh hatte ich vergessen nutze den GCC mit AVR Studio.
Im Datenblatt steht das der Tiny 13 einen Internen Takt von 9.6 oder 4.8 
MHZ erzeugen kann.

Habe die Zeiten mit einer Stoppuhr gemessen ab dem moment wo die LED an 
geht.

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

OK die Vermutung mit BASCOM is natuerlich Unfug, da der gepostete Code 
ja C ist.

Poste doch mal den GESAMTEM Code + Schaltplan und auch die 
Fuse-Einstellungen. Dann muss man nicht so viel raten.

von Klaus2m5 (Gast)


Lesenswert?

CKDIV8 würde ich auch tippen. Laut Datenblatt default=enabled.

von Florian I. (fbeek)


Lesenswert?

Wenn du CKDIV8 meinst dann kann ich nur festellen das ich gepennt hab 
:-) diese Fuse steht auf 1 = unprogrammed

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Die neueren Typen koennen den Systemtakt an einem entsprechenden Pin 
nach aussen fuehren. Aktiviere dieses Fuse und messe doch mal den Takt, 
dann weisst Du, wie schnell die MCU wirklich laeuft. Und nochmal: -O2 
beim Compilieren verwenden, sonst funktioniert _delay* nicht richtig.

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

OK ich habe gerade nachgesehen - der Tiny13 kann das nicht mit dem 
externen Clock. Naja dann wie gesagt: Code+Schaltplan.

von Florian I. (fbeek)


Lesenswert?

Hab es hinbekommmen lag am Teiler.

Danke für die Hilfe

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Weiter oben hast Du doch geschrieben dass das CKDIV8-Bit unprogrammiert 
ist...? Naja gut denn.

von Gast (Gast)


Lesenswert?

Die Taktfrequenz eines Controllers kann man sehr schnell mit einem 
kleinen Testprogramm herausbekommen. Man schaltet in einer 
Endlosschleife einen Portpin abwechselnd auf H und L, und dazwischen 
ruft man eine Delay-Routine auf, die eine bekannte Anzahl Taktzyklen 
verbrät, z. B. diese:
1
Delay200KCyles:
2
    ldi  ZL, Low(40000)
3
    ldi  ZH, High(40000)
4
5
Delay200KCyclesLoop:
6
    nop                         ; 1 Cycle
7
    sbiw ZL, 1                  ; 2 Cycles
8
    brne Delay200KCyclesLoop    ; 2 Cycles
9
10
    ret

Damit ist der AVR für (fast) genau 200000 Taktzyklen beschäftigt. 
Folglich wird bei FOSC = 8 MHz der Pin mit der Frequenz 8000000/200000/2 
= 20 Hz togglen.  Das kann man leicht erfassen (Datenlogger, 
Frequenzmessgerät, Oszi, oder über einen Frequenzteiler weiter teilen 
und eine Stoppuhr benutzen).

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.