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
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
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
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
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
Wenn es auf die 2,4% Ungenauigkeit nicht ankommt, solltest Du einfach schreiben können: void set_timer(int t){ TCNT1 = -(4 * t); }; Stefan
hmm sollte es nicht void set_timer(int t) { tcnt1 = 0cffff -(4 * t); return tcnt1; } heißen ? gruß kofi
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.