Autor |
Mit welcher Taktfrequenz läuft mein ATtinyxxx wirklich? |
|
|
|
|
BID = 162684
hajos118 Schreibmaschine
Beiträge: 2453 Wohnort: Untermaiselstein
|
|
Vielleicht eine blöde Frage, aber wie kann ich die Taktfrequenz meßtechnisch feststellen - insbesondre weil ich nur den internen Oszillator verwenden möchte!
Kann mir vorstellen, mit einem Timer - Interrupt und umschalten eines Pin's, aber wie genau ist das?
Gibt's da Erfahrungen oder/und evtl. schon eine Testschaltung mit Programm?
Greets
Hajo
|
|
BID = 162690
Benedikt Inventar
Beiträge: 6241
|
|
Schreib dir ein kleines Programm, das einen Port bei jedem Durchlauf umschaltet. Mit einem Frequenzzähler kannst du die Frequenz dann messen. Weiterhin weißt du, dass dein Programm für jeden Durchlauf x Takte braucht, und daraus kannst du dann die Taktfrequenz berechnen. |
|
BID = 163390
hajos118 Schreibmaschine
Beiträge: 2453 Wohnort: Untermaiselstein
|
... ist leider in "C" nicht ganz so einfach (Takte pro Befehl).
Vielleicht kann mir jemand erklären, warum bei einem Wert von "5000" gerade eine Dauer von 10 msec zwischen den IRQs vergeht. Ich betreibe den AVR mit internem Oszillator bei 4 Mhz (?)
Mit einigen Versuchen habe ich herausgefunden, daß bei einem Port Pin genau 10msec zwischen jedem Umschalten vergehen, wenn ich folgendes Programm einspiele (WinAVR): (ATtiny2313)
#include <main.h>
// hier drin definitionen für Variable
#include <avr/interrupt.h>
#include <avr/signal.h>
// 5000 => 10 msec Interrupt
#define DURATION 5000
void init(void);
//Hauptprogramm
int main (void)
{
init();
while (1)
{
}
return (1);
}
void init(void)
{
// Ausgänge initialisieren
outp(0x0f,DDRB); // Der halbe Port B = Ausgang
sei(); // Globalen Interrupt freigeben
TIMSK =_BV(OCIE1A); // Vergleichswertüberlauf Interrupt einschalten
TCCR1B = _BV(CS10); // Vorteiler =1
OCR1A = DURATION - 1; //
}
}
/***********************
Interruptroutine wird aufgerufen
************************/
SIGNAL(SIG_TIMER1_COMPA)
{
outp((cent & 1),PORTB);
cent++;
TCNT1 = 0x0000; // Rücksetzen
}
|
BID = 163682
uc Neu hier
Beiträge: 28
|
Das geht nur in Assebler!
|
BID = 163720
giwer Stammposter
Beiträge: 202
|
Versuch es mit der Funktion Delay.
Die Funktion _delay_loop_2(uint16_t __count) braucht zum abarbeiten genau 4 Systemzyklen
z.B
#include <avr/delay.h>
.
.
PORTB |= _BV(0); // Bit 0 setzen.
_delay_loop_2(1000); // 4000 Zyklen warten
PORTB & = ~_BV(0); // Bit 0 löschen
Jetzt musst nur die Impulslänge am PORTB(0) messen und die Frequenz ausrechnen.
|
BID = 163801
perl Ehrenmitglied
Beiträge: 11110,1 Wohnort: Rheinbach
|
Zitat :
| Jetzt musst nur die Impulslänge am PORTB(0) messen |
Das kann nicht jeder.
Günstiger wär es wohl einen 1s Timer zu programmieren.
Dann kann man durch Vergleich mit einem gewöhnlichen Wecker feststellen, wieviel der vor- oder nach geht.
_________________
Haftungsausschluß:
Bei obigem Beitrag handelt es sich um meine private Meinung.
Rechtsansprüche dürfen aus deren Anwendung nicht abgeleitet werden.
Besonders VDE0100; VDE0550/0551; VDE0700; VDE0711; VDE0860 beachten !
|
BID = 164193
hajos118 Schreibmaschine
Beiträge: 2453 Wohnort: Untermaiselstein
|
@perl:
Genau das hab' ich ja versucht (100 Hz Takt, s.o.), allerdings durch Trial & Error.
Bin dann auf die "5000" als Zählerwert gekommen. Nun interessiert mich halt, wie schnell denn der Contoller wirklich läuft...
|
BID = 164231
giwer Stammposter
Beiträge: 202
|
Der TCNT1- Zähler muss in der erste Zeile der Interruptroutine zurückgesetzt werden, da TCNT1 weiter zählt während outp((cent & 1),PORTB); und cent++;
abgearbeitet wird.
4000000 / 5000 – 1 ergibt eine Interruptfrequenz von 800 Hz.
Ist auch wirklich 4 MHz intern eingestellt ?
|
BID = 164674
hajos118 Schreibmaschine
Beiträge: 2453 Wohnort: Untermaiselstein
|
Habe mal die Flash - Bits angesehen... es ist der interne Oszi eingestellt (CKSEL 0010).
Evtl. ist noch ein Prescaler (8) eingestellt (... würde meine Ergebnisse bestätigen).
Leider hab' ich aber keinen Zugang mehr zum Chip - irgendwie läßt sich das Ding nicht mehr ansprechen / Programmieren.
Mit dem Prog: TWINAVR (Stand-Alone Programmer) hab' ich das Teil bis jetzt immer wieder löschen können, bevor ich mit sp12 (in WinAVR eingebunden mittels avrdude) ein Prog eingespielt habe. Geht jetzt aber nicht mehr... stellt sich irgendwie tot
Weiter testen und ggf. Reserve chip aus meinem Lauflich abzweigen (ist dann aber einer der letzten, die ich zur Verfügung habe.)
Wo gibt's die Teile günstig???
Greets
Hajo
|
BID = 164734
giwer Stammposter
Beiträge: 202
|
|
BID = 164744
giwer Stammposter
Beiträge: 202
|
Mit der AVRprog Software lässt sich die Frequenz einstellen und die Einstellungen auslesen, sowie Flach und Eeprom getrennt beschreiben, vergleichen, löschen und vieles mehr. Programmer und Software findest du hier.
http://www.klaus-leidinger.de/mp/Mi.....t2313
|