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.
Po zaremowaniu instrukcji wszystko działa normalnie.
Co ciekawe, jeśli zmienię sposób wywołania funkcji na
to wszystko działa. Czemu?
Posty scaliłem.
[zumek]
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 FunctionPo zaremowaniu instrukcji
Stringi = Format(czas_str(inx_zaw) , "00")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]
