ADVERTISEMENT

ATmega328_serwer_SD_SPI_HARD_zm_nazwy_pliku_v6_napięcie_strzalka.zip

[Bascom] [Bascom][Atmega328] Nieprawidłowe wyświetlanie strzałek kierunku na LCD 20x4

Sporo tego ( obsługa SD, PCF8563 + menu do ustawiania daty, obsługa PCF8574 w przerwaniu INT1 )- ale nie ma problemu - zmieniła się tylko zawartość podprogramu Pomiar była taka, jak w pierwszym poście oraz wyłączyłem w wyświetlanie na LCD tych wartości wskazań z DS18B20, oczywiście dostosowałem pozycje wyświetlania do LCD 4*20 - załączniku spakowany plik $regfile = "m328pdef.dat" $crystal = 14745600 $baud = 9600 ' predkość transmisji $hwstack = 128 ' rozmiar stosu sprzętowego $swstack = 128 ' rozmiar stosu programowego $framesize = 128 ' rozmiar ramki '********************* Config Serialin = Buffered , Size = 18 ' , Bytematch = 13 Enable Interrupts '********************* Konfiguracja dodatkowych bibliotek $include "Config_AVR-DOS.BAS" 'Biblioteka AVR-DOS '********************* Konfiguracja wyświetlacza Config Lcdbus = 4 Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portb.1 , Rs = Portb.0 Config Lcd = 20 * 4 '********************* Konfiguracja znaków specjalnych LCD Deflcdchar 4 , 32 , 7 , 9 , 17 , 17 , 17 , 31 , 32 ' SD OK Deflcdchar 0 , 8 , 20 , 8 , 32 , 32 , 32 , 32 , 32 ' znak stopnia celcjusza Deflcdchar 1 , 32 , 4 , 14 , 21 , 4 , 4 , 4 , 32 ' strzałka góra Deflcdchar 2 , 32 , 4 , 4 , 4 , 21 , 14 , 4 , 32 ' strzałka dół '********************* Konfiguracja magistrali I2C Config I2cdelay = 10 ' domyślnie tryb Slow Config Sda = Portc.4 Config Scl = Portc.5 '********************* Konfiguracja magistrali 1-Wire Config 1wire = Portd.4 '********** Konfiguracja Timer1 - PWM Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Disconnect , Compare B Pwm = Clear Down Enable Timer1 '********** Konfiguracja Timer2 Config Timer2 = Timer , Prescale = 1024 ' Dla Prescale 64 - 1 sekunda = 500 On Timer2 Czas Enable Interrupts Load Timer2 , 112 Enable Timer2 '********************* włączenie przerwania zewnętrznego Config Int1 = Falling On Int1 Pcf_int1 Enable Int1 '********************* Konfiguracja wejść i wyjść Config Portd.2 = Output ' sterowanie RS485 Reset Portd.2 Config Portb.2 = Output 'Podświetlanie Set Portb.2 Config Portd.5 = Input ' Detekcja karty SD/MMC Set Portd.5 '********************* Deklaracje zmiennych Liczników Dim Licznik_mod001 As Integer Dim Licznik_ds As Integer Dim Licznik_delay_ds As Integer Dim Licznik_v As Integer Dim Licznik_time As Byte Dim Licznik1 As Integer Dim Licznik_sd As Word Dim Licznik_symbol_sd As Integer Dim Licznik_odczyt As Integer '********************* Deklaracje zmiennych numeracji Dim Numer As String * 6 Dim Numer_sd As Integer Dim Dane_sd As String * 5 Dim Wpis As String * 4 Dim Timerek As Integer Dim Timerek_str As String * 5 '********************* Deklaracje zmiennych Flag Dim Flaga_ds As Bit Dim Flaga_timerek As Bit Dim Flaga_sd As Bit Dim Flaga_sd_save As Bit Dim Flaga_odczyt As Bit Dim Licznik_flaga As Bit Dim Blad_sd As Bit Dim Zapisano As Bit '********************* Deklaracje zmiennych UART Dim Flaga_menu As Bit Dim Start_menu As Byte Dim Modul As Byte Dim Temp_odcz As String * 6 Dim Mod_001 As String * 7 Dim Ramka_mod_001 As String * 7 Dim Ramka_001 As Byte Dim Flaga_001 As Bit Dim Znak As Byte Dim Czas_uart As Integer Dim Flaga_uart1 As Bit Dim Flaga_uart2 As Bit '********************* Deklaracje zmiennych zegara Dim S As Byte 'DEC Dim M As Byte 'DEC Dim H As Byte 'DEC Dim Day As Byte Dim Month As Byte Dim Wk As Byte Dim Year As Byte Dim Hh As Byte 'BCD Dim Mm As Byte 'BCD Dim Ssek As Byte 'BCD Dim Wwk As Byte Dim Dday As Byte Dim Mmonth As Byte Dim Yyear As Byte Dim Dt As String * 2 Dim Mc As String * 3 Dim Dt1 As Byte Dim Mc1 As Byte '********************* Deklaracje zmiennych temperatury Dim I1 As Integer Dim I2 As Integer Dim I3 As Integer Dim I4 As Integer Dim I11 As Integer ' przechowuje poprzednią wartoś temp Dim I22 As Integer ' przechowuje poprzednią wartoś temp Dim I33 As Integer ' przechowuje poprzednią wartoś temp 'Dim Tmp As Byte Dim Tmp3 As Integer 'Dim Tmp11 As String * 3 'Dim Tmp22 As String * 3 'Dim Ttt As String * 14 Dim Ss1 As String * 6 Dim Ss2 As String * 6 Dim Ss3 As String * 6 Dim Ss4 As String * 6 Dim Ss5 As String * 6 Dim Dsid1(8) As Byte Dim Dsid2(8) As Byte Dim Dsid3(8) As Byte Dim Dsid4(8) As Byte '********************* Adres pierwszego DS18B20 - wewnątrz Dsid1(1) = &H28 Dsid1(2) = &H73 Dsid1(3) = &H46 Dsid1(4) = &H25 Dsid1(5) = &H03 Dsid1(6) = &H00 Dsid1(7) = &H00 Dsid1(8) = &HBF '********************* Adres drugiego DS18B20 - zewnątrz Dsid2(1) = &H28 Dsid2(2) = &H9F Dsid2(3) = &H79 Dsid2(4) = &H25 Dsid2(5) = &H03 Dsid2(6) = &H00 Dsid2(7) = &H00 Dsid2(8) = &H00 '********************* Adres trzeciego DS18B20 - C.O. Dsid3(1) = &H28 Dsid3(2) = &H24 Dsid3(3) = &H47 Dsid3(4) = &H25 Dsid3(5) = &H03 Dsid3(6) = &H00 Dsid3(7) = &H00 Dsid3(8) = &HD9 '********************* Adres czwartego DS18B20 - zasilacz Dsid4(1) = &H28 Dsid4(2) = &HEF Dsid4(3) = &H83 Dsid4(4) = &H25 Dsid4(5) = &H03 Dsid4(6) = &H00 Dsid4(7) = &H00 Dsid4(8) = &H83 '********************* Deklaracje zmiennych układu PCF8574 Dim Pcf8574port As Byte Dim Pcf_out As Byte '********************* Deklaracje zmiennych karty SD Dim Card_det As Bit Dim Sd As String * 7 '********************* Deklaracje zmiennych pomiaru napięcia Dim Odczyt1 As Byte Dim Odczyt2 As Byte Dim Odczyt3 As Byte Dim A1 As Single Dim Napiecie1 As String * 4 Dim A2 As Single Dim Napiecie2 As String * 4 Dim A3 As Single Dim Napiecie3 As String * 4 '********************* Deklaracje zmiennych String Dim Data_czas As String * 18 Dim Ciag_timer As String * 13 Dim Data_plik As String * 6 Dim Czas_pcf As String * 12 Dim Data_pcf As String * 10 Dim Info_ciag As String * 25 Dim Plik As String * 14 Dim Ciag_zasilacz As String * 30 ' Deklaracja zmiennej zasilacza Dim Temp_ciag1 As String * 25 Dim Temp_ciag2 As String * 25 Dim Temp_ciag3 As String * 12 Dim Ciag_piec As String * 12 Dim Stan_piec As String * 3 '********************* Deklaracje podprogramów Declare Sub Write_to_sd() ' zapis na kartę SD Declare Sub Gettime() ' pobieranie czasu Declare Sub Settime ' ustawianie czasu Declare Sub Zapis_pcf Declare Sub Odczyt_zn Declare Sub Odczyt Declare Sub Menu Declare Sub Odczyt_sd() Declare Sub Pcf_zapis Declare Sub Pomiar Declare Sub Odczytaj '********************* Konfiguracja SD/MMC 'SPI Sprzętowy: 'MMC -->ATMega328 'DATA3 -> PORTD.6 ( SS ) 'DI -> PORTB.3 ( MOSI ) 'CLK -> PORTB.5 ( SCK ) 'DATA0 -> PORTB.4 ( MISO ) 'SPI Programowy: 'MMC -->ATMega32 'DATA3 -> PORTB.0 'DI -> PORTB.3 'CLK -> PORTB.1 'DATA0 -> PORTB.2 'CD/DAT3 - przez dzielnik do PD.6 'CMD/DI - przez dzielnik do PD.5 'DAT0 - bezpośrednio do PD.7 'Clk / Sclk - Przez Dzielnik Do Pd.4 '********************* SPI Sprzętowe Const Cmmc_soft = 0 'SPI Sprzętowe ' Podanie pinu wyboru układu Config Pind.6 = Output 'wskazanie, który Pin jest CS karty MMC/SD Mmc_cs Alias Portd.6 Set Mmc_cs ' Definiowanie Pinu układu HW-SPI, który ma sygnał SS Config Pinb.7 = Output ' definowanie Pin'u sygnału SPI SS Spi_ss Alias Portb.1 Set Spi_ss ' Set SPI-SS to Output and High por Proper work of ' SPI as Master ' HW-SPI konfigurowane dla szybszej pracy Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = High , Phase = 1 , Clockrate = 4 , Noss = 1 'Config Spi = Soft , Din = Pinb.3 , Dout = Portb.2 , Ss = Portb.0 , Clock = Portb.1 Spsr.0 = 1 ' Podwójna prędkość na ATMega128 Spiinit ' Błędy Const Cperrdrivereset = 225 ' Error response Byte at Reset command Const Cperrdriveinit = 226 ' Error response Byte at Init Command Const Cperrdrivereadcommand = 227 ' Error response Byte at Read Command Const Cperrdrivewritecommand = 228 ' Error response Byte at Write Command Const Cperrdrivereadresponse = 229 ' No Data response Byte from MMC at Read Const Cperrdrivewriteresponse = 230 ' No Data response Byte from MMC at Write Const Cperrdrive = 231 Const Cperrdrivenotsupported = 232 ' return code for DriveGetIdentity, not supported yet Waitms 700 Dim Gbdriveerror As Byte ' General Driver Error register Dim Gbdriveerrorreg As Byte ' Driver load Error-Register of HD in case of error Dim Gbdrivestatusreg As Byte ' Driver load Status-Register of HD on case of error Dim Gbdrivedebug As Byte $lib "MMC.LIB" ' link do biblioteki drivera $external _mmc '********************* Wartości początkowe 'adres odczytu I2C PCF8591 Zapisano = 0 Blad_sd = 0 Flaga_sd = 0 Flaga_sd_save = 0 Flaga_menu = 0 Modul = 0 Numer_sd = 0 Flaga_odczyt = 1 Flaga_001 = 0 Flaga_uart1 = 0 Flaga_uart2 = 0 Flaga_ds = 0 '********************* Wartości stałe Const Pcf8574write = 70 Const Pcf8574read = 71 Const Adres_o = 145 '********************* Przypisanie przyjaznych nazw do poszczególnych portów - Aliasów Lcd_p Alias Portb.2 Gora Alias Pcf8574port.0 Lewo Alias Pcf8574port.4 Enter Alias Pcf8574port.1 Prawo Alias Pcf8574port.3 Dol Alias Pcf8574port.2 C_det Alias Pind.5 Re_de Alias Portd.2 '********************* Adresy modułów Mod_001 = "MOD001" Cursor Off Cls '******** Ustawienie pinów PCF8574 ( 1 - wejście, 0 - wyjście ) I2cstart I2cwbyte Pcf8574write I2cwbyte 00011111 I2cstop '******** Ustawienie stanów pinów PCF8574 I2cstart I2cwbyte Pcf8574write ' adres zapisu I2cwbyte Pcf8574port I2cwbyte &B11111111 'wartość zmiennej do zapisania I2cstop Pwm1b = 50 I11 = 0 I22 = 0 I33 = 0 Do Reset Re_de Echo Off '***************************** wyświetlanie na LCD Locate 1 , 1 Lcd Czas_pcf Locate 1 , 17 Lcd Timerek_str Locate 1 , 13 Lcd Numer Locate 2 , 2 Lcd Data_pcf '***************************** Stan pieca If I3 > 360 Then Stan_piec = "Wl" Else Stan_piec = "Wyl" End If '********* Formatowanie wyświetlania numeru wpisu Numer = Format(numer , "000") '***************************** Obliczenia napięcia 'Obliczenia dla 12V A1 = Odczyt1 * 0.1328 Napiecie1 = Fusing(a1 , "#.#" ) 'Obliczenia dla 5V A2 = Odczyt2 * 0.0366 Napiecie2 = Fusing(a2 , "#.#" ) 'Obliczenia dla 3,3V A3 = Odczyt3 * 0.0315 Napiecie3 = Fusing(a3 , "#.#" ) '***************************** odczytanie ostatniego wpisu na karcie SD - tylko raz If Flaga_odczyt = 1 Then 'jeśli flaga_odczyt = 1 - przy starcie ma wartość początkową 1 If Licznik_flaga = 1 Then ' jeśli Licznik_flaga = 1 ( po 8 sekundach ) Call Gettime ' odczytaj czas i datę Call Odczyt_sd ' wywołaj odczyt z SD '********* Obliczanie numeru wpisu pozycji na karcie SD Numer_sd = Val(wpis) ' zamień string na Integer i wpisz do zmiennej Numer_sd Numer_sd = Numer_sd + 1 ' zwiększ odczytaną wartość wpis o jeden Numer = Str(numer_sd) ' konwersja Integer do String End If Licznik_flaga = 0 ' wyzeruj flagę licznika End If '***************************** Wejście do menu ustawień czasu i daty If Lewo = 1 And Enter = 1 Then Gosub Menu End If '***************************** wywołanie podprogramu odczytu czasu 'Disable Interrupts Call Gettime 'Enable Interrupts 'If Ischarwaiting() = 1 Then ' sprawdź czy jest jakiś znak do odebrania w buforze lub HW UART ' Gosub Odczyt_rs 'End If '***************************** obsługa wyjść PCF8574 '******* detekcja karty SD/MMC - obsługa LED If C_det = 0 Then Pcf_out = &B11011111 ' stan niski wyjścia P5 ( dec = 223 ) Call Pcf_zapis End If If C_det = 1 Then Pcf_out = &B11111111 ' stan wysoki wyjścia P5 (dec = 255 ) Call Pcf_zapis End If '******* LED pomiaru temperatury If Flaga_ds = 1 Then Pcf_out = &B11111111 ' stan wysoki wyjścia P5 (dec = 255 ) Call Pcf_zapis Flaga_ds = 0 End If '***************************** wysyłanie żadania danych do modułu 001 If Flaga_001 = 1 Then Set Re_de Waitms 2 Print "MOD001" ; Chr(13) ; Waitms 8 Reset Re_de Flaga_001 = 0 Licznik_mod001 = 0 End If '***************************** Szukanie ramki w odebranym ciągu 'Ramka_001 = Instr(ttt , Mod_001) ' szukaj w zmiennej ttt ciągu Mod_001 'Ramka_mod_001 = Mid(ttt , Ramka_001 , 6) ' zwraca fragment tekstu ze zmiennej ttt '***************************** Wyciągniecie ze stringu od URT If Ramka_mod_001 = "MOD001" Then Flaga_uart2 = 1 'Tmp11 = Mid(ttt , 7 , 3) 'Tmp1 = Val(tmp11) 'Tmp22 = Mid(ttt , 11 , 3 ) 'Tmp2 = Val(tmp22) 'Tmp3 = Tmp2 End If '******** Wysłanie odpowiedzi do układu przesyłającego dane If Flaga_uart1 = 1 And Flaga_uart2 = 1 Then Set Re_de Waitus 400 Print "MOD001OK" ; Chr(13) ; Waitms 1 Reset Re_de Flaga_uart1 = 0 Flaga_uart2 = 0 End If '******** Obsługa liczenia czasu If Flaga_timerek = 1 Then Incr Timerek Flaga_timerek = 0 Licznik_time = 0 End If Timerek_str = Str(timerek) Timerek_str = Format(timerek_str , "000") '***************************** Warunek określający częstość zapisu na SD If Flaga_sd_save = 1 And S <> 59 Then ' jeśłi flaga_sd_Save =1 i sekundy różne od 59 Licznik_symbol_sd = 0 ' zerowanie licznika czasu wyświetlania symbolu karty SD Locate 1 , 20 Lcd Chr(4) Locate 2 , 13 Lcd " " Pwm1b = 150 Incr Numer_sd ' zwiększ wartość zmiennej Numer_sd Numer = Str(numer_sd) ' konwersja Integer do String Call Write_to_sd() Flaga_sd_save = 0 Zapisano = 0 Pcf_out = &B10111111 ' stan niski wyjścia P5 ( dec = 223 ) Call Pcf_zapis Timerek = 0 Licznik_time = 0 End If '***************************** Długość świecenie symbolu karty SD na LCD If Flaga_sd = 1 Then Locate 1 , 20 Lcd " " ' wyczyść LCD w pozycji 1,20 Pwm1b = 50 Flaga_sd = 0 ' zerowanie flagi Flaga_sd Pcf_out = &B11111111 ' stan niski wyjścia P5 ( dec = 223 ) Call Pcf_zapis End If '***************************** Resetowanie licznika zapisu SD / numeru wpisu If H = 23 And M = 59 And S = 59 Then Licznik_sd = 0 Licznik_time = 0 Timerek = 0 Numer_sd = 0 End If '***************************** Tworzenie ciągu do zapisu na SD Info_ciag = Czas_pcf + " " + Data_pcf Temp_ciag1 = "Zew: " + Ss2 + " " + "Wew: " + Ss1 Temp_ciag2 = "C.O. :" + Ss3 + " " + "Piec: " + Ss4 Temp_ciag3 = "Tzas= " + Ss5 Ciag_timer = "Zapis " + Timerek_str + " sek" Ciag_zasilacz = "U1= " + Napiecie1 + " U2= " + Napiecie2 + " U3= " + Napiecie3 Ciag_piec = "Piec= " + Stan_piec '***************************** Obsługa zmiany nazwy pliku w zależności od dnia tygodnia i miesiąca Plik = "datDD_MM" + ".txt" Mid(plik , 4 , 5 ) = Data_plik Loop End '***************************** Pomiar temperatury Sub Pomiar Disable Interrupts '********************* odczyt pierwszego DS18B20 1wreset 1wwrite &H55 1wverify Dsid1(1) 1wwrite &HBE I1 = 1wread(2) '********************* odczyt drugiego DS18B20 1wreset 1wwrite &H55 1wverify Dsid2(1) 1wwrite &HBE I2 = 1wread(2) '********************* odczyt trzeciego DS18B20 1wreset 1wwrite &H55 1wverify Dsid3(1) 1wwrite &HBE I3 = 1wread(2) '********************* odczyt czwartego DS18B20 - zasilacz 1wreset 1wwrite &H55 1wverify Dsid4(1) 1wwrite &HBE I4 = 1wread(2) '********************* konwersja dla wszystkich DS18B20 1wreset 1wwrite &HCC 1wwrite &H44 Waitms 750 Enable Interrupts Licznik_ds = 0 Pcf_out = &B01111111 ' stan niski wyjścia P5 ( dec = 223 ) Call Pcf_zapis '***************************** Obliczanie temperatury '********************* Obliczenia dla pierwszego I1 = I1 * 10 I1 = I1 / 16 If I1 >= I11 Then I11 = I1 If I1 > 0 Then Ss1 = Str(i1) Ss1 = Format(ss1 , " 0.0") Locate 3 , 1 Lcd "Wew" ; Chr(1) ; Ss1 ; Chr(0); Else Ss1 = Str(i1) Ss1 = Format(ss1 , "0.0") Locate 3 , 1 Lcd "Wew" ; Chr(1) ; Ss1 ; Chr(0) ; End If Else I11 = I1 If I1 > 0 Then Ss1 = Str(i1) Ss1 = Format(ss1 , " 0.0") Locate 3 , 1 Lcd "Wew" ; Chr(2) ; Ss1 ; Chr(0); Else Ss1 = Str(i1) Ss1 = Format(ss1 , "0.0") Locate 3 , 1 Lcd "Wew" ; Chr(2) ; Ss1 ; Chr(0); End If End If '********************* Obliczenia dla drugiego I2 = I2 * 10 I2 = I2 / 16 If I2 >= I22 Then I22 = I2 If I2 > 0 Then Ss2 = Str(i2) Ss2 = Format(ss2 , " 0.0") Locate 3 , 11 Lcd "Zew" ; Chr(1) ; Ss2 ; Chr(0); Else Ss2 = Str(i2) Ss2 = Format(ss2 , "0.0") Locate 3 , 11 Lcd "Zew" ; Chr(1) ; Ss2 ; Chr(0); End If Else I22 = I2 If I2 > 0 Then Ss2 = Str(i2) Ss2 = Format(ss2 , " 0.0") Locate 3 , 11 Lcd "Zew" ; Chr(2) ; Ss2 ; Chr(0) ; Else Ss2 = Str(i2) Ss2 = Format(ss2 , "0.0") Locate 3 , 11 Lcd "Zew" ; Chr(2) ; Ss2 ; Chr(0) ; End If End If '********************* Obliczenia dla trzeciego I3 = I3 * 10 I3 = I3 / 16 If I3 >= I33 Then I33 = I3 If I3 > 0 Then Ss3 = Str(i3) Ss3 = Format(ss3 , " 0.0") Locate 4 , 1 Lcd "C.O" ; Chr(1) ; Ss3 ; Chr(0) ; Else Ss3 = Str(i3) Ss3 = Format(ss3 , "0.0") Locate 4 , 1 Lcd "C.O" ; Chr(1) ; Ss3 ; Chr(0); End If Else I33 = I3 If I3 > 0 Then Ss3 = Str(i3) Ss3 = Format(ss3 , " 0.0") Locate 4 , 1 Lcd "C.O" ; Chr(2) ; Ss3 ; Chr(0) ; Else Ss3 = Str(i3) Ss3 = Format(ss3 , "0.0") Locate 4 , 1 Lcd "C.)" ; Chr(2) ; Ss3 ; Chr(0); End If End If '********************* Obliczenia dla czwartego zasilacz I4 = I4 * 10 I4 = I4 / 16 Ss5 = Str(i4) Ss5 = Format(ss5 , " 0.0") '********************* Obliczenia dla wirtulanego - piec C.O. Tmp3 = I3 If I3 < 390 Then Tmp3 = Tmp3 + 20 Elseif I3 > 391 Then Tmp3 = Tmp3 + 31 Else Tmp3 = Tmp3 + 42 End If 'Tmp3 = Tmp3 + 43 Ss4 = Str(tmp3) Ss4 = Format(ss4 , " 0.0") Locate 4 , 11 Lcd "Piec " ; Ss4 ; Chr(0) ; End Sub '*********************** 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 Open Plik For Append As #2 'otwórz plik pomiar.txt aby dopisać dane Write #2 , Numer , Info_ciag , Temp_ciag1 , Temp_ciag2 , Ciag_zasilacz , Temp_ciag3 , Ciag_piec 'zapisz dane: data, czas , odczyt temperatury Flush #2 'zapisz bufor pliku na karcie SD Locate 2 , 13 ' w pozycji 4,1 Lcd Lof(#2) ; " b" ' wyświetl rozmiar pliku Close #2 'zamknij kanał transmisji sprzętowego urządzenia Blad_sd = 0 'ustaw zmienna na 0 Zapisano = 1 End If Else Blad_sd = 1 End If End Sub '*********************** Obsługa czasu/daty Sub Gettime() I2cstart I2cwbyte 162 I2cwbyte &H02 I2cstart I2cwbyte 163 I2crbyte Ssek , Ack 'Odczytuje sekundy I2crbyte Mm , Ack 'Odczytuje minuty I2crbyte Hh , Ack 'Odczytuje godziny I2crbyte Dday , Ack 'Odczytuje dni I2crbyte Wwk , Ack 'Odczytuje dzień tygodnia I2crbyte Mmonth , Ack 'Odczutuje miesiąc I2crbyte Yyear , Nack 'Odczytuje rok I2cstop Ssek = Ssek And &B01111111 'sekundy Mm = Mm And &B01111111 'minuty Hh = Hh And &B00111111 'godziny Dday = Dday And &B00111111 'dni miesiąca Wwk = Wwk And &B00000111 'dni tygodnia Mmonth = Mmonth And &B00011111 'miesiące Yyear = Yyear And &B11111111 'lata S = Makedec(ssek) 'Zamiana kodu BCD na wartość dziesiętną M = Makedec(mm) 'Zamiana kodu BCD na wartość dziesiętną H = Makedec(hh) 'Zamiana kodu BCD na wartość dziesiętną Wk = Makedec(wwk) 'Zamiana kodu BCD na wartość dziesiętną Day = Makedec(dday) 'Zamiana kodu BCD na wartość dziesiętną Month = Makedec(mmonth) 'Zamiana kodu BCD na wartość dziesiętną Year = Makedec(yyear) 'Zamiana kodu BCD na wartość dziesiętną Czas_pcf = Bcd(hh) + ":" + Bcd(mm) + ":" + Bcd(ssek) + " " + Dt 'Tworzenie stringa z czasem Data_pcf = Bcd(dday) + "/" + Mc + "/" + Bcd(yyear) 'Tworzenie stringa z datą '********************* Funkcja zamieniająca numer dnia tygodna na nazwę dnia Dt1 = Makedec(wwk) 'numer dnia tygodnia dla lookupstr Dt = Lookupstr(dt1 , Dzien_tyg ) '********************* Funkcja zamieniająca numer miesiaca na nazwę miesiaca Mc1 = Makedec(mmonth) 'numer miesiąca dla lookupstr Mc = Lookupstr(mc1 , Miesiace ) '********************* Funkcja zmiany nazwy pliku w zależności od numeru dnia i miesiąca Data_plik = Bcd(dday) + "_" + Bcd(mmonth) End Sub '********************* Podprogram Menu Sub Menu: Flaga_menu = 1 Start_menu = 0 Cls Do If Prawo = 1 Then Waitms 25 If Prawo = 1 Then Incr Start_menu If Start_menu >= 8 Then Start_menu = 0 End If End If End If Select Case Start_menu Case 0 : Case 1 : Locate 1 , 1 Lcd "Minuta" Waitms 500 : Cls : Gosub Ustaw_min Case 2 : Locate 1 , 1 Lcd "Godzina" Waitms 500 : Cls : Gosub Ustaw_godz Case 3 : Locate 1 , 1 Lcd "Dzien" Waitms 500 : Cls : Gosub Ustaw_dzien Case 4: Locate 1 , 1 Lcd "Miesiac" Waitms 500 : Cls : Gosub Ustaw_mc Case 5 : Locate 1 , 1 Lcd "Dzien tyg." Waitms 500 : Cls : Gosub Ustaw_dz_t Case 6: Locate 1 , 1 Lcd "Rok" Waitms 500 : Cls : Gosub Ustaw_rok Case 7 : Locate 1 , 1 Lcd "Zapisz" Waitms 500 : Cls : Gosub Settime End Select If Prawo = 1 And Enter = 1 Then ' przycisk, który powoduje wyjście z menu Flaga_menu = 0 Cls Exit Do End If Loop End Sub Ustaw_min: Locate 1 , 11 Lcd M If Gora = 1 Then M = M + 1 If M > 59 Then M = 0 End If End If If Dol = 1 Then M = M - 1 If M < 0 Then M = 59 End If End If If Enter = 1 Then Gosub Settime End If Return Ustaw_godz: Locate 1 , 11 Lcd H If Gora = 1 Then H = H + 1 If H > 23 Then H = 0 End If End If If Dol = 1 Then H = H - 1 If H < 0 Then H = 23 End If End If If Enter = 1 Then Gosub Settime End If Return Ustaw_dzien: Locate 1 , 11 Lcd Day If Gora = 1 Then Day = Day + 1 If Day > 31 Then Day = 1 End If End If If Dol = 1 Then Day = Day - 1 If Day < 1 Then Day = 31 End If End If If Enter = 1 Then Gosub Settime End If Return Ustaw_mc: Locate 1 , 11 Lcd Month If Gora = 1 Then Month = Month + 1 If Month > 12 Then Month = 1 End If End If If Dol = 1 Then Month = Month - 1 If Month < 1 Then Month = 12 End If End If If Enter = 1 Then Gosub Settime End If Return Ustaw_dz_t: Locate 1 , 12 Lcd Wk If Gora = 1 Then Wk = Wk + 1 If Wk > 6 Then Wk = 0 End If End If If Dol = 1 Then Wk = Wk - 1 If Wk < 0 Then Wk = 6 End If End If If Enter = 1 Then Gosub Settime End If Return Ustaw_rok: Locate 1 , 11 Lcd Year If Gora = 1 Then Year = Year + 1 If Year > 25 Then Year = 10 End If End If If Dol = 1 Then Year = Year - 1 If Year < 10 Then Year = 25 End If End If If Enter = 1 Then Gosub Settime Locate 1 , 13 Lcd " " End If Return '********************* Funkcja ustawiająca zegar PCF8563 Sub Settime S = 0 'przy zapisie zeruj sekundy Ssek = Makebcd(s) 'sekundy Mm = Makebcd(m) 'minuty Hh = Makebcd(h) 'godziny Dday = Makebcd(day) 'dni Wwk = Makebcd(wk) 'dni tygodnia Mmonth = Makebcd(month) 'miesiace Yyear = Makebcd(year) 'lata I2cstart 'warunek startu I2cwbyte &HA2 'Adres zapisu I2cwbyte 0 'select control register I2cwbyte 8 'ustaw bit maskowania dni i roku I2cstart 'powtórz warunek startu I2cwbyte &HA2 'Adres zapisu I2cwbyte 2 'wybór rejestru I2cwbyte Ssek 'zapis sekund I2cwbyte Mm 'zapis minut I2cwbyte Hh 'zapis godzin I2cwbyte Dday 'zapis dni I2cwbyte Wwk 'zapis dni tygodnia I2cwbyte Mmonth 'zapis miesięcy I2cwbyte Yyear 'zapis roku I2cstop End Sub Return '********************* Odczyt danych z karty SD - ostatnia linia Sub Odczyt_sd() Local Errorcode As Byte ''() Gbdriveerror = Driveinit() If Gbdriveerror = 0 Then Errorcode = Initfilesystem(1) If Errorcode <> 0 Then Blad_sd = 1 Else Open Plik For Input As #2 Do Line Input #2 , Dane_sd Wpis = Mid(dane_sd , 2 , 4) ' wyciąga 4 znaki z odczytanych danych - licząc od drugiego miejsca Loop Until Eof(2) <> 0 'Eof = 255 - koniec pliku ??? Close #2 'zamknij kanał transmisji sprzętowego urządzenia Blad_sd = 0 End If Else Blad_sd = 1 End If Flaga_odczyt = 0 ' zerowanie flaga_odczyt, aby odczyt był tylko raz End Sub '********************* Odczyt napięcia z PCF8593 I2C Odczytaj: I2cinit I2cstart 'sygnał startu magistrali I2C I2cwbyte 144 'wyślij adres "odbiorczy" PCF8591 I2cwbyte &B00000100 I2cwbyte &B00000101 I2cwbyte 255 I2cstart 'znów generujemy warunek startu I2cwbyte Adres_o 'adresujemy układ EEPROM do odczytu I2crbyte Odczyt1 , Ack I2crbyte Odczyt2 , Ack I2crbyte Odczyt3 , Nack I2cstop Return '********************* Timer2 - 2 ms x 500 = 1 sekunda Czas: Timer2 = Timer2 + 112 Incr Licznik_sd Incr Licznik1 Incr Licznik_symbol_sd Incr Licznik_odczyt Incr Licznik_ds Incr Licznik_delay_ds Incr Licznik_time Incr Licznik_v If Licznik_sd = 13000 Then 'Licznik dla zapisu co 10 minut ( 60000 x 0,01 ) Flaga_sd_save = 1 ' Dla wartości licznika = 30000 - czas = 9 minut, 9 sekund Licznik_sd = 0 End If If Licznik_symbol_sd = 150 Then ' licznik czasu świecenia symbolu karty SD + LED Flaga_sd = 1 End If If Licznik_odczyt = 100 Then ' Licznik czasu, po jakim będzie odczyt Licznik_flaga = 1 End If If Licznik_ds = 900 Then ' Licznik czasu po którym nastąpi pomiar temperatury Gosub Pomiar Licznik_delay_ds = 0 End If If Licznik_delay_ds = 100 Then ' Licznik opóźnienie czasu świecenia LED pomiaru DS18B20 Flaga_ds = 1 End If If Licznik_time = 100 Then Flaga_timerek = 1 End If If Licznik_v = 1000 Then 'Licznik odczytu napięcia Gosub Odczytaj Licznik_v = 0 End If Return '*********************** Podprogram przerwania Int1 Pcf_int1: '******** odczyt układu PCF8574 Waitms 10 I2cstart I2cwbyte Pcf8574read I2crbyte Pcf8574port , Nack I2cstop Return '******** podprogram obslugi ukladu PCF8574 - Zapis Sub Pcf_zapis I2cstart I2cwbyte Pcf8574write ' adres zapisu I2cwbyte Pcf_out 'wartość zmiennej do zapisania I2cstop Return End Sub '********************* Informacja o nazwie dnia tygodnia i miesiąca Dzien_tyg: Data "Nd" , "Pn" , "Wt" , "Sr" , "Cz" , "Pt" , "So" Miesiace: Data "" , "Sty" , "Lut" , "Mar" , "Kwi" , "Maj" , "Cze" , "Lip" , "Sie" , "Wrz" , "Paz" , "Lis" , "Gru"


Download file - link to post
  • ATmega328_serwer_SD_SPI_HARD_zm_nazwy_pliku_v6_napięcie_strzalka.zip
    • ATmega328_serwer_SD_SPI_HARD_zm_nazwy_pliku_v6_napiêcie_strzalka.bas