Omvandla x sekunder till "minuter och sekunder" ..

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
JimmyAndersson
Inlägg: 26586
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Omvandla x sekunder till "minuter och sekunder" ..

Inlägg 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?
bearing
Inlägg: 11677
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Inlägg 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).
Användarvisningsbild
JimmyAndersson
Inlägg: 26586
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg 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.
bearing
Inlägg: 11677
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Inlägg 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.
Användarvisningsbild
JimmyAndersson
Inlägg: 26586
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

Godmorgon! :D

Nu hänger jag med. Bra lösning!
bearing
Inlägg: 11677
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Inlägg 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.
macgyver
Inlägg: 321
Blev medlem: 8 juni 2005, 00:24:09
Ort: Göteborg
Kontakt:

Inlägg 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
Användarvisningsbild
JimmyAndersson
Inlägg: 26586
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

Hej! Det var länge sedan. :)

Enkel och smidig lösning!
Ska testa om det får plats, men jag tror det.
Användarvisningsbild
anlamotte
Inlägg: 859
Blev medlem: 5 augusti 2003, 15:54:34
Ort: Stockholm
Kontakt:

Inlägg 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
bearing
Inlägg: 11677
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Inlägg 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.
Skriv svar