Forum: Mikrocontroller und Digitale Elektronik Zähler oder Counter mit Millisekunden


von enzo kleedorfer (Gast)


Lesenswert?

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

von Andi (Gast)


Lesenswert?

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

von enzo kleedorfer (Gast)


Lesenswert?

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

von Andi (Gast)


Lesenswert?

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

von Läubi (Gast)


Lesenswert?

Hat nicht ein Sek = 100ms ??

von Christof Krüger (Gast)


Lesenswert?

Hat ein Meter 100mm?

von enzo kleedorfer (Gast)


Lesenswert?

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

von enzo kleedorfer (Gast)


Lesenswert?

Hallo,

hat jemand eine Idee wo der Fehler liegt ?

lG

Enzo

von Chris (Gast)


Lesenswert?

> 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.

von enzo kleedorfer (Gast)


Lesenswert?

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

von Dave (Gast)


Lesenswert?

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

von enzo kleedorfer (Gast)


Lesenswert?

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

von Chris (Gast)


Lesenswert?

> 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
Noch kein Account? Hier anmelden.