mikrocontroller.net

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


Autor: enzo kleedorfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: enzo kleedorfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Läubi (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Hat nicht ein Sek = 100ms ??

Autor: Christof Krüger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat ein Meter 100mm?

Autor: enzo kleedorfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: enzo kleedorfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

hat jemand eine Idee wo der Fehler liegt ?

lG

Enzo

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: enzo kleedorfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dave (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: enzo kleedorfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> na eigentlich stimmts... chris, du hast den preload vergessen..

Sorry, hast Recht. Dann machts schon um die 1000 Interrupts pro
Sekunde.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.