Sida 1 av 1

Omvandla x sekunder till "minuter och sekunder" ..

Postat: 12 december 2006, 02:09:47
av JimmyAndersson
Tänkte bygga om lite i tid-koden för min TFT-UV-box.

Med en encoder ställer man in tiden för nedräkningen.
Encodern ökar/minskar värdet i data1. Detta motsvarar antalet sekunder man ställer in. Sedan tänkte jag använda följande lilla kod för att omvandla till minuter och sekunder (för att det ser snyggare ut på displayen än att bara visa sekunder) :

Kod: Markera allt

     if data1 >= 60 then
       starttid_m = starttid_m + 1
       data1 = data1 - 60
     else
       starttid_s = data1
     end if
Sedan skrivs innehållet i starttid_m och starttid_s på displayen.
Detta sker alltså för varje gång som värdet i variabeln data1 ändras.

Problemet är bara att koden uppenbarligen bara fungerar när man vrider encodern medsols, dvs ökar tiden. Hur löser man detta? Jag skulle ju behöva minska variabeln starttid_m , men kan inte komma på hur if-raden ovan ska se ut. Eller finns det någon helt annan lösning som jag missat?

Postat: 12 december 2006, 02:54:54
av bearing
Om variablerna är en integers borde man kunna koda:

Kod: Markera allt


     starttid_s = starttid_s + data1

     while starttid_s >= 60
       starttid_m = starttid_m + 1
       starttid_s = starttid_s - 60
     endw

     while starttid_s < 0
       starttid_m = starttid_m - 1
       starttid_s = starttid_s + 60
     endw


(osäker på om syntaxen är rätt)

Om de inte är integers kan du byta ut: "starttid_s < 0" mot "starttid_s >=128" eller motsvarande maskning (kan inte syntaxen för det).

Postat: 12 december 2006, 03:12:08
av JimmyAndersson
edit: Plockade bort en tankevurpa. :)


bearing:
Variablerna är dimensionerade som bytes.

Jag förstår nästan hur du menar. Det enda frågetecknet är siffran 128. Variabeln starttid_s kan bli max 59, sedan blir den 0 igen.

Postat: 12 december 2006, 03:29:08
av bearing
En byte kan ju bli mellan 0 och 255, men om man vill att den ska lagra negativa siffror brukar man definiera 0-127 som positiva och man låter sedan 255 ner till 128 motsvara -1 ner till -128. Drar man bort 1 från en byte som innehåller värdet 0 blir ju värdet 255 eftersom den slår runt. Därför funkar det bra att hantera siffrorna på detta sättet.

"starttid_s >=128" motsvarar alltså "starttid_s < 0" kan man säga.

Ett snabbare sätt att kolla om det är negativt är att kontrollera att bit 7 är 1, då är nämligen värdet minst 128.

Postat: 12 december 2006, 03:31:51
av JimmyAndersson
Godmorgon! :D

Nu hänger jag med. Bra lösning!

Postat: 12 december 2006, 03:47:02
av bearing
Fast nu har jag gjort en tankevurpa. Man måste så klart lägga in att den kontrollerar om det är negativt först. För >=60 kommer ju även fånga negativa tal.

Postat: 12 december 2006, 13:02:34
av macgyver
annars om minut och sekundvariablerna bara är till för att visas på displayen och du inte har ont om programminne kan du ju skriva:

disp_min = starttid_s / 60;
disp_sek = starttid_s % 60; ( eller mod istället för % om du använder basic)

och låta starttid_s enbart ökas/minskas av encodern och alltid vara >= 0

Postat: 12 december 2006, 15:11:19
av JimmyAndersson
Hej! Det var länge sedan. :)

Enkel och smidig lösning!
Ska testa om det får plats, men jag tror det.

Postat: 12 december 2006, 15:53:59
av anlamotte

Kod: Markera allt

FormatTime:
  Tmp_m = 0
  Tmp_s = 0

  For M_adr = 1 To Tmp_tmr
    Incr Tmp_s
    If Tmp_s > 59 Then
      Incr Tmp_m
      Tmp_s = 0
    End If
  Next M_adr

  If Tmp_m < 10 Then
    Tmpstr = Tmpstr + "0"
  End If

  Tmpstr = Tmpstr + Str(tmp_m)
  Tmpstr = Tmpstr + ":"

  If Tmp_s < 10 Then
    Tmpstr = Tmpstr + "0"
  End If

  Tmpstr = Tmpstr + Str(tmp_s)

Return

Postat: 12 december 2006, 16:37:58
av bearing
Det tar nog längre tid också med / och %, fast jag kan tänka mig att det är gott om tid också i ett sånt här program.