Witam
W oparciu o projekt Kolegi _Duch - rejestrator pogodowy zrobiłem swój ( na razie prosty ) rejestrator. Wykorzystałem podane w wątku pliki config_mmc.bas i Config_AVR-DOS.BAS . Na płytce testowej EVB 4.3 v.4 . Podłączenie z SD standardowe.
Niestety nic się nie zapisuje na karcie SD ( próbowałem 2 Gb Kingston i 1 Gb Sandisk - formatowane na FAT i FAT32 ). Karta wkładałem czyste/sformatowane i zapisanym plikiem. - to bez znaczenia Co minutę miga dioda określająca czas zapisu, natomiast dioda sygnalizująca zapis świeci cały czas - co oznacza jakiś problem z kartą SD.
Może ktoś wychwyci błąd.
Pozdrawiam
Piotr
W oparciu o projekt Kolegi _Duch - rejestrator pogodowy zrobiłem swój ( na razie prosty ) rejestrator. Wykorzystałem podane w wątku pliki config_mmc.bas i Config_AVR-DOS.BAS . Na płytce testowej EVB 4.3 v.4 . Podłączenie z SD standardowe.
Niestety nic się nie zapisuje na karcie SD ( próbowałem 2 Gb Kingston i 1 Gb Sandisk - formatowane na FAT i FAT32 ). Karta wkładałem czyste/sformatowane i zapisanym plikiem. - to bez znaczenia Co minutę miga dioda określająca czas zapisu, natomiast dioda sygnalizująca zapis świeci cały czas - co oznacza jakiś problem z kartą SD.
$regfile = "m32def.dat"
$crystal = 16000000
$baud = 9600 ' predkość transmisji
$hwstack = 128 ' rozmiar stosu sprzętowego
$swstack = 128 ' rozmiar stosu
$framesize = 128 ' rozmiar ramki
'********************* Konfiguracja dodatkowych bibliotek
'AVR-DOS config
$include "Config_MMC.bas" 'Konfiguracja karty SD
$include "Config_AVR-DOS.BAS" 'Biblioteka AVR-DOS
'********************* Konfiguracja wejść i wyjść
Config Porta.6 = Output
Reset Porta.6
Config Porta.7 = Output
Reset Porta.7
'********************* Konfiguracja wyświetlacza
Config Lcdbus = 4
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.2 , Rs = Portc.3
Config Lcd = 16 * 2
'********************* Konfiguracja znaku specjalnego LCD
Deflcdchar 0 , 6 , 9 , 6 , 32 , 32 , 32 , 32 , 32 ' znak stopnia celcjusza
'********************* Konfiguracja magistrali I2C
Config I2cdelay = 5 ' domyślnie tryb Slow
Config Sda = Portc.1
Config Scl = Portc.0
'********************* Konfiguracja magistrali 1-Wire
Config 1wire = Porta.0
'********************* Deklaracje zmiennych
Dim Ds1(8) As Byte 'zmienna określająca numer układu
Dim Ss As String * 6 'zmienna zawierająca przeliczoną i sformatowaną wartość wskazania układu
Dim T1 As Integer 'zmienna odczytu dwóch bajtów z DS18B20
Dim W As Byte
'Dim Tm(5) As Byte At &H60
Dim I As Byte , Temp As Byte
Dim L As Byte , Ll As Byte
'********************* Deklaracje zmiennych zegara
Dim S As Byte At &H60 Overlay
Dim M As Byte At &H61 Overlay
Dim H As Byte At &H62 Overlay
Dim D As Byte At &H63 Overlay
Dim Month As Byte At &H64 Overlay
Dim Czas_pcf As String * 8
Dim Data_pcf As String * 8
'********************* Deklaracje zmiennych karty SD
Dim Blad_sd As Bit
Dim Zapisano As Bit
Dim B As Word
'********************* Deklaracje podprogramów
Declare Sub Settime(byval S1 As Byte , Byval M1 As Byte , Byval H1 As Byte , Byval D1 As Byte , Byval Month1 As Byte) '***** ustawianie czasu
Declare Sub Gettime() 'pobieranie czasu
Declare Sub Wysw_godz 'wyświetlanie czasu
Declare Sub Write_to_sd()
Declare Sub Pomiar
Declare Sub Ds_odczyt
'********************* Deklaracje Aliasów
Sd_dioda Alias Porta.6
Dioda Alias Porta.7 'Przypisanie przyjaznych nazw do poszczególnych portów do których
'********************* Konfiguracja SD/MMC
'MMC -->ATMega32
'DATA3 -> PORTB.4
'DI -> PORTB.5
'CLK -> PORTB.7
'DATA0 -> PORTB.6
'********************* Wartości początkowe
Zapisano = 0
Blad_sd = 0
Cursor Off 'wyłącz kursor
Cls 'czyść ekran
Ds1(1) = 1wsearchfirst() 'rozkaz szukania pierwszego układu
Do
Call Gettime 'pobieranie czasu
Call Wysw_godz
Call Ds_odczyt 'wyświetlanie czasu
Call Pomiar
Loop
End
'*************************** pomiar temp. na termometrze ds18b20
'********** magistrala 1-wire wejście 1 czujnik 1
Sub Ds_odczyt
1wreset 'reset magistrali 1-wire
1wwrite &H55 'rozkaz adresowy MATCH ROM
1wverify Ds1(1) 'sprawdź adres
1wwrite &HBE 'rozkaz funkcyjny polecenie odczytu DS18B20
T1 = 1wread(2) 'odczytaj dwa pierwsze bajty
'czekaj 750 ms
'********** magistrala 1-wire konwersja temperatury
1wreset 'reset magistrali 1-Wire
1wwrite &HCC 'rozkaz funkcyjny SKIP ROM
1wwrite &H44 'konwersja temperatury dla wszystkich DS18B20
Wait 1
'**************** pierwsze wejście - DS18B20 obliczenia + wyświetlanie **********
T1 = T1 * 10
T1 = T1 / 16
'If Tc1 > 0 Then Cls 'korekta przesuniecia znaku st C przy przejściu z temp ujemnej na dodatnią
Ss = Str(t1)
Ss = Format(ss , " 0.0") 'formatuj według wzorca - jedno miejsce po przecinku
Locate 1 , 1 'wyświetl w pozycji
Lcd "Temp1=" ; Ss ; Chr(0) ; "C " 'wyświetl wynik formatowania + znak specjalny + C
Return
End Sub
'*********************** Obsługa czasu/daty
Sub Gettime()
I2cstart
I2cwbyte 162 'adres układu I2C
I2cwbyte 2 'wyślij adres układu
I2cstart 'warunek startu
I2cwbyte 163 'adres układu I2C
I2crbyte S , Ack 'odczyt komórki pamięci - będzie następny
I2crbyte M , Ack 'odczyt komórki pamięci - będzie następny
I2crbyte H , Ack 'odczyt komórki pamięci - będzie następny
I2crbyte D , Ack 'odczyt komórki pamięci - będzie następny
I2crbyte Month , Nack 'odczyt komórki pamięci - ostatni bajt
I2cstop
End Sub
Wysw_godz:
Locate 2 , 1
Lcd Hex(h) ; ":" ; Hex(m) ; ":" ; Hex(s) ; " " ; Hex(d) ; "-" ; Hex(month);
Czas_pcf = Bcd(h) + ":" + Bcd(m) + ":" + Bcd(s) 'Tworzenie stringa z czasem
Data_pcf = Bcd(d) + "/" + Bcd(month) 'Tworzenie stringa z datą
Return
'*********************** Obsługa zapisu na SD
Sub Write_to_sd() ''()
Local Errorcode As Byte
Gbdriveerror = Driveinit()
If Gbdriveerror = 0 Then
Errorcode = Initfilesystem(1)
If Errorcode <> 0 Then
Blad_sd = 1
Else
Reset Sd_dioda 'Zapala diodę LED
Open "pomiar.txt" For Append As #2 'otwórz plik pomiar.txt aby dopisać dane
Write #2 , Data_pcf , Czas_pcf , Ss 'zapisz dane: data, czas , odczyt temperatury
Flush #2 'zapisz bufor pliku na karcie SD
Close #2 'zamknij kanał transmisji sprzętowego urządzenia
Blad_sd = 0 'ustaw zmienna na 0
Set Sd_dioda 'zgaś diodę LED
End If
Else
Reset Sd_dioda 'zapala diodę LED
Blad_sd = 1
End If
End Sub ' Write_to_sd()
'*********************** Podprogram określający kiedy dokonać pomiarów oraz zapisu na SD
Sub Pomiar
If S = 0 Or S = 30 Then 'jeśli sekundy wynoszą 0 lub 30
Reset Dioda 'Zapala diodę LED
Call Gettime() 'Skocz do podprogramu pobierania czasu z pcf8583
Call Ds_odczyt 'Skocz do podprogramu odczytu temperatury z DS18b20
If M = 0 Or M = 10 Or M = 20 Or M = 30 Or M = 40 Or M = 50 Then 'Jeśli minuty = np. 10 to idzie zapisać wynik na SD
If S = 0 Then
If Zapisano = 0 Then
Call Write_to_sd() 'Idzie zapisać wyniki
Zapisano = 1 'Ustawia flaga zapisania na SD
End If
End If
End If
Set Dioda 'Gasi diodę LED
End If
If S = 10 Then 'jeśli sekundy wynoszą 10
If Zapisano = 1 Then 'Jeśli zmienna zapisano (na SD) wynosi 1
Zapisano = 0 'Wtedy ustaw 0
End If
End If
End Sub
Może ktoś wychwyci błąd.
Pozdrawiam
Piotr