logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[mega8][Bascom] Formatowanie zmiennych Byte i Word

tomwlo 09 Sie 2008 23:13 2025 1
REKLAMA
  • #1 5425107
    tomwlo
    Poziom 10  
    Witam wszystkich kolegów.
    Od jakiegoś czasu zmagam się z uC AVR. wymyśliłem już kilka rzeczy, ale zwiesiłem się na problemie, mianowicie jak formatować zmienne typu Byte, lub Word.

    Zrobiłem Częstościomierz programowy, i wszystko działa, ale w celu fajnego wyświetlania wyniku w formacie " FAN : 960 rpm " musiałem utworzyć taki kawałek kodu:
    Wyswietlanieliczb:
       Locate 2 , 2
          Select Case Fan
             Case Is < 10 : Lcd "FAN :    " ; Fan ; " rpm"
             Case Is < 100 : Lcd "FAN :   " ; Fan ; " rpm"
             Case Is < 1000 : Lcd "FAN :  " ; Fan ; " rpm"
             Case Is < 10000 : Lcd "FAN : " ; Fan ; " rpm"
             Case Is > 9999 : Lcd "FAN : " ; "?^^?" ; " rpm"
          End Select
    Return


    Pytanie:
    Czy istnieje prostszy sposób aby skonwertować liczbę np 123 na 0123 (wyrównanie do prawej, nie do lewej), podobnie jak to się dzieje w przypadku instrukcji FORMAT dla zmiennych tekstowych typu STRING?

    Wiem, że można przekształcić zmienne word na string i wtedy obrobić, ale jest to chyba niepotrzebna strata pamięci procesora...

    Bardzo prosiłbym o odpowiedź.
    Pozdrawiam
  • REKLAMA
  • #2 5451306
    tomwlo
    Poziom 10  
    OK, witam ponownie
    po braku odpowiedzi, wywnioskowałem iż nikt nie posiada żadnego prostszego i sprawdzonego sposobu na formatowanie liczb w postaci zmiennych typu WORD i BYTE.

    Zgodnie z tym założeniem, napisałem sobie programik, z zegarkiem i kilkoma menu. Z założenia powinno wyglądać to tak:
    timer przepełnia się dokładnie co 1s, wtedy zmienna SEK jest zwiększana od 0 do 59 (i tak dalej jak w zegarku).
    W zależności od ilości kliknięć portem B.1 pojawiają się różne menu (wyświetlanie czasu i jakieś durne teksty, dla ćwiczenia).

    Czas formatowany jest podczas wywołania etykiety Et_wyswietlanieczasu, gdzie powinien czas formatować się na 00 : 00 : 00.
    Wszystko z początku działa, ale po upłynięciu pewnego czasu (różnie bywa, 1 minuta, 3 minuty ,5 minut) IC "myli" się w formatowaniu i w miejscu czasu pojawia się 00 : 00 : 000. Zupełnie jakby nie zdążył z jakimiś obliczeniami... .
    Proszę o pomoc, załączam kod programiku, uwaga roi się od etykiet.

    
    '----------------------------------------------------------------------------
    '........OPIS PROGRAMU.......................................................
    '----------------------------------------------------------------------------
    $regfile = "m8def.dat"
    $crystal = 8000000
    '----------------------------------------------------------------------------
    '........LCD.................................................................
    '----------------------------------------------------------------------------
    Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5
    Config Lcd = 16 * 2
    '----------------------------------------------------------------------------
    '........DEKLARACJE..........................................................
    '----------------------------------------------------------------------------
    'porty
    Config Pinb.1 = Input
    Config Pinb.2 = Input
    Portb.1 = 1
    Portb.2 = 1
    'timery
    Config Timer1 = Timer , Prescale = 256
    Enable Timer1
    Enable Interrupts
    On Timer1 Et_przerwanie
    'zmienne
    Dim Migacz As Bit
    Dim Godz As Byte
    Dim Minuta As Byte
    Dim Sek As Byte
    Dim Stanb1 As Byte
    Dim Stanb1_help As Bit
    Dim Stanb2 As Byte
    Dim Stanb2_help As Bit
    Dim Iloscprzerwan As Word
    '----------------------------------------------------------------------------
    '........ZAŁOŻENIA WSTĘPNE...................................................
    '----------------------------------------------------------------------------
    Cls
    Migacz = 0
    Stanb1_help = 0
    Stanb2_help = 0
    Stanb1 = 1
    
    Cursor Off
    '----------------------------------------------------------------------------
    '........PĘTLA GŁÓWNA........................................................
    '----------------------------------------------------------------------------
    Do
    Gosub Et_stan_pinb1
    Gosub Et_wybormenu
    Locate 1 , 2
    Lcd Iloscprzerwan
    
    Loop
    End
    '----------------------------------------------------------------------------
    '........ETYKIETY............................................................
    '----------------------------------------------------------------------------
    Et_przerwanie:
    Timer1 = 34286
    Iloscprzerwan = Iloscprzerwan + 1
    Toggle Migacz
       If Sek < 59 Then
             Sek = Sek + 1
          Else
             Sek = 0
             If Minuta < 59 Then
                   Minuta = Minuta + 1
                Else
                   Minuta = 0
                   If Godz < 23 Then
                         Godz = Godz + 1
                      Else
                         Godz = 0
                  End If
             End If
       End If
    Return
    '............................................................................
    Et_wyswietlanieczasu:
    '......ustawienie czasu impulsu na 1 sekundę
    'zmienne do ustawienia
    'Godz - godziny od 00 do 23
    'Minuta - minuty  od 00 do 59
    'Sek - sekundy od 00 do 59
    '......uruchamianie mrugania dwukropków
    '(   If Migacz = 0 Then
             Locate 2 , 6
             Lcd ":"
             Locate 2 , 11
             Lcd ":"
          Else
             Locate 2 , 6
             Lcd " "
             Locate 2 , 11
             Lcd " "
       End If
    ')
    '......umiejscowienie godzin w odpowiednim miejscu
    Locate 2 , 3
       If Godz < 10 Then
             Lcd "0" ; Godz
          Else
             Lcd Godz
       End If
    '......umiejscowienie minut w odpowiednim miejscu
    Locate 2 , 8
       If Minuta < 10 Then
             Lcd "0" ; Minuta
          Else
             Lcd Minuta
       End If
    '......umiejscowienie sekund w odpowiednim miejscu
             Locate 2 , 13
       If Sek < 10 Then
             Lcd "0" ; Sek
          Else
             Lcd Sek
       End If
    Return
    '............................................................................
    Et_stan_pinb1:
       If Stanb1_help = 1 Then
                If Pinb.1 = 0 Then
                   Cls
                   If Stanb1 > 3 Then
                         Stanb1 = 1
                         Stanb1_help = 0
                      Else
                         Stanb1 = Stanb1 + 1
                         Stanb1_help = 0
                   End If
                End If
           Else
                If Pinb.1 = 1 Then
                   Stanb1_help = 1
                End If
       End If
    Return
    '............................................................................
    Et_stan_pinb2:
       If Stanb2_help = 1 Then
                If Pinb.2 = 0 Then
                   Stanb2 = Stanb2 + 1
                   Stanb2_help = 0
                End If
           Else
                If Pinb.2 = 1 Then
                   Stanb2_help = 1
                End If
       End If
    Return
    '............................................................................
    Et_menu_1:
    Gosub Et_wyswietlanieczasu
    Return
    '............................................................................
    Et_menu_2:
    Locate 1 , 2
    Lcd "Zmień czas"
    Locate 2 , 2
    Lcd "godzina: "
    Return
    '............................................................................
    Et_menu_3:
    Locate 1 , 2
    Lcd "Zmień czas"
    Locate 2 , 2
    Lcd "minuta: "
    Return
    '............................................................................
    Et_menu_4:
    Locate 1 , 2
    Lcd "Uśmiechnij się"
    Locate 2 , 2
    Lcd "Jutro do pracy"
    Return
    '............................................................................
    Et_wybormenu:
    Select Case Stanb1
    Case 1 : Gosub Et_menu_1
    Case 2 : Gosub Et_menu_2
    Case 3 : Gosub Et_menu_3
    Case 4 : Gosub Et_menu_4
    End Select
    
    Return
    '----------------------------------------------------------------------------
    '.......KONIEC PROGRAMU.....................................................
    '----------------------------------------------------------------------------


    Bardzo proszę o pomoc, siedzę już nad problemem tydzień.

    PS.
    wczoraj wydawało mi się że zatłukłem Atmegę8 (przy zmianie fusebit na zewnętrzny Xtal,) a okazało się że nóżka od Xtal1 była nie przylutowana, w ogóle :). A najśmieszniejsza rzecz : na LCD pojawiały się znaki z programu, ale w tempie 1 na 5 s.

    Pozdrawiam, Tomek
REKLAMA