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

[BascomAVR][Atmega 128][Zapis do karty MMC + Fat 16]

Snowboarder 09 Lis 2008 22:08 3496 2
REKLAMA
  • #1 5720243
    Snowboarder
    Poziom 11  
    Wiem że podobne tematy krążą po forum, to też od paru tygodni czytam je uważnie i próbuję rozwiązać mój problem ,lecz z marnym skutkiem…:/
    Jestem początkujący w programowaniu w BascomAVR, w związku z czym napotykam na duże trudności w realizacji przedstawionego poniżej problemu(jest to kwestia zalki z jednego przedmiotu :D).
    Problem jest następujący:
    - zapis danych z termometru i zegara czasu rzeczywistego na kartę MMC w określonych przedziałach czasu.(wiąże się to z utworzeniem systemu plików FAT 16 na karcie MMC).
    Poniżej zamieszczam kod do konwersji czasu i temperatury (tyle dałem rady zrobić:D),

    $regfile = "m128def.dat"
    $lib = "MMC.LIB"
    $crystal = 11059200
    
    Config Lcdpin = Pin , Db4 = Portd.4 , Db6 = Portd.6 , Db5 = Portd.5 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
    
    Config Lcd = 16 * 4
    Config Scl = Portb.7
    Config Sda = Portb.6
    '********************** SPI mode ********************************************
    
    Config Pinb.0 = Output                                        ' define here Pin for CS of MMC/SD Card
    Mmc_cs Alias Portb.0
    Set Mmc_cs
    ' 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
    Spiinit
    
    '****************************************************************************
    
    Const Ds1307w = &B11010000
    Const Ds1307r = &B11010001
    Const Ds1621w = &B10010000
    Const Ds1621r = &B10010001
    Deflcdchar 0 , 14 , 10 , 14 , 32 , 32 , 32 , 32 , 32
    Deflcdchar 1 , 4 , 10 , 10 , 14 , 31 , 31 , 14 , 32
    Dim Sekundy As Byte , Minuty As Byte , Godziny As Byte , Dzien As Byte , Dzienty As String * 3
    Dim Dzient As Byte , Miesiac As Byte , Rok As Byte
    Dim Tempd As Byte , Tempd1 As Byte , A As Word , Ujemna As Word
    
    Do
    
    
    I2cstart
       I2cwbyte Ds1621w
       I2cwbyte 238
    I2cstop
    I2cstart
       I2cwbyte Ds1307w
       I2cwbyte 0
    I2cstop
    
    I2cstart
       I2cwbyte Ds1307r
       I2crbyte Sekundy , 8
       I2crbyte Minuty , 8
       I2crbyte Godziny , 8
       I2crbyte Dzien , 8
       I2crbyte Dzient , 8
       I2crbyte Miesiac , 8
       I2crbyte Rok , 9
    I2cstop
    
                   Sekundy = Makedec(sekundy)
                   Minuty = Makedec(minuty)
                   Godziny = Makedec(godziny)
                   Dzien = Makedec(dzien)
                   Dzient = Makedec(dzient)
                   Miesiac = Makedec(miesiac)
                   Rok = Makedec(rok)
    
                   Select Case Dzien
                   Case 1 : Dzienty = "NIE"
                   Case 2 : Dzienty = "PON"
                   Case 3 : Dzienty = "WT "
                   Case 4 : Dzienty = "SR "
                   Case 5 : Dzienty = "CZW"
                   Case 6 : Dzienty = "PIA"
                   Case 7 : Dzienty = "SOB"
                   End Select
    Waitms 250
    Cls
    Cursor Off
    
    Locate 1 , 1
       If Minuty < 10 Then
          Lcd ; Dzienty ; " |  " ; Godziny ; ":0" ; Minuty ; ":" ; Sekundy
       Else
          Lcd ; Dzienty ; " |  " ; Godziny ; ":" ; Minuty ; ":" ; Sekundy
       End If
    
    Locate 2 , 3
       If Rok < 10 Then
          Lcd ; Dzient ; "/" ; Miesiac ; "/0" ; Rok
       Else
       Lcd ; Dzient ; "/" ; Miesiac ; "/" ; Rok
       End If
    
    I2cstart
       I2cwbyte Ds1621w
       I2cwbyte 170
    I2cstart
     I2cwbyte Ds1621r
     I2crbyte Tempd , 8
     I2crbyte Tempd1 , 9
        A = Tempd1 / 25
    I2cstop
    If Tempd < 200 Then
       Locate 3 , 1
          Lcd ; Chr(1) ; " +" ; Tempd ; "." ; A ; Chr(0) ; "C" ;
    Else
      If A = 5 Then
         Ujemna = 255 - Tempd
      Else
         Ujemna = 256 - Tempd
      End If
       Locate 3 , 1
          Lcd ; Chr(1) ; " -" ; Ujemna ; "." ; A ; Chr(0) ; "C" ;
         End If
    
    
    Loop
    
    End
    

    ---pozostała najistotniejsza część: stworzenie FAT-u i zapis.
    Jeśli ktoś z Was ma na swoim koncie taki programik- to proszę o wszelką pomoc!!.
    Ps: załączam układ w Proteusie i pliki.
    [BascomAVR][Atmega 128][Zapis do karty MMC + Fat 16]
  • REKLAMA
  • #2 5774769
    sinuh3
    Poziom 17  
    Jest coś takiego jak elm-fat, niestety w C. bardzo fajnie działa, po przeskoczeniu początkowych problemów. W jednym z moich starszych postów o tych walkach wspominałem.
  • #3 5775533
    Snowboarder
    Poziom 11  
    Otóż to:”w C” :D
    …zaopatrzyłem się nawet w książkę(niestety jest w języku C)-ale dużo pomogła mi w rozkminieniu FAT-u. Teraz pozostała kwestia napisania w Bascomie programu(że tak powiem ) z czytującego mi FAT, czyli: jaki to jest FAT, ile klastrów na sektor, które są wolne, od którego można rozpocząć zapisywanie itd. – i oczywiście wymyśleć funkcję zapisującą dane do pliku…
    ....ale dzięki < sinuh3> za jakikolwiek ruch w tym temacie :D
REKLAMA