You are not logged in.

Dear visitor, welcome to Forum64. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

Semtex-H

Unregistered

1

Friday, July 16th 2004, 6:52pm

Timer (TI$)

Hi Leutz !

Weis jemand ob und wie man 2 unabhängige Timer programmieren kann ?
Soweit ich weis, geht TI$ nur 1x....!?
Man könnte noch TI auslesen , aber die Umrechnerei in Sekunden ist so performance killend und lästig.

Einer 'ne Idee ?

Gruß Frank

Thomas H

Unregistered

2

Friday, July 16th 2004, 8:51pm

Hallo Frank

Du kannst ja die Timer in den beiden CIAs nutzen, wobei der Timer A von CIA ja für den Syteminterrupt verwendet wird, der auch TI weitersetzt, das ja nur ein Systeminterruptszähler ist.


Gruß Thomas

kottira

Unregistered

3

Friday, July 16th 2004, 10:02pm

Hi,

ich empfehle wieder mal die Time-of-Day-Clock. (Eine ähnliche Frage gab es neulich in der ASM-Rubrik von Turrican.) Es gibt ja sogar zwei unabhängige TODs, das wäre für den Zweck doch ideal. Man muß sich nur mal mit dem System zum Setzen und Auslesen vertraut machen.

Die bisher beste Beschreibung gibt es bei Project 64 genauer: http://project64.c64.org/misc/mapc6411.zip . Im Dokument selber gibt es unter Adresse 56328 eine Erklärung mit Basic-Beispielprogramm. Das Programm ist je nach Anwendung vermutlich unnötig kompliziert, aber eben mal ein Beispiel.

Was in dem Programm fehlt ist das bei uns (50 Hz) nötige Setzen von Bit 7 in 56334, damit die Uhr auch genau lauft. Uhr Nr. 2, die genauso funktioniert, liegt an den Adressen ab 56584.

Für jede Uhr gibt es ein Sekundenregister: Inhalt AND 15 ergibt die 1er Stelle, (Inhalt/16 ) AND 15 die 10er Stelle.

Fein, oder? Der C64 ist eben eine wahre Schatzkammer. :D

Franz

Semtex-H

Unregistered

4

Saturday, July 17th 2004, 1:09am

Hi !

Erstmal danke. Aber das mit der MAP-dings raff ich net.
Die Timer der Beiden CIA's wären generell ok , aber dann kann ich gleich wieder TI umrechnen.

Gibts keine Möglichkeit , ein 2. TI$ zu nutzen , also eins das direkt in sekunden zählt ?
Habe auch schon probiert die Inhalte von TI$ zu übertragen in verschiedene Variablen, aber kriegei ch nicht hin.

Vieleicht bin ich zu blöd oder ich seh's nicht...

Gruss Frank

Semtex-H

Unregistered

5

Saturday, July 17th 2004, 1:45am

Und :

funktioniert das abfragen der CIA-Timer auch , wenn ich im gleichen Programm den Userport programmiere ? Weil irgendwie haben die CIA-Timer doch da ihre Finger im Spiel ?!?

Frank

kottira

Unregistered

6

Saturday, July 17th 2004, 2:26am

Also, die CIA-Timer funktionieren unabhängig davon, was die CIAs sonst noch so zu tun haben. Und sie zählen in jeweils getrennten Registern Stunden, Minuten, Sekunden und 10/Sekunden. Man muß nur jeweils 1er und 10er Stelle des Wertes für die Anzeige rausrechnen.

Wozu soll denn das Ganze ungefähr dienen? Z.B. ab Ereignis x/y zwei Zeiten in Sekunden anzeigen? Geht die zu messende Zeit über 60 Sekunden hinaus? Wird nur Zeit angezeigt oder soll das Programm bei einer bestimmten Zeit reagieren? Davon wird wahrscheinlich abhängen, was die zweckmäßigste Lösung ist.

Zum Umrechnen von TI in Sekunden: einfach durch 60 dividieren. Bei 2 Zeiten müßte man die Startzeiten erfaßen und vom jeweils aktuellen Wert abziehen (von Komplikationen wie 24-Stunden-Übertrag mal abgesehen...)

Franz

Semtex-H

Unregistered

7

Monday, July 19th 2004, 3:26am

ok !

Weiss jemand die Adressen , die ich auslesen muss ?

Gruß Frank

PS : habe das Problem in der Zwischenzeit auf andere Weise auch gelöst :
TI umgerechnet und in verschiebbaren Variablen abgelegt. Problem war nur der Umstand , dass TI sich ändert , wenn sich TI$ ändert. Bitte aber trotzdem die Adressen für die CIA Timer nennen, damit ich später umändern (Plan B) kann...

  • "Fröhn" is male

Posts: 4,493

Date of registration: Jan 5th 2004

Location: MOS County

  • Send private message

member since 108 month member since 108 month member since 108 month member since 108 month member since 108 month member since 108 month

8

Monday, July 19th 2004, 11:11am

am einfachsten wäre eine kleine assemblerroutine, die die TOD benutzt und den wert in eine basic variable schreibt. komplett in basic wäre das doch etwas lahm und auch kompliziert.

Semtex-H

Unregistered

9

Monday, July 19th 2004, 4:21pm

Hi !

Macht nix , wenns in Basic lahm ist , ich compiliere es nachher eh.

Weiss jemand die Adressen bzw Register und Bits ?

Gruss Frank

kottira

Unregistered

10

Monday, July 19th 2004, 6:54pm

Ja, weiß ich. :))

[list]CIA1 / CIA 2
56228 56584 1/10 Sekunden
56329 56585 Sekunden
56330 56586 Minuten
56331 56587 Stunden
56334 56590 Bit 7 setzen = 50 Hz[/list]

Die 50 Hz müssen nur einmal gesetzt werden. Beim Setzen bzw. Null-Setzen einer Uhrzeit ist es so, daß zuletzt die 1/10 Sekunden gepokt werden müssen, damit die Uhr zu laufen anfängt. Beim Auslesen ist es ähnlich: zuletzt müssen die 1/10 Sekunden gepeekt werden (auch wenn man sie gar nicht braucht), da die Uhr den Wert in den Registern beim Auslesen einfriert und erst wieder updatet, wenn die 1/10 Sekunden gelesen worden sind.

Die Werte sind im BCD-Format. In Basic kann man sich z.B. Funktionen definieren:
1 DEF FNA(X)= 48 OR (X/16) AND 15
2 DEF FNB(X)= 48 OR X AND 15

FNA(gepeekter Wert) liefert die 10er Stelle, FNB die 1er Stelle. Da es Zahlencodes sind, kann man die zwei Stellen entweder in den Bildschirm poken oder mit CHR$ zu einem String addieren.

Semtex-H

Unregistered

11

Monday, July 19th 2004, 7:39pm

Cool !

Ich danke Dir & Euch !!

So kann ich das direkt verarbeiten , die beiden Zeiten vergleichen und Bedingungen erstellen - genau was ich brauche.

Vielen Dank ...

Gruss Frank

Semtex-H

Unregistered

12

Tuesday, July 20th 2004, 4:00am

Quoted

Original von kottira
Ja, weiß ich. :))

[list]CIA1 / CIA 2
56228 56584 1/10 Sekunden
56329 56585 Sekunden
56330 56586 Minuten
56331 56587 Stunden
56334 56590 Bit 7 setzen = 50 Hz[/list]

Die 50 Hz müssen nur einmal gesetzt werden. Beim Setzen bzw. Null-Setzen einer Uhrzeit ist es so, daß zuletzt die 1/10 Sekunden gepokt werden müssen, damit die Uhr zu laufen anfängt. Beim Auslesen ist es ähnlich: zuletzt müssen die 1/10 Sekunden gepeekt werden (auch wenn man sie gar nicht braucht), da die Uhr den Wert in den Registern beim Auslesen einfriert und erst wieder updatet, wenn die 1/10 Sekunden gelesen worden sind.

Die Werte sind im BCD-Format. In Basic kann man sich z.B. Funktionen definieren:
1 DEF FNA(X)= 48 OR (X/16) AND 15
2 DEF FNB(X)= 48 OR X AND 15

FNA(gepeekter Wert) liefert die 10er Stelle, FNB die 1er Stelle. Da es Zahlencodes sind, kann man die zwei Stellen entweder in den Bildschirm poken oder mit CHR$ zu einem String addieren.



Hi nochmal !

Habs mal probiert - Zeit in Gang bringen -OK!
Auslesen auch ok ! Die werte springen (weil im BCD (?) Format ) ...
Also umrechnen...

ABER : ich raff das nit mit "DEF FNA" etc.
WAS muss da WO rein ?

Angenommen die Sekunden übertrage ich in Variable "B" ...

DEF FN...*@!?! - HÄ?

Bitte helfen ....

Frank

kottira

Unregistered

13

Tuesday, July 20th 2004, 9:49am

Die DEF-Anweisungen muß das Programm nur einmal ausführen, damit es die Funktionen anlegt. Meistens stehen sie daher am Programmanfang.

Die Funktion aufrufen kann man dann jederzeit und mit beliebigen numerischen Werten bzw. Variablen in der Klammer. Zum Beispiel:

B=PEEK(56329)
B1=FNA(B) : B2=FNB(B)
oder
PRINT FNA(B); FNB(B)
oder
POKE 1024,FNA(B) : POKE1025,FNB(B)

Man kann das natürlich auch anders machen und statt eine definierte Funktion zu verwenden jedesmal direkt rechnen oder das mit einer Subroutine lösen. Im Prinzip geht es nur darum, wie man aus einem BCD-Wert zwei Zahlenstellen zum Anzeigen gewinnt.

Semtex-H

Unregistered

14

Tuesday, July 20th 2004, 10:39am

Moin !

Funzt bei mir nicht , wenn ichs eingebe , kommt immer 48 raus ?!?

müsste doch so laufen :

Am Anfang des Progs

DEF FN(X)=48 OR (X/16) AND 15
DEF FN(X)=48 OR X AND 15


...dann alle Pokes gesetzt (BIT 0 und 7 an adresse 56334 und alle anderen auf null)
... in Endlosschleife lese ich die Adressen aus - B=PEEK(56329)

und dann

? FNA(B) - [ ? FNB(B) mal weggelassen...]


Sachter bei mir immer 48 ...?!?
Was ist verkehrt ?

Gruss

Frank

This post has been edited 2 times, last edit by "Semtex-H" (Jul 20th 2004, 10:48am)


Semtex-H

Unregistered

15

Tuesday, July 20th 2004, 10:30pm

PS : ist das BCD - Format = Hex ?

Gruss Frank

kottira

Unregistered

16

Wednesday, July 21st 2004, 10:54am

Quoted

Original von Semtex-H
Am Anfang des Progs

DEF FN(X)=48 OR (X/16) AND 15
DEF FN(X)=48 OR X AND 15


Müßte heißen FNA(X) und FNB(X). Ist aber sicher nur ein Tippfehler hier, im Programm hätte es eine Fehlermeldung gegeben.

Quoted

Sachter bei mir immer 48 ...?!?
Was ist verkehrt ?


Kann ich Dir auch nicht sagen. Programm unterbrechen und im Direktmodus probieren, ob die Funktion stimmt: FNA(16) müßte z.B. 49 ergeben. Schauen, welchen Wert die Variable B hat. Wenn die tatsächlich immer Null ist, stimmt mit dem Auslesen der Zeit was nicht.

BCD ist ein Zahlenformat, bei dem 4 Bit eine dezimale Zahl 0...9 darstellen. In einem Byte mit 8 Bit stecken demnach 2 Dezimalzahlen.

Semtex-H

Unregistered

17

Wednesday, July 21st 2004, 2:49pm

Hallo,

wir müssen mal eben sortieren und Klarheit schaffen.
Also, um die vermeindliche Uhr laufen zu lassen (eigentlich nur um eine Zählfunktion in Gang zu bringen) , tue ich folgendes :

10 A=56328:B=56329:C=56330:D=56331:E=56334
20 POKE E,129:POKE D,0:POKE C,0:POKE B,0:POKE A,0 (Bit 1und7 setzen, alle Werte 0)
30 CLS:? PEEK (D)
31 ?PEEK(C)
32 ?PEEK(B):ZS=PEEK (B) (Sekunden anzeigen, ZS=Wert der Sekunden)
33 ?PEEK(A)
40 GOTO 10

So konnte ich erstmal sehen , was passiert.
Es Zählen alle Stellen.

DAnn habe ich hinzugefügt :

5 DEF FNA(X) = 48 OR (X/16) AND 15
6 DEF FNB(X) = 48 OR X AND 15

35 LET Y= FNA (ZS))
36 ? Y

FNB habe ich erstmal rausgelassen , weil FNA schon so komisch ist.

Folgendes passiert :

Alle Stellen Zählen immer noch , Y ist ab Start = 48 , sobald PEEK(B) grösser 9 ist (Also auf 16 springt (!) ) , erhöht sich Y auf 49.
Eigentlich erhöht sich Y bei jedem Sprung von PEEK(B) - also den Sekunden - um 1...?!

Komme ich irgendwie nicht drauf klar.
Oder ich habe einen Knoten im Hirn ......


Gruß Frank

This post has been edited 3 times, last edit by "Semtex-H" (Jul 21st 2004, 2:51pm)


kottira

Unregistered

18

Thursday, July 22nd 2004, 12:02am

Völlige Klarheit kann ich jetzt auch nicht schaffen - zumal ich gerade vom Gastgarten komme :bia

Aber ganz abgesehen von Zeile 30 (mein C64 kennt CLS nicht), würde vielleicht alles so passen, wenn Du statt

Quoted

35 LET Y= FNA (ZS))
36 ? Y


schreiben würdest:
35 ? CHR$(FNA(ZS));CHR$(FNB(ZS))

FNA() und FNB() liefern 10er und 1er Stellen für eine Uhrzeit im ASCII- bzw. BS-Code.

Wenn Du statt druckbarer Zeichen lieber den numerischen Wert hättest, dann kann man den gewinnen mit (immer noch ZS=Registerinhalt) Y=10*INT(ZS/16)+(ZS and 15).

Man könnte auch eine (in dem Fall wäre es nur eine) definierte Funktion anlegen:
DEF FNA(X)=10*INT(X/16)+(X and 15)
und hätte mit
? FNA(ZS) den Wert geliefert.

Es hängt eben alles ein bißchen davon ab, was Du mit den Uhrzeiten anstellen möchtest.

Semtex-H

Unregistered

19

Thursday, July 22nd 2004, 1:22am

Hmmmm...

CLS (clearscreen) habe ich hier nur stellvertretend für Print"Clearhome" geschrieben, weil hier ja das Zeichen nicht geht...

Also im Prinzip benötige ich die Timer nur , um bis zu einem bestimmten Wert (z.B. 120 sek.) raufzuzählen und während des Raufzählens Bedingungen zu erfüllen.Also z.B. "wenn der Wert des Timers = xx ist dann mache..." und ab einer gewissen Zeit geht das Ganze von vorne los, also alles wieder auf null.
Eine reine Uhrzeit brauche ich nicht.
Störend sind in der Zählfunktion eben nur die "Sprünge" , wobei ich nicht verstehe, wieso die Timer z.B. von 9 direkt auf 16 springen usw.
Es würde genügen , wenn ich einfach die genauen Sekunden raus hätte.


Gruss Frank

This post has been edited 1 times, last edit by "Semtex-H" (Jul 22nd 2004, 1:23am)