Elektroda.pl
Elektroda.pl
X
Osprzęt kablowy
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Bascom] [ATmega32] Zapis wyników na karcie SD

24 Sty 2011 08:56 9098 23
  • Poziom 18  
    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.


    Code:

    $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
  • Osprzęt kablowy
  • Osprzęt kablowy
  • Poziom 18  
    Plik Config MMC.bas nie ruszałem, jest taki jak ściągnąłem z Twojego wątku. Tzn próbowałem przenieść jego zawartość do pliku głównego - zauważyłem, że tak się stosuje.

    Co do połączeń to standardowo - płytce EVB 4.3 mam

    DATA3 -> PORTB.4
    DI -> PORTB.5
    CLK -> PORTB.7
    DATA0 -> PORTB.6
    Cdet -> nie podłączone

    nawet mierzyłem, czy projektant EVB się nie pomylił, ale wszystkie wyprowadzenia ok.

    Może to coś w FuseBitach ? Próbowałem ustawić Burno-Mat-em, tak jak u Ciebie na zrzucie z ekranu, ale w ogóle przestał działać

    Co do pliku Config MMC.bas, to czy coś w nim zmieniałeś ? ja wykorzystałem go bez zmian, oczywiście próbowałem z software'owym SPI, ale efekt taki sam.
  • Poziom 18  
    Raczej nie zaczęło. Prawidłowo działa odliczanie czasu w oparciu o zegar PCF8583 - co minutę miga dioda podprogramu Pomiar. I na tym się kończy sprawa jeśli chodzi o SD, nie dopisuje do pliku, nie tworzy nowego, reszta działa poprawnie - wyświetlanie czasu i temperatury na LCD.

    Plik Config_MMC.bas jest od Kolegi Duch

    Code:

    '-------------------------------------------------------------------------------
    '                         Config_MMC.BAS
    '               Config File for MMC Flash Cards Driver
    '        (c) 2003-2005 , MCS Electronics / Vögel Franz Josef
    '-------------------------------------------------------------------------------
    ' Place MMC.LIB version 5.6 in the LIB-Path of BASCOM-AVR installation
    '
    'Connection as following
    'MMC    M128/M103           M32
    '1      MMC_CS PORTB.0      MMC_CS PORTB.4
    '2      MOSI PORTB.2        MOSI PORTB.5
    '3      GND                 GND
    '4      +3.3V               +3.3V
    '5      CLOCK PORTB.1       CLOCK PORTB.7
    '6      GND                 GND
    '7      MISO, PORTB.3       MISO, PORTB.6

    ' you can vary MMC_CS on HW-SPI and all pins on SOFT-SPI, check settings
    ' ========== Start of user definable range =====================================

    ' you can use HW-SPI of the AVR (recommended) or a driver build in Soft-SPI, if
    ' the HW-SPI of the AVR is occupied by an other SPI-Device with different settings

    ' Declare here you SPI-Mode
    ' using HW-SPI:     cMMC_Soft = 0
    ' not using HW_SPI: cMMC_Soft = 1

    Const Cmmc_soft = 0

    #if Cmmc_soft = 0

    ' --------- Start of Section for HW-SPI ----------------------------------------


       ' define Chip-Select Pin
       Config Pinb.4 = Output                                   ' define here Pin for CS of MMC/SD Card
       Mmc_cs Alias Portb.4
       Set Mmc_cs

       ' Define here SS Pin of HW-SPI of the CPU (f.e. Pinb.0 on M128)
       'Config Pinb.4 = Output                                   ' define here Pin of SPI SS
       'Spi_ss Alias Portb.4
       'Set Spi_ss                                               ' Set SPI-SS to Output and High por Proper work of
                                                      ' SPI as Master

       ' HW-SPI is configured to highest Speed
       Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = High , Phase = 1 , Clockrate = 4 , Noss = 1
       Spsr = 1                                                 ' Double speed on ATMega128 default = commented changed by author
       Spiinit                                                  ' Init SPI

    ' --------- End of Section for HW-SPI ------------------------------------------

    #else                                                       ' Config here SPI pins, if not using HW SPI

    ' --------- Start of Section for Soft-SPI --------------------------------------

       ' Chip Select Pin  => Pin 1 of MMC/SD
       Config Pinb.4 = Output
       Mmc_cs Alias Portb.4
       Set Mmc_cs

       ' MOSI - Pin DI => Pin 2 of MMC/SD
       Config Pinb.5 = Output
       Set Pinb.5
       Mmc_portmosi Alias Portb
       Bmmc_mosi Alias 2

       ' MISO - Pin  D0 => Pin 7 of MMC/SD
       Config Pinb.6 = Input
       Mmc_portmiso Alias Pinb
       Bmmc_miso Alias 3

       ' SCK - Pin CLK  => Pin 1 of MMC/SD
       Config Pinb.1 = Output
       Set Pinb.7
       Mmc_portsck Alias Portb
       Bmmc_sck Alias 1

    ' --------- End of Section for Soft-SPI ----------------------------------------

    #endif
  • Poziom 18  
    Jak powinno wyglądać zasilanie układu ? ja daję 5V z USB, a karta SD jest zasilana i ma 3,36V. Próbowałem cały układ zasilać z 3,3V, ale zwykła Mega 32 według noty działa od 4,5V
  • Poziom 12  
    Czy kolega: maximus22_kr rozwiązał problem?
    Ja na razie też walczę ze swoim podłączeniem.
    Atmega32 = 5V a karta micro SD zasilana 3,3V

    1. Czy twoja karta to SD czy micro SD? (u mnie micro SD)
    2. Jaką wersje masz Bascom? (moja to: 1.11.8.1)
    u mnie w wersji 1.11.8.1 w katalogu LIB plik: AVR-DOS.LBX
    jest w wersji: 5.2
    gdy zamieniam powyższą bibliotekę na wersję 5.5
    Bascom przy kompilacji programu wyrzuca mi taki błąd:
    "illegal character [expected (,got'='] in file
    3. Czy wersja Bascom 1.11.8.1 ma jakieś różnice pomiędzy oryginałem
    a tym z ograniczeniem kodu?
    4. wrzuć swój schemat.
  • Poziom 18  
    Witam
    Niestety nie ( inna sprawa, że ostatnio brak czasu )

    Używam zwykłej SD - 1 Gb Sandisk i 2Gb Kingston. Ale sienie poddaje i zamówiłem MMC 256 Mb.

    Używam wersji Bascom 1.11.9.5.

    Podłączam według opisu w pliku config_mmc.bas. Atmega32 jest na 5V karta SD na 3,3V, zastosowałem nawet dzielniki na rezystorach, żeby lepiej dopasować poziomy.
    [Bascom] [ATmega32] Zapis wyników na karcie SD
    Poprawiłem załącznik.
    [zumek]

    Nic to na razie nie zmieniło. Obstawiam raczej podłączenie - Kolego Duch potwierdził, że kod jest w porządku.

    Znalazłem jeszcze taki kod:
    Code:

    $regfile = "m32def.dat"
    $crystal = 8000000
    $hwstack = 128
    $swstack = 128
    $framesize = 128
    $baud = 9600
    $include "Config_MMC.bas"
    $include "Config_AVR-DOS.BAS"


    Declare Sub Srednik

    Config Pinb.0 = Input
    Config Pinb.1 = Input
    Config Pinb.2 = Input
    Config Pinb.3 = Input
    Config Porta.0 = Output
    Config Porta.1 = Output
    Config Porta.2 = Output
    Config 1wire = Portd.7
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
    Config Lcd = 20 * 4
    Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Disconnect , Prescale = 1
    Config Clock = Soft , Gosub = Sectic
    Config Date = Dmy , Separator = /


    Dim Temp1_lcd As String * 6
    Dim Temp2_lcd As String * 6
    Dim Tempmin_lcd As String * 6
    Dim Tempmax_lcd As String * 6
    Dim Tempminsd_lcd As String * 6
    Dim Tempmaxsd_lcd As String * 6
    Dim Tempamplituda_lcd As String * 6
    Dim Srednia_lcd As String * 6
    Dim Data_sd As String * 8
    Dim Flaga_zapisz As Bit
    Dim Flaga_zapisz_sr As Bit
    Dim Flaga_menu As Bit
    Dim Flaga_1w As Bit
    Dim Blad_sd As Bit
    Dim Interwal As Byte
    Dim Dsid1(8) As Byte
    Dim Dsid2(8) As Byte
    Dim Czujnik As Byte
    Dim Errorcode As Byte
    Dim Temp1 As Integer
    Dim Temp2 As Integer
    Dim Tempmin As Integer
    Dim Tempmax As Integer
    Dim Tempminsd As Integer
    Dim Tempmaxsd As Integer
    Dim Tempamplituda As Integer
    Dim Czas As Integer
    Dim Srednia As Long
    Dim Srednia_p As Long


    Deflcdchar 1 , 12 , 18 , 18 , 12 , 32 , 32 , 32 , 32        ' Stopnie
    Deflcdchar 2 , 32 , 7 , 15 , 31 , 31 , 31 , 31 , 31
    Deflcdchar 3 , 32 , 4 , 4 , 4 , 4 , 21 , 14 , 4             ' replace ? with number (0-7)
    Deflcdchar 4 , 4 , 14 , 21 , 4 , 4 , 4 , 4 , 32             ' replace ? with number (0-7)
    S1 Alias Pinb.0
    S2 Alias Pinb.1
    S3 Alias Pinb.2
    S4 Alias Pinb.3
    Led1 Alias Porta.0
    Led2 Alias Porta.1
    Led3 Alias Porta.2

    Set Porta.0
    Set Porta.1
    Set Porta.2
    Set Portb.0
    Set Portb.1
    Set Portb.2
    Set Portb.3

    Time$ = "06:00:01"
    Date$ = "01.01.10"
    Flaga_zapisz = 0
    Tempmin = 1000
    Tempmax = -1000
    Interwal = 3

    Dsid2(1) = 1wsearchfirst()
    Dsid1(1) = 1wsearchnext()
    Interwal = 1
    Cursor Off
    Cls
    Enable Interrupts
    Wait 4
    Pwm1a = 50
    Do
    If S4 = 0 Then
       Waitms 25
          If S4 = 0 Then
             Flaga_menu = 1
             Cls
                Locate 1 , 8
                Lcd "Czas    "
                Wait 2
                Do
                Locate 3 , 6
                Lcd Time$
                Waitms 500
                If S2 = 0 Then
                   Waitms 25
                      If S2 = 0 Then
                         _sec = 0
                         Czas = 0
                         Srednia = 0
                         Incr _min
                         If _min = 60 Then
                            _min = 0
                         End If
                      End If
                End If
                If S3 = 0 Then
                   Waitms 25
                      If S3 = 0 Then
                         _sec = 0
                         Czas = 0
                         Srednia = 0
                         Incr _hour
                         If _hour = 24 Then
                            _hour = 0
                         End If
                      End If
                End If
                Loop Until S4 = 0
                Cls
                Locate 1 , 8
                Lcd "DATA    "
                Wait 3
                Do
                Locate 3 , 6
                Lcd Date$
                Waitms 500
                If S3 = 0 Then
                   Waitms 25
                      If S3 = 0 Then
                         Incr _day
                         If _day = 31 Then
                            _day = 0
                         End If
                      End If
                End If
                If S2 = 0 Then
                   Waitms 25
                      If S2 = 0 Then
                         Incr _month
                         If _month = 12 Then
                            _month = 12
                         End If
                      End If
                End If
                If S1 = 0 Then
                   Waitms 25
                      If S1 = 0 Then
                         Incr _year
                         If _year = 20 Then
                            _year = 10
                         End If
                      End If
                End If

                Loop Until S4 = 0
                Cls
                Locate 1 , 6
                Lcd "INTERWAL"
                Wait 2
                Do
                If S3 = 0 Then
                   Waitms 25
                      If S3 = 0 Then
                         Incr Interwal
                         If Interwal = 4 Then
                            Interwal = 1
                         End If
                      End If
                End If
                If S2 = 0 Then
                   Waitms 25
                      If S2 = 0 Then
                         Decr Interwal
                         If Interwal = 0 Then
                            Interwal = 3
                         End If
                      End If
                End If
                Locate 3 , 1
                Select Case Interwal
                   Case 1 : Lcd "1 sekunda    "
                   Case 2 : Lcd "1 minuta     "
                   Case 3 : Lcd "10 minut     "
                End Select
                Waitms 500
                Loop Until S4 = 0

                Locate 1 , 6
                Lcd "EXIT MENU"
                If Tempmax = 850 Then
                   Tempmax = -1000
                End If
                Waitms 600
                Srednia_p = 0
                Srednia = 0
                Czas = 0
                Flaga_menu = 0
                Cls
             End If
       End If
       If Flaga_zapisz = 1 Then
          If Flaga_menu = 0 Then
             Gbdriveerror = Driveinit()
                If Gbdriveerror = 0 Then
                   Errorcode = Initfilesystem(1)
                   If Errorcode <> 0 Then
                      Blad_sd = 1
                      Else
                      Led2 = 0
                      Waitms 5
                      Led2 = 1
                      Open "temper.txt" For Append As #2
                      Write #2 , Date$ , Time$ , Temp1_lcd , Temp2_lcd
                      Flush #2
                      Close #2
                      Led3 = 0
                      Waitms 5
                      Led3 = 1
                      If Flaga_zapisz_sr = 1 Then
                         Waitms 50
                         Led2 = 0
                         Waitms 5
                         Led2 = 1
                         Open "avg.txt" For Append As #1
                         Write #1 , Data_sd , Tempminsd_lcd , Tempmaxsd_lcd , Tempamplituda_lcd , Srednia_lcd
                         Flush #1
                         Close #1
                         Led3 = 0
                         Waitms 5
                         Led3 = 1
                         Flaga_zapisz_sr = 0
                      End If
                      Flaga_zapisz = 0
                      Select Case Interwal

                      Case 1:
                               Waitms 1
                      Case 2:
                               Wait 2

                      Case 3:
                               Wait 2

                      End Select
                   End If
                Else
                Locate 2 , 1
                Lcd "blad"
                End If
          End If
       End If
    Loop


    Sectic:

             Led1 = 0
             Czujnik = 1wirecount()
             1wreset
             1wwrite &H55
             1wverify Dsid1(1)
             1wwrite &HBE
             Temp1 = 1wread(2)
             1wreset
             1wwrite &H55
             1wverify Dsid2(1)
             1wwrite &HBE
             Temp2 = 1wread(2)
             1wreset
             1wwrite &HCC
             1wwrite &H44
             Temp1 = Temp1 * 10
             Temp1 = Temp1 \ 16
             Temp2 = Temp2 * 10
             Temp2 = Temp2 \ 16
             If Temp1 < Tempmin Then
                Tempmin = Temp1
                Tempminsd = Temp1
             End If
             If Temp1 > Tempmax Then
                Tempmax = Temp1
                Tempmaxsd = Temp1
             End If
             Tempamplituda = Tempmaxsd - Tempminsd
             Temp1_lcd = Str(temp1)
             Temp1_lcd = Format(temp1_lcd , "0.0")
             Temp2_lcd = Str(temp2)
             Temp2_lcd = Format(temp2_lcd , "0.0")
             Tempmin_lcd = Str(tempmin)
             Tempmin_lcd = Format(tempmin_lcd , "0.0")
             Tempmax_lcd = Str(tempmax)
             Tempmax_lcd = Format(tempmax_lcd , "0.0")
             Tempminsd_lcd = Str(tempminsd)
             Tempminsd_lcd = Format(tempminsd_lcd , "0.0")
             Tempmaxsd_lcd = Str(tempmaxsd)
             Tempmaxsd_lcd = Format(tempmaxsd_lcd , "0.0")
             Tempamplituda_lcd = Str(tempamplituda)
             Tempamplituda_lcd = Format(tempamplituda_lcd , "0.0")

             If S1 = 0 Then
                Tempmin = 1000
                Tempmax = -1000
             End If
             Led1 = 1
             Gosub Srednik


             Select Case Interwal

             Case 1:
                      Flaga_zapisz = 1
             Case 2:
                      If _sec = 0 Then
                         Flaga_zapisz = 1
                      End If
             Case 3:
                      If _min = 0 Or _min = 10 Or _min = 20 Or _min = 30 Or _min = 40 Or _min = 50 Then
                         If _sec = 0 Then
                         Flaga_zapisz = 1
                         End If
                      End If
             End Select
             If Flaga_menu = 0 Then
             Locate 1 , 1
             Lcd Time$ ; "   "
             Locate 1 , 12
             Lcd Date$
             Locate 2 , 1
             Lcd "Out:" ; Temp1_lcd ; Chr(1) ; "C " ; "Avg:" ; Srednia_lcd ; Chr(1) ; "C "
             Locate 3 , 1
             Lcd "In :" ; Temp2_lcd ; Chr(1) ; "C  "
             Locate 4 , 1
             Lcd Chr(3) ; ":" ; Tempmin_lcd ; Chr(1) ; "C  "
             Locate 4 , 11
             Lcd Chr(4) ; ":" ; Tempmax_lcd ; Chr(1) ; "C  "
             End If
    Return

    Srednik:


             If _sec = 0 And _min = 59 And _hour = 23 Then
                Data_sd = Date$
             End If
             If _sec = 0 Then
                Incr Czas
                Srednia_p = Srednia_p + Temp1
                Srednia = Srednia_p / Czas
                Srednia_lcd = Str(srednia)
                Srednia_lcd = Format(srednia_lcd , "0.0")
             End If
             If _sec = 0 And _min = 0 And _hour = 0 Then
                Flaga_zapisz_sr = 1
                Srednia_p = 0
                Srednia = 0
                Czas = 0
                Tempminsd = 1000
                Tempmaxsd = -1000
                Tempamplituda = 0
             End If
    Return


    Do tego plik Config_mmc.bas
    Code:

     '-------------------------------------------------------------------------------
    '                         Config_MMC.BAS
    '               Config File for MMC Flash Cards Driver
    '        (c) 2003-2005 , MCS Electronics / Vögel Franz Josef
    '-------------------------------------------------------------------------------
    ' Place MMC.LIB version 5.6 in the LIB-Path of BASCOM-AVR installation
    '
    'Connection as following
    'MMC    M128/M103           M32
    '1      MMC_CS PORTB.0      MMC_CS PORTB.4
    '2      MOSI PORTB.2        MOSI PORTB.5
    '3      GND                 GND
    '4      +3.3V               +3.3V
    '5      CLOCK PORTB.1       CLOCK PORTB.7
    '6      GND                 GND
    '7      MISO, PORTB.3       MISO, PORTB.6

    ' you can vary MMC_CS on HW-SPI and all pins on SOFT-SPI, check settings
    ' ========== Start of user definable range =====================================

    ' you can use HW-SPI of the AVR (recommended) or a driver build in Soft-SPI, if
    ' the HW-SPI of the AVR is occupied by an other SPI-Device with different settings

    ' Declare here you SPI-Mode
    ' using HW-SPI:     cMMC_Soft = 0
    ' not using HW_SPI: cMMC_Soft = 1

    Const Cmmc_soft = 0

    #if Cmmc_soft = 0

    ' --------- Start of Section for HW-SPI ----------------------------------------


       ' define Chip-Select Pin
       Config Pinb.4 = Output                                   ' define here Pin for CS of MMC/SD Card
       Mmc_cs Alias Portb.4
       Set Mmc_cs

       ' Define here SS Pin of HW-SPI of the CPU (f.e. Pinb.0 on M128)
       'Config Pinb.4 = Output                                   ' define here Pin of SPI SS
       'Spi_ss Alias Portb.4
       'Set Spi_ss                                               ' Set SPI-SS to Output and High por Proper work of
                                                      ' SPI as Master

       ' HW-SPI is configured to highest Speed
       Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = High , Phase = 1 , Clockrate = 4 , Noss = 1
       Spsr = 1                                                 ' Double speed on ATMega128 default = commented changed by author
       Spiinit                                                  ' Init SPI

    ' --------- End of Section for HW-SPI ------------------------------------------

    #else                                                       ' Config here SPI pins, if not using HW SPI

    ' --------- Start of Section for Soft-SPI --------------------------------------

       ' Chip Select Pin  => Pin 1 of MMC/SD
       Config Pinb.4 = Output
       Mmc_cs Alias Portb.4
       Set Mmc_cs

       ' MOSI - Pin DI => Pin 2 of MMC/SD
       Config Pinb.5 = Output
       Set Pinb.5
       Mmc_portmosi Alias Portb
       Bmmc_mosi Alias 2

       ' MISO - Pin  D0 => Pin 7 of MMC/SD
       Config Pinb.6 = Input
       Mmc_portmiso Alias Pinb
       Bmmc_miso Alias 3

       ' SCK - Pin CLK  => Pin 1 of MMC/SD
       Config Pinb.1 = Output
       Set Pinb.7
       Mmc_portsck Alias Portb
       Bmmc_sck Alias 1

    ' --------- End of Section for Soft-SPI ----------------------------------------

    #endif

    ' ========== End of user definable range =======================================


    ' Error
    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 1                                                    ' Wait some time before initialising MMC/SD
    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 driver library
    $external _mmc
    Gbdriveerror = Driveinit()                                  ' Init MMC/SD Card
  • Poziom 12  
    u mnie wywołanie tej funkcji:
    Gbtemp1 = Initfilesystem(1)
    zwraca 3 albo 5. nie wiem dlaczego.
    może ta karta micro SD 1 giga nie nadaje sie do tego projektu.
  • Poziom 18  
    Zmieniłem kwarc na 8 MHz - znalazłem informacje, że SD na 16 MHz nie działa.

    Dodałem linie ( chciałem ręcznie wyzwalać zapis )
    Code:

    Config Portb.1 = Input
    Reset Portb.1
    Manual Alias Portb.1

    If Manual = 0 Then
    Call Write_to_sd()
    End If


    Jeśli usunę te linie to znowu nic się nie zapisuje.

    Efekt jest taki, że zapisuje co sekundę ( oczywiście na zmianę stanu PB.1 nie reaguje, tylko cały czas zapisuje. PB.1 to ATMega 32 jest T1

    Całość wygląda tak :
    Code:

    $regfile = "m32def.dat"
    $crystal = 8000000
    $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_AVR-DOS.BAS"                               'Biblioteka AVR-DOS

    '********************* Konfiguracja wejść i wyjść

    Config Porta.6 = Output
    Reset Porta.6
    Config Porta.7 = Output
    Reset Porta.7
    Config Portb.0 = Input
    Config Portb.1 = Input
    Reset Portb.1


    '********************* 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                                               'DEC
    Dim M As Byte                                               'DEC
    Dim H As Byte                                               'DEC
    Dim Hh As Byte                                              'BCD
    Dim Mm As Byte                                              'BCD
    Dim Ssek As Byte                                            'BCD

    Dim Day As Byte
    Dim Month As Byte
    Dim Dday As Byte
    Dim Mmonth As Byte

    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
    Sd Alias Portb.0
    Manual Alias Portb.1

    '********************* Konfiguracja SD/MMC

    'MMC -->ATMega32
    'DATA3 -> PORTB.4
    'DI    -> PORTB.5
    'CLK   -> PORTB.7
    'DATA0 -> PORTB.6

    Const Cmmc_soft = 0                                         'SPI Sprzętowe

       ' Podanie pinu wyboru układu
       Config Pinb.4 = Output                                   'wskazanie, który Pin jest CS karty MMC/SD
       Mmc_cs Alias Portb.4
       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.7
       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                                                  ' Inicjowanie SPI

    '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

    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                                              'wyświetlanie czasu
    Call Ds_odczyt
    Call Pomiar

    If Manual = 0 Then
    Call Write_to_sd()
    End If

    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 Ssek , Ack                                       'odczyt komórki pamięci - będzie następny
      I2crbyte Mm , Ack                                         'odczyt komórki pamięci - będzie następny
      I2crbyte Hh , Ack                                         'odczyt komórki pamięci - będzie następny
      I2crbyte Dday , Ack                                       'odczyt komórki pamięci - będzie następny
      I2crbyte Mmonth , Nack                                    'odczyt komórki pamięci - ostatni bajt
      I2cstop

       S = Makedec(ssek)
       M = Makedec(mm)                                          'Zamiana kodu BCD na wartość dziesiętną
       H = Makedec(hh)
       Day = Makedec(dday)
       Month = Makedec(mmonth)

       Set Dioda

     Czas_pcf = Bcd(hh) + ":" + Bcd(mm) + ":" + Bcd(ss)         'Tworzenie stringa z czasem
     Data_pcf = Bcd(dday) + "/" + Bcd(mmonth)                   'Tworzenie stringa z datą

    End Sub



    Wysw_godz:
     Locate 2 , 1
     Lcd Hex(hh) ; ":" ; Hex(mm) ; ":" ; Hex(ssek) ; " " ; Hex(dday) ; "/" ; Hex(mmonth);
    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 = 5 Or M = 10 Or M = 15 Or M = 20 Or M = 25 Or M = 30 Or M = 35 Or M = 40 Or M = 45 Or M = 50 Or M = 55 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 coś z odczytem czasu jest skopane ?

    Wyniki jakie otrzymuję to:
    "01/02" "23:10:32" "21.0"
    "01/02" "23:10:32" "21.0"
    "01/02" "23:10:32" "21.0"
    "01/02" "23:11:32" "21.0"
    "01/02" "23:11:32" "21.0"
    "01/02" "23:11:32" "21.0"
    "01/02" "23:11:32" "21.0"
    "01/02" "23:11:32" "21.0"
    "01/02" "23:11:32" "21.0"
    "01/02" "23:11:32" "21.0"
    "01/02" "23:11:32" "21.0"
    "01/02" "23:11:32" "21.0"
    "01/02" "23:11:32" "21.0"
    "01/02" "23:11:32" "21.0"
    "01/02" "23:11:32" "21.0"
    "01/02" "23:11:32" "21.0"
    "01/02" "23:11:32" "21.0"
    "01/02" "23:11:32" "21.0"
    "01/02" "23:11:32" "21.0"
    "01/02" "23:11:32" "21.0"
    "01/02" "23:11:32" "21.0"
    "01/02" "23:11:32" "21.0"
    "01/02" "23:11:32" "21.0"
    "01/02" "23:11:32" "21.0"
    "01/02" "23:11:32" "21.0"
    "01/02" "23:11:32" "21.0"
    "01/02" "23:11:32" "21.0"
    "01/02" "23:11:32" "21.0"
    "01/02" "23:11:32" "21.0"
    "01/02" "23:11:32" "21.0"
    "01/02" "23:11:32" "21.0"
    "01/02" "23:11:32" "21.0"
    "01/02" "23:11:32" "21.0"
    "01/02" "23:11:32" "21.0"
    "01/02" "23:11:32" "21.0"
    "01/02" "23:11:32" "21.0"
    "01/02" "23:11:32" "21.0"
    "01/02" "23:11:32" "21.0"
    "01/02" "23:11:32" "20.9"
    "01/02" "23:11:32" "21.0"
    "01/02" "23:11:32" "21.0"
    "01/02" "23:11:32" "20.9"
    "01/02" "23:11:32" "21.0"
    "01/02" "23:11:32" "21.0"
    "01/02" "23:11:32" "21.0"
    "01/02" "23:11:32" "21.0"
    "01/02" "23:11:32" "21.0"
    "01/02" "23:11:32" "21.0"
    "01/02" "23:11:32" "21.0"
    "01/02" "23:11:32" "20.9"
    "01/02" "23:11:32" "21.0"
    "01/02" "23:11:32" "21.0"
    "01/02" "23:11:32" "21.0"
    "01/02" "23:12:32" "21.0"
    "01/02" "23:12:32" "21.0"
    "01/02" "23:12:32" "21.0"
  • Poziom 12  
    A co to za błąd opisany w pliku: Config_MMC.bas
    Const Cperrdrivereadresponse = 229 ' No Data response Byte from MMC at Read
    bo mi właśnie taki błąd wyrzuca.

    ponadto w tym pliku jest taki zapis:
    ' Place MMC.LIB version 5.6 in the LIB-Path of BASCOM-AVR installation

    czy to znaczy że jest ten plik: MMC.LIB wymagany w wersji 5.6 ?
    Ale skąd go wziąść ?
  • Poziom 18  
    Przerzuciłem zawartość config_mmc.bas do głównego projektu, poprawiłem błąd w kodzie.
    Code:

    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


    i jeszcze miałem błąd w konfiguracji - zamiast "Set", miałem "Reset".
    No i ruszyło, zapis mam co 5 minut, chociaż im dłużej zapisuje, tym częściej coś pominie, nie wiem czemu, ale czasem przeskakuje niektóre cyfry sekund i jest np.
    23:12:23
    23:12:25

    Wynik jaki zapisał to:
    "02/02" "," "23:00:00" "," "Pokoj" "21.1"
    "02/02" "," "23:05:00" "," "Pokoj" "21.3"
    "02/02" "," "23:10:00" "," "Pokoj" "21.4"
    "02/02" "," "23:15:00" "," "Pokoj" "21.4"
    "02/02" "," "23:20:00" "," "Pokoj" "21.5"
    "02/02" "," "23:25:00" "," "Pokoj" "21.5"
    "02/02" "," "23:30:00" "," "Pokoj" "21.5"
    "02/02" "," "23:35:00" "," "Pokoj" "20.0"

    niestety są znaki "", ale to już mniejsze zło, no i przez to przeskakiwanie sekund czasem nie robi pomiaru.
    Wynik z nocy zajął 2 kb

    Dodano po 3 [godziny] 15 [minuty]:

    Obserwowałem go przez chwilę i wyszło, że to złe wyświetlanie sekund, czyli pomijanie czasem niektórych "00" powoduje, że jest brak zapisu. Braki są w okolicach 00 i 30 sekund

    Znalazłem sugestię na forum Elektroda, żeby wykorzystać przerwanie INT z PCF8383 - Link

    i przez to odciążyć procesor
  • Poziom 12  
    Napisz mi jakich wersji plików używasz, w katalogu lib, Bascom?

    AVR-DOS.LBX
    MMC.LIB
    MMC.LBX
  • Poziom 18  
    Nie wiem dokładnie, które są to wersje. Dołączam je spakowane.

    Wiesz może jak rozwiązać problem z zegarem - z pomijaniem niektórych cyfr sekund ?

    Nie zapomnij zmienić w config_mmc.bas
    Tak ma być poprawnie
    Spsr.0 = 1
  • Poziom 18  
    Usunąłem Wait 1 przy konwersji z DS18B20, działa, bez problemu ( na trzech przewodach ), tylko wyniki są opóźnione - tzn. wyświetlany wynik nie jest z aktualnego pomiaru, tylko z poprzedniego.

    Dodałem jeszcze dwa czujniki DS18B20. Ich zapis razem z godziną i datą na karcie jest jak najbardziej w porządku, tylko wyświetlanie trochę szwankuje - tzn. czasem wyświetlają się jakieś bzdury, a czasem nic. Co ciekawe sam program cały czas działa i zapisuje co 5 minut wyniki, mimo problemów z wyświetlaczem. W górnej linii zrobiłem przełączane przez Timer0 wyświetlanie wyników tylko jednego układu DS i od tej pory mam problem z wyświetlaczem.

    Code:

    $regfile = "m32def.dat"
    $crystal = 8000000
    $baud = 9600                                                ' predkość transmisji
    $hwstack = 256                                              ' rozmiar stosu sprzętowego
    $swstack = 128                                              ' rozmiar stosu
    $framesize = 128                                            ' rozmiar ramki


    '********************* Konfiguracja dodatkowych bibliotek

    'AVR-DOS config

    $include "Config_AVR-DOS.BAS"                               'Biblioteka AVR-DOS

    '********************* Konfiguracja wejść i wyjść

    Config Porta.6 = Output
    Set Porta.6
    Config Porta.7 = Output
    Set Porta.7
    Config Portd.2 = Input
    Set Portd.2

    '********************* 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 Timer0

    Config Timer0 = Timer , Prescale = 1024
    Enable Timer0
    Enable Interrupts
    On Timer0 Czas


    '********************* 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 Ss1 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 Ds2(8) As Byte                                          'zmienna określająca numer układu
    Dim Ss2 As String * 6                                       'zmienna zawierająca przeliczoną i sformatowaną wartość wskazania układu
    Dim T2 As Integer                                           'zmienna odczytu dwóch bajtów z DS18B20
    Dim Ds3(8) As Byte                                          'zmienna określająca numer układu
    Dim Ss3 As String * 6                                       'zmienna zawierająca przeliczoną i sformatowaną wartość wskazania układu
    Dim T3 As Integer                                           'zmienna odczytu dwóch bajtów z DS18B20
    '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                                               'DEC
    Dim M As Byte                                               'DEC
    Dim H As Byte                                               'DEC
    Dim Hh As Byte                                              'BCD
    Dim Mm As Byte                                              'BCD
    Dim Ssek As Byte                                            'BCD

    Dim Day As Byte
    Dim Month As Byte
    Dim Dday As Byte
    Dim Mmonth As Byte

    Dim Czas_pcf As String * 8
    Dim Data_pcf As String * 8

    Dim Licznik As Integer
    Dim Ot1 As Bit                                              'pomocnicza zmienna bitowa do wyboru podprogramu
    Dim Ot2 As Bit                                              'pomocnicza zmienna bitowa do wyboru podprogramu
    Dim T As Integer                                            'zmienna licznikowa określająca czas wyświetlania wskazań aktywnego układu


    '********************* Deklaracje zmiennych karty SD

    Dim Blad_sd As Bit
    Dim Zapisano As Bit


    '********************* 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_odczyt1
    Declare Sub Ds_odczyt2
    Declare Sub Ds_odczyt3

    Declare Sub Temp1
    Declare Sub Temp2
    Declare Sub Temp3
    Declare Sub Wybor

    '********************* Deklaracje Aliasów

    Sd_dioda Alias Porta.6                                      'Przypisanie przyjaznych nazw do poszczególnych portów do których
    Dioda Alias Porta.7


    '********************* Konfiguracja SD/MMC

    'MMC -->ATMega32
    'DATA3 -> PORTB.4
    'DI    -> PORTB.5
    'CLK   -> PORTB.7
    'DATA0 -> PORTB.6

    Const Cmmc_soft = 0                                         'SPI Sprzętowe

       ' Podanie pinu wyboru układu
       Config Pinb.4 = Output                                   'wskazanie, który Pin jest CS karty MMC/SD
       Mmc_cs Alias Portb.4
       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.7
       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                                                  ' Inicjowanie SPI

    '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

    Zapisano = 0
    Blad_sd = 0
    Ot1 = 0
    Ot2 = 0
    T = 300


    '********************* Program główny

    Cursor Off                                                  'wyłącz kursor
    Cls                                                         'czyść ekran

    Ds1(1) = 1wsearchfirst()                                    'rozkaz szukania pierwszego układu
    Ds2(1) = 1wsearchnext()                                     'rozkaz szukania pierwszego układu
    Ds3(1) = 1wsearchnext()                                     'rozkaz szukania pierwszego układu

    Do

    Call Gettime                                                'pobieranie czasu

    Call Pomiar

    'Call Ds_odczyt1
    'Call Ds_odczyt2
    'Call Ds_odczyt3

    Call Wysw_godz                                              'wyświetlanie czasu

    Loop



    '*************************** pomiar temp. na termometrze ds18b20

    '********** magistrala 1-wire wejście 1 czujnik 1
    Sub Ds_odczyt1

    Disable Interrupts

    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

    '********** magistrala 1-wire konwersja temperatury

    1wreset                                                     'reset magistrali 1-Wire
        1wwrite &HCC                                            'rozkaz funkcyjny SKIP ROM
       1wwrite &H44                                             'konwersja temperatury dla wszystkich DS18B20


    Enable Interrupts


    '**************** pierwsze wejście - pierwszy 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ą
       Ss1 = Str(t1)
       Ss1 = Format(ss1 , " 0.0")                               'formatuj według wzorca - jedno miejsce po przecinku


    'Locate 1 , 1
    'Waitms 150                                                  'wyświetl w pozycji
    'Lcd Ss1 ; Chr(0) ; "C "                                     'wyświetl wynik formatowania + znak specjalny + C


    Return

    End Sub


    '********** magistrala 1-wire wejście 1 czujnik 2
    Sub Ds_odczyt2

    Disable Interrupts

    1wreset                                                     'reset magistrali 1-wire
    1wwrite &H55                                                'rozkaz adresowy MATCH ROM
    1wverify Ds2(1)                                             'sprawdź adres
    1wwrite &HBE                                                'rozkaz funkcyjny polecenie odczytu DS18B20
    T2 = 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


    Enable Interrupts

    '**************** pierwsze wejście - drugi DS18B20 obliczenia + wyświetlanie **********

    T2 = T2 * 10
       T2 = T2 / 16
       'If Tc1 > 0 Then Cls                                       'korekta przesuniecia znaku st C przy przejściu z temp ujemnej na dodatnią
       Ss2 = Str(t2)
       Ss2 = Format(ss2 , " 0.0")                               'formatuj według wzorca - jedno miejsce po przecinku


    'Locate 1 , 10
    'Waitms 150                                                  'wyświetl w pozycji
    'Lcd Ss2 ; Chr(0) ; "C "                                     'wyświetl wynik formatowania + znak specjalny + C


    Return

    End Sub

    '********** magistrala 1-wire wejście 1 czujnik 2
    Sub Ds_odczyt3

    Disable Interrupts

    1wreset                                                     'reset magistrali 1-wire
    1wwrite &H55                                                'rozkaz adresowy MATCH ROM
    1wverify Ds3(1)                                             'sprawdź adres
    1wwrite &HBE                                                'rozkaz funkcyjny polecenie odczytu DS18B20
    T3 = 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


    Enable Interrupts

    '**************** pierwsze wejście - drugi DS18B20 obliczenia + wyświetlanie **********

    T3 = T3 * 10
       T3 = T3 / 16
       'If Tc1 > 0 Then Cls                                       'korekta przesuniecia znaku st C przy przejściu z temp ujemnej na dodatnią
       Ss3 = Str(t3)
       Ss3 = Format(ss3 , " 0.0")                               'formatuj według wzorca - jedno miejsce po przecinku


    'Locate 2 , 10
    'Waitms 150                                                  'wyświetl w pozycji
    'Lcd Ss3 ; Chr(0) ; "C "                                     'wyświetl wynik formatowania + znak specjalny + C


    Return

    End Sub

    '**************** Podprogram wyświetlania wskazań pierwszego układu DS18B20 **********
    Temp1:

    Lcd "               "                                       'wyczyść ekran z poprzednich wskazań

     Locate 1 , 1                                               'wyświetl w pozycji
     Lcd "Pokoj=" ; Ss1 ; Chr(0) ; "C   "                       'wyświetl wynik obliczeń + znak stopnia + litera C


    Return


    '**************** Podprogram wyświetlania wskazań drugiego układu DS18B20 **********
    Temp2:

    Lcd "               "                                       'wyczyść ekran z poprzednich wskazań

    Locate 1 , 1                                                'wyświetl w pozycji
    Lcd "Kaloryfer=" ; Ss2 ; Chr(0) ; "C"                       'wyświetl wynik obliczeń + znak stopnia + litera C


    Return

    '**************** Podprogram wyświetlania wskazań drugiego układu DS18B20 **********
    Temp3:

    Lcd "               "                                       'wyczyść ekran z poprzednich wskazań

    Locate 1 , 1                                                'wyświetl w pozycji
    Lcd "Zewnatrz=" ; Ss3 ; Chr(0) ; "C "                       'wyświetl wynik obliczeń + znak stopnia + litera C


    Return

    '**************** Podprogram wyboru wyświeltania danych z układu DS18B20 **********

    Wybor:                                                      'podprogram wyboru czujnika DS18B20
    If Ot1 = 0 And Ot2 = 0 Then                                 'warunek(i)
    Gosub Temp1                                                 'wtedy idź do podprogramu pierwszego DS18B20
    Ot1 = 1                                                     'zmień stan zmiennej bitowej Ot1 na 1
    Ot2 = 0                                                     'zmień stan zmiennej bitowej Ot2 na 0


    Elseif Ot1 = 1 And Ot2 = 0 Then                             'dodatkowy warunek(i)
    Gosub Temp2                                                 'to idź do podprogramu drugiego DS18B20
    Ot1 = 0                                                     'zmień stan zmiennej bitowej Ot1 na 0
    Ot2 = 1                                                     'zmień stan zmiennej bitowej Ot2 na 1

    Else                                                        'jesli nie to
    If Ot1 = 0 And Ot2 = 1 Then                                 'warunek(i)
    Gosub Temp3                                                 'to idź do podprogramu trzeciego DS18B20
    Ot1 = 0                                                     'zmień stan zmiennej bitowej Ot1 na 0
    Ot2 = 0                                                     'zmień stan zmiennej bitowej Ot2 na 0


    End If
    End If
    Return

    '**************** Podprogram Timer0 **********

    Czas:
    Counter0 = Counter0 + 6
    Incr Licznik                                                'zwiększaj stan licznika


    If Licznik = T Then                                         'jeśli Licznik = T
    Gosub Wybor                                                 'idź do podprogramu Wybor
    Licznik = 0                                                 'zeruj licznik

    End If

    Return


    '***********************  Obsługa czasu/daty

    Sub Gettime()

       I2cstart
       I2cwbyte 162                                             'Wysyła adres odczytu urzadzenia (162 (0xA2) układu PCF8583)
       I2cwbyte &H00
       I2cwbyte &H08                                            'włącza maskowanie roku i dnia tygodnia
       I2cstop
       I2cstart
       I2cwbyte 162                                             'Wysyła adres odczytu urzadzenia (162 (0xA2) układu PCF8583)
       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 Mmonth , Nack                                   'Odczutuje miesiąc
       I2cstop
       S = Makedec(ssek)
       M = Makedec(mm)                                          'Zamiana kodu BCD na wartość dziesiętną
       H = Makedec(hh)
       Day = Makedec(dday)
       Month = Makedec(mmonth)
       Czas_pcf = Bcd(hh) + ":" + Bcd(mm) + ":" + Bcd(ssek)     'Tworzenie stringa z czasem
       Data_pcf = Bcd(dday) + "/" + Bcd(mmonth)                 'Tworzenie stringa z datą


    End Sub


    Wysw_godz:
     Locate 2 , 1
     Lcd Czas_pcf
     Locate 2 , 10
     Lcd Data_pcf

    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 , "," , "Pokoj" , Ss1 , "," , "Kaloryfer" , Ss2 , "," , "Zewnatrz" , Ss3       '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_odczyt1                                       'Skocz do podprogramu odczytu temperatury z DS18b20
          Call Ds_odczyt2                                       'Skocz do podprogramu odczytu temperatury z DS18b20
          Call Ds_odczyt3                                       'Skocz do podprogramu odczytu temperatury z DS18b20

          If M = 0 Or M = 5 Or M = 10 Or M = 15 Or M = 20 Or M = 25 Or M = 30 Or M = 35 Or M = 40 Or M = 45 Or M = 50 Or M = 55 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

  • Poziom 16  
    Szanowni koledzy

    Pozwolicie że odświeżę trochę ten temat.
    Uparcie próbuję skompilować program do obsługi karty SD. Ale nie mogę przejść nawet tego etapu. Zaznaczam, że używam wersji kompilatora 1.11.8.1 (podejrzewam że tu tkwi problem, ale po kolei)

    1. Sciągnąłem biblioteki AVR-DOS.LBX, MMC.LIB, oraz MMC.LBX ze strony http://members.aon.at/voegel/ (a więc nie sądzę aby coś było w nich namieszane) i umieściłem je w katalogu c:\...\BASCOM-AVR\LIB.
    2. Podobnie jak powyższe ściągnąłem Config_MMC.bas oraz Config_AVR-DOS.bas z w/w strony i mam je w katalogu projektu. Skonfigurowałem je tak jak sugerował kolega maximus22_kr
    3. W czasie próby kompilacji prostego programu:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    otrzymuję błąd: illegal character [expected (,got'='] in file... identycznie jak opisał to kolega Przemek_bundy w poście #7. Sprawdziłem, że to polecenia:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    w funkcji Write_To_Sd() powodują właśnie ten błąd (po ich wyremowaniu błąd nie jest generowany)
    Domyślam się że kompilator nie "rozumie" tej składni

    Proszę o naprowadzenie mnie czy poprawnie rozumuję.

    Czy może jednak inny jest inny problem...
    [/code]
  • Poziom 11  
    Panowie rewalacja.
    Dopiero zaczałem czytać i mam odpowiedź na wszystkie moje zagadnienia

    Teraz jeszcze edycja Excela ...
  • Poziom 13  
    Ale po co znaki \\ ? - własnie o nie się rzuca kompilator

    Code:

    Open \"pomiar.txt\" For Append As #2


    dodatkowo w konfiguracji trzeba sprawdzić Spsr.0 = 1:
    Code:

    Const Cmmc_soft = 0                                         'SPI Sprzętowe

       ' Podanie pinu wyboru układu
       Config Pinb.4 = Output                                   'wskazanie, który Pin jest CS karty MMC/SD
       Mmc_cs Alias Portb.4
       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.7
       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 


    Nie wiem czemu, ale u mnie po wymianie kwarcu z 16 MHz na 8 MHz ruszyło od razu - wyrabia się z zapisem stringu 40 znakowego co 5 sekund
  • Poziom 16  
    Czy to znaczy, że nazwa pliku nie powinna być wpisana w cudzysłowie?
    W sumie nic nowego nie wymyśliłem wszyscy przede mną tak wpisywali i nikt nie zgłaszał żadnych problemów z tego powodu

    Po drugie mam tak właśnie ustawione
    Spsr.0 = 1
    cokolwiek to miałoby znaczyć
  • Poziom 13  
    upss naraz wałkuję dwa tematy o SD, stąd nieporozumienie.

    u mnie taki kod działa na kwarcu 8 MHz

    Code:

    $regfile = "m32def.dat"
    $crystal = 8000000
    $baud = 9600                                                ' predkość transmisji
    $hwstack = 128                                              ' rozmiar stosu sprzętowego
    $swstack = 128                                              ' rozmiar stosu
    $framesize = 128                                            ' rozmiar ramki

    '********************* Deklaracja podprogramów
    Declare Sub Write_to_sd()
    Declare Sub Pomiar   
    '********************* Deklaracja zmiennych
    Dim Czas_pcf_sd As String * 8
    Dim Data_plik As String * 8
    '********************* Konfiguracja SD/MMC

    'MMC -->ATMega32
    'DATA3 -> PORTB.4
    'DI    -> PORTB.5
    'CLK   -> PORTB.7
    'DATA0 -> PORTB.6

    Const Cmmc_soft = 0                                         'SPI Sprzętowe

       ' Podanie pinu wyboru układu
       Config Pinb.4 = Output                                   'wskazanie, który Pin jest CS karty MMC/SD
       Mmc_cs Alias Portb.4
       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.7
       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                                                  ' Inicjowanie SPI

    '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

    '***********************  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
             Flaga_sd = 1
             Open Plik For Append As #2                         'otwórz plik pomiar.txt aby dopisać dane
             Write #2 , Data_pcf , "," , Czas_pcf_sd , "," , "Pokoj" , Ss1 , "," , "Kaloryfer" , Ss2 , "," , "Zewnatrz" , Ss3       '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       

    '*********************** Podprogram określający kiedy dokonać pomiarów oraz zapisu na SD

    Sub Pomiar
    If S = 0 Then                                               'jeśli sekundy wynoszą 0 lub 30

          Reset Dioda                                           'Zapala diodę LED
          Call Gettime()                                        'Skocz do podprogramu pobierania czasu z pcf8583
          Call Ds_odczyt1                                       'Skocz do podprogramu odczytu temperatury z DS18b20
          Call Ds_odczyt2                                       'Skocz do podprogramu odczytu temperatury z DS18b20
          Call Ds_odczyt3                                       'Skocz do podprogramu odczytu temperatury z DS18b20

          If M = 0 Or M = 5 Or M = 10 Or M = 15 Or M = 20 Or M = 25 Or M = 30 Or M = 35 Or M = 40 Or M = 45 Or M = 50 Or M = 55 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     


    Do tego jest obsługa zegara na PCF8563, który wyznacza moment zapisu. Zapis z trzech czujników + data + godzina

    Co do zmienne Ss, która u Kolegi jest typu Word,
    polecenie Write #2 , Ss nie lubi niektórych zmiennych, pamiętam, że musiałem zrobić dodatkową zmienna typu string, bo niektórych nie przyjmuje.
  • Poziom 16  
    A jakiej wersji kompilatora kolega używa?

    oraz jakich plików mmc.lib, mmc.lbx oraz avr-dos.lbx

    ja używam:
    avr-dos.lbx ver.5.5,
    mmc.lib ver.2
    mmc.lbx ver.2

    zastanawiam się jeszcze jak powinno się prawidłowo postępować
    czy wgrać mmc.lib do katalogu LIB i skompilować narzędziem Bascom-AVR (Lib Manager) czy skopiować ogólnie dostępny.
  • Poziom 16  
    Zarzuciłem taki prosty programik.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Kompiluje się poprawnie.
    Po załączeniu przechodzi inicjalizację "napędu"
    DriveInit daje w odpowiedzi 0

    ale wykłada się na InitFileSystem
    w odpowiedzi daje 20 co oznacza:
    cpSectorSizeNotSupported (Only sector size of 512 Bytes is supported)

    Ja jednak używam kart sformatowanych na FAT16 i właśnie 512B/sektor). Używam kart 8MB oraz 16MB, obie wyciągnięte z aparatów foto.

    Czy może ktoś ma sugestie dotyczące używanych kart i sposobu ich formatowania?
  • Poziom 16  
    Ok zadziałało.
    Kupiłem kartę EMTEC 2GB i sformatowałem na FAT16. Rozmiar jednostki alokacji (sektora?) ustawił się domyślnie na 16kB ale to nie przeszkadza.
    Zastanawia mnie w czym różnią się karty 16MB i 128MB których używałem wcześniej i które nie działały od tej 2GB.