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] Jak podłączyć kartę SD 1GB do Atmega8 i zapisywać dane w Bascom?

grabek_radek 05 Cze 2008 10:15 15546 16
REKLAMA
  • #1 5215295
    grabek_radek
    Poziom 21  
    Posty: 579
    Pomógł: 2
    Ocena: 37
    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  
    Posty: 934
    Pomógł: 137
    Ocena: 10
    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.
  • REKLAMA
  • #4 5215401
    grabek_radek
    Poziom 21  
    Posty: 579
    Pomógł: 2
    Ocena: 37
    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  
    Posty: 463
    Pomógł: 50
    Ocena: 134
    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  
    Posty: 3103
    Pomógł: 208
    Ocena: 66
    [Atmega8] Jak podłączyć kartę SD 1GB do Atmega8 i zapisywać dane w Bascom?

    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
    
    
  • #7 5215723
    grabek_radek
    Poziom 21  
    Posty: 579
    Pomógł: 2
    Ocena: 37
    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  
    Posty: 3103
    Pomógł: 208
    Ocena: 66
    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.
  • REKLAMA
  • #9 5215820
    grabek_radek
    Poziom 21  
    Posty: 579
    Pomógł: 2
    Ocena: 37
    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  
    Posty: 3103
    Pomógł: 208
    Ocena: 66
    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
  • #11 5215983
    grabek_radek
    Poziom 21  
    Posty: 579
    Pomógł: 2
    Ocena: 37
    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  
    Posty: 3103
    Pomógł: 208
    Ocena: 66
    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  
    Posty: 19997
    Pomógł: 1394
    Ocena: 2822
    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  
    Posty: 80
    Pomógł: 1
    Ocena: 16
    Co to jest za układ 78L03? Nigdzie nie mogę znaleźć datasheet'a? Czy jest to stabilizator 3-woltowy?
  • #15 8776791
    Freddy
    Poziom 43  
    Posty: 19997
    Pomógł: 1394
    Ocena: 2822
    Hmm, to ma być stabilizator 3.3V, ale takiego symbolu 78L03 to nie widziałem jeszcze :)
  • #16 8777143
    vixy
    Poziom 12  
    Posty: 80
    Pomógł: 1
    Ocena: 16
    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  
    Posty: 19997
    Pomógł: 1394
    Ocena: 2822
    Może, acz nie musi.

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy podłączenia karty SD 1GB do mikrokontrolera Atmega8 z rezonatorem 8 MHz oraz zapisu danych pomiarowych w języku Bascom. Ze względu na ograniczone zasoby Atmegi8, obsługa systemu plików jest utrudniona, ponieważ karta SD operuje na sektorach 512 bajtów, które muszą być odczytywane i zapisywane w całości. Proponowane rozwiązanie to zapis surowych danych pomiarowych bez modyfikacji istniejących sektorów, co eliminuje potrzebę buforowania całego sektora w pamięci mikrokontrolera. Przykładowy kod Bascom pokazuje implementację zapisu danych ADC bezpośrednio na kartę, gdzie w pętli zapisu wykonywany jest pomiar i natychmiastowy zapis na kartę. Dane zapisywane są w formacie surowym, najpierw młodszy, potem starszy bajt wartości pomiarowej, co umożliwia późniejszy odczyt i przetwarzanie na PC. Wskazano również, że dla wygody i większych możliwości warto rozważyć użycie mikrokontrolerów z większą pamięcią, np. Atmega16 lub Atmega32. Dodatkowo pojawiła się krótka dyskusja o stabilizatorze 3.3V oznaczonym jako 78L03, którego datasheet nie jest powszechnie dostępny, a jego charakterystyka może być LDO lub nie.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA