Ums Umfusen kommt man nicht umhin... ist doch nicht so schlimm.
VG Micha
Der tiny13 ist bei der internen Taktfrequenz eine Ausnahmen. Bei fast allen anderen Typen hat man Standardmäßig 1 MHz und dann meist noch 4 MHz, 8 MHz und 128 kHz zur Auswahl.
Die 3,68.. MHz ist eine Übliche Quarzfrequenz, wenn man eine RS232 Verbindung nutzen will. Mit etwas Glück kriegt man ggf. den internen Takt von 4 MHz auch noch so weit verstellt, aber der Sinn ist dann verloren, weil der interne Takt nicht so genau ist.
Ums Umfusen kommt man nicht umhin... ist doch nicht so schlimm.
VG Micha
Ja. So wie ich ausgetestet habe, müsste der Chip standartmäßig auf etwa 1MHz gefused sein. Irre ich mich da etwa?Um auf die richtigen Zeiten bei wait/delay zu kommen, muss lediglich der gefuste Takt mit dem in der Software unter F_CPU angegebenen Wert übereinstimmen.
Hat der 3 'innere Uhren' (Der Tiny13 kann intern doch nur auf 128kHz, 4,8MHz oder 9,6MHz eingestellt werden) und von denen wählt man beim fusen eine aus??
Unter F_CPU steht beim workpad automatisch 3.684... drinnen.Wie kommst Du da auf 1MHz bzw. 3,68...Mhz???
Das habe ich verstellt auf 10 - da hats nicht gepasst.
Dann habe ich auf 1 gestellt - jetzt müssts ungefähr hinhauen...
Bei der Auswahl des internen Taktes kann man wirklich verschiedene Oszillatoren wählen, oder einfach nur einen Teiler zuschalten. Die 128 kHz kommen vom Watchdog timer also einen extra Oszillator. Die alten Versionen haben wirklich die Frequenz des Oszillators oder gar den ganzen Oszillator umgeschaltet. Neu wird eher eine Teiler dazu geschaltet und der 1 MHz Takt den man Standardmäßig meist hat kommt von einem 8 MHz Takt der durch 8 geteilt wird.
Ich nehme an, der Befehl zum umfusen der Taktreferenz steht im datasheet?
Naja, wenn ich weiß, dass er auf 1Mhz läuft, dann passt das erstmal...
Batteriesparender ists ja auch, und auf speed kommts bei meinen bisherigen Programmen ja nicht an![]()
Beim nächsten Projekt, einem Datumsmitzähler (Mo, xx.yy.20xx) kommt es auch nur auf Genauigkeit an, nicht auf Schnelligkeit...
Genügt für sowas eigentlich die interne Taktgebung oder ist die dafür zu ungenau (hm, welche Genauigkeit wäre denn akzeptabel? ... <1h pro 10 Jahre? Kann das zu schaffen sein??)
Möchte nur mal vermelden, dass ich eine Art Eieruhr für diverse Zwecke gebaut habe...
Der Chip ist ja serienmäßig auf 1Mhz gefused, und das habe ich mal so gelassen. Dann waitMs(5000) (also 5 sek) und das in einer Schleife oftmals ablaufen lassen (Ok, Energiesparen ist hier noch nicht dabei)
5 sek * 12 = 1 Min... 5*12 sek * x min
Mit 2 Tastern kann man 20 oder 50 Minuten einstellen, und dann leuchtet eine Status-LED....
Demnächst werde ich es mit delay versuchen... Und später mit sleep und interrupt....
Eine Eieruhr ist ein dankbares Projekt zum Lernen, insbesonders
für Timerprozesse. Und eine Quarzgenauigkeit nicht notwendig.
Gute Wahl. VG Micha
Du solltest noch bedenken, dass solche delay-befehle und so bei zu großen werten etwas ungenau werden. Über 5-6s solltest du nicht nehmen. Bei diesen Anwendungen zwar nicht dramatisch, aber wenn es mal genau gehen soll, doch ein wichtiger Faktor.
mfg
Sobald ich Interrupts kann, werde ich das mit Timer-Interrupt und sleep ergänzen.Zitat von Wsk8
Ist bereits auf eine Lochrasterplatine gelötet, der Chip steckt nur im Sockel - also gut ergänzbar
Ich denke, ich poste das mal, falls weiter Anfänger nach einem Demoprogramm suchen
}Code://---------------------------------------------------------------------- #define F_CPU 1000000 // Taktfrequenz des myAVR-Boards #include <avr\io.h> // AVR Register und Konstantendefinitionen //---------------------------------------------------------------------- uint16_t weckton () { int i=0; for (i; i<3000; i++) { PORTB=PORTB|(1<<PB2); // us = mikrosekunden ; 200us -> 5000Hz waitMs(0.8); PORTB=PORTB&(~(1<<PB2)); waitMs(0.8); } waitMs(70); for (i; i<3000; i++) { PORTB=PORTB|(1<<PB2); // 200us -> 5000Hz waitMs(1); PORTB=PORTB&(~(1<<PB2)); waitMs(1); } waitMs(50); for (i; i<2000; i++) { PORTB=PORTB|(1<<PB2); // us = mikrosekunden ; 200us -> 5000Hz waitMs(1.5); PORTB=PORTB&(~(1<<PB2)); waitMs(1.5); } return 0; } main () { DDRB=0b11110110; PORTB=0b00011001; waitMs(500); PORTB=PORTB&(~(1<<PB4)); while(true) // wichtig, dass Controller mehrmals if-abfragt!!! { if(!(PINB&(1 << PB0))) // Wenn Taster1 gedrückt, dann { PORTB=PORTB|(1<<PB1); // Status-LED: 2 min for (int j=0; j<24;j++) //24* 5sek = 2Min (*10=20 min) { waitMs(6000); // 1000ms *60 sek -> min -> *2 min (6sek ~ 5sek laut AVR) // waitms schafft nur 64K Zyklen, je nach Taktung zb. 30 sek -> Schleife } while (true) { weckton (); } } if(!(PINB&(1 << PB3))) // Wenn Taster3 gedrückt, dann { PORTB=PORTB|(1<<PB4); // Status-LED: 5 min for (int g=0; g<60;g++) //600* 5sek = 50Min (60*5 = 5 min) { waitMs(6000); // 1000ms *60 sek -> min -> *20 min (6sek ~ 5sek laut AVR) // waitms schafft nur 64K Zyklen, je nach Taktung zb. 30 sek -> Schleife } while (true) //5 min { weckton (); } } }
Danke, Micha
Mfg
Lesezeichen