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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Периферия » Работа с файлом avr dos


Работа с файлом avr dos

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

1

Добрый день. Проблема такая. Мне нужно воспроизводить wav файл с sd карты. Делаю так:
.....
$include "Config_MMC.bas"
$include "Config_AVR-DOS.BAS"
......
Btemp1 = Initfilesystem(1) 'делаем инициализацию                               
  If Btemp1 <> 0 Then                                     
  Sd_ok = 0                                           
  Else
  Sd_ok = 1                                         
  End If
.........
Close #10                          'на всякий случай закрываем поток
S = Dir( "KUDA.WAV")        'смотрим ест ли файл с таким именем
If Len(s) > 0 Then            'если есть, то
File_name = "KUDA.WAV"                                 
   If Open_file_wav = 0 Then                                'если файл не открывали до этого
   Open File_name For Binary As #10                         'открываем для чтения и записи
   Open_file_wav = 1                                        'выставляем бит, что файл открыт
   End If
End If
.......
If Eof(#10) = 0 Then Get #10 , Mmc_data1(curbyte1)       'пока не конец файла читаем из него
.......
If Eof(#10) <> 0 Then Close #10  'если конец, закрываем поток

Когда происходит чтение первый раз, то звук воспроизводится нормально, но как только закачивается файл, закрывается поток и нужно воспроизвести второй файл тем же образом, баском отвечает, что файл не найден. В чем может дело быть? Почему он не находит 100% имеющийся файл?

0

2

Можно предположить, что поток не освобождается, хотя если close пишите, то должно освободиться.
А как вы понимаете, что файл не найден?

0

3

Как определяю, условие не выполняется If Len(s) > 0 Then .... говорит, что такого файла нет. Хотя он на флешке есть и воспроизведется, если сделать ресет контроллеру.

0

4

а может что-то с переменными или их иницализацией?
прикрепите файл, так быстрее помогут

0

5

Вот:

Код:
$regfile = "M128def.dat"                                    'выбираем тип кристалла
$crystal = 16000000                                         'частота процессора
$baud = 9600                                                'частота обмена с модулем
$hwstack = 128                                              'размер железного стека
$swstack = 128                                              'размер программного стека
$framesize = 128                                            'количество страниц

'-------------------------------------------------------------------------------

Config Adc = Single , Prescaler = Auto , Reference = Internal       'конфигурация АЦП выбираем скорость преобразования
Start Adc
'-------------------------------------------------------------------------------

'Переменные для работы с картой и со звуком-------------------------------------
Dim Btemp1 As Byte                                          'переменная для выбора раздела
'Подключаем файл конфигурации  и библиотеку AVR-DOS
$include "Config_MMC.bas"
$include "Config_AVR-DOS.BAS"
'===============================================================================
Dim Bb As Byte
Dim Curbyte1 As Integer                                     'текущий байт в функции воспроизведения первого буфера
Curbyte1 = 0
Dim Curbyte2 As Integer                                     'текущий байт в функции воспроизведения 2 буфера
Curbyte2 = 0
Dim Buff1_bit As Bit                                        'говорит пуст ли первый буфер 0-пуст 1 - заполнен
Buff1_bit = 0
Dim Buff2_bit As Bit                                        'говорит пуст ли 2 буфер 0-пуст 1 - заполнен
Buff2_bit = 0
Dim Play1_bit As Bit                                        'говорит играется ли первый буфер 0-нет 1 - играется
Play1_bit = 0
Dim Play2_bit As Bit                                        'говорит играется ли 2 буфер 0-нет 1 - играется
Play2_bit = 0
Dim Mmc_data1(512) As Byte                                  '512 байт буфера воспроизведения
Dim Mmc_data2(512) As Byte                                  '512 байт буфера воспроизведения
Dim Files As Byte                                           'общее количество файлов на карте
Dim S As String * 15                                        'строка на 15 символов
S = ""
Dim Index As Integer                                        'текущий номер файла
Dim File As String * 15                                     'строка хранения имени файла
File = ""
Dim File_name As String * 15                                'имя проигрываемого файла
File_name = ""
Dim I As Integer                                            'переменные - счётчики
Dim J As Long
Dim Parolwav_bit As Bit                                     'говорит запрвшивали ли мы пароль 0-нет, 1-да
Parolwav_bit = 0
Dim Parolwav_golos_bit As Bit                               'говорит говорили ли мы о запрвшивании пароля 0-нет, 1-да
Parolwav_golos_bit = 0
Dim Open_file_wav As Bit                                    'открыт ли файл 0-нет, 1-да
Open_file_wav = 0
Dim Eof_bit As Bit                                          'показывает был ли конец файла
Eof_bit = 0
Dim End_play_bit As Bit                                     'показывает был ли конец воспроизведения
End_play_bit = 1
Dim Adc_reg As Integer

Config Portb.7 = Input
Sd_in Alias Pinb.7                                          'определяет вставлена ли SD карта   (1-не вставлена, 0-вставлена)

Dim Sd_in_bit As Bit                                        'показывает проверяли ли мы наличие sd карты 0-не проверяли, 1-проверяли
Sd_in_bit = 0                                               'не проверяли наличие sd карты

Dim Sd_ok As Bit                                            'показывает нормально ли прошла тестирование sd карта 1 - норм, 0-не норм
Sd_ok = 0

Config Timer2 = Timer , Prescale = 8
Timer2 = 200
On Ovf2 Play                                                'включить прерывание по переполнению
Enable Ovf2
Stop Timer2

'-------------------------------------------------------------------------------

'переменные и настройки для работы с sim900-------------------------------------

'===============================================================================
'Настройка силовой части------------------------------------------------
'===============================================================================
Enable Interrupts

Declare Sub Test_mms                                        'тестируем SD
Declare Sub Play_wav                                        'подпрограмма проигрывания звука
Declare Sub Open_pwm                                        'подпрограмма открытия и настройки ШИМа
Declare Sub Close_pwm                                       'подпрограмма закрытия ШИМа
Declare Sub Close_wav                                       'подпрограмма закрытия wav файла
Declare Sub Zagruz_buff                                     'загрузка буфера

If Sd_in = 0 And Sd_in_bit = 0 Then                         'если есть SD карта и не тестировали ее, то
Test_mms                                                    'тестируем SD
Sd_in_bit = 1
End If


Do

Adc_reg = Getadc(0)

If Adc_reg > 100 And End_play_bit = 1 Then                  'если есть питание и никакой файл не востроизводится, то
S = Dir( "NAP.WAV")                                         'ищем файл
   If Len(s) > 0 Then                                       'если есть
   Close_wav
   File_name = S                                            'голос напряжение в норме
   Play_wav
   Else
   Sound Pinb.5 , 200 , 2000                                'сигнал ок
   End If
End If

If Adc_reg <= 100 And End_play_bit = 1 Then                 'если нет питания и никакой файл не воспроизводится, то
S = Dir( "NAP_BAD.WAV")
   If Len(s) > 0 Then
   Close_wav
   File_name = "NAP_BAD.WAV"                                'голос питания нет
   Play_wav
   Else
   Sound Pinb.5 , 200 , 2000                                'сигнал ок
   End If
End If

'работа с буфером---------------------------------------------------------------
Zagruz_buff                                                 'загружаем буфер для воспроизведения
'-------------------------------------------------------------------------------

If Eof_bit = 1 Then                                         'если был конец файла то сбрасываем
Close_wav
Eof_bit = 0                                                 'говорим, что конца файла не было
End If

'-------------------------------------------------------------------------------

If Parolwav_bit = 1 And Parolwav_golos_bit = 0 Then         'если пароль запросили и не говорили об этом
Parolwav_golos_bit = 1                                      'говорили о том, что запросили пароль
Close_wav
S = Dir( "PAR.WAV")
   If Len(s) > 0 Then
   File_name = "PAR.WAV"                                    'голос пароль
   Play_wav
   Else
   Sound Pinb.5 , 200 , 2000                                'сигнал ок
   End If
End If

'блок тестирования SD///////////////////////////////////////////////////
If Sd_in = 1 Then                                           'если sd карту вытащили
Sd_in_bit = 0                                               'говорим, что не тестировали SD
Sd_ok = 0
End If

If Sd_in = 0 And Sd_in_bit = 0 Then                         'если есть SD карта и не тестировали ее, то
Test_mms                                                    'тестируем SD
Sd_in_bit = 1                                               'говорим, что тестировали SD
End If
'/////////////////////////////////////////////////////////////////////////SD

Loop

End
'//////////////////////////////////////////////////////////////////////////////

'-----------------------------------------------------------------
Sub Test_mms:

'If Gbdriveerror = 0 Then
Btemp1 = Initfilesystem(1)                                  ' инициализируем фат выбор раздела  ( используйте 0 для разделов без загрузочного сектора, 1 с загрузочным)
  If Btemp1 <> 0 Then                                       'если есть ошибки
  Sd_ok = 0                                                 'говорим
  Else
  Sd_ok = 1                                                 'если нет ошибок тоже говорим
  End If

End Sub
'-------------------------------------------------------------------------------

'Подпрограммы воспроизведения---------------------------------------------------
Sub Play_wav:
Open_pwm
End_play_bit = 0
   If Open_file_wav = 0 Then                                'если файл не открывали
   Open File_name For Binary As #10                         'открываем файл
   Open_file_wav = 1                                        'говорим, что открыли
   End If
For Curbyte1 = 1 To 512
   If Eof(#10) = 0 Then Get #10 , Mmc_data1(curbyte1)       'если не конец файла, то копируем в буфер 512 байт
Next
Curbyte1 = 0
Buff1_bit = 1
For Curbyte2 = 1 To 512
   If Eof(#10) = 0 Then Get #10 , Mmc_data2(curbyte2)       'если не конец файла, то копируем в буфер 512 байт
Next
Curbyte2 = 0
Buff2_bit = 1
Play1_bit = 1
Start Timer2                                                'стартуем таймер для востпроизведения
End Sub


Play:

Timer2 = 92
If Buff1_bit = 1 And Play1_bit = 1 And Play2_bit = 0 Then
Incr Curbyte1                                               'увеличиваем текущий байт
Pwm1a = Mmc_data1(curbyte1)
   If Curbyte1 >= 512 Then
   Buff1_bit = 0
   Play1_bit = 0
   Play2_bit = 1
   End If
Elseif Buff2_bit = 1 And Play2_bit = 1 And Play1_bit = 0 Then
Incr Curbyte2                                               'увеличиваем текущий байт
Pwm1a = Mmc_data2(curbyte2)
   If Curbyte2 >= 512 Then
   Buff2_bit = 0
   Play2_bit = 0
   Play1_bit = 1
   End If
End If

If Eof(#10) <> 0 Then Eof_bit = 1                           'если конец файла, то

Return

Sub Open_pwm:
Config Timer1 = Pwm , Pwm = 8 , Prescale = 1 , Compare A Pwm = Clear Down       'настраиваем таймер3 на ШИМ
Pwm1a = 128                                                 'устанавливаем среднюю точку
End Sub

Sub Close_pwm:
Config Timer1 = Timer
Config Portb.5 = Input
End Sub
'-------------------------------------------------------------------------------

Sub Close_wav:
Stop Timer2                                                 'останавливаем таймер
Close #10                                                   'закрываем поток
Pwm1a = 1
Close_pwm                                                   'закрываем ШИМ
Eof_bit = 0
End_play_bit = 1
Open_file_wav = 0
Buff1_bit = 0
Buff2_bit = 0
Play1_bit = 0
Play2_bit = 0
End Sub

Sub Zagruz_buff:
If Buff1_bit = 0 And Play1_bit = 0 And Play2_bit = 1 Then   'если буфур 1 пуст, и не проигрывается, и проигрывается второй
For Curbyte1 = 1 To 512                                     'делаем 512 раз
If Eof(#10) = 0 Then Get #10 , Mmc_data1(curbyte1)          'если не конец файла, то копируем в буфер 512 байт
Next
Curbyte1 = 0
Buff1_bit = 1
End If

If Buff2_bit = 0 And Play2_bit = 0 And Play1_bit = 1 Then
For Curbyte2 = 1 To 512
If Eof(#10) = 0 Then Get #10 , Mmc_data2(curbyte2)          'если не конец файла, то копируем в буфер 512 байт
Next
Curbyte2 = 0
Buff2_bit = 1
End If
End Sub

Проиграв один файл после включения питания, остальные проигрывать отказывается, говорит, что не найдены

Отредактировано Александр Д. (2012-03-10 14:48:01)

0

6

может сделаете просто воспроизведение одного файла, без всей логики?
так проверите, что вообще у Вас работает работа с картой...

0

7

В том то и дело, что один файл без логики воспроизводится, но после Close_wav (точнее после Close #10), хотя может и не после этого, не могу понять, работа с картой прекращается, т.е. контроллер не видит точно имеющиеся файлы на флешке. После того как сделаю ресет, опять воспроизводит.
Уже не знаю на что думать.
Версия dos: Config File-System for Version 5.4: ' Needs BASCOM-AVR 1.11.8.2 or higher
Флешка форматирована в FAT32 объем 2Гб
Версия bascom 1.11.9.0
И еще. Если не делать проверку на наличие файла (например, нужно воспроизвести файл PAR.WAV, он точно есть на флешке, пишем просто Open "PAR.WAV" For Binary As #10), то он создает файл с аналогичным именем  (PAR.WAV) на флешке, но размером 0 байт!!! Вставляю флешку в комп там два файла с одинак именем и расширением.
Совсем голову сломал, мож кто сталкивался.

0

8

мда
похоже на глюк библиотеки
Авторам писали? советую!

0

9

А может быть это из-за старых версий моих библиотек? или они уже не обновляются?

0

10

а чем компилируете?

0

11

bascom 1.11.9.0

0

12

ыыы
это демо?

0

13

Вот, что пишет в меню о программе

Don't forget that Serial numbers should not be sent to the user list.
Make sure you sent your email to support and not a public list !

Compiler version :1.11.9.0
Compiler build   :1.11.9.0.001
IDE version      :1.11.9.0
Serial number    :MH-0203-00149
Windows OS       :Microsoft Windows XP
Windows SP       :Service Pack 2
Explorer         :6.0.2900.2180
Company          :
Owner            :Admin
Windows dir      :C:\WINDOWS
App data dir     :C:\Documents and Settings\Admin\Application Data
System dir       :C:\WINDOWS\system32

А что посоветуете Вы? Может здесь мой головняк?

0

14

Скачайте последнюю демо версию с сайта, там уже 2.0.7.4 идет.
Если будут проблемы, то напишите авторам и потом расскажете нам.

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

0

15

Спасибо, что то отстал я. Скачаю и отпишусь.

0

16

Что-то проблемный я сегодня. Скачал с офиц сайта демо версию, а она оказалась 2.0.7.1. Поставил, она вылетает. Не могли бы Вы мне ссылочку на 2.0.7.4 дать, я реально не нашел ее там.

0

17

На сайте лежит в любом случае новее того, что вы используете, ближайшее что нашел: http://www.mcselec.com/index.php?option … ;Itemid=54
Какая это версия не знаю, у меня лицензия (её живее обновляют). Возможно это тоже самое (2.0.7.1).

Перед установкой новой версии, попробуйте удалить старую полностью с компьютера.

Отредактировано RDW (2012-03-10 18:58:55)

0

18

Вот поставил. Говорит, что в демо версии не будет компилировать больше 4к, а у меня больше. Тогда вопрос еще: как купить лицензию, и сколько это стоить будет. Мозг в любом случае дороже.

0

19

Обратится к админу форума(radan) или на оф. сайте.

0

20

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

Вот поставил. Говорит, что в демо версии не будет компилировать больше 4к, а у меня больше. Тогда вопрос еще: как купить лицензию, и сколько это стоить будет. Мозг в любом случае дороже.

Вот конец темы посвященное этому вопросу: Лицензия. Быть или не быть?
Там я описывал во сколько мне стала покупка (чтобы приблизительно понять диапазон).

Отредактировано RDW (2012-03-10 21:24:54)

0


Вы здесь » Программирование ATMEL в BASCOM. » Периферия » Работа с файлом avr dos