Forum: Mikrocontroller und Digitale Elektronik TCNT1H und TCNT1L berechnen


von Kofi (Gast)


Angehängte Dateien:

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

von Stefan (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

von Kofi (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

von Stefan (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

von Kofi (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

von Stefan (Gast)


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

von Kofi (Gast)


Lesenswert?

hmm sollte es nicht

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

heißen ?

gruß kofi

von Stefan (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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.