Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Работа с SD картой без AVR-DOS


Работа с SD картой без AVR-DOS

Сообщений 31 страница 45 из 45

1

Доброго Здоровья!

Кто нибудь работал с SD картой на уровне FAT (только чтение) без AVR-DOS?

Кто нибудь пользовал SD карту в полноценном 4-х битном режиме?

0

31

так. есть озарение, что вся эта строка отвечает за общение с дисплеем. я прав или лев?

0

32

переписал строку под программный SPI. теперь говорит "Error : 202   Line :   1     .EQU not found, probably using functions that are not supported by the selected chip [UBRR]  , in File : D:\Ðàçíîå\ØÈÌ\SD.bas
Error : 202   Line :   1     .EQU not found, probably using functions that are not supported by the selected chip [UCR]  , in File : D:\Ðàçíîå\ØÈÌ\SD.bas
Error : 1     Line :   419   Unknown statement [.EQU not found for:USR]  , in File : D:\Ðàçíîå\ØÈÌ\SD.bas
Error : 387   Line :   419   IO address must be in range [0-31] [USR]  , in File : D:\Ðàçíîå\ØÈÌ\SD.bas
Error : 1     Line :   419   Unknown statement [.EQU not found for:USR]  , in File : D:\Ðàçíîå\ØÈÌ\SD.bas
Error : 387   Line :   419   IO address must be in range [0-31] [USR]  , in File : D:\Ðàçíîå\ØÈÌ\SD.bas
Error : 202   Line :   419   .EQU not found, probably using functions that are not supported by the selected chip [UDR]  , in File : D:\Ðàçíîå\ØÈÌ\SD.bas
Error : 1     Line :   419   Unknown statement [.EQU not found for:USR]  , in File : D:\Ðàçíîå\ØÈÌ\SD.bas
Error : 387   Line :   419   IO address must be in range [0-31] [USR]  , in File : D:\Ðàçíîå\ØÈÌ\SD.bas
Error : 202   Line :   419   .EQU not found, probably using functions that are not supported by the selected chip [UDR]  , in File : D:\Ðàçíîå\ØÈÌ\SD.bas

т.е. я пытаюсь заюзать фичи, которых в тиньке нет

0

33

IDok написал(а):

да я вообще всю программу удалить могу!

Да никто не против, только взамен что-то дайте ! ;)

IDok написал(а):

только для чего она мне такая, удаленная главная проблема в том, что баскомлю я месяц наверное. и если вычурно мигать светодиодом я еще научился, то остальные слова из кода для меня как устав китайской армии - нутром чую, что надо бежать, а куда - не понятно

Похоже на мои потуги в сторону Си... ;)
Как верный песик - все понимаю, а сказать не могу... ;)

Терпение - вот основа психологии программиста !

IDok написал(а):

ну и тиньки живой нет. есть мертвая, но она устала

Значит надо брать другой МК и мучать дальше... ;)

Открою вам свой секрет...
На сегодняшний день мною уже задушено насмерть более десятка МК разных...
По разным причинам...  Все - по разным...
И я - не жалею, т.к. каждая подобная "смерть" - мой опыт !
Грабли никто не любит, а они, тем не менее есть...

0

34

Nord
так што оно теперь от меня хочет?

0

35

IDok написал(а):

Nordтак што оно теперь от меня хочет?

Увы, я не "экстрасекс", по сайтам гадать не умею... ;)

Скриншоты, фото и пр. информацию об ошибках - в студию, тогда погадаем...

0

36

так вон же выше - куча ошибок из лога.
код теперь так выглядит (выделенная строка - программный SPI вместо апаратного. ноги вроде правильно расставил)

Код:
$Regfile="attiny85.dat"
$Crystal=8000000
$hwstack=40
$swstack=16
$framesize=32


Print Version(3) ; Version(1)

Dim A As Byte

Config Timer0 = Pwm , Compare A Pwm = Clear Up , Compare B Pwm = Clear Down , Prescale = 1
Config Timer1 = Timer , Prescale = 1                        '1èìï =62,9nS

Pwm0a = 125
Pwm0b = 125

Dim Speed As Word

'ïåðåìåííûå ììñ
Dim Init_err As Byte , Ccs As Bit , Sd As Bit , Fl_err As Bit
Dim Fl_data_is As Bit
Dim Fl As Bit , Cont_err As Byte
Dim Dat As Byte , N As Byte
Dim Resp As Byte
Dim I As Word
Dim Addr As Dword
Dim Ad(4) As Byte At Addr Overlay
Dim D(8) As Byte
Dim B(8) As Byte
Dim Sektor As Word
Dim G As Dword

'ïåðåìåííûå FAT16
Dim Boot_sector As Dword
    Dim Bs(4)as Byte At Boot_sector Overlay
Dim Num_sector As Word                                      'ðàçìåð ñåêòîðîâ â áàéòàõ
Dim Num_claster As Byte                                     'êîëè÷åñòâî ñåêòîðîâ íà êëàñòåð
Dim Tab_fat As Word                                         'Íà÷àëî òàáëèöû FAT. ×åðåç ñêîëüêî ñåêòîðîâ îò Boot sector.
    Dim Tf(2) As Byte At Tab_fat Overlay
Dim Num_fat As Byte                                         'êîëè÷åñòâî êîïèé fat
                                       '                                                  ôëàã íàëè÷èÿ äàííûõ
 Dim On_play As Bit                                         'ôëàãæåëàíèÿ âîñïðîèçâîäèòü çâóê
Dim Size_tab As Word                                        'ðàçìåð òàáëèöû
    Dim St(2) As Byte At Size_tab Overlay
Dim Fat As Word                                             'àäðåñ ïåðâîé òàáëèöû FAT
Dim Catalog As Dword                                        ' àäðåñ êàòàëîãà
Dim Adr_fail As Dword                                       ' àäðåñ ôàéëà.
Dim Fail As Word
   Dim Fa(2) As Byte At Fail Overlay
Dim Size_fail As Dword                                      ' ðàçìåð ôàéëà
         Dim Sf(4) As Byte At Size_fail Overlay
Dim End_fail As Dword
Dim Blok As Word                                            ' îïðåäåëåíèå áëîêîâ ïî 32 áàéòà
Dim Size_catalog as word                                            'ðàçìåð êàòàëîãà(êàê ïðàâèëî 512 áàéò, ïî ñåìó ìîæíî è íå ñ÷èòûâàòü.
    dim sc(2) as Byte at size_catalog overlay
Dim Claster As Word
Dim Cl(2) As Byte At Claster Overlay
Dim Play As Byte                                            ' íîìåð ôàéëà, êîòîðûé íàäî âîñïðîèçâåñòè
Dim Sel As Byte
Dim Gword As Dword
'ïåðåìåííûå  FAT
dim bit_rait as Word
     dim br(2) as Byte at bit_rait overlay
'Declarations
Declare Sub Minit
Declare Sub Readmmc
Declare Sub Readsd( , Byval Answer As Byte , Byval N As Byte)
Config Portb.3 = Output
Config Portb.5 = Output
'Config Portb.2 = Output : Cs Alias Portb.2
Config portb.4 = Output : Cs Alias Portb.4


[b]CONFIG SPI = SOFT, DIN = PINb.1, DOUT = PINb.0 , SS =NONE, CLOCK = PINb.2 , SPIIN=0 , MODE=0
[/b]   Spiinit
' Print "WelÑom"
' Waitms 100
 'do
' Minit
' If Fl_err = 0 Then
 ' Print "Ok!"
 '       If Sd = 0 Then
 '             If Ccs = 0 Then Print "Êàðòà SDSC " Else Print " Êàðòà SDHC "
 '       Else
 '       Print "Êàðòà SD "
 '       End If
 ' Else
 ' Print " Êàðòà íå îáíàðóæåíà!"
 ' End
 ' End If
    Addr = 0
    Gword = 1
  Readmmc
   'if b(1) = 6 then Print" FAT 16 "
   print " àäðåñ Boot_sector ";Boot_sector
   Addr = Boot_sector

  Readmmc
  print " Tab_fat";Tab_fat
  Fat = Boot_sector + Tab_fat
   print "àäðåñ FAT ";fat
  Catalog = Num_fat * Size_tab
  Catalog = Catalog + Fat
   print "Êàòàëîã "; catalog

  Addr = Catalog
  gword=size_catalog
  Readmmc

    Do
  Input " Ââåäèòå íîìåð ôàéëà- " , Play

    Addr = Catalog
    Gword = 1
  Readmmc

Addr = Adr_fail
     Gword = Size_fail
    Readmmc
  Loop

 End






 '======= SUB ROUTINES AND FUNCTIONS =======
'*** Èíèöèàëèçàöèÿ êàðòû MMC ***
Sub Minit
Cont_err = 0
'Do
 Set Cs
D(1) = &HFF : D(2) = &HFF : D(3) = &HFF : D(4) = &HFF : D(5) = &HFF : D(6) = &HFF : D(7) = &HFF : D(8) = &HFF       'èíèöèàëèçàöèÿ,  îòïðàâëÿåì FF
 Spiout D(1) , 8
  Print " Cmd0"
  Waitms 1
 Reset Cs
 Cmd0:                                                      ' êîìàíäà 0 ñáðîñ êàðòû 40,00,00,00,00,95
  D(1) = &H40                                               '40
  D(2) = 0
  D(3) = 0
  D(4) = 0
  D(5) = 0
  D(6) = &H95
 ' D(7) =&hff
  Call Readsd(1 , 7)
If Fl_err = 1 Then Return


If A = 201 Then Init_err.0 = 1                              ' áèò 0 -êàðòû íåò
  Print " Cmd1" ;
  Cmd1:
 D(1) = &HFF
D(2) = &H41                                                 ' êîìàíäà 1 ïåðåâîä êàðòû â ðåæèì spi 41,00,00,00,00,FF
D(3) = 0
  D(4) = 0
  D(5) = 0
  D(6) = 0
For A = 1 To 200                                            ' æäåì îòêëèê 00 åñëè âñ¸ íîðìàëüíî â ïðîòèâíîì ñëó÷àå ïîâòîðÿåì
 Spiout D(1) , 8                                            ' ïðèíèìàåì îòêëèê (01)
Spiin Resp , 1
 Delay
'Print Hex(resp) ; " " ;
If Resp = &H05 Then Goto Cmd_8
If Resp = &H00 Then
 Ccs = 0                                                    ' êàðòà SD
   Print "OK"
       Return
 End If
  Next


 Cmd_8:
 Print " NO"
    Print " Smd8"
  'D(1) = &HFF
  D(2) = &H48
  D(3) = 0
  D(4) = 0
  D(5) = &H01
  D(6) = &HAA
  D(7) = &H87                                               '
 Call Readsd(&Haa , 7)


Print "ACMD-41"
   Print "CMD 55 "
 Acmd41:

    D(2) = &H77                                             ' 55 OR 64
    D(5) = 0
    D(6) = 0
     D(7) = 0
    ' Call Readsd(1 , 8)
    For A = 1 To 40
  Spiout D(1) , 8
   Spiin Resp , 1
     Print Hex(resp) ; " ";
  If Resp = &H01 Then Exit For
  Next

   D(1) = &H69
   D(2) = &H40
    For A = 1 To 40
  Spiout D(1) , 7
 Spiin Resp , 1
  If Resp = &H00 Then
     Init_err.2 = 0
 Exit For
 Else

 Init_err.2 = 1
 End If
Next
   Print "CMD 41 "
 Cmd_58:
 D(1) = &HFF
  D(2) = &H7A
  D(3) = 0
  D(4) = 0
  D(5) = 0
  D(6) = 0
  D(7) = &HFF
  Call Readsd(0 , 7)                                        '



 Spiin B(1) , 4
'Print Hex(b(1)) ; Hex(b(2)) ; Hex(b(3)) ; Hex(b(4))
If B(1) = &HC0 Then Ccs = 1 Else Ccs = 0                    'PRINT "Êàðòà SDHC. Ñ÷èòûâàíèå ïîáëî÷íîå"

 Set Cs
End Sub

 Sub Readmmc
 If Ccs = 0 Then Shift Addr , Left , 9                      'åñëè êàðòà SD , àäðåñ óêàçûâàåì â áàéòàõ, åñëè SDHC â áëîêàõ
 G = 0
   Reset Cs
    Print
  Print "Êîëè÷åñòâî ñ÷èòûâàåìûõ áëîêîâ " ; Gword
Print "àäðåñ " ; Addr
  D(1) = &HFF
  D(2) = &H52                                               ' êîìàíäà ìíîãîáëî÷íîãî ÷òåíèÿ
  D(3) = Ad(4)
  D(4) = Ad(3)
  D(5) = Ad(2)
  D(6) = Ad(1)
  D(7) = &HFF
   Call Readsd(0 , 7)
If Ccs = 0 Then Shift Addr , Right , 9
    Print " Áëîê äàííûõ"

While G <> Gword
Incr G

    For A = 1 To 200                                        '
  Spiin Resp , 1
    '  Print Hex(resp) ; " ";
If Resp = &HFE Then Exit For
   Next A

    For I = 0 To 511

      Spiin Resp , 1



        Select Case Addr
           Case 0:
                                   If I = &H1C2 Then B(1) = Resp                 ' Fat
                                   If I = &H1C6 Then Bs(1) = Resp                'Boot sector
                                   If I = &H1C7 Then Bs(2) = Resp
                                   If I = &H1C8 Then Bs(3) = Resp                '
                                   If I = &H1C9 Then Bs(4) = Resp

           Case Boot_sector:
                                   If I = 13 Then Num_claster = Resp             'êîëè÷åñòâî ñåêòîðîâ â êëàñòåð
                                   If I = 14 Then Tf(1) = Resp                   'íà÷àëî òàáëèöû FAT
                                   If I = 15 Then Tf(2) = Resp
                                   If I = 16 Then Num_fat = Resp                 'êîëè÷åñòâî êîïèé FAT
                                   if i=17 then sc(1)=resp   '
                                   if i=18 then sc(2)=resp    ' ðàçìåð êàòàëîãà â áàéòàõ(êàê ïðàâèëî 512)
                                   If I = 22 Then St(1) = Resp       'ðàçìåð òàáëèöû â ñåêòîðàõ
                                   If I = 23 Then St(2) = Resp
                                    'print hex(resp);" ";
           Case Catalog
                                   Blok = I / 32                                 'íîìåð áëîêà â êàòàëîãå (áëîê ñîñòîèò èç 32 áàéò)
                                   A = I Mod 32                                  '  íîìåð áàéòà â áëîêå
                                   If A = 0 And Resp = 0 Then
                                    Exit While
                                    Elseif Play = 0 Then
                                      Fl_data_is = 1        'âûñòàâëÿåì ôëàã åñëè â íà÷åëå áëîêà íåò íóëåé è íå õîòèì âîñïðîèçâîäèòü
                                      End If

                                       If Fl_data_is = 1 Or Blok = Play Then     ' ñ÷èòûâàåì äàííûå ôàéëîâ â íà÷àëå, ëèáî çàäàííûé ôàéë
                                         If A = 0 Then Print Blok ; " ";
                                         'If A = 0 Then Fa(1) = Resp              ' èìÿ ôàéëà
                                         'If A = 1 Then Fa(2) = Resp
                                         If A < 12 Then Print Chr(resp);
                                         If A = 26 Then Cl(1) = Resp             ' êëàñòåð
                                         If A = 27 Then Cl(2) = Resp
                                         If A = 28 Then Sf(1) = Resp             'ðàçìåð ôàéëà
                                         If A = 29 Then Sf(2) = Resp
                                         If A = 30 Then Sf(3) = Resp
                                         If A = 31 Then Sf(4) = Resp
                                         If A = 31 Then
                                         Print Blok ; ". " ; Chr(fa(1)) ; Chr(fa(2 )) ; " ðàçìåð " ; Size_fail ; " áàéò"
                                          Adr_fail = Claster - 2
                                          Adr_fail = Adr_fail * Num_claster
                                          Adr_fail = Adr_fail + Catalog
                                          Adr_fail = Adr_fail + 32
                                           Shift Size_fail , Right , 9           ' ïåðåâîäèì ðàçìåð èç áàéò â ñåêòîðà
                                          End_fail = Adr_fail + Size_fail        ' îïðåäåëÿåì àäðåñ êîíöà ôàéëà
                                            Fl_data_is = 0

                                         End If
                                       End If
                Case Adr_fail :

                                           If On_play = 0 Then
                                            if g=1 then
                                              If I = 24 Then Br(1) = Resp
                                              If I = 25 Then Br(2) = Resp
                                              If I = 55 Then
                                              Set On_play
                                              Print "Áèòðýéò " ; Bit_rait

                                                Bit_rait = Bit_rait / 10
                                              Boot_sector = 1000000000 / Bit_rait
                                              Boot_sector = Boot_sector / 629
                                              Speed = Boot_sector
                                              Print "Speed =" ; Speed
                                              End If
                                            end if

                                       Else

                                             Do

                                              If Timer1 > speed Then                        'äëÿ 22000ãö.
                                            'If Timer1 > 362 Then                       'äëÿ 44100ãö
                                    '  Stop Timer0
                                              Timer1 = 0
                                         '     Start Timer0
                                              Exit Do
                                              End If
                                             Loop


                                                  Pwm0a = Resp
                                                  Pwm0b = Resp
                                       ' Else
                                                  ' If Resp = &H80 Then Set On_play

                                       End If
                                                             Sel = Ischarwaiting()
                  End Select

              Next I
                         If Sel = 1 Then
                            Sel = Waitkey()
                            Print Sel
                              Select Case Sel
                              Case 115 : Exit While
                               Case 46 :
                          '                           Exit For
                               Case 44 :
                           '                          Exit For
                               End Select
                     End If


   Spiin B(1) , 2                                           'ïðè¸ì " â âîçäóõ" CRC



Wend
  Print "ÁËÎÊ " ; Blok ; " " ; G
 Reset On_play
  Pwm0a = 125
  Pwm0b = 125
  D(2) = &H4C                                               ' stop  read
 Call Readsd(0 , 7)                                         '

   Set Cs

End Sub




Sub Readsd(byval Answer As Byte , Byval N As Byte)          '
 Reset Fl_err
  Spiout D(1) , N
    For A = 1 To 200                                        '
  Spiin Resp , 1
      Print Hex(resp) ; " ";
If Resp = Answer Then Exit For
  If A = 200 Then Set Fl_err
   Next

  End Sub

0

37

IDok написал(а):

так вон же выше - куча ошибок из лога.код теперь так выглядит (выделенная строка - программный SPI вместо апаратного. ноги вроде правильно расставил)

Ну и ?.. ;)
Открываем Протеус, рисуем там схему, подгружаем HEX и экспериментируем до опупения !

Ни один МК при этом не умрет - гарантирую ! ;)

0

38

Nord
схему выдумать-то я смогу. но только как я скомпилирую программу не избавившись от ошибок?а как я их победю, если не могу наяндексировать, что за .EQU оно с меня хочет? и сталбыть не знаю - нужно оно тут или нет

0

39

IDok написал(а):

схему выдумать-то я смогу. но только как я скомпилирую программу не избавившись от ошибок?а как я их победю, если не могу наяндексировать, что за .EQU оно с меня хочет? и сталбыть не знаю - нужно оно тут или нет

Я не гуру в чтении флешек средствами Bascom, но склонен подозревать, что программа просит какой-то файл с расширением .EQU... ;)
Возможно, я неправ... ;)

Я отстаиваю другую "политику"...
Предлагаю пока "накидать" схему в Протеусе, тут и гуру подтянутся... ;)

В любом случае - ругать подкидную доску, если кроссовки скользят - глупо... ;)

Отредактировано Nord (2017-04-03 20:46:33)

0

40

шайтан, стерлось сообщение.
раскоментировав кусок кода эти ошибки убрать удалось (яндекс говорит, что это относится к аппаратному UART, может и не врет). теперь там два незакрытых цикла показывает. вот - ищу... но вложенность такая - что это надолго

0

41

IDok написал(а):

переписал строку под программный SPI. теперь говорит "Error : 202   Line :   1     .EQU not found, probably using functions that are not supported by the selected chip [UBRR]  , in File : D:\Ðàçíîå\ØÈÌ\SD.bas"
...
т.е. я пытаюсь заюзать фичи, которых в тиньке нет

Сами же и ответили... ;)
Первое же сообщение об ошибке говорит, что используются неизвестные для чипа функции...

0

42

сдаюсь. ног не хватает. 3 отдай под SPI, 2 под ШИМ, одна еще под что-то зарезервирована, не понял. и выходы ШИМа совпадают с ногами SPI. пичаль.

0

43

Использовать другой МК с большим числом выводов, не вариант?

0

44

вариант, конечно. тогда уж проще атмегу328 взять, как в исходном коде. просто у Си-шников получилось, и, говорят - не плохо получилось. я попробую еще потыкаться, вместо двух ШИМ-выходов один заюзать, но не факт. автор схемку не приложил, сложно понять куда какой нога

0

45

Я ссылку давал на статью на Радиокоте. Там схема и плата есть в дип трэйсе. Для тини85 берите схему Чана и под неё переписывайте прошивку. Чтение карты и поиск по FAT одинаков. Но управление кардинально меняется. К тому -же  -просто переписать не получиться. Нужно брать "умную книгу" и читать ,читать, читать......

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Работа с SD картой без AVR-DOS