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

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

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

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



FAT16 и AVR

Сообщений 1 страница 8 из 8

1

Возможна ли работа atmega8 с FAT без AVR-DOS ?

Как я понял все библиотеки для работы с FAT жрут много ресурсов и требуют дорогих процессоров, но в то же время встречается полно исходников на СИ которые работают с SD FAT16-32 на процах как atmega8, некоторые не поддерживают запись на SD а только чтение.

Может кто то делал такое?

0

2

Вот программа на СИ
ссылка

Может ее перевести можно.

0

3

Да. Разговаривать самому с собой уже входит в привычку.

Вот так я поиграл Wav на mega8 с SD карточки 1Gb

Код:
$regfile = "m8def.dat"
$crystal = 11059200                                         '
$baud = 9600

Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Down , Prescale = 1       ' øèì ìîäóëÿòîð PWM
Pwm1a = 255
Pwm1b = 255
'Constants
Const Msbl = 0
Const Msbh = 1
Const Dly = 2
Const Bits8 = 8
Const Bits16 = 16
Const Bits32 = 32

'Dim
Dim Dat As Byte
Dim Resp As Byte
Dim I As Word
Dim Addr As Long
Dim Adres As Long
Dim Tanzim As Byte
Dim Ali As Byte
Dim Test As Long
Dim Copy As Long
Dim Shomare As Long
Dim Hassan As Byte
'Aliases
Cs Alias Portc.2
Mosi Alias Portc.3
Clk Alias Portc.4
Miso Alias Pinc.5


'Declarations
Declare Sub Minit
Declare Sub Readmmc(byval Addr As Long )
Declare Sub Mread(byval Addr As Long )
'Configs
Config Portc.5 = Output
Config Portc.2 = Output
Config Portc.4 = Output
Config Pinc.3 = Input


Waitms 300
Config Spi = Soft , Din = Pinc.5 , Dout = Portc.3 , Ss = Portc.2 , Clock = Portc.4
 Enable Interrupts
 Enable Spi

 Spiinit

'******** MAIN PROGRAM *************

' Reset Portd.3
Main:
 'Initialize the MMCC
 Wait 2
  Print ""
  Print "Init MMC"
 Minit
' Adres = 1048576
 Adres = 376832
  Ali = 0
  Print "ok"

 Wait 2
  Print "read"
    Test = 512 * 7800
' Inja:
While Adres <> Test

 ' Print Adres
  Call Readmmc(adres)
  Adres = Adres + 512
Wend
Print "End of program"
Endloop:
Goto Endloop
End                                                         'end program
'***************************** END OF PROGRAM **********************************

'======= SUB ROUTINES AND FUNCTIONS =======
'*** Èíèöèàëèçàöèÿ êàðòû MMC ***
Sub Minit
 Set Cs
 Dat = &HFF                                                 ' îòïðàâëÿåì FF
 For I = 1 To 10                                            '10 ðàç ÷òîá MMC ïîëó÷èëà òàêòîâûå èìïóëüñû äëÿ ñâîéõ íóæä (íå ìåíåå 8)
  Shiftout Mosi , Clk , Dat , Msbl                          '
 Next I

 Resp = 255
 Reset Cs

Print "Reset MMC"
 Cmd0:                                                      ' êîìàíäà 0 ñáðîñ êàðòû 40,00,00,00,00,95
  Dat = &H40                                                '40
    Shiftout Mosi , Clk , Dat , Msbl
  Addr = &H00000000
    Shiftout Mosi , Clk , Addr , Msbl
  Dat = &H95
    Shiftout Mosi , Clk , Dat , Msbl

  While Resp <> &H01                                        ' æäåì îòêëèê 01 åñëè âñ¸ íîðìàëüíî (äðóãèå áèòû óêàçûâàþò íà îøèáêó)
    Shiftin Miso , Clk , Resp , Msbl
        Print "Otklik " ; Resp
  Wend
 Print "Reset OK!"
 Set Cs
  Waitms 50
 Reset Cs

 Dat = &HFF
 Print "Return SPI"
 Cmd1:                                                      ' êîìàíäà 1 ïåðåâîä êàðòû â ðåæèì spi 41,00,00,00,00,FF
 While Resp <> &H00                                         ' æäåì îòêëèê 00 åñëè âñ¸ íîðìàëüíî â ïðîòèâíîì ñëó÷àå ïîâòîðÿåì
  Set Cs
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftin Miso , Clk , Resp , Msbl
  Reset Cs
  Dat = &H41                                                ' êîä êîìàíäû 41
    Shiftout Mosi , Clk , Dat , Msbl                        ' 00000000
  Addr = 0
    Shiftout Mosi , Clk , Addr , Msbl                       ' FF âìåñòî CRC
  Dat = &HFF
    Shiftout Mosi , Clk , Dat , Msbl                        ' ïóñòîé äëÿ òàêòîâ
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftin Miso , Clk , Resp , Msbl                        ' ïðèíèìàåì îòêëèê (01)
   Print "otklik SPI " ; Resp
 Wend

 Dat = &HFF
 Set Cs
 Print "Init OK!"
End Sub



'**** READ routine assumes ADDR uses Status subroutine *****
Sub Readmmc(byval Addr As Long)
' Addr = 0
 Set Cs
 Dat = &HFF
   Shiftout Mosi , Clk , Dat , Msbl
   Shiftin Miso , Clk , Resp , Msbl
 Reset Cs

 Dat = &H51                                                 'êîìàíäà 51 ÷èòàòü áëîê 512 áàéò
   Shiftout Mosi , Clk , Dat , Msbl                         'àäðåñ
   Shiftout Mosi , Clk , Addr , Msbl

 Dat = &HFF                                                 'FF âìåñòî ÑRC
   Shiftout Mosi , Clk , Dat , Msbl
   Shiftin Miso , Clk , Resp , Msbl

 While Resp <> 0                                            ' ïîêà êàðòà äóìàåò, ïåðåä ïîñûëêîé îíà äàñò 0 ïîòîì FE
   Shiftin Miso , Clk , Resp , Msbl
 Wend

 While Resp <> &HFE                                         ' ïîñûëêà äàííûõ ïðåäâàðÿåòñÿ áàéòîì FE ïåðåä
   Shiftin Miso , Clk , Resp , Msbl
 Wend

 For I = 1 To 512                                           ' ïðèíèìàåì áëîê 512 áàéò
    Shiftin Miso , Clk , Resp , Msbl
'    If Resp <> 255 And Resp <> 0 Then                       'Çàïèñûâàåì íà ÷èñòóþ êàðòî÷êó FAT 1 ôàéë WAV 22êãö 8áèò ìîíî
'     Print "Block # " ; Addr ; " " ; I ; " - " ; Resp       'ñ ïîìîùüþ ýòîãî êîäà âûñìàòðèâàåì àäðåñ ãäå äàííûå íå ðàâíû 0 èëè 255
'     Waitms 50                                              'ïîòîì ïîäñòàâëÿåì ýòîò àäðåñ â êà÷åñòâå ñòàðòîâîãî
'    End If
      Pwm1a = Resp
      Pwm1b = Resp

      Waitus 29
 Next I

 Shiftin Miso , Clk , Resp , Msbl                           ' ïðîïóñêàåì äâà áàéòà CRC
 Shiftin Miso , Clk , Resp , Msbl
Set Cs

End Sub

Прикольно!
А че комментарии по русски не показываются?

0

4

Димон написал(а):

Прикольно!
А че комментарии по русски не показываются?

Ошибка кодировки
Попробуйте тоже самое скопировать при включенной русской раскладке клавиатуры.

+1

5

Код:
'---------------------------------------------
'Проигрыватель Wav с карточки SD\MMC Y.D.E. 2011
'Первоисточник http://avrprojects.info/avr-projects/mmc-card-based-wav-player/
'---------------------------------------------
'  mega8      SD\MMC
'  25 PC2-----1 CS
'  26 PC3-----2 MOSI
'           --3 Gnd
'           --4 +3.3v
'  27 PC4-----5 SCK
'           --6 Gnd
'  28 PC5-----7 MISO
'
'  15 PB1--4,7mF--Speeker--Gnd
'
'------------------------------------------
$regfile = "m8def.dat"
$crystal = 11059200                                         '
$baud = 9600

Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Down , Prescale = 1       ' шим модулятор PWM
Pwm1a = 255
Pwm1b = 255
'Constants
Const Msbl = 0
Const Msbh = 1
Const Dly = 2
Const Bits8 = 8
Const Bits16 = 16
Const Bits32 = 32

'Dim
Dim Dat As Byte
Dim Resp As Byte
Dim I As Word
Dim Addr As Long
Dim Adres As Long
Dim Tanzim As Byte
Dim Ali As Byte
Dim Test As Long
Dim Copy As Long
Dim Shomare As Long
Dim Hassan As Byte
'Aliases
Cs Alias Portc.2
Mosi Alias Portc.3
Clk Alias Portc.4
Miso Alias Pinc.5


'Declarations
Declare Sub Minit
Declare Sub Readmmc(byval Addr As Long )
Declare Sub Mread(byval Addr As Long )
'Configs
Config Portc.5 = Output
Config Portc.2 = Output
Config Portc.4 = Output
Config Pinc.3 = Input


Waitms 300
Config Spi = Soft , Din = Pinc.5 , Dout = Portc.3 , Ss = Portc.2 , Clock = Portc.4
 Enable Interrupts
 Enable Spi

 Spiinit

'******** MAIN PROGRAM *************

' Reset Portd.3
Main:
 'Initialize the MMCC
 Wait 2
  Print ""
  Print "Init MMC"
 Minit
' Adres = 1048576
 Adres = 376832
  Ali = 0
  Print "ok"

 Wait 2
  Print "read"
    Test = 512 * 7800
' Inja:
While Adres <> Test

 ' Print Adres
  Call Readmmc(adres)
  Adres = Adres + 512
Wend
Print "End of program"
Endloop:
Goto Endloop
End                                                         'end program
'***************************** END OF PROGRAM **********************************

'======= SUB ROUTINES AND FUNCTIONS =======
'*** Инициализация карты MMC ***
Sub Minit
 Set Cs
 Dat = &HFF                                                 ' отправляем FF
 For I = 1 To 10                                            '10 раз чтоб MMC получила тактовые импульсы для свойх нужд (не менее 8)
  Shiftout Mosi , Clk , Dat , Msbl                          '
 Next I

 Resp = 255
 Reset Cs

Print "Reset MMC"
 Cmd0:                                                      ' команда 0 сброс карты 40,00,00,00,00,95
  Dat = &H40                                                '40
    Shiftout Mosi , Clk , Dat , Msbl
  Addr = &H00000000
    Shiftout Mosi , Clk , Addr , Msbl
  Dat = &H95
    Shiftout Mosi , Clk , Dat , Msbl

  While Resp <> &H01                                        ' ждем отклик 01 если всё нормально (другие биты указывают на ошибку)
    Shiftin Miso , Clk , Resp , Msbl
        Print "Otklik " ; Resp
  Wend
 Print "Reset OK!"
 Set Cs
  Waitms 50
 Reset Cs

 Dat = &HFF
 Print "Return SPI"
 Cmd1:                                                      ' команда 1 перевод карты в режим spi 41,00,00,00,00,FF
 While Resp <> &H00                                         ' ждем отклик 00 если всё нормально в противном случае повторяем
  Set Cs
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftin Miso , Clk , Resp , Msbl
  Reset Cs
  Dat = &H41                                                ' код команды 41
    Shiftout Mosi , Clk , Dat , Msbl                        ' 00000000
  Addr = 0
    Shiftout Mosi , Clk , Addr , Msbl                       ' FF вместо CRC
  Dat = &HFF
    Shiftout Mosi , Clk , Dat , Msbl                        ' пустой для тактов
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftin Miso , Clk , Resp , Msbl                        ' принимаем отклик (01)
   Print "otklik SPI " ; Resp
 Wend

 Dat = &HFF
 Set Cs
 Print "Init OK!"
End Sub



'**** READ routine assumes ADDR uses Status subroutine *****
Sub Readmmc(byval Addr As Long)
' Addr = 0
 Set Cs
 Dat = &HFF
   Shiftout Mosi , Clk , Dat , Msbl
   Shiftin Miso , Clk , Resp , Msbl
 Reset Cs

 Dat = &H51                                                 'команда 51 читать блок 512 байт
   Shiftout Mosi , Clk , Dat , Msbl                         'адрес
   Shiftout Mosi , Clk , Addr , Msbl

 Dat = &HFF                                                 'FF вместо СRC
   Shiftout Mosi , Clk , Dat , Msbl
   Shiftin Miso , Clk , Resp , Msbl

 While Resp <> 0                                            ' пока карта думает, перед посылкой она даст 0 потом FE
   Shiftin Miso , Clk , Resp , Msbl
 Wend

 While Resp <> &HFE                                         ' посылка данных предваряется байтом FE перед
   Shiftin Miso , Clk , Resp , Msbl
 Wend

 For I = 1 To 512                                           ' принимаем блок 512 байт
    Shiftin Miso , Clk , Resp , Msbl
'    If Resp <> 255 And Resp <> 0 Then                       'Записываем на чистую карточку FAT 1 файл WAV 22кгц 8бит моно
'     Print "Block # " ; Addr ; " " ; I ; " - " ; Resp       'с помощью этого кода высматриваем адрес где данные не равны 0 или 255
'     Waitms 50                                              'потом подставляем этот адрес в качестве стартового
'    End If
      Pwm1a = Resp
      Pwm1b = Resp

      Waitus 29
 Next I

 Shiftin Miso , Clk , Resp , Msbl                           ' пропускаем два байта CRC
 Shiftin Miso , Clk , Resp , Msbl
Set Cs

End Sub

Да так правда лучше.
Спасибо.
Не знал.

+1

6

Привет, здорово.

0

7

Вопрос такой: насколько сложно сделать читалку, чтобы получилась система LCD+AVR+SD? Нужно, чтобы файл *.txt сохранялся на флешку и читался на ЖКИ от нокии 3310.

0

8

И что дает AVR-DOS?

0