[uC] Microprocessor: klok omrekenen

Pagina: 1
Acties:
  • 103 views sinds 30-01-2008
  • Reageer

  • 3lmowww
  • Registratie: April 2002
  • Laatst online: 17-06-2022
Ik heb een klokmodule (Dallas semiconductor iButton, DS1904)

Dit is in principe een 32 bits secondenteller, maar mijn microcontroller kan maar met 16 bit berekeningen uitvoeren, wat inhoud dat:
- ik geen decimalen heb
- geen getallen groter dan 66536 (hex FFFF) kan gebruiken.

Kan iemand mij helpen met het berekenen dat ik de minuten en uren (in 24 uren) in variabelen kan krijgen?

Ik kan met mijn microcontroller wel delen, vermenigvuldigen, optellen en aftrekken en dergelijken, evenals logische functies enzo (het gaat om een parallax BS2p uC, en later wil ik dit uitbreiden naar een PIC16F628)

Ik krijg dus bijvoorbeeld dit binnen uit de klokmodule:

code:
1
2
3
4
5
6
7
8
0000003C hex = 00000060 dec = 1 minuut
00000E10 hex = 00003600 dec = 1 uur
00015180 hex = 00086400 dec = 24 uur
00000E4C hex = 00003660 dec = 1 uur, 1 minuut

bij:
00015FCC hex = 00090060 dec
moet de klok dus 1 uur 1 minuut weergeven...


Alle tips zijn welkom

[ Voor 5% gewijzigd door 3lmowww op 26-10-2003 13:20 ]

Electronics development


  • TheGhostInc
  • Registratie: November 2000
  • Niet online
Ok, hier gaan we ;)

Allereerst het 16-32bits verhaal.
Heel toevallig, 32bits is 2x 16bits, als het goed is moet het lukken om die 32bits in 2 16bits getallen te zetten, dan heb je in het geval van 24uur:
0001
5180

Een oplossing is:
Je neemt het getal wat je hebt uitgelezen, en haalt daar net zolang 0E10 vanaf, totdat het getal negatief wordt. (oftwel, wanneer de waarde door 0 gaat, dit is een instructie, waarbij een flag wordt gezet die hoog wordt als je 0 passeerd)
Het aantal keer *voordat* hij 0 passerd is het aantal uren.
Daarna met de rest die overbleef nog een keer telkens 003C eraf halen, totdat je weer hetzelfde krijgt, en de rest is de seconden.
Je doorloopt dan nog geen 100 keer door een loopje heen, dat moet haalbaar zijn.

Andere oplossing is de waarde telkens bitwise te verschuiven, en aan de hand van de "afvallende" bit kun je dan telkens bepalen wat er bij moet komen, waarschijnlijk gaat dit iets sneller, maar is wel gevoeliger voor fouten.

Gooi maar iets op ICQ als je meer info wil over die laatste optie, ik ben vanavond online.

Andere oplossing, de handigste: (moet duidelijk nog een beetje wakker worden)
Gewoon delen.
die 1000 (in hex) Komt overeen met iets van 18 uur, 12 minuten en 16 seconden (oid).

Je pakt het andere getal en deelt dat eerst door 3600, het aantal wat er uitkomt is de uren, de rest is het aantal minuten+seconden. dat deel je weer door 60, dan is de uitkomst weer de minuten, en de rest is seconden.
Daar tel je eventueel dan die 18 uur 12 minuten en 16 seconden bij op, (opletten als je bij de sec. of min over de 60 gaat) en je bent klaar.

* TheGhostInc was daarnet echt niet wakker

[ Voor 25% gewijzigd door TheGhostInc op 26-10-2003 13:44 . Reden: aanvulling ]


  • 3lmowww
  • Registratie: April 2002
  • Laatst online: 17-06-2022
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
start:
  getvars:
    msb = $0011       'meest significant
    lsb = $0000       'minst significant (laatste is secs)

  calcmsb:
    FOR time = 1 TO msb
      scs = scs + 16
      DO WHILE (scs > 60)
        scs = scs - 60
        mns = mns + 1
      loop
      DO WHILE (mns > 60)
        mns = mns - 60
        hrs = hrs + 1
      LOOP
      DO WHILE (hrs > 24)
        hrs = hrs - 24
        dys = dys + 1
      LOOP
      mns = mns + 12
      hrs = hrs + 18
    NEXT

    DEBUG DEC dys," ", DEC hrs,":", DEC mns,":",DEC scs, CR

zo, msb = most significant 2bytes, lsb last significant 2bytes.
in de getvars: gaat hij de vars uit de module halen... even duidelijk gesimeuleerd ;)

het calculeren van de most significant 2bytes gaat al lukken :)
dys = dagen
hrs = uren
mns= minuten
scs = seconds

geschreven in pBasic, taal voor mijn bs2p

Electronics development


  • TheGhostInc
  • Registratie: November 2000
  • Niet online
Ik heb een bitje moeite met basic (geef mij maar C of asm), ga dan ook niet proberen je code te doorgronden. Heb niet het idee dat het heel logisch geprogrammeerd is.
De keuze om een FOR loop te gebruiken en die "msb" aantal keer te laten doorlopen is wel logisch, maar ik weet niet 100% zeker dat dit ook goed gaat voordat die msb > 1.

Als ik je loop 1x doorloop, en me voorstel dat het 1 uur is (oid) dan komt er volgens mij bij jou uit: 19 uur en 12 minuten (en 16seconden) Maar het kan zijn dat ik ergens een syntax verkeerd lees.

Succes er verder mee, er zijn afaik veel mensen met iButton's of interesse erin, die

  • PiepPiep
  • Registratie: Maart 2002
  • Laatst online: 08-06 11:02
Kan die taal ook rest delingen aan, dus modulo.
Ik zou namelijk niet graag willen wachten op een lus die tig keer wordt doorlopen als het 's avonds laat is.
ipv elke keer 60 seconden van de seconden af te halen en een minuut erbij te doen kan je doen.
minuten = seconden / 60
seconden = seconden modulo 60

Valt me trouwens nog mee dat er geen slotje op dit topic staat, je zegt namelijk niet wat je zelf al geprobeert hebt en wat je ideeen zijn.

486DX2-50 16MB ECC RAM 4x 500MB Drive array 1.44MB FDD MS-Dos 6.22


  • TheGhostInc
  • Registratie: November 2000
  • Niet online
PiepPiep schreef op 26 October 2003 @ 15:12:
Kan die taal ook rest delingen aan, dus modulo.
Ik zou namelijk niet graag willen wachten op een lus die tig keer wordt doorlopen als het 's avonds laat is.
ipv elke keer 60 seconden van de seconden af te halen en een minuut erbij te doen kan je doen.
minuten = seconden / 60
seconden = seconden modulo 60
Daar heb je gelijk in, maar zoals ik in de post hierboven (ondertussen doorgestreept) al zei, 100x een loopje doorlopen is geen probleem.
Zeker zo'n PIC-je voert al gauw een miljoen instructies per seconde uit.

modulo is wel mogelijk met de meeste uProcessors
Valt me trouwens nog mee dat er geen slotje op dit topic staat, je zegt namelijk niet wat je zelf al geprobeert hebt en wat je ideeen zijn.
Zie je iets dat niet door de beugel kan, attendeer dan een moderator via een topicreport maar post hierover niet in het topic, dat werkt alleen averechts. Zie ook de policy die wij op dit forum hanteren.
NOFI, maar ik moet toegeven dat de poging om het probleem op te lossen wat sumier waren, maar dat de openingpost wel dusdanig veel info bevatte dat ik me goed kon voorstellen dat hij even niet wist waar hij mee bezig was.
Programmeren van uProcessors is vaak lastiger omdat je zowel met hardware als software in je hoofd zit.

  • 3lmowww
  • Registratie: April 2002
  • Laatst online: 17-06-2022
Sorry dat ik niet gepost heb wat ik al geprobeerd had: ik kon bij geen enkele gedachte die ik zelf had zo ver komen dat er een mogelijkheid bestond dat het zou werken. had ik er even bij moeten zetten.

Dit is het display hoe het nu draait, word nog fraai ingebouwd, voor de geinteresseerden.

De software klopt nog steeds niet volledig, ik ga nog even de documentatie van mn chip goed lezen over hoe die berekeningen uitvoerd.

Bedankt voor de tip over de modulo, net gekeken en die functie kan ik ook gebruiken... julie horen nog hoe het afloopt.

Electronics development

Pagina: 1