mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Aus 4MHz 3.92 machen?


Autor: Jürgen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich stehe gerade auf dem Schlauch und glaube so langsam das mein 
Vorhaben mit diesem Controller scheitert.

Ich habe hier einen ATTINY25 und einen 4MHz Quarz rum liegen.

Jetzt würde ich gerne mit Timer0 (8Bit) eine Frequenz von 3.92 Hz 
erzeugen.

Geht das?
Wenn ja bitte kurz vorrechnen.
Welche bits ich wo setzten muss möchte ich dan wieder selber rausfinden.

Danke

Autor: Jens D. (jens) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

wieso vorrechenen? Wieso nicht selbst das Hirn anschmeissen?

Tipps gebe ich aber gerne.
Den Prescaler kannst schonmal den hoegsten nehmen und da biste dann 
unter 20Hz nach dem Timer.
Nun kannst du per Software die 20 noch weiter runterteilen.
Oder damit einen anderen Timer bedienen.

Jens

Autor: Marvin M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Geht nicht, selbst mit Prescaler 1024 bekommt man eine Überlauffrequenz 
von 15,26 Hz.
Man müsste dann schon zusätzlich eine Teilung in Software machen.
Beispiel:
Timer0-Interrupt mit Prescaler 1, das ergibt dann 15625Hz. Dort lassen 
wir einen Software-Zähler bis 3986 laufen, dann kommen 3,919 Hz raus.

Autor: Artur Funk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
(2^16) - ((3.92 * 4 000 000) / 1 024) = 50223.5
Ganz genau kriegst du die 3.92Hz nicht hin. Mit 0xC418 bist du gut bei 
3.926Hz

Autor: Tim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wenn ja bitte kurz vorrechnen.
Etwa so?

4.000.000Hz / 3,92Hz = 1020408.163265306122 => kein ganzzahliger 
teiler...
1020408.163265306122 / 1024(Prescaler) = 996.4923469387755102 Takte am 
Timer
,5 ist aber blöde...
1020408.163265306122 / 256(Prescaler) = 3985.969387755102041 Takte am 
Timer
0,969 ist schon besser.
Also Timer mit /256 Prescaler laufen lassen und 3986(aufgerundet) Takte 
abzählen (15 mal bis 256 zählen lassen und beim 16. mal nur bis 146)
Das währen dann 4.000.000Hz  256  3986 = 3.919969894631209232Hz

Das währe eine Timer0 lösung.
Mit dem timer1 könnte das durch die interne PLL noch besser gehen.

Jeep, wieder zu langsam....

Autor: SF (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Tiny hat aber leider nur 8Bit Timer. Dafür aber einen Vorteiler, der 
bis 16384 geht. Mit diesem Programm kann man sich recht schnell die 
Timer-OCR-Werte für CTC-Mode und den resultierenden Fehler anzeigen 
lassen. Ideal für Leute die nicht häufig die Timer verwenden:

http://www.b9.com//elect/avr/kavrcalc/

Mit einem Vorteiler von 4096, OCR von oxF8 kommt man auf 3.9219 Hz. Das 
sind dann 0.049% Fehler.

Autor: Jürgen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die vielzahl von Antworten.
Habe ich das richtig verstanden:
Vorteiler und Prescaler ist was anderes?

Wo ist der unterschied?

Autor: Tim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Danke für die vielzahl von Antworten.

Bitte.

>Habe ich das richtig verstanden:
>Vorteiler und Prescaler ist was anderes?

Nö. Ist das selbe.
Das eine ist halt Deutsch und das andere Englisch.

Autor: Jürgen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich glaube da stimmt was nicht.
Soweit wie ich das verstanden habe,
hat der Tiny25 einen Prescaler 1024.

Richtig oder Falsch?

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo , hast du auch bedacht das ein Quarz zwar ziehmlich genau ist nur 
nicht so genau das deine Frequenz genau 4.000.000 Hz beträgt. Es ist 
technisch gesehen eine Toleranz vorhanden,sagen wir mal + - 1%.
So jetzt Rechne mal mit diesen Werten. Und du wirst sehen das die Komma- 
stellen nicht so wichtig sind. Also genau 3.92 Hz wirst du nie 
hinbekommen.
Klar gibt es möglichkeiten, nur geht es dann ins Geld.
Nur mal so bemerkt.

Viel Spaß

Mike

Autor: SF (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau doch einfach ins Datenblatt:
http://www.atmel.com/dyn/resources/prod_documents/...

Der Tiny25 hat zwei Timer.

Der erste hat einen Vorteiler der folgende Werte annehmen kann:
:1, :8, :64, :256, :1024

Der zweite Timer hat folgende Vorteiler:
:1, :2, :4, :8, :16, :32, :64, :128, :256, :512, :1024, :2048, :4096, 
:16384

Autor: Hans-Jörg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für denn Hinweis.
Ist mir bekannt.

Autor: Jürgen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für den Tipp.

Ich habe gedacht das Timer 0 und Timer 1 identisch sind und deshalb nur 
Timer 0 bedrachtet.

Herzlichen Dank

Autor: Jürgen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo noch mal,

ich bin gerade am verzweifeln.
Ich versuche schon seit einer Woche das folgende hinzubekommen:

>>Mit einem Vorteiler von 4096, OCR von oxF8 kommt man auf 3.9219 Hz

Aber es will einfach nicht.

Denn Vorteiler habe ich hinbekommen. Auch die 0xF8 bekomme ich in das 
OCR Register.

Welche Bits muss ich noch in welche Register setzten das mir der Tiny25 
mit Timer1 und CTC Modus einen Interup mit dem Takt auslöst?


Muss noch kurz dazusagen,
Ich habe seit 2 Jahren nichts mehr mit µC gemacht. Ich weis kaum noch 
wie das geht. :-(

Herzlichen Dank für eure hilfreiche Hilfe. :-)

Jürgen

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kurz bei ICC geschaut:

void port_init(void)
{
 PORTB = 0x00;
 DDRB  = 0x00;
}

//TIMER1 initialize - prescale:4096
// desired value: 3.92Hz
// actual value:  3,922Hz (0,0%)
void timer1_init(void)
{
 TCCR1A = 0x00; //stop
 TCNT1 = 0x07
 OCR1A = 0xF9;
 OCR1B = 0xF9;
 OCR1C = 0x80;
 TCCR1A = 0x00;
}

#pragma interrupt_handler timer1_ovf_isr:iv_TIM1_OVF
void timer1_ovf_isr(void)
{
 //TIMER1 has overflowed
 TCNT1 = 0x07; //reload counter 
}

//call this routine to initialize all peripherals
void init_devices(void)
{
 //stop errant interrupts until set up
 CLI(); //disable all interrupts
 port_init();
 timer1_init();

 MCUCR = 0x00;
 TIMSK = 0x01; //timer interrupt sources
 GIMSK = 0x00; //interrupt sources
 SEI(); //re-enable interrupts
 //all peripherals are now initialized
}

//
void main(void)
{
 init_devices();
 //insert your functional code here...
}


gruß hans

Autor: Jürgen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Mühe die du dir gemacht hast.

Liege ich richtig das das folgende die eigentliche Interrup-Routine ist?
#pragma interrupt_handler timer1_ovf_isr:iv_TIM1_OVF
void timer1_ovf_isr(void)
{
 //TIMER1 has overflowed
 TCNT1 = 0x07; //reload counter 
}

Autor: Nils (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

darf ich fragen was das
#pragma interrupt_handler timer1_ovf_isr:iv_TIM1_OVF
bewirkt? Ich habe das noch nicht gesehen.

Gruss
Nils

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Jürgen,

warte mal auf Jörg Wunsch DD (ich hoffe der Name ist richtig).
Das ist noch einer, der Quarze mit Bleistiftstichen verstimmt hat.

Gruß Klaus

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da hat Jörg Wünsch auch nichts mit zu tun, denn der entwickelt nur den 
GCC mit, aber nicht den ICC. Das sind zwei völlig unterschiedliche 
Compiler, die die Verwaltung von ISRs unterschiedlich handhaben.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Simon,

mir ginges um den Quarz abzugleichen
und nicht um eine numerische Lösung.
Die paar Herz die der daneben liegt, bekommt man
evtl auch durch Ziehkondensatoren hin.

Gruß Klaus

Autor: Jürgen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Halli Hallo,

Also, ich programmiere mit dem AVR-Studio und dem AVR-GCC Compiler.

Hatte noch keine Zeit das Prog. auszuprobieren. Aber wenn ichs richtig 
verstehe funktioniert es mit dem GCC so wieso nicht.?

Weitere Frage:

>>mir ginges um den Quarz abzugleichen

Meins du damit die Toleranz des Quarzes?

Wie funktioniert es?


MfG

Jürgen

Autor: Andreas Lang (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Hallo , hast du auch bedacht das ein Quarz zwar ziehmlich genau ist nur
> nicht so genau das deine Frequenz genau 4.000.000 Hz beträgt. Es ist
> technisch gesehen eine Toleranz vorhanden,sagen wir mal + - 1%.

Wo kaufst du denn deine Quarze?!
Tyisch sind es +-50-100ppm also 0,0050-0,01% (korekte Kondensatorwerte 
vorausgesetzt)

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.