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
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
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.
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? ;)
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.
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.
Wenn du CKDIV8 meinst dann kann ich nur festellen das ich gepennt hab :-) diese Fuse steht auf 1 = unprogrammed
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.
OK ich habe gerade nachgesehen - der Tiny13 kann das nicht mit dem externen Clock. Naja dann wie gesagt: Code+Schaltplan.
Weiter oben hast Du doch geschrieben dass das CKDIV8-Bit unprogrammiert ist...? Naja gut denn.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.