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

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

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

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


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


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

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

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

46

Доброго времени! Играюсь с чтением-записью SDHC карт и немного наехал на пень... Новичковый затуп. Создал байтовый массив и через Overlay наложил  переменные
Dim Data(6) as byte
Dim Cmd as byte at Data(1) overlay
Dim Sector as dword at Data(1) +1 overlay 
Dim Crc as byte at Data(1) +5 overlay
далее отправляю их по SPI на карту
Spiout data(1) , 6
Все круто, но переменная Sector заносится в память и выводится по разному. То есть, запоминаем ее как &H11223344, а передаем массивом как &H44332211.
Вроде бы, со стороны МК все верно, но мне хотелось упростить паровоз, типа Data(2) = &HFF : Data(3) = &H05 : Data(4) = &H00 : Data(5) = &HFE , и иметь возможность инкрементировать от нуля до миллионов переменную Sector. Можно ли как то без лишних строк кода или отправлять массив не от 1 до 6 , а от 6 до 1 , или накладывать переменную Sector в нужной очередности байтов на массив?
Пока на ум приходит или
For I = 6 to 1 step -1
Spiout Data(I) , 1
Next
или через дополнительные преобразования  постоянно разворачивать Sector
Может быть, у кого то есть другие мысли как передать 6 байт разом, не через массив, к примеру?

Отредактировано Nec (2023-01-23 11:58:58)

0

47

И ещё вопросик. Скорость программного SPI как то настраивается? Весь HELP перечитал через гугл переводчик, ничего не понял

0

48

Syntax for software SPI

CONFIG SPI|SPISOFT = SOFT, DIN = PIN, DOUT = PIN , SS = PIN|NONE, CLOCK = PIN , SPIIN=value , MODE=mode, SPEED=speed, SETUP=setup , EXTENDED=ext

SPEED
Is a numeric constant for an optional delay. This delay is in us. When you specify 1, it will result in 2 us delay : 1 us before and 1 us after the clock. By default there is no delay. Only slow slave chips might require a delay.
SPEED only applies when MODE is specified.

Чем больше число - тем медленнее (больше задержка)

0

49

Я так понял это задержка между пачками clock импульсов. Сама частота тактирования не меняется. Или нет?

0

50

не понял вопроса
В описании же указано: до импульса CLK и после импульса - всё поменяется

0

51

Вот и я не понимаю это время между переключениями линии clock с высокого на низкий уровень и наоборот (то есть, при цифре 1 линия 1мкс в высоком уровне и потом 1мкс в низком) или это паузы между каждым байтом (то есть, 8 тактов - пауза 1мкс - 8 тактов - пауза 1мкс...)
В первом случае, максимальная частота получится 500кгц. Во втором частота не меняется, меняется лишь скорость передачи за счёт пауз между байтами

Перевод последних строк, которые вы привели из хелпа:
По умолчанию задержки нет. Задержка может потребоваться только для медленных подчиненных микросхем.
СКОРОСТЬ применяется только тогда, когда указан РЕЖИМ.
Напрашивается мысль, что это паузы между двумя соседними байтами

Отредактировано Nec (2023-01-23 15:56:26)

0

52

Вот тут были ?
http://avrproject.ru/publ/poleznaja_inf … r/4-1-0-66
http://avrproject.ru/index/spi_interfej … henie/0-33
http://microsin.net/programming/avr/avr … e-spi.html

0

53

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

Можно ли как то без лишних строк кода или отправлять массив не от 1 до 6 , а от 6 до 1 , или накладывать переменную Sector в нужной очередности байтов на массив?

Можно.  Overlay
Там все есть для решения вашего вопроса. ;)

Только вот встречный вопрос - как у вас компилятор проглатывает без ошибок эту и последующие строки ?
Dim Data(6) as byte

Вы используете в качестве имени массива зарезервированное слово Data, что запрещено синтаксисом Bascom...

0

54

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

Вот тут были ?

Спасибо, первые две изучил в первый же вечер. Последнюю сейчас почитал с удовольствием. Собственно, алгоритм работы мне понятен. Все прекрасно работает в железе. За скорость встал вопрос потому что мне кажется (может быть, придираюсь?), что чуть больше 8мс  для записи или чтения сектора в 512 байт многовато

0

55

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

Можно.  Overlay
Там все есть для решения вашего вопроса.


И по этой ссылке читал вчера. Сегодня хотел вопрос задать в той теме, но не нашёл её.
Передавать переменную(по моему) пробовал. Результат тот же. Да и переменную пришлось использовать типа Double. Массивом как то удобнее пока что получается передавать 6 байт команды, аргумента и контрольной суммы. Выкрутился передавая массив задом наперёд, вызывая подпрограмму с For i = 6 to 1 step - 1, как писал выше. Вроде бы не сильно подгружает ресурсы МК. Больше за размер кода борьба. Как начал осваивать FAT32, код возрос раз в 5, начал путаться и оптимизировать. За библиотеки, вроде AVR-DOS в курсе. Никогда библиотеками не пользовался, спортивный интерес разбираться самому)

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

Только вот встречный вопрос - как у вас компилятор проглатывает без ошибок эту и последующие строки ?
Dim Data(6) as byte

Вы используете в качестве имени массива зарезервированное слово Data, что запрещено синтаксисом Bascom...

Верно, подметили... Компилятор, конечно же, не переварит такого. Это я из головы набросок напечатал, в коде имена немного другие...

Отредактировано Nec (2023-01-23 20:57:56)

0

56

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

...что чуть больше 8мс  для записи или чтения сектора в 512 байт многовато

А что вы хотите добиться от последовательного (!) интерфейса, работающего не скорости в сотню кбит... ;)

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

Да и переменную пришлось использовать типа Double.
Массивом как то удобнее пока что получается передавать 6 байт команды, аргумента и контрольной суммы.

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

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

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

Выкрутился передавая массив задам наперёд, вызывая подпрограмму с For i = 6 to 1 step - 1, как писал выше.
Вроде бы не сильно подгружает ресурсы МК. Больше за размер кода борьба.

Скорость работы операторов Bascom

0

57

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

А что вы хотите добиться от последовательного (!) интерфейса, работающего не скорости в сотню кбит...

Хочу понять максимальную скорость и способы её регулирования)

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

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

Все просто и не просто одновременно. Карта, в идеале, читается и пишется секторами по 512байт. В какую переменную вы мне предлагаете записать?) Поэтому массив. А потом из этого массива мне нужно выдернуть номер нужного мне сектора (переменная 4 байта) и дать карте команду (1байт команда, 4 байта номер сектора, 1 байт контрольная сумма) перейти на нужный мне сектор.

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

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

Скорость работы операторов Bascom

Так к массиву и стремлюсь в конце концов) а переменные это лишь способ извлекать/внедрять нужные мне данные в этот массив.
Скорость работы операторов одна из  моих любимых страничек этого форума)
P. S. На счёт скорости и памяти, быстрее бейсика, наверное, только ассемблер( ИМХО) . Его бы я поучил, но нужен наставник. Самому, что то, с наскока, не очень даётся. А вот в сравнение с СИ, баском на порядок рациональнее. Не раз делал компактнее и шустрее программы, чем мои знакомые ардуинщики на СИ!!!

0

58

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

Хочу понять максимальную скорость и способы её регулирования)

Поройтесь в этом разделе Связь проводная и беспроводная, интерфейсы
Тем много, читать-не перечитать ;) , но наверняка этот вопрос уже проскакивал.

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

А потом из этого массива мне нужно выдернуть номер нужного мне сектора (переменная 4 байта) и дать карте команду (1 байт команда, 4 байта номер сектора, 1 байт контрольная сумма) перейти на нужный мне сектор.

"номер нужного мне сектора (переменная 4 байта)"    - переменная типа Dword
"1 байт команда"                                                        - просто ячейка массива
"4 байта номер сектора"                                             - переменная типа Dword
"1 байт контрольная сумма"                                        - просто ячейка массива
Поскольку "1" и "3" это одно и то же (выделено выше), то и записывайте в массив сразу в нужном порядке.
Если я понял все правильно, то массива х6 вам для этого хватит.

RDW привел же пример Overlay
Только сделайте не ...+3 (2, 1, 0), а ...+5 (4, 3, 2) или ...+2 (3, 4, 5) в определениях оверлея.
А ячейки 1 и 6 массива - это будут байты команды и КС.
Все, пакет для отправки готов ! ;)

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

0

59

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

RDW привел же пример Overlay
Только сделайте не ...+3 (2, 1, 0), а ...+5 (4, 3, 2) или ...+2 (3, 4, 5) в определениях оверлея.
А ячейки 1 и 6 массива - это будут байты команды и КС.
Все, пакет для отправки готов !


Видимо, не поняли вы о чем я. Упрощу ситуацию.
Dim ar(2) As Byte
Dim I As Word at ar(1) overlay
I = &H0001 (в память кладём 1)
Spiout ar(1), 2 (отправляем 2 байта массива)
Принимающая сторона получает &H0100, то есть 256.

 

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

А Ассемблер только изначально страшно выглядит.

Нужно, наверное, архитектуру микроконтроллера изучить досконально, чтобы разобраться в jmp, r16 и прочих примудрастях. Или ещё что-то, чего я недопонимаю. Это, как перспектива. А пока осваиваю Баском, он меня вполне устраивает, пока хватает ресурсов AVR микроконтроллеров

0

60

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

Видимо, не поняли вы о чем я. Упрощу ситуацию.
Dim ar(2) As Byte
Dim I As Word at ar(1) overlay
I = &H0001 (в память кладём 1)
Spiout ar(1), 2 (отправляем 2 байта массива)
Принимающая сторона получает &H0100, то есть 256.

Я, надеюсь, понял вашу проблему правильно, потому и влез... ;)

Давайте на в/у примере "от RDW" разберемся, используя некоторые ваши элементы...

Dim ar(6) As Byte                            - ваш массив
Dim I As DWord                               - переменная для адреса
Dim ar(2) As Byte At I + 3 Overlay    - распределение по массиву
Dim ar(3) As Byte At I + 2 Overlay    - ... обратите внимание ...
Dim ar(4) As Byte At I + 1 Overlay    - ... на разницу позиций ...
Dim ar(5) As Byte At I + 0 Overlay    - возможен совпадающий по очередности вариант
....
I = &H00000001                              - в память кладём 1
                                                      - в какой ячейке массива окажется &H01 ? ;)
                                                      - правильно, в 5-й
ar(1) = &H10                                   - команда
ar(6) = &H58                                  - допустим, такая КС получилась

Spiout ar(1), 6                                 - отправляем 6 байтов массива

Что не так в предложенном ? ;)

В строках "+ 0 Overlay" или "+ 3 Overlay" - все равно компилятор каждый раз будет отсчитывать местонахождение ячейки массива сначала и данные попадут на место.
Главное - изначально правильно указать принадлежность каждого байта переменной к конкретной ячейке массива.

0


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