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

[Atmega8][Bascom] Karta SD 1GB

grabek_radek 05 Cze 2008 10:15 15360 16
REKLAMA
  • #1 5215295
    grabek_radek
    Poziom 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]
  • REKLAMA
  • #3 5215356
    Pituś Bajtuś
    Poziom 28  
    regulamin pkt 16 napisał:
    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 5215401
    grabek_radek
    Poziom 21  
    no tak tylko ze
    Cytat:
    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
  • REKLAMA
  • #5 5215463
    zerpo
    Poziom 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 5215603
    marek_Łódź
    Poziom 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

    '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
    


    
    '*** 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
    
    
  • REKLAMA
  • #7 5215723
    grabek_radek
    Poziom 21  
    Cytat:
    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 5215760
    marek_Łódź
    Poziom 36  
    grabek_radek napisał:
    Cytat:
    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 5215820
    grabek_radek
    Poziom 21  
    marek_Łódź a mozna prosic jak to bedzie wygladal kod bo troszke jeszcze nie lape bo bede probowal to po raz 1
  • #10 5215889
    marek_Łódź
    Poziom 36  
    Na przykład tak:

    '** 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
  • REKLAMA
  • #11 5215983
    grabek_radek
    Poziom 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 5216171
    marek_Łódź
    Poziom 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 5216448
    Freddy
    Poziom 43  
    grabek_radek napisał:
    no tak tylko ze
    Cytat:
    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 8776753
    vixy
    Poziom 12  
    Co to jest za układ 78L03? Nigdzie nie mogę znaleźć datasheet'a? Czy jest to stabilizator 3-woltowy?
  • #15 8776791
    Freddy
    Poziom 43  
    Hmm, to ma być stabilizator 3.3V, ale takiego symbolu 78L03 to nie widziałem jeszcze :)
  • #16 8777143
    vixy
    Poziom 12  
    Freddy napisał:
    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 8778740
    Freddy
    Poziom 43  
    Może, acz nie musi.
REKLAMA