Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[Atmega8][Bascom] Karta SD 1GB

grabek_radek 05 Jun 2008 10:15 15294 16
  • #1
    grabek_radek
    Level 21  
    Witam wiem ze temat byl poruszany ale chcialem to zaczac od poczatku jakies wyjasnienia

    A mianowicie chce podlaczyc karte sd 1GB do mikrokontrolera atmega 8 z rezonatorem 8 MHz i zapisywac do nej dane z pomiaru

    potrzebuje schematu o raz kawalek kodu w bascomie do komunikacji z ta karta


    Poprawiłem tytuł:
    https://www.elektroda.pl/rtvforum/topic1015361.html
    [c_p]
    [28-30.06.2022, targi] PowerUP EXPO 2022 - zasilanie w elektronice. Zarejestruj się za darmo
  • #3
    Pituś Bajtuś
    Level 28  
    regulamin pkt 16 wrote:
    Za podstawowe przesłanie w działalności na forum uznaje się bezinteresowność, własną inicjatywę i przedsiębiorczość użytkowników. Nie będą akceptowane wszelkie formy lenistwa, i roszczeniowego charakteru prezentowane przez użytkowników.
  • #4
    grabek_radek
    Level 21  
    no tak tylko ze
    Quote:
    Oznacza to, że najlepszymi kontrolerami do tego celu są układy Mega103 lub Mega128. Inne układy posiadają zbyt mało wewnętrznej pamięci. Można także używać układu Mega8515 czy Mega162 z dołączoną pamięcią XRAM.

    czyli chyba bede musial przejsc na innego procka :)
    ale moze komus sie udalo na atmega 8
  • #5
    zerpo
    Level 22  
    Da się na mniejszym procku, ale trzeba będzie trochę kombinować. Sektory na karcie mają 512 bajtów i są odczytywane/zapisywane w całości. Nie ma dostępu do pojedynczych bajtów. Jeśli więc chcesz zmienić tylko jeden bajt, to musisz odczytać cały sektor, zmienić bajt w zbuforowanej tablicy i następnie zapisać ponownie na kartę.
    Bez wolnych 512 bajtów w uC obsługa jakiegoś systemu plików staje się praktycznie niemożliwa.

    Sam dostęp do surowych danych z karty jest możliwy, ale bardzo niewygodny, bo trzeba by było np. odczytywać tylko wybrane bajty z 512 bajtowego sektora, resztę wyrzucać do pustej zmiennej. Tam samo z zapisem. Czyli za dużo kombinowania, zwłaszcza, że za niecałe 10zł można kupić mege16 lub 32 i mieć problem z głowy...
  • #6
    marek_Łódź
    Level 36  
    [Atmega8][Bascom] Karta SD 1GB

    Procesor ATMega32. W przypadku M8 owszem, można odczytać część bloku 512 pomijając zbędne, ale zapisać ponownie taki blok już się nie da bo brakuje nam danych, które zgubiliśmy przy odczycie. No chyba, że dane generujemy w biegu (np pomiary) i ich nie modyfikujemy. Przy procesorze 3V pomijamy dzielniki oporowe

    Code:
    'Constants
    
    Const Msbl = 0
    Const Msbh = 1
    Const Dly = 2
    Const Bits8 = 8
    Const Bits16 = 16
    Const Bits32 = 32

    'Variables
    Dim Res(16) As Byte
    Dim Indat(512) As Byte                                      'Memory buffer for temp storage.
    Dim Dat As Byte
    Dim Resp As Byte
    Dim Resp2 As Word
    Dim Isd As Word
    Dim Jsd As Word
    Dim Ksd As Byte
    Dim Bout As Byte
    Dim Addr As Long
    Dim Saddr As Long
    Dim Eaddr As Long

    'Aliases
    Cs Alias Portd.6
    Clk Alias Portb.7
    Miso Alias Pinb.6                                           'inp
    Mosi Alias Portb.5                                          'out

    'Declarations
    Declare Sub Mprint
    Declare Sub Minit
    Declare Sub Mstatusx
    Declare Sub Mwrite(byval Addr As Long )
    Declare Sub Mread(byval Addr As Long )
    Declare Sub Merase(byval Saddr As Long , Byval Eaddr As Long)

    Config Spi = Soft , Din = Pinb.6 , Dout = Portb.5 , Ss = Portd.6 , Clock = Portb.7


    Code:

    '*** INITIALIZATION OF MMC ***
    Sub Minit
    Nocard = 0
    Set Cs
    Dat = &HFF
    For Isd = 1 To 10
      Shiftout Mosi , Clk , Dat , Msbl
    Next Isd
    Resp = 255

    Reset Cs
    Cmd0:
    Dat = &H40
    Shiftout Mosi , Clk , Dat , Msbl
    Addr = &H00000000
    Shiftout Mosi , Clk , Addr , Msbl
    Dat = &H95
    Shiftout Mosi , Clk , Dat , Msbl

    Isd = 1
    While Resp <> &H01
      Shiftin Miso , Clk , Resp , Msbl
      Isd = Isd + 1
      If Isd = 50 Then Exit While
    Wend
    If Isd = 50 Then
      Nocard = 1
      Reset Mosi
      Return
    End If

    Set Cs
    Waitms 50
    Reset Cs
    Dat = &HFF

    Cmd1:
    While Resp <> &H00
    Set Cs
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftin Miso , Clk , Resp , Msbl
    Reset Cs
    Dat = &H41
    Shiftout Mosi , Clk , Dat , Msbl
    Addr = 0
    Shiftout Mosi , Clk , Addr , Msbl
    Dat = &HFF
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftin Miso , Clk , Resp , Msbl
    Wend

    Dat = &HFF
    Set Cs
    Reset Mosi
    End Sub

    '**** READ routine assumes ADDR uses Status subroutine *****
    Sub Mread(byval Addr As Long)
    If Nocard = 1 Then Exit Sub
    Addr = Addr * 512
    Set Cs
    Dat = &HFF
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftin Miso , Clk , Resp , Msbl
    Reset Cs
    Dat = &H51
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftout Mosi , Clk , Addr , Msbl
    Dat = &HFF
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftin Miso , Clk , Resp , Msbl

    Isd = 1
    While Resp <> 0
    Shiftin Miso , Clk , Resp , Msbl
    Isd = Isd + 1
    If Isd = 50 Then
      Nocard = 1
      Return
    End If
    Wend

    Isd = 1
    While Resp <> &HFE
     Shiftin Miso , Clk , Resp , Msbl
    Isd = Isd + 1
    If Isd = 50 Then
      Nocard = 1
      Return
    End If
    Wend

    For Isd = 1 To 512
        Shiftin Miso , Clk , Indat(isd) , Msbl
    Next Isd

    Shiftin Miso , Clk , Resp , Msbl
    Shiftin Miso , Clk , Resp , Msbl

    Set Cs
    'Mstatus
    Reset Mosi
    End Sub

    '****Block Start Tag / End Tag and ERASE ****
    Sub Merase(byval Saddr As Long , Byval Eaddr As Long)

    'erase first 1024 bytes

    'Block START TAG
    Cmd32:

    Set Cs
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftin Miso , Clk , Resp , Msbl
    Reset Cs
    Dat = &H60
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftout Mosi , Clk , Saddr , Msbl
    Dat = &HFF
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftin Miso , Clk , Resp , Msbl
    While Resp <> &H00
    Shiftin Miso , Clk , Resp , Msbl
    Wend

    'Block END TAG
    Cmd33:

    Set Cs
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftin Miso , Clk , Resp , Msbl
    Reset Cs
    Dat = &H61
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftout Mosi , Clk , Eaddr , Msbl
    Dat = &HFF
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftin Miso , Clk , Resp , Msbl
    While Resp <> &H00
    Shiftin Miso , Clk , Resp , Msbl
    Wend

    'ERASE SELECTED BLOCK
    Cmd38:
    Set Cs
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftin Miso , Clk , Resp , Msbl
    Reset Cs
    Dat = &H66
    Shiftout Mosi , Clk , Dat , Msbl
    Addr = 0
    Shiftout Mosi , Clk , Addr , Msbl
    Dat = &HFF
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftin Miso , Clk , Resp , Msbl
    While Resp = 0
    Shiftin Miso , Clk , Resp , Msbl
    Wend

    'Mstatus
    End Sub

    '** WRITE Routine assumes ADDR, BOUT uses Status subroutine **
    Sub Mwrite(byval Addr As Long)
    If Nocard = 1 Then Exit Sub
    Addr = Addr * 512
    Cmd24:
    Set Cs
    Dat = &HFF
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftin Miso , Clk , Resp , Msbl
    Reset Cs
    Dat = &H58
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftout Mosi , Clk , Addr , Msbl
    Dat = &HFF
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftin Miso , Clk , Resp , Msbl
    While Resp <> 0
    Shiftin Miso , Clk , Resp , Msbl
    Wend

    Dat = &HFE
    Shiftout Mosi , Clk , Dat , Msbl

    For Isd = 1 To 512
     Shiftout Mosi , Clk , Indat(isd) , Msbl
    Next Isd
    Dat = &HFF
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftin Miso , Clk , Resp , Msbl

    Shiftin Miso , Clk , Resp , Msbl
    While Resp = 0
    Shiftin Miso , Clk , Resp , Msbl
    Wend

    Set Cs
    'Mstatus
    Reset Mosi
    End Sub

    'Get MMC Status
    Sub Mstatusx
    Cmd13:
    Set Cs
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftin Miso , Clk , Resp , Msbl
    Reset Cs
    Dat = &H4D
    Shiftout Mosi , Clk , Dat , Msbl
    Addr = 0
    Shiftout Mosi , Clk , Addr , Msbl
    Dat = &HFF
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftin Miso , Clk , Resp2 , Msbl
    Set Cs
    End Sub

  • #7
    grabek_radek
    Level 21  
    Quote:
    No chyba, że dane generujemy w biegu (np pomiary) i ich nie modyfikujemy


    tak wlasnie o to chodzi atmega 8 ma tylko zapisywac na czystej karcie wyniki z pomiaru - nic nie bedzie modyffikowac tylkow puste miejsca bedzie zapisywac jeden pomiar nastepny juz w innym miejscu
  • #8
    marek_Łódź
    Level 36  
    grabek_radek wrote:
    Quote:
    No chyba, że dane generujemy w biegu (np pomiary) i ich nie modyfikujemy


    tak wlasnie o to chodzi atmega 8 ma tylko zapisywac na czystej karcie wyniki z pomiaru - nic nie bedzie modyffikowac tylkow puste miejsca bedzie zapisywac jeden pomiar nastepny juz w innym miejscu


    W pętli zapisu zamiast pobierać dane z tablicy trzeba wykonywać pomiar i w biegu zapisywać na kartę. Podobnie trzeba zrealizować odczyt, wtedy bufor jest zbędny.
  • #9
    grabek_radek
    Level 21  
    marek_Łódź a mozna prosic jak to bedzie wygladal kod bo troszke jeszcze nie lape bo bede probowal to po raz 1
  • #10
    marek_Łódź
    Level 36  
    Na przykład tak:

    Code:
    '** WRITE Routine assumes ADDR, BOUT uses Status subroutine **
    
    Sub Mwrite(byval Addr As Long)
    If Nocard = 1 Then Exit Sub
    Addr = Addr * 512
    Cmd24:
    Set Cs
    Dat = &HFF
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftin Miso , Clk , Resp , Msbl
    Reset Cs
    Dat = &H58
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftout Mosi , Clk , Addr , Msbl
    Dat = &HFF
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftin Miso , Clk , Resp , Msbl
    While Resp <> 0
    Shiftin Miso , Clk , Resp , Msbl
    Wend

    Dat = &HFE
    Shiftout Mosi , Clk , Dat , Msbl

    For Isd = 1 To 256
     vv=GetAdc(chan)
     b=low( vv)
     Shiftout Mosi , Clk , b , Msbl
     b=high( vv)
     Shiftout Mosi , Clk , b , Msbl
    Next Isd

    Dat = &HFF
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftin Miso , Clk , Resp , Msbl

    Shiftin Miso , Clk , Resp , Msbl
    While Resp = 0
    Shiftin Miso , Clk , Resp , Msbl
    Wend

    Set Cs
    'Mstatus
    Reset Mosi
    End Sub


    Procedura zapisuje 256 bajtów z kanału analogowego Chan pod addr na karcie
  • #11
    grabek_radek
    Level 21  
    a czy to bedzie dzialac gdy do vv bede wpisywal zmienna ktora wczesniej sobie zadeklarowalem w programie ??

    tz
    dim a as integer
    ....


    vv=a
    czy to musi bys bezposrednio z jakiejsc lini ?
    a i jeszcze jedna sprawa w jakim formacie te dane sa zapisywane bo pozniej chce je odczytywac na zwyklym PC o ile jest to mozliwe
  • #12
    marek_Łódź
    Level 36  
    Można zapisywać dowolne dane z dowolnej zmiennej. W pętli umieściłem odczyt adc, bo tylko w trybie jednoczesnej obsługi przetwornika i karty mamy możliwość rezygnacji z bufora. Oczywiście ta obsługa może dotyczyć kilku kanałów, łącznie z zapisem na karcie znaczników/wartości czasu.

    Analogicznie może się odbywać współpraca z rs232/485 (w procedurze odczytu też mamy pętlę pobierania danych z karty, które trzeba natychmiast wysłać).

    Dane są dokładnie w formacie otrzymanym z przetwornika, w powyższym przykładzie najpierw młodszy, potem starszy bajt. Dla otrzymania wielkości mierzonej trzeba je stosownie przeskalować.

    Procedury zapisu odczytu to nieco zmodyfikowane procedurki gdzieś, kiedyś pobrane z netu.
  • #13
    Freddy
    Level 43  
    grabek_radek wrote:
    no tak tylko ze
    Quote:
    Oznacza to, że najlepszymi kontrolerami do tego celu są układy Mega103 lub Mega128. Inne układy posiadają zbyt mało wewnętrznej pamięci. Można także używać układu Mega8515 czy Mega162 z dołączoną pamięcią XRAM.

    czyli chyba bede musial przejsc na innego procka :)
    ale moze komus sie udalo na atmega 8


    Używaj klawisza szukaj ! było już kilkanaście razy o tym.
    szukaj takich haseł jak : FAT 16/32 na AVR
  • #14
    vixy
    Level 12  
    Co to jest za układ 78L03? Nigdzie nie mogę znaleźć datasheet'a? Czy jest to stabilizator 3-woltowy?
  • #15
    Freddy
    Level 43  
    Hmm, to ma być stabilizator 3.3V, ale takiego symbolu 78L03 to nie widziałem jeszcze :)
  • #16
    vixy
    Level 12  
    Freddy wrote:
    Hmm, to ma być stabilizator 3.3V, ale takiego symbolu 78L03 to nie widziałem jeszcze :)

    Dziękuję za odpowiedź, dopytam jeszcze: czy to ma być LDO?
  • #17
    Freddy
    Level 43  
    Może, acz nie musi.