www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik TCNT1H und TCNT1L berechnen


Autor: Kofi (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Kofi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Kofi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn es auf die 2,4% Ungenauigkeit nicht ankommt, solltest Du einfach
schreiben können:

void set_timer(int t){
  TCNT1 = -(4 * t);
};


Stefan

Autor: Kofi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmm sollte es nicht

void set_timer(int t)
{
  tcnt1 = 0cffff -(4 * t);
  return tcnt1;
}

heißen ?

gruß kofi

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

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.