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

[Bascom] Dziwny problem z funkcjami

Logan 23 Mar 2010 20:52 1484 4
  • #1 7871705
    Logan
    Poziom 30  
    Witam

    Postanowiłem nauczyć się wykorzystywać funkcji w swoich programach. Na początek chciałem przerobić opanowaną jakiś czas temu obsługę układu DS1307. Nie wiem czemu, ale wartości na lcd dochodzą do 59 i program staje, procesor się nie zawiesza, po prostu wartość 59 zamarza na wyświetlaczu. Błąd musi być gdzieś w funkcji, w jej wywołaniu, bo zawartość wydaje mi się OK.

    $regfile = "m8def.dat"       'Atmega8
    $crystal = 8000000  'oscylator 8MHz
    
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portb.5 , Db5 = Portb.4 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.1 , Rs = Portd.7
    Cursor Off
    
    Config Scl = Portc.5
    Config Sda = Portc.3
    Config Watchdog = 2048
    
    Const Adres_w = &B11010000
    Const Adres_r = &B11010001
    
    Declare Function Stringi(czas_dec As Byte) As String       'zamiana danych na stringi
    Declare Sub Zapis(index As Byte , Zawartosc As Byte)       'zapis danych do DS1307
    Declare Sub Dec_bcd(zawartosc As Byte)       'zamiana danych z DEC na BCD
    
    '***** ZMIENNE ******
    Dim Zawartosc(8) As Byte       '1 -sekundy, 2 -minuty, 3 -godziny, 4 -dzien tygodnia, 5 -dzien Miesiaca, 6 -miesiac, 7 -rok,8-eeprom
    Dim Inx_zaw As Byte 'index zmiennej Zawartosc
    Dim Czas_str(7) As String * 2       '1 -sekundy, 2 -minuty, 3 -godziny, 4 -dzien Tygodnia, 5 -dzien Miesiaca, 6 -miesiac, 7 -rok
    Dim Index As Byte   'zegar od 00 do 07, obszar pamięci DS1307 od 08 do 3F
    '********************
    
    Index = &H00
    Inx_zaw = 1
    Zawartosc(inx_zaw) = 58
    
    Cls
    Lcd "Starting..."
    Wait 1
    Cls
    Call Dec_bcd(zawartosc(inx_zaw))
    Call Zapis(index , Zawartosc(inx_zaw))
    Do
    Gosub Odczyt
    Czas_str(inx_zaw) = Stringi(zawartosc(inx_zaw))
    Locate 2 , 1
    Lcd Czas_str(inx_zaw)
    Wait 1
    Reset Watchdog
    Loop
    End
    
    '***********************************
    '********** DEC -> BCD *************
    '***********************************
    Sub Dec_bcd(zawartosc As Byte)
    Zawartosc(inx_zaw) = Makebcd(zawartosc(inx_zaw))
    End Sub
    
    '***********************************
    '**********ZAPIS DANYCH*************
    '***********************************
    Sub Zapis(index As Byte , Zawartosc As Byte)
    I2cstart
    I2cwbyte Adres_w
    I2cwbyte Index
    I2cwbyte Zawartosc
    I2cstop
    End Sub
    
    '***********************************
    '*********ODCZYT DANYCH*************
    '***********************************
    Odczyt:
    I2cstart
    I2cwbyte Adres_w
    I2cwbyte Index
    I2creceive Adres_w , Zawartosc(inx_zaw) , 0 , 1
    Return
    
    '*********************************
    '*******PRZETWARZANIE DANYCH******
    '*********************************
    Function Stringi(zawartosc As Byte) As String
    Zawartosc(inx_zaw) = Makedec(zawartosc(inx_zaw))
    Czas_str(inx_zaw) = Str(zawartosc(inx_zaw))
    Stringi = Format(czas_str(inx_zaw) , "00")
    End Function


    Po zaremowaniu instrukcji
    Stringi = Format(czas_str(inx_zaw) , "00")
    wszystko działa normalnie.

    Co ciekawe, jeśli zmienię sposób wywołania funkcji na
    Lcd Stringi(zawartosc(inx_zaw))  

    to wszystko działa. Czemu?

    Posty scaliłem.
    [zumek]
  • #2 7873851
    zumek
    Poziom 39  
    Logan napisał:
    ... Czemu?

    Dlatego, że źródło i cel funkcji Format, to ten sam obszar pamięci(czytaj: ta sama zmienna)
    Ponieważ funkcje zwracają wartość przez referencję, to w tym przypadku polecenie
    
    Stringi = Format(czas_str(inx_zaw) , "00")
    

    jest równoważne
    
    Czas_str(inx_zaw) = Format(czas_str(inx_zaw) , "00")


    Poza tym, deklarujesz
    
    Declare Function Stringi(czas_dec As Byte) As String       'zamiana danych na stringi
    

    a używasz
    
    Function Stringi(zawartosc As Byte) As String

    Jak myślisz, której ze zmiennych użyje kompilator :?:

    By Twoja funkcja działała bezbłędnie, to może wyglądać następująco:
    
    
    Function Stringi(czas_dec As Byte) As String
    Local Tt As String * 3
    Tt = Str(Makedec(czas_dec))
    Stringi = Format(Tt , "00")
    End Function
    
    




    I na koniec:
    Funkcja Stringi nie jest Ci w ogóle potrzebna - zastąp ją poleceniem Hex i będziesz miał to samo.
  • #3 7874143
    Logan
    Poziom 30  
    Declare Function Stringi(czas_dec As Byte) As String       'zamiana danych na stringi 

    czas_dec zostało przez moją nieuwagę, już poprawiłem na:
    Declare Function Stringi(zawartosc(inx_zaw) As Byte) As String       'zamiana danych na stringi 


    Zmieniłem zawartość funkcji wg Twojej rady na:
    Function Stringi(zawartosc As Byte) As String
    Local Tt As String * 3
    Tt = Str(makedec(zawartosc(inx_zaw)))
    Stringi = Format(Tt , "00")
    End Function
    , ale zwraca mi 00.

    zumek napisał:
    Funkcja Stringi nie jest Ci w ogóle potrzebna - zastąp ją poleceniem Hex i będziesz miał to samo.
    Odczytane dane mam w BCD, co mi da zamiana ich na postać szesnastkową, skoro datę i czas chcę mieć w formacie 14:00:00 24-03-10 ?
  • #4 7874229
    zumek
    Poziom 39  
    Logan napisał:

    Zmieniłem zawartość funkcji wg Twojej rady na:
    Function Stringi(zawartosc As Byte) As String
    Local Tt As String * 3
    Tt = Str(makedec(zawartosc(inx_zaw)))
    Stringi = Format(Tt , "00")
    End Function
    , ale zwraca mi 00.

    Po co w funkcji deklarujesz argument, by go potem nie używać :?:
    Tak powinno być.
    Function Stringi(zawartosc As Byte) As String
    Local Tt As String * 3
    Tt = Str(makedec(zawartosc))
    Stringi = Format(Tt , "00")
    End Function


    Poz tym , jak u Ciebie wyglądają "stosy"($hwstack, itd) :?:

    Logan napisał:
    ... co mi da zamiana ich na postać szesnastkową...

    Dokładnie to, o co Ci chodzi :)
    Spróbuj.
    
    Function Stringi(zawartosc As Byte) As String
    
    Stringi = Hex(zawartosc)
    
    End Function
    
  • #5 7874362
    Logan
    Poziom 30  
    Faktycznie! przecież bzdury miałem. Poprawiłem na:
    Function Stringi(zawartosc As Byte) As String
    Local Tt As String * 3
    Tt = Str(makedec(zawartosc))
    Stringi = Format(Tt , "00")
    End Function
    , ale teraz na wyświetlaczu mam 00, które po kilku sekundach zmienia się w 01, 02...09, 00 i stoi.

    Stos standardowo wg Bascoma:
    HW:32
    Soft:8
    Frame:24.

    Stringi = Hex(zawartosc)
    faktycznie działa.
REKLAMA