Hello, Guest the thread was called1.3k times and contains 11 replays

last post from Hucky at the

Probleme mit Echtzeit

  • Tach !


    Ich habe da so nen Problem....


    Vorweg erstmal ne Frage, ist es besser den CIA 1 oder den 2 für die Uhr zu benutzen ? Oder ist das wurscht ? Fuscht der IRQ nicht in den Timer 1 mit rein ? Oder wie war das ?


    Naja, egal.


    Das Starten der Uhr klappt noch ganz gut. Innerhalb 10 Sekunden hat sie leider eine Abweichung von ca. 2 Sekunden.
    Toll, oder ?! :grr:


    Ich brauche das ganze für nen Hardwareprojekt.


    Es soll zwischen zwei Lichschranken die Durchgangszeit gemessen werden.


    Ich habe zuerst das Stundenregister mit 0 geladen. Dadurch bleibt die Uhr erstmal stehen. Danach habe ich das Minutenregister auf 0 gesetzt, dass die Sekunden, zum Schluss die Zehntel Sekunden, dadurch wurde die "Uhr" dann gestartet.
    Das Bit für 50Hz habe ich natürlich gesetzt.
    So.
    Da ganze habe ich mit ner Tastaturabfrage simuliert.
    Nachdem ich die einzelnen Register ausgelesen habe steht da manchmal sogar Mist. Wie kann das Sekunden Register den Wert 80 annehmen ?!
    Auf jeden Fall weicht die Zeit total von eine normalen Stoppuhr ab.
    Habe ich was falsch gemacht ?
    Darf ich überhaupt die einzelnen Register direkt auslesen, oder müssen die erst irgendwie umgerechnet werden ?


    mfG Hucky

  • Weiß nicht, ob's Dir hilft...


    Die Echtzeituhren arbeiten im BCD-Format, sowohl beim Lesen als auch beim Schreiben. Dezimale Eingaben führen zu nix.


    BCD = int(DEZ/10)*16+(DEZ-int(DEZ/10)*16


    oder anders herum:


    DEZ = int(BCD/16)*10+(BCD and 15)


    Die Echtzeituhren werden im Normalbetrieb nicht genutzt. Wenn ein Alarm ausgegeben werden soll, erzeugt der Timer im CIA#1 einen IRQ, der im CIA#2 einen NMI. Sonst haben die mit dem Interrupt nix zu tun (die "Interrupt-Zeit" in TI$ wird in den Adressen 160 - 162 gespeichert).


    00.00 Uhr (Mitternacht) wird als 12.00 Uhr morgens (12.00 AM) angezeigt.


    Ich hatte noch irgendwo ein Beispielprogramm, moment...

  • Uhr stellen:


    10 input"zeit" (hhmmss)";t$
    20 h$=left$(t$,2)
    30 m$=mid$(t$,3,2)
    40 s$=right$(t$,2)
    50 a=val(s$):gosub100:s=bc
    60 a=val(m$):gosub100:m=bc
    70 a=val(h$):ifa>11thenpm=128:a=a-12
    80 gosub100:h=bc or pm
    90 poke56334,129:poke56331,h:poke56330,m:poke56329,s:poke56328,0:end
    100 bc=int(a/10)*16+(a-int(a/10)*16):return


    Uhr lesen:


    10 h=peek(56331)and127
    20 m=peek(56330)
    30 s=peek(56329)
    40 a=s:gosub100:s$=str$(a)
    50 a=m:gosub100:m$=str$(a)
    60 a=h:gosub100:h$=str$(a)
    70 ifpeek(56331)and128thena=a+12:h$=str$(a)
    80 printh$"."m$":"s$
    90 z=peek(56328 ):end
    100 d=int(a/16)*10+(a and15):a=d:return


    Gutes Gelingen...

  • Hallo,


    ich mach das immer anders mit der Zeiterfassung.


    Speichere beim ersten Durchlauf TI und und ziehe diese Gespeicherte Zeit beim nächsten Durchlauf vom neuen Wert ab.


    Passend umrechnen und fertig. ergibt sogar eine Sekundenzeit mit Komma.


    Oder welchen Zeitraum brauchst du..?



    Aber Hallo
    Jogi

  • Hallo Christian,


    wenn ich 24 Stunden zwischen zwischen zwei Lichtschranken brauche sind mir ein paar Minuten egal. :D


    Habs mal für nee Rennbahn gebaut und da gings nur um 3-6sec.


    Kommt immer drauf an für was ich es nehmen will, manch mal reicht auch TI.


    Quote


    Es soll zwischen zwei Lichschranken die Durchgangszeit gemessen werden.


    sagt halt alles und nichts.


    Aber Hallo
    Jogi

  • @headroom


    Meine Uhr hängt leider auf 10 Sekunden 1,7 Sekunden hinterher.


    Was habe ich denn falsch gemacht ?!


    100 POKE 56328+3,0 : POKE 56328+2,0 : POKE 56328+1,0
    110 PRINT "TASTE = START"
    120 GET A$: IF A$ = "" THEN 120
    130 POKE 56328,0
    140 PRINT "TASTE - STOP"
    150 GET A$: IF A$ = "" THEN 150
    200 H = PEEK (56328+3) AND 127
    210 M = PEEK (56328+2)
    220 S = PEEK (56328+1)
    230 Z = PEEK (56328+0)
    240 A=S : GOSUB 400 : S$=STR$(A)
    250 A=M : GOSUB 400 : M$=STR$(A)
    260 A=H : GOSUB 400 : H$ =STR$(A)
    270 A=Z: GOSUB 400 : Z$ = STR$(A)
    300 PRINT "STUNDE";H$
    310 PRINT "MINUTE";M$
    320 PRINT "SEKUNDE";S$
    330 PRINT "ZEHNTEL";Z$
    340 END
    400 D=INT(A/16)*10+(A AND 15):A=D:RETURN



    mfG Hucky


    http://www.emuecke.de

  • Danke....


    ist nicht für mich, aber ich werde bestimmt mal drauf zurückgreifen...


    Schon komisch. Im C64 Intern steht es anderes drin, speziell das Umwandeln von BCD -> Dezimal. Mit dem Programm funzt es auch nicht.


    mfG Hucky


    http://www.emuecke.de