ATMega и WAV

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Вымогатель припоя
Аватара пользователя
Сообщения: 586
Зарегистрирован: Ср мар 07, 2007 22:58:02
Откуда: Черкассы, Украина

Сообщение Negor »

Я уже замаялся. Вроде всё просто а на выходе какая то...

Код: Выделить всё

.include "m8def.inc"
.cseg
.org 0
	rjmp Reset
.org OVF1addr
	rjmp OVF1
reset:
	ldi r16, high(RAMEND)
	out SPH, r16
	ldi r16, low(RAMEND)
	out SPL, r16
	ldi r16, 1<<2
	out DDRB, r16
;	ldi r16, 0x00
;	out OCR1AH, r16
;	clr r16
;	out OCR1AL, r16
	ldi ZH, high(2*data)
	ldi ZL, low(2*data)
	ldi r16, (1<<COM1B1)|(1<<WGM10)
	out TCCR1A, r16
	ldi r16, (1<<WGM12)|(1<<CS10)
	out TCCR1B, r16
	ldi r16, (1<<TOIE1)
	out TIMSK, r16
	sei
main:
	nop
	rjmp main

OVF1:
	clr r17
	out OCR1BH, r17
	lpm r17, Z+
	out OCR1BL, r17
	cpi ZH, high(enddata)
	breq endmem
	cpi ZL, low(enddata)
	breq endmem
	reti
endmem:
	clr r16
	out TCCR1B, r16
	reti
Взял вав 16кГц 8 бит и загнал всё что там было между метками data и enddata. Прилагаю сам файл. А на выходе то треск коротенький то писк. Что не так я делаю?
Вложения
data.rar
rar переименовать в wav
(6.31 КБ) 360 скачиваний
There is only 10 kind of people: those who understands binary code and those who dont!!!
Контактная информация:
Реклама
Опытный кот
Аватара пользователя
Сообщения: 703
Зарегистрирован: Вс янв 18, 2009 21:12:49

Сообщение asteroid7 »

Кварц или частота какая? 8?
В любом случае, нафига режим "fast"? Для 8MHz нужен "phase correct".
И грузить не OCR1B, а в OCR1А (см. ДШ).
Для отладки лучше использовать однотонной wav с постоянной частотой.
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

именно для 8 бит - фаст...
Кстати http://vrtp.ru/index.php?showtopic=11377&st=0
Контактная информация:
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 175
Зарегистрирован: Сб ноя 22, 2008 15:31:52

Сообщение Белк »

Насколько я помню в wav файлах отсчёты хранятся в знаковом формате, т.е. -128...127, а ШИМ по сути беззнаковый, например если сигнал колеблется вблизи нуля от -1 до 1, что должно быть практически тишиной, то если не учесть что он знаковый на выходе будут значения от 0 до 255, т.е. полная амплитуда. Вот и получается непонятно что. Соответственно данные надо корректировать, для этого достаточно к каждому отсчёту прибавить 128.
Реклама
Эиком - электронные компоненты и радиодетали
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

Код тишины для 8 битного wav является значение 0x80, и на выходе шима будет меандр - т.е. после интегрирующей цепочки получается половина напряжения питания.
Вложения
n6.jpg
(78.63 КБ) 507 скачиваний
Контактная информация:
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 586
Зарегистрирован: Ср мар 07, 2007 22:58:02
Откуда: Черкассы, Украина

Сообщение Negor »

А если у мен сразу с МК на динамик?
There is only 10 kind of people: those who understands binary code and those who dont!!!
Контактная информация:
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 586
Зарегистрирован: Ср мар 07, 2007 22:58:02
Откуда: Черкассы, Украина

Сообщение Negor »

Даже после добавления к каждому отсчёту 0x80 полная анархия на выходе.
There is only 10 kind of people: those who understands binary code and those who dont!!!
Контактная информация:
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

Посмотрите на ваш код - инициализация здесь

Код: Выделить всё

   ldi ZH, high(2*data)
   ldi ZL, low(2*data) 
а сравнение ?

Код: Выделить всё

 cpi ZH, high(enddata) 
Вообще неправильно здесь

Код: Выделить всё

   cpi ZH, high(enddata)
   breq endmem
   cpi ZL, low(enddata)
   breq endmem 
Но я не спец по авр-ному асму :)
И этот фокус с умножением на 2 будет работать на коротких кусках, по-моему
Контактная информация:
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

1. где вы храните сам вав?
2. какова тактовая
3. для работы с регистровыми парами +/- есть спец.инструкции
adiw и sbiw
в вашем случае

Код: Выделить всё

   cpi ZH, high(enddata) 
   breq endmem 
   cpi ZL, low(enddata) 
   breq endmem 
 
последний блок никогда прочитан не будет.
4. частота шим должна быть = 16кГц в вашем случае.[/b]

зы: выход oc1а сконфигурирован как вход. и для 8 битного вав надо использовать 8 битный счетчик
Последний раз редактировалось GP1 Чт сен 10, 2009 19:25:32, всего редактировалось 1 раз.
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

Negor писал(а):Даже после добавления к каждому отсчёту 0x80 полная анархия на выходе.
ничего никуда прибавлять не надо.
что-то меня терзают смутные подозрения....
схемку подключения в студию, плиз.
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 703
Зарегистрирован: Вс янв 18, 2009 21:12:49

Сообщение asteroid7 »

urry писал(а):именно для 8 бит - фаст...
:)
С какого испугу!

В двух словах. На выводе звука с AVR собаку съел. Можно смело за диссертацию садиться. :)

Теперь по "брошенной фразе"...
У ТС частота дискретизации файла 16кГц. Так зачем навязывать 31кГц, тем самым, занижая динамический диапазон звука больше чем в два раза. Что за панацея с фаст режимом, который при определённых значениях WAV-а будет вносить серьезные искажения в выходной сигнал.
Сможете объяснить...
Вымогатель припоя
Аватара пользователя
Сообщения: 586
Зарегистрирован: Ср мар 07, 2007 22:58:02
Откуда: Черкассы, Украина

Сообщение Negor »

что-то меня терзают смутные подозрения....
схемку подключения в студию, плиз.
Схема обычная - выход OC1B сконфигурирован на выход(PORTB.2 для Atmega8). Этот вывод идёт на один зажим динамика. Второй зажим идёт на землю. Тактовая 8МГц. Храню в памяти программ. Метку endmem ввёл специально чтоб не парится с расчётом и завершить нормально считывание.
а сравнение ?
Спасибо - косяк исправлен.

Теперь в общем. Нашёл тут программку для работы со звуком - так она может делать экспорт в бинарник. Причём можно указать как будет вывод - знаковый или нет. наз-ся Wavosaur. В ней сейчас сделаю вав с синусоидой на 1000Гц и 1 сек. 8 бит 8кГц. И посмотрим что будет

PS А может быть косяк в том что я добавляю данные по строкам в которых 15 байт вот так

Код: Выделить всё

.db   0xA7, 0x00, 0x59, 0x7F, 0x59, 0x00, 0xA7, 0x81, 0xA7, 0x00, 0x59, 0x7F, 0x59, 0x00, 0xA7
Компилятор их нулями до 16 докидывает и получается хня.
There is only 10 kind of people: those who understands binary code and those who dont!!!
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 586
Зарегистрирован: Ср мар 07, 2007 22:58:02
Откуда: Черкассы, Украина

Сообщение Negor »

Что-то я вообще потерялся. А казалось так легко... Ни одну частоту дискретизации нельзя получить от стандартных наборов частот внутренних тактовых генераторов Meg'и. А если начинать извращатся с режимом CTC то получается не тот размер сэмпла. И как быть? В принципе мне бы хватило 16000кГц 8 бит. Но на восьмибитном таймере при 8 Мгц получается либо 31кГц либо 4. А если взять режим СТС и пихать туда 8битный файл. то даже при максимальном уровне сигнала по файлу это будеть половина заполнености периода на выходе ибо при 8МГц без предделителя для получения прерывания с частотой 16кГц в OCR1A нужно поместит 0x01F4. Буду рад оказаться неправ ибо кактож другие делают.
asteroid7 - поделитесь опытом
There is only 10 kind of people: those who understands binary code and those who dont!!!
Контактная информация:
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

asteroid7 писал(а):
urry писал(а):именно для 8 бит - фаст...
:)
С какого испугу!

В двух словах. На выводе звука с AVR собаку съел. Можно смело за диссертацию садиться. :)
Я не являюсь поклонником китайской кухни.
asteroid7 писал(а): Теперь по "брошенной фразе"...
У ТС частота дискретизации файла 16кГц. Так зачем навязывать 31кГц, тем самым, занижая динамический диапазон звука больше чем в два раза. Что за панацея с фаст режимом, который при определённых значениях WAV-а будет вносить серьезные искажения в выходной сигнал.
Сможете объяснить...
Попытаюсь. При частоте шима 16 килогерц в спектре выходного сигнала присутствует паразитная гармоника шим/2 - 8 килогерц.
При частоте 32 килогерца она уже - 16 килогерц, что гораздо приятнее. Забирать данные можно с частотой 16 килогерц и модифировать регист шима через период.
Далее, можно сделать ресамлинг в "пустом" значении - т.е - выводить среднее арифметическое 2 предыдущих замеров в случае, когда не забираем данные.
Контактная информация:
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

Negor писал(а):Что-то я вообще потерялся. А казалось так легко... Ни одну частоту дискретизации нельзя получить от стандартных наборов частот внутренних тактовых генераторов Meg'и.
С чего Вы так решили ??? Вы можете получить любую частоту дискретизацию, какую хотите....
Negor писал(а): А если начинать извращатся с режимом CTC то получается не тот размер сэмпла. И как быть? В принципе мне бы хватило 16000кГц 8 бит. Но на восьмибитном таймере при 8 Мгц получается либо 31кГц либо 4.
вот возьмите эти 30 килогерц и забирайте данные через раз.
Контактная информация:
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

Negor писал(а): что-то меня терзают смутные подозрения....
схемку подключения в студию, плиз.
Схема обычная - выход OC1B сконфигурирован на выход(PORTB.2 для Atmega8). Этот вывод идёт на один зажим динамика. Второй зажим идёт на землю.
Это уже ни в какие ворота... Выход ШИМа - на интегрирующую цепочку, затем - через разделительный конденсатор на вход унч (звуковой карты).
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 703
Зарегистрирован: Вс янв 18, 2009 21:12:49

Сообщение asteroid7 »

urry писал(а):
asteroid7 писал(а): Теперь по "брошенной фразе"...
У ТС частота дискретизации файла 16кГц. Так зачем навязывать 31кГц, тем самым, занижая динамический диапазон звука больше чем в два раза. Что за панацея с фаст режимом, который при определённых значениях WAV-а будет вносить серьезные искажения в выходной сигнал.
Сможете объяснить...
Попытаюсь. При частоте шима 16 килогерц в спектре выходного сигнала присутствует паразитная гармоника шим/2 - 8 килогерц.
При частоте 32 килогерца она уже - 16 килогерц, что гораздо приятнее. Забирать данные можно с частотой 16 килогерц и модифировать регист шима через период.
Далее, можно сделать ресамлинг в "пустом" значении - т.е - выводить среднее арифметическое 2 предыдущих замеров в случае, когда не забираем данные.
urry!
В первом вашем посте этого топика, меня покоробила фраза "именно для 8 бит - фаст...". Слово именно, я воспринял как опровержение моему посту, где я предлагал использовать режим "phase correct".

По негласным правилам форума, или любыми другими средствами общения в интернете, где оппоненты не видят и не знают друг друга, существует правило: опровергаешь - предлагай. В противном случае, таких людей называют нехорошим словом :)

Я это к чему так распространяюсь...
Про половинные паразитные гармоники можете вешать лапшу другим. Пожалуйста, не мне. Возможно, имеет место описка, и слово гармоника пропечаталось не в тему. Но, доказательств преимуществ режима "фаст" над "корректом", в данном случае, я не увидел. Недостатки в сравнении привёл выше.

Да хрен с ней с этой дискретизацией. Попробуйте программным путём, через прерывание по переполнению, вывести фаст ШИМ-ом подряд три значения: 253, 254, 255. Получится?
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

asteroid7 писал(а):
urry писал(а): Попытаюсь. При частоте шима 16 килогерц в спектре выходного сигнала присутствует паразитная гармоника шим/2 - 8 килогерц.
При частоте 32 килогерца она уже - 16 килогерц, что гораздо приятнее. Забирать данные можно с частотой 16 килогерц и модифировать регист шима через период.
Далее, можно сделать ресамлинг в "пустом" значении - т.е - выводить среднее арифметическое 2 предыдущих замеров в случае, когда не забираем данные.
urry!
В первом вашем посте этого топика, меня покоробила фраза "именно для 8 бит - фаст...". Слово именно, я воспринял как опровержение моему посту, где я предлагал использовать режим "phase correct".

По негласным правилам форума, или любыми другими средствами общения в интернете, где оппоненты не видят и не знают друг друга, существует правило: опровергаешь - предлагай. В противном случае, таких людей называют нехорошим словом :)

Я это к чему так распространяюсь...
Про половинные паразитные гармоники можете вешать лапшу другим. Пожалуйста, не мне. Возможно, имеет место описка, и слово гармоника пропечаталось не в тему. Но, доказательств преимуществ режима "фаст" над "корректом", в данном случае, я не увидел. Недостатки в сравнении привёл выше.

Да хрен с ней с этой дискретизацией. Попробуйте программным путём, через прерывание по переполнению, вывести фаст ШИМ-ом подряд три значения: 253, 254, 255. Получится?
Я никому не пытаюсь вешать лапшу. Не имею такой привычки.
255 - не получится, а 252, 253,254 - вполне.
Код прилагаю.
Необходимости в старших значениях - нет , файл перед выводом нормализуется по амплитуде.
Чтобы больше не слышать хамства, в этой теме я больше не пишу.
Как, собственно, наверное, и на этом сайте.
Вложения
snd_m8.rar
(73.25 КБ) 219 скачиваний
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 586
Зарегистрирован: Ср мар 07, 2007 22:58:02
Откуда: Черкассы, Украина

Сообщение Negor »

Получилось) Очень противный высокий звук
вот такой код использовал

Код: Выделить всё

.include "m8def.inc"
.cseg
.org 0
	rjmp Reset
.org OVF1addr
	rjmp OVF1
reset:
	ldi r16, high(RAMEND)
	out SPH, r16
	ldi r16, low(RAMEND)
	out SPL, r16
	ldi r16, 1<<2
	out DDRB, r16
	ldi ZH, high(2*data)
	ldi ZL, low(2*data)
	ldi r16, (1<<COM1B1)|(1<<WGM10)
	out TCCR1A, r16
	ldi r16, (1<<WGM12)|(1<<CS10)
	out TCCR1B, r16
	ldi r16, (1<<TOIE1)
	out TIMSK, r16
	sei
main:
	nop
	rjmp main

OVF1:
	clr r17
	out OCR1BH, r17
	lpm r17, Z+
	out OCR1BL, r17
	cpi ZH, high(2*enddata)
	brne l_reti
	cpi ZL, low(2*enddata)
	breq endmem
l_reti:
	reti
endmem:
	ldi ZH, high(2*data)
	ldi ZL, low(2*data)
	reti


data:
.db 253, 254, 255
enddata:
От внутренних 8МГц Динамик на oc1b
There is only 10 kind of people: those who understands binary code and those who dont!!!
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 586
Зарегистрирован: Ср мар 07, 2007 22:58:02
Откуда: Черкассы, Украина

Сообщение Negor »

А ларчик просто открывался. Дело в том что я пользовался для перегена вав в контроллер такую цепочку. Открывал wav в HxD и экспортировал в файл Pascal. Затем самопальной прогой добавлял в начало каждой строки .db и убирал в конце запятую. Результат закидывал в asm и заливал. Так вот. При компиляции было много warning но я на них не обращал внимания и зря. Дело в том что в каждой строке было только по 15!!!! байт и компилятор докидывал по нолику в каждую строку. Итого на каждый 16й байт из 6кбайт звука был нулевым. Это и давало противный писк на выходе. Кроме того один из форумчан оказался прав насчёт частоты несущей. При 8МГц тактовой действительно несущую слышно хоть и не много. При 12МГц всё гуд. Так что "если долго мучатся - то всё получится"
There is only 10 kind of people: those who understands binary code and those who dont!!!
Контактная информация:
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»