Доброго Здоровья!
Кто нибудь работал с SD картой на уровне FAT (только чтение) без AVR-DOS?
Кто нибудь пользовал SD карту в полноценном 4-х битном режиме?
Программирование ATMEL в BASCOM. |
Привет, Гость! Войдите или зарегистрируйтесь.
Вы здесь » Программирование ATMEL в BASCOM. » Периферия » Работа с SD картой без AVR-DOS
Доброго Здоровья!
Кто нибудь работал с SD картой на уровне FAT (только чтение) без AVR-DOS?
Кто нибудь пользовал SD карту в полноценном 4-х битном режиме?
так. есть озарение, что вся эта строка отвечает за общение с дисплеем. я прав или лев?
переписал строку под программный 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
т.е. я пытаюсь заюзать фичи, которых в тиньке нет
да я вообще всю программу удалить могу!
Да никто не против, только взамен что-то дайте ! 
только для чего она мне такая, удаленная главная проблема в том, что баскомлю я месяц наверное. и если вычурно мигать светодиодом я еще научился, то остальные слова из кода для меня как устав китайской армии - нутром чую, что надо бежать, а куда - не понятно
Похоже на мои потуги в сторону Си... 
Как верный песик - все понимаю, а сказать не могу... 
Терпение - вот основа психологии программиста !
ну и тиньки живой нет. есть мертвая, но она устала
Значит надо брать другой МК и мучать дальше... 
Открою вам свой секрет...
На сегодняшний день мною уже задушено насмерть более десятка МК разных...
По разным причинам... Все - по разным...
И я - не жалею, т.к. каждая подобная "смерть" - мой опыт !
Грабли никто не любит, а они, тем не менее есть...
Nord
так што оно теперь от меня хочет?
Nordтак што оно теперь от меня хочет?
Увы, я не "экстрасекс", по сайтам гадать не умею... 
Скриншоты, фото и пр. информацию об ошибках - в студию, тогда погадаем...
так вон же выше - куча ошибок из лога.
код теперь так выглядит (выделенная строка - программный 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
так вон же выше - куча ошибок из лога.код теперь так выглядит (выделенная строка - программный SPI вместо апаратного. ноги вроде правильно расставил)
Ну и ?.. 
Открываем Протеус, рисуем там схему, подгружаем HEX и экспериментируем до опупения !
Ни один МК при этом не умрет - гарантирую ! 
Nord
схему выдумать-то я смогу. но только как я скомпилирую программу не избавившись от ошибок?а как я их победю, если не могу наяндексировать, что за .EQU оно с меня хочет? и сталбыть не знаю - нужно оно тут или нет
схему выдумать-то я смогу. но только как я скомпилирую программу не избавившись от ошибок?а как я их победю, если не могу наяндексировать, что за .EQU оно с меня хочет? и сталбыть не знаю - нужно оно тут или нет
Я не гуру в чтении флешек средствами Bascom, но склонен подозревать, что программа просит какой-то файл с расширением .EQU... 
Возможно, я неправ... 
Я отстаиваю другую "политику"...
Предлагаю пока "накидать" схему в Протеусе, тут и гуру подтянутся... 
В любом случае - ругать подкидную доску, если кроссовки скользят - глупо... 
Отредактировано Nord (2017-04-03 20:46:33)
шайтан, стерлось сообщение.
раскоментировав кусок кода эти ошибки убрать удалось (яндекс говорит, что это относится к аппаратному UART, может и не врет). теперь там два незакрытых цикла показывает. вот - ищу... но вложенность такая - что это надолго
переписал строку под программный 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"
...
т.е. я пытаюсь заюзать фичи, которых в тиньке нет
Сами же и ответили... 
Первое же сообщение об ошибке говорит, что используются неизвестные для чипа функции...
сдаюсь. ног не хватает. 3 отдай под SPI, 2 под ШИМ, одна еще под что-то зарезервирована, не понял. и выходы ШИМа совпадают с ногами SPI. пичаль.
Использовать другой МК с большим числом выводов, не вариант?
вариант, конечно. тогда уж проще атмегу328 взять, как в исходном коде. просто у Си-шников получилось, и, говорят - не плохо получилось. я попробую еще потыкаться, вместо двух ШИМ-выходов один заюзать, но не факт. автор схемку не приложил, сложно понять куда какой нога
Я ссылку давал на статью на Радиокоте. Там схема и плата есть в дип трэйсе. Для тини85 берите схему Чана и под неё переписывайте прошивку. Чтение карты и поиск по FAT одинаков. Но управление кардинально меняется. К тому -же -просто переписать не получиться. Нужно брать "умную книгу" и читать ,читать, читать......
Доброго времени! Играюсь с чтением-записью 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)
И ещё вопросик. Скорость программного SPI как то настраивается? Весь HELP перечитал через гугл переводчик, ничего не понял
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.
Чем больше число - тем медленнее (больше задержка)
Я так понял это задержка между пачками clock импульсов. Сама частота тактирования не меняется. Или нет?
не понял вопроса
В описании же указано: до импульса CLK и после импульса - всё поменяется
Вот и я не понимаю это время между переключениями линии clock с высокого на низкий уровень и наоборот (то есть, при цифре 1 линия 1мкс в высоком уровне и потом 1мкс в низком) или это паузы между каждым байтом (то есть, 8 тактов - пауза 1мкс - 8 тактов - пауза 1мкс...)
В первом случае, максимальная частота получится 500кгц. Во втором частота не меняется, меняется лишь скорость передачи за счёт пауз между байтами
Перевод последних строк, которые вы привели из хелпа:
По умолчанию задержки нет. Задержка может потребоваться только для медленных подчиненных микросхем.
СКОРОСТЬ применяется только тогда, когда указан РЕЖИМ.
Напрашивается мысль, что это паузы между двумя соседними байтами
Отредактировано Nec (2023-01-23 15:56:26)
Можно ли как то без лишних строк кода или отправлять массив не от 1 до 6 , а от 6 до 1 , или накладывать переменную Sector в нужной очередности байтов на массив?
Можно. Overlay
Там все есть для решения вашего вопроса. 
Только вот встречный вопрос - как у вас компилятор проглатывает без ошибок эту и последующие строки ?
Dim Data(6) as byte
Вы используете в качестве имени массива зарезервированное слово Data, что запрещено синтаксисом Bascom...
Вот тут были ?
Спасибо, первые две изучил в первый же вечер. Последнюю сейчас почитал с удовольствием. Собственно, алгоритм работы мне понятен. Все прекрасно работает в железе. За скорость встал вопрос потому что мне кажется (может быть, придираюсь?), что чуть больше 8мс для записи или чтения сектора в 512 байт многовато
Можно. Overlay
Там все есть для решения вашего вопроса.
И по этой ссылке читал вчера. Сегодня хотел вопрос задать в той теме, но не нашёл её.
Передавать переменную(по моему) пробовал. Результат тот же. Да и переменную пришлось использовать типа Double. Массивом как то удобнее пока что получается передавать 6 байт команды, аргумента и контрольной суммы. Выкрутился передавая массив задом наперёд, вызывая подпрограмму с For i = 6 to 1 step - 1, как писал выше. Вроде бы не сильно подгружает ресурсы МК. Больше за размер кода борьба. Как начал осваивать FAT32, код возрос раз в 5, начал путаться и оптимизировать. За библиотеки, вроде AVR-DOS в курсе. Никогда библиотеками не пользовался, спортивный интерес разбираться самому)
Только вот встречный вопрос - как у вас компилятор проглатывает без ошибок эту и последующие строки ?
Dim Data(6) as byteВы используете в качестве имени массива зарезервированное слово Data, что запрещено синтаксисом Bascom...
Верно, подметили... Компилятор, конечно же, не переварит такого. Это я из головы набросок напечатал, в коде имена немного другие...
Отредактировано Nec (2023-01-23 20:57:56)
...что чуть больше 8мс для записи или чтения сектора в 512 байт многовато
А что вы хотите добиться от последовательного (!) интерфейса, работающего не скорости в сотню кбит... 
Да и переменную пришлось использовать типа Double.
Массивом как то удобнее пока что получается передавать 6 байт команды, аргумента и контрольной суммы.
Что-то не пойму вашу кашу с переменными и массивами...
- используете многобайтовую переменную для хранения данных
- используя оверлей, получаете к ней доступ, как к массиву
- этим же путем изменяете значение переменной (ее байтов)
- передаете значение байтов этой переменной, использую ее, как массив...
Не проще ли избавиться от громоздкой переменной (доступ к которой, кстати, дольше, чем к элементам массива) и использовать просто массив, загружая его и передавая из него данные в нужном порядке.
Выкрутился передавая массив задам наперёд, вызывая подпрограмму с For i = 6 to 1 step - 1, как писал выше.
Вроде бы не сильно подгружает ресурсы МК. Больше за размер кода борьба.
А что вы хотите добиться от последовательного (!) интерфейса, работающего не скорости в сотню кбит...
Хочу понять максимальную скорость и способы её регулирования)
Что-то не пойму вашу кашу с переменными и массивами...
- используете многобайтовую переменную для хранения данных
- используя оверлей, получаете к ней доступ, как к массиву
- этим же путем изменяете значение переменной (ее байтов)
- передаете значение байтов этой переменной, использую ее, как массив...
Все просто и не просто одновременно. Карта, в идеале, читается и пишется секторами по 512байт. В какую переменную вы мне предлагаете записать?) Поэтому массив. А потом из этого массива мне нужно выдернуть номер нужного мне сектора (переменная 4 байта) и дать карте команду (1байт команда, 4 байта номер сектора, 1 байт контрольная сумма) перейти на нужный мне сектор.
Не проще ли избавиться от громоздкой переменной (доступ к которой, кстати, дольше, чем к элементам массива) и использовать просто массив, загружая его и передавая из него данные в нужном порядке.
Скорость работы операторов Bascom
Так к массиву и стремлюсь в конце концов) а переменные это лишь способ извлекать/внедрять нужные мне данные в этот массив.
Скорость работы операторов одна из моих любимых страничек этого форума)
P. S. На счёт скорости и памяти, быстрее бейсика, наверное, только ассемблер( ИМХО) . Его бы я поучил, но нужен наставник. Самому, что то, с наскока, не очень даётся. А вот в сравнение с СИ, баском на порядок рациональнее. Не раз делал компактнее и шустрее программы, чем мои знакомые ардуинщики на СИ!!!
Хочу понять максимальную скорость и способы её регулирования)
Поройтесь в этом разделе Связь проводная и беспроводная, интерфейсы
Тем много, читать-не перечитать
, но наверняка этот вопрос уже проскакивал.
А потом из этого массива мне нужно выдернуть номер нужного мне сектора (переменная 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 , полистать имеющиеся здесь в немалом количестве фрагменты и все станет быстро понятно до определенного уровня.
Затем, разумеется, вопросы возникнут, но уже более предметные. 
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.
А Ассемблер только изначально страшно выглядит.
Нужно, наверное, архитектуру микроконтроллера изучить досконально, чтобы разобраться в jmp, r16 и прочих примудрастях. Или ещё что-то, чего я недопонимаю. Это, как перспектива. А пока осваиваю Баском, он меня вполне устраивает, пока хватает ресурсов AVR микроконтроллеров
Видимо, не поняли вы о чем я. Упрощу ситуацию.
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" - все равно компилятор каждый раз будет отсчитывать местонахождение ячейки массива сначала и данные попадут на место.
Главное - изначально правильно указать принадлежность каждого байта переменной к конкретной ячейке массива.
Вы здесь » Программирование ATMEL в BASCOM. » Периферия » Работа с SD картой без AVR-DOS