www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Attiny läuft langsam


Autor: Florian Idb (fbeek)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Florian Idb (fbeek)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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? ;)

Autor: Hannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
9.6 Mhz 1minute20

4.8 40 Sekunden

das kann nicht sein.

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Div/8-Fuse? Kommt prima hin :-)
10s->80s

Autor: Florian Idb (fbeek)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus2m5 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
CKDIV8 würde ich auch tippen. Laut Datenblatt default=enabled.

Autor: Florian Idb (fbeek)
Datum:

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

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

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

Autor: Florian Idb (fbeek)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab es hinbekommmen lag am Teiler.

Danke für die Hilfe

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

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

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
Delay200KCyles:
    ldi  ZL, Low(40000)
    ldi  ZH, High(40000)

Delay200KCyclesLoop:
    nop                         ; 1 Cycle
    sbiw ZL, 1                  ; 2 Cycles
    brne Delay200KCyclesLoop    ; 2 Cycles

    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).

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.