Hallo, wie kann ich einen Zähler oder Counter realisieren, der in ms zählt. Konkret möchte ich so eine Art Uhr bauen, aber nicht mit Stunden/Minuten/Sekunden sondern nur mit Sekunden/Millisekunden. Es wäre auch möglich daß nonstop die Millisekunden in einer Endlosschleife raufgezählt werden, und die je nach Bedarf abgegriffen werden können, wenn ein bestimmtes Ereignis eintritt. Hat jemand dazu eine Idee, oder gibt es dazu vielleicht schon einen Code ? Ich programmiere mit BASCOM. Herzlichen Dank Enzo
Jetzt kann man so was wirklich sehr einfach mit BASCOM machen und Du willst nen Code dafür. Andere machen das in Assembler und C. Gruß Andi
Danke für Deine Antwort, hat mir sehr geholfen. Für eine Lösung in C wäre ich auch sehr dankbar. Aber selbst ist der Mann. Setze mich halt wieder die ganze Nacht hin um eine Lösung zu finden. Liebe Grüße Enzo
Ist doch eh am besten, sich selber dran zu setzen wegen dem Lerneffekt! Ansonsten ist hier im Thread "Timer" ein Ansatz für die Millisekunden-Geschichte zu finden. Mußt halt nur noch für Deinen µC entsprechend anpassen. Gennerell zählt man bei jedem ms-Takt eine Variable sagen wir mal MS immer um eins nach oben. Ist diese bei 1000 angelangt, wird Sekunde um eins hochgezählt und MS auf 0 gesetzt. Das gleiche gilt dann für Minute wenn Sekunde bei 60 und für Stunde wenn Minute bei 60 und Datum, Wochentag, Jahr. Aber Du willst ja nur Sekunden und Millisekunden. Dann kommt noch die Ausgabe auf einem LCD oder wird das nur intern für Wartezeiten benötigt? Gruß Andi
Hallo zusammen, es ist nicht so, daß ich nicht selber dran gesessen wäre. Wahrscheinlich haltet ihr mich für bekloppt aber da gingen schon viele Stunden drauf um zu recherchieren. Im unteren Code komme ich trotzdem nicht auf mein gewünschtes Ergebnis der Millisekundenzählung. Timer0 setzt bei Erreichung von 255 den Interrupt. Bei einem Prescale von 64 bei 4MHz, besitzt der Timer0 für jeden Impuls eine Zeit von 0,016 ms. Ich benötige also 256-192 = 64 Impulse des Timers0 damit er alle 1ms einen Interrupt erzeugt, und die Variable 'Millisekunden' inkrementiert. In der Do/Loop Schleife sollte ich dann alle Millisekunden einen Wert angezeigt bekommen, durch die Verzögerung der Darstellung natürlich nicht notwenig, aber die dargestellten Zeiten sollten in ms dargestellt analog der Realzeit sein. Nur die Zeit bzw die Werte die dargestellt werden zählen viel zu langsam. Dafür das es Milliskeunden sind, müßte pro Sekunde der Wert um 1000 steigen. Tut er aber nicht, ca um den Faktor 100 zu langsam. $regfile = "m8def.dat" $crystal = 4000000 Dim Millisekunden As Long Dim K As Long Const Reload = 192 Config Timer0 = Timer , Prescale = 64 On Timer0 Timer1int Enable Interrupts Enable Timer0 Do K = Millisekunden * 4 Print Millisekunden ; " " ; K Loop Timer1int: Load Timer0 , Reload Incr Millisekunden Return
> hat jemand eine Idee wo der Fehler liegt ?
4MHz 64 256 macht etwa 244 Interrupts pro Sekunde. Oben wurde aber
festgestellt, dass eine Sekunde 1000 Millisekunden enthält.
-> Dein Prescaler ist zu hoch.
bzw, bei Zeiten wie "0,016 ms" würde ich immer zwei Mal nachrechnen.
Das sind nämlich gerade mal 16us (Mikrosekunden). Bei 4Mhz benötigt ein
Takt eine viertel Mikrosekunde. Das heißt du hättest alle 64 Takte einen
Interrupt, was doch etwas schwerer zu realisieren ist.
ich kann meinen Prescaler aber nur mit den Werten 1,8,64,256,1024 belegen. Und 8 funzt auch nicht. Du schreibst 244 Interrupts pro Sekunde. Das würde heißen, daß sich die Variable "Millisekunden" pro Sekunde um ca. 244 statt um 1000 erhöht. Wenn ich das Progi im AVR Simulator von Bascom durchlaufen lasse, so wird diese Variable pro Sekunde nur um ca. 40 erhöht und nicht um 244, was ja auch noch zu wenig wäre. Ist es nicht möglich Millisekunden zu zählen mit Bascom ?? LG Enzo
na eigentlich stimmts... chris, du hast den preload vergessen.. 4.000.000/64/64 = 977 d.h. es bleiben 1000 irq pro sekunde übrig soweit scheint die rechnung doch zu stimmen :) wenn ich mal von assembler schaue, dann: irq-aufrufen 4+2 register sichern 2temp1, 3sreg = 5 preload werte laden und ausgeben = 2 inc low-register 1 brcc meist 2 (sonst: 1branch, 1x inc highregister) register zurückholen 5 reti 4 4+2+5+2+1+2+5+4=25... das is aber stinknormaler assembler.. kann man noch verbessern, aber basic wird sicher LÄNGER brauchen.. ob sich das dann mit den 64 schneidet.. dont know naja.. ich hasse basic g i pray for the power of assembler dave
Wenn die Rechnung stimmt, warum erhalte ich dann: 0 0 0 1 1 2 2 3 4 5 6 6 7 7 8 9 etc statt: 1000 2125 3125 4147 etc ????? lG Martin
> na eigentlich stimmts... chris, du hast den preload vergessen..
Sorry, hast Recht. Dann machts schon um die 1000 Interrupts pro
Sekunde.
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.