TCNT1H und TCNT1L berechnen

Gast #61841
Lesenswert?
• ▲
▼
Hi!
Ihr kennt ja bestimmt alle das Programm, dessen Screenshot im Anhang
ist ...

Unten kann man die Timer-register berechnen
aber das ist ein Wert, die ich mit dem µC berechnen möchte, weil er
sich stets ändert.

Könnte mir jemand verraten wie man die ohne das Proggi berechnen kann?
Und eventuell welche Datentypen ich bei der Berechnung verwenden
sollte?

Vielen Dank

gruß
kofi
Angehängte Dateien:
Gast
Lesenswert?
• ▲
▼
bei 4 Mhz 100Hz einstellen: bedeutet 4.000.000 / 100 = 40.000 Takte

40.000 = 9C40 Hex   (entspricht Reload-Werten 9Ch, 40h)

Wenn Du ohne Reload/mit TCNT1x arbeiten willst, dann rechnest Du:

10000h - 9C40h = 63C0h

Das hat damit zu tun, dass der Timer aufwärts läuft, und von 63C0h bis
zum Überlauf (-> Überlauf entspricht 10000h) sind es dann 9C40h oder
40000 Takte.

Solche Programme bringen einen (meiner Meinung nach) nicht wirklih
weiter, sondern bewirken vielmehr, dass die einfachsten Zusammenhänge
einem für immer ein Rätsel bleiben.

Stefan
Gast
Lesenswert?
• ▲
▼
Finde ich auch!
Danke für deine Erklärung aber aber ich verstehe es nicht so ganz...

ich will eine Funktion schreiben der ich
eine 10 übergebe und eine 65497 (FFD9) zurückbekomme

wie kann ich das denn berechnen ?

int. soll also alle 10ms ausgeführt
4MHz
prescale 1024
Gast
Lesenswert?
• ▲
▼
Du willst eine Zeit in ms angeben, sehe ich das richtig?
Dann ist 1024-Prescale etwas ungeschickt, dann muss der Timer für 1ms
etwa 3,9 mal zählen, das kann er nicht. Also kleine Ungenauigkeiten
sind eingebaut.
Wenn Du diese Ungenauigkeit akzeptieren kannst, dann rechnest Du bei
1024-Prescale: Timerwert =  -(t[ms] * 4)

ansonsten:
-(4000 * t[ms] / 1024)


in Deinem Beispiel also (t[ms] = 10):
-(10 * 4) = -40  = FFD8h

oder genauer:
-(4000 * 10 / 1024) = -39  = FFD9h

Wenn Du es genau haben willst, solltest Du allerdings auf jeden Fall
die Reload-Register verwenden. Dann kannst Du Dir das Minus-Zeichen
auch sparen und den (positiven) Wert direkt ins Relaod-Reg schreiben.

Stefan
Gast
Lesenswert?
• ▲
▼
Ich werd' das mal so übernehmen aber ist egal ob ich jetzt 10 oder 300
übergebe ne ?
Es ist überhaupt nicht zeitkritisch kann ruhig ne ganze ecke abweichen
!
Vielen Dank !!

Kennst du dich vielleicht auch mit C aus ?
wenn ich diese berecnung machen will wie  muss die ergebnis variable
deklariert sein es sind ja 16 bit und vorzeichen behaftet.

float x;
oder double x;
oder wie ?

danke nochmal !!

gruß
kofi
Gast
Lesenswert?
• ▲
▼
@kofi

wenn schon dann:

  tcnt1 = 0x10000 - (4*t);

sonst verrechnest Du Dich um 1. 0xffff ist ja b bereits -1, nicht
Null.
Aber ist nicht nötig: Beispiel:
-(1*4) = -4  ist als Hex-Darstellung 0xfffc.

  return tcnt1;

wird bei einer void-Funktion nicht funktionieren, wozu will ich diesen
Wert auch dem aufrufendem Programm zurückgeben?

Stefan

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.