Zähler oder Counter mit Millisekunden

Gast #126429
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
Gast
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
Gast
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
Gast
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
Gast
> 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.
Gast
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
Gast
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 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.