.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. Прилагаю сам файл. А на выходе то треск коротенький то писк. Что не так я делаю?
Кварц или частота какая? 8?
В любом случае, нафига режим "fast"? Для 8MHz нужен "phase correct".
И грузить не OCR1B, а в OCR1А (см. ДШ).
Для отладки лучше использовать однотонной wav с постоянной частотой.
Насколько я помню в wav файлах отсчёты хранятся в знаковом формате, т.е. -128...127, а ШИМ по сути беззнаковый, например если сигнал колеблется вблизи нуля от -1 до 1, что должно быть практически тишиной, то если не учесть что он знаковый на выходе будут значения от 0 до 255, т.е. полная амплитуда. Вот и получается непонятно что. Соответственно данные надо корректировать, для этого достаточно к каждому отсчёту прибавить 128.
Код тишины для 8 битного wav является значение 0x80, и на выходе шима будет меандр - т.е. после интегрирующей цепочки получается половина напряжения питания.
В двух словах. На выводе звука с AVR собаку съел. Можно смело за диссертацию садиться.
Теперь по "брошенной фразе"...
У ТС частота дискретизации файла 16кГц. Так зачем навязывать 31кГц, тем самым, занижая динамический диапазон звука больше чем в два раза. Что за панацея с фаст режимом, который при определённых значениях WAV-а будет вносить серьезные искажения в выходной сигнал.
Сможете объяснить...
что-то меня терзают смутные подозрения....
схемку подключения в студию, плиз.
Схема обычная - выход OC1B сконфигурирован на выход(PORTB.2 для Atmega8). Этот вывод идёт на один зажим динамика. Второй зажим идёт на землю. Тактовая 8МГц. Храню в памяти программ. Метку endmem ввёл специально чтоб не парится с расчётом и завершить нормально считывание.
а сравнение ?
Спасибо - косяк исправлен.
Теперь в общем. Нашёл тут программку для работы со звуком - так она может делать экспорт в бинарник. Причём можно указать как будет вывод - знаковый или нет. наз-ся Wavosaur. В ней сейчас сделаю вав с синусоидой на 1000Гц и 1 сек. 8 бит 8кГц. И посмотрим что будет
PS А может быть косяк в том что я добавляю данные по строкам в которых 15 байт вот так
Что-то я вообще потерялся. А казалось так легко... Ни одну частоту дискретизации нельзя получить от стандартных наборов частот внутренних тактовых генераторов 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!!!
В двух словах. На выводе звука с AVR собаку съел. Можно смело за диссертацию садиться.
Я не являюсь поклонником китайской кухни.
asteroid7 писал(а):
Теперь по "брошенной фразе"...
У ТС частота дискретизации файла 16кГц. Так зачем навязывать 31кГц, тем самым, занижая динамический диапазон звука больше чем в два раза. Что за панацея с фаст режимом, который при определённых значениях WAV-а будет вносить серьезные искажения в выходной сигнал.
Сможете объяснить...
Попытаюсь. При частоте шима 16 килогерц в спектре выходного сигнала присутствует паразитная гармоника шим/2 - 8 килогерц.
При частоте 32 килогерца она уже - 16 килогерц, что гораздо приятнее. Забирать данные можно с частотой 16 килогерц и модифировать регист шима через период.
Далее, можно сделать ресамлинг в "пустом" значении - т.е - выводить среднее арифметическое 2 предыдущих замеров в случае, когда не забираем данные.
Negor писал(а):Что-то я вообще потерялся. А казалось так легко... Ни одну частоту дискретизации нельзя получить от стандартных наборов частот внутренних тактовых генераторов Meg'и.
С чего Вы так решили ??? Вы можете получить любую частоту дискретизацию, какую хотите....
Negor писал(а):
А если начинать извращатся с режимом CTC то получается не тот размер сэмпла. И как быть? В принципе мне бы хватило 16000кГц 8 бит. Но на восьмибитном таймере при 8 Мгц получается либо 31кГц либо 4.
вот возьмите эти 30 килогерц и забирайте данные через раз.
Negor писал(а):
что-то меня терзают смутные подозрения....
схемку подключения в студию, плиз.
Схема обычная - выход OC1B сконфигурирован на выход(PORTB.2 для Atmega8). Этот вывод идёт на один зажим динамика. Второй зажим идёт на землю.
Это уже ни в какие ворота... Выход ШИМа - на интегрирующую цепочку, затем - через разделительный конденсатор на вход унч (звуковой карты).
asteroid7 писал(а):
Теперь по "брошенной фразе"...
У ТС частота дискретизации файла 16кГц. Так зачем навязывать 31кГц, тем самым, занижая динамический диапазон звука больше чем в два раза. Что за панацея с фаст режимом, который при определённых значениях WAV-а будет вносить серьезные искажения в выходной сигнал.
Сможете объяснить...
Попытаюсь. При частоте шима 16 килогерц в спектре выходного сигнала присутствует паразитная гармоника шим/2 - 8 килогерц.
При частоте 32 килогерца она уже - 16 килогерц, что гораздо приятнее. Забирать данные можно с частотой 16 килогерц и модифировать регист шима через период.
Далее, можно сделать ресамлинг в "пустом" значении - т.е - выводить среднее арифметическое 2 предыдущих замеров в случае, когда не забираем данные.
urry!
В первом вашем посте этого топика, меня покоробила фраза "именно для 8 бит - фаст...". Слово именно, я воспринял как опровержение моему посту, где я предлагал использовать режим "phase correct".
По негласным правилам форума, или любыми другими средствами общения в интернете, где оппоненты не видят и не знают друг друга, существует правило: опровергаешь - предлагай. В противном случае, таких людей называют нехорошим словом
Я это к чему так распространяюсь...
Про половинные паразитные гармоники можете вешать лапшу другим. Пожалуйста, не мне. Возможно, имеет место описка, и слово гармоника пропечаталось не в тему. Но, доказательств преимуществ режима "фаст" над "корректом", в данном случае, я не увидел. Недостатки в сравнении привёл выше.
Да хрен с ней с этой дискретизацией. Попробуйте программным путём, через прерывание по переполнению, вывести фаст ШИМ-ом подряд три значения: 253, 254, 255. Получится?
urry писал(а):
Попытаюсь. При частоте шима 16 килогерц в спектре выходного сигнала присутствует паразитная гармоника шим/2 - 8 килогерц.
При частоте 32 килогерца она уже - 16 килогерц, что гораздо приятнее. Забирать данные можно с частотой 16 килогерц и модифировать регист шима через период.
Далее, можно сделать ресамлинг в "пустом" значении - т.е - выводить среднее арифметическое 2 предыдущих замеров в случае, когда не забираем данные.
urry!
В первом вашем посте этого топика, меня покоробила фраза "именно для 8 бит - фаст...". Слово именно, я воспринял как опровержение моему посту, где я предлагал использовать режим "phase correct".
По негласным правилам форума, или любыми другими средствами общения в интернете, где оппоненты не видят и не знают друг друга, существует правило: опровергаешь - предлагай. В противном случае, таких людей называют нехорошим словом
Я это к чему так распространяюсь...
Про половинные паразитные гармоники можете вешать лапшу другим. Пожалуйста, не мне. Возможно, имеет место описка, и слово гармоника пропечаталось не в тему. Но, доказательств преимуществ режима "фаст" над "корректом", в данном случае, я не увидел. Недостатки в сравнении привёл выше.
Да хрен с ней с этой дискретизацией. Попробуйте программным путём, через прерывание по переполнению, вывести фаст ШИМ-ом подряд три значения: 253, 254, 255. Получится?
Я никому не пытаюсь вешать лапшу. Не имею такой привычки.
255 - не получится, а 252, 253,254 - вполне.
Код прилагаю.
Необходимости в старших значениях - нет , файл перед выводом нормализуется по амплитуде.
Чтобы больше не слышать хамства, в этой теме я больше не пишу.
Как, собственно, наверное, и на этом сайте.
А ларчик просто открывался. Дело в том что я пользовался для перегена вав в контроллер такую цепочку. Открывал 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!!!