Jump to content
windas

Помогите Со Звуком

Recommended Posts

Здравствуйте!

Начал осваивать программирование AVR. Делаю таймер для засветки фоторезиста на уф. светодиодах. Вроде программа почти готова, но уперся в звук. Думал, что самое легкое, ан нет.

Суть в следующем. По окончании работы таймера, хочу сделать сигнал об окончании(какой не важно, лишь бы пискнул). Но не выходит. Идет простое щелкание, тикание, тарахтение. Слишком малая частота и не могу добиться нужной. Использую Atmega8. 4 мегагерца. Пищалка hy-05 hycom через транзистор. Таймер Т0 обслуживает динамическую индикацию. Таймер Т1_А - считает секунды, Таймер Т2 - опрос энкодера и кнопки. Все работает вроде нормально. Под звук использую Т1_В без делителя. Все равно трещит, а не пищит. Убирал Т1, думал как то влияет - не влияет. Менял ОСR1B - частота меняется, но не сильно. Дрыгал ножкой в основном блоке программы, все равно не пищит а тарахтит, зараза. Вообщем не могу заставить генерировать 2400гц для пищалки. Запарился уже. Можно сделать генератор отдельно, но хочу добить программно. Все равно потом нужно будет в других проектах. Подскажите, где копать? Может какой другой таймер влияет из-за ошибки?(но ведь все работает). Может фьюзы? Но опять же другие таймеры работают. Такое ощущение, что вся схема работает на пониженой частоте, но работает. Подскажите где копать, на что еще внимание обратить? Что почитать? Блин, из-за какого то писка все встало. Заранее спасибо.

Share this post


Link to post
Share on other sites

Используйте таймер в режиме СТС (сброс по совпадению), регистр сравнения будет задавать частоту звука.

Так и делаю. Таймер Т1_B сброс по совпадении. Хотя перепробовал уже все режимы. Все равно только тарахтит.

Share this post


Link to post
Share on other sites

Литиевые батарейки Fanso для систем телеметрии и дистанционного контроля

Системы телеметрии находят все более широкое применение во многих отраслях на промышленных и коммунальных объектах. Требования, предъявляемые к условиям эксплуатации приборов телеметрии и, как следствие, источников питания для них, могут быть довольно жесткими. Fanso предоставляет широкую линейку продукции, рассчитанной на различные условия эксплуатации, что позволяет подобрать батарейку для каждого конкретного применения, в том числе и для устройств телеметрии.

Подробнее

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

Не забыл. Убираю предделитель - тарахтит быстрее, но все равно тарахтит, а не пищит.

Share this post


Link to post
Share on other sites
                     

Приглашаем на вебинар Решения для построения ультразвуковых счетчиков жидкостей и газов на базе MSP430

Компэл совместно с Texas Instruments 23 октября 2019 приглашают на вебинар, посвященный системам-на-кристалле для построения ультразвуковых расходомеров жидкостей и газов на базе ядра MSP430. Вебинар проводит Йоханн Ципперер – эксперт по ультразвуковым технологиям, непосредственно участвовавший в создании данного решения. На вебинаре компания Texas Instruments представит однокристальное решение, позволяющее создавать точные недорогие счетчики жидкостей и газов.

Подробнее...

В некоторых местах форматирование кода есть, в других нет. Странно.

Вы в курсе, что в режиме СТС частота задается либо регистром OCR1A, либо ICR, но не OCR1B?

Share this post


Link to post
Share on other sites

Если в плане научиться программировать - то все это обсуждение, наверное, полезно.

А ежели в плане практичности

Мужик, тебе нужны "шашечки" или тебе нужно ехать?
то тупо поставьте баззер (зуммер) со встроенным генератором. СтОит всего раза в три больше, чем без генератора, но все равно копейки.

Share this post


Link to post
Share on other sites

зачем его покупать если можно с материнки выдрать. В этом случае и таймер дергать туды=сюды не придется.

Edited by Viktor26

Share this post


Link to post
Share on other sites

Хоть чушь-то не пишите! На материнках как раз стоят зуммеры БЕЗ встроенного генератора.

Share this post


Link to post
Share on other sites

лично, мне, два раза попадались выдранные с материнки, и один с бортового компа для авто, заводились от трех пальчиковых батареек

Share this post


Link to post
Share on other sites

На материнках как раз стоят зуммеры БЕЗ встроенного генератора.

50/50 ИМХО

А формирование звука, примеров программ на разных языках полно, только поискать.

Edited by o_l_e_g

Share this post


Link to post
Share on other sites

Вы в курсе, что в режиме СТС частота задается либо регистром OCR1A, либо ICR, но не OCR1B?

Поменять функции прерываний местами. Тогда для получения частоты на линии порта PB2 (при тактовой 4МГц) потребуется такая настройка таймера:

TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (1<<COM1B0) | (0<<WGM11) | (0<<WGM10);

TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (1<<WGM12) | (0<<CS12) | (1<<CS11) | (0<<CS10);

OCR1AH=0x00;

OCR1AL=0x66;

Навскидку.

Share this post


Link to post
Share on other sites

Viktor26, значит, Вам повезло больше. Мне такие НИ РАЗУ не попадались. А распаял я более 3-х десятков материнок.

Share this post


Link to post
Share on other sites

)) три десятка не мало, а когда в воинской части идет модернизация счет идет на 50-60 машин(ЭВМ) в год. у меня в ноябре этого года будет ровно 9 лет выслуги. за это время столько всякого, и хорошего и плохого, угробили, мама дорогая)))

как вспомню новый осциллограф с1-117, с четчиком часов на задней крышке, с наработкой 27 минут, утилизированный по сроку службы, аж плакать хочется, что я только не предлагал за него, не отдали.

Share this post


Link to post
Share on other sites

В некоторых местах форматирование кода есть, в других нет. Странно.

Вы в курсе, что в режиме СТС частота задается либо регистром OCR1A, либо ICR, но не OCR1B?

Хм. Я делал 2 прерывания по совпадению OCR1A - считает секунды и OCR1B - генерирует звук. Разве не может быть одно прерывания по совпадению А и другое прерывание по совпадению В? Вроде изучая чужие коды такие варианты были. Объясните, плз, если чего то не до понимаю.

Если в плане научиться программировать - то все это обсуждение, наверное, полезно.

А ежели в плане практичности

Мужик, тебе нужны "шашечки" или тебе нужно ехать?
то тупо поставьте баззер (зуммер) со встроенным генератором. СтОит всего раза в три больше, чем без генератора, но все равно копейки.

Я хочу изучить программирование и использовать практически. Я вобщем то радиолюбитель со стажем. Немного программировал на Fox Pro и 1с. Что бы облегчить себе жизнь, мог бы использовать готовый таймер из китая. Он у меня работает с УФ лампами. Но задача изучить и сделать самому. И это пока первый проект, на котором учусь. И его можно было бы упростить, но специально выбираю сложный путь, что бы учится.

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

зачем его покупать если можно с материнки выдрать. В этом случае и таймер дергать туды=сюды не придется.

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

Вы в курсе, что в режиме СТС частота задается либо регистром OCR1A, либо ICR, но не OCR1B?

Поменять функции прерываний местами. Тогда для получения частоты на линии порта PB2 (при тактовой 4МГц) потребуется такая настройка таймера:

TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (1<<COM1B0) | (0<<WGM11) | (0<<WGM10);

TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (1<<WGM12) | (0<<CS12) | (1<<CS11) | (0<<CS10);

OCR1AH=0x00;

OCR1AL=0x66;

Навскидку.

Приду домой попробую повесить секунды на OCR1B, a звук на OCR1A. хотя я вообще убирал второе прерывание, что бы оно ни как не влияло. Все равно эффект тот же. Или вообще все убрать(индикаторы, секунды, энкодер), оставить только код звука и проверить, будет ли работать. Если нет, значит фьюзы. (хотя секунды ведь тикают, динамическая инд.работает, энкодер работает.) У меня схема уже спаяна, использую как отладочную плату. Написал код - сразу загрузил - сразу проверил.

К стате, если дрыгать ножкой в основном теле программы, ведь должно быть 4мГц или около того? Пробовал так делать, результат тот же, тарахтит. Такое ощущение что работает на частоте опроса энкодера или динамической индикации.

Share this post


Link to post
Share on other sites

Вы наверное немножечко неправильно поняли, OCR1A используется потому что вывод ШИМ на МК именно под этот регистр сравнения заточен.

и то что Вы убирали\отключали другие прерывания, не имеет значения. Просто чучуть неправильно настроили. Сегодня проверите и скорее всего, %90, что у Вас все получится.

Share this post


Link to post
Share on other sites

Вы наверное немножечко неправильно поняли, OCR1A используется потому что вывод ШИМ на МК именно под этот регистр сравнения заточен.

и то что Вы убирали\отключали другие прерывания, не имеет значения. Просто чучуть неправильно настроили. Сегодня проверите и скорее всего, %90, что у Вас все получится.

Т.е. предлагаете звук повесить на OCR1A, а секунды считать по OCR1B? Попробую. Хотя изначально секунды делал по переполнению счетчика, а звук по совпадению А.

Share this post


Link to post
Share on other sites
void ENC_InitEncoder(void) {
 DDRB |= (0<<DDB2) | (0<<DDB1) | (0<<DDB0);

Что это за бред? Тоже самое в Init_Timer_B() и много где еще.
void ENC_InitEncoder(){
DDRB |= (0<<DDB2) | (0<<DDB1) | (0<<DDB0);
PORTB |= (1<<PORTB2) | (1<<PORTB1) | (1<<PORTB0);
TCCR2=(1<<COM21) | (1<<CS21) | (1<<CS20); // (0<<PWM2) | (1<<COM21) | (0<<COM20) | (0<<CTC2)
TCNT2=0x81;
OCR2=0x34;
TIMSK |= (1<<TOIE2);
encod0=PINB & 0x03;
}

Какой смысл менять TCNT2 от 0x81 до 0xFF, а сравнивать значение с 0x34?

Кроме того, привел код в читабельный вид (перенеся его заодно для простоты в AVRStudio) и обнаружил, что все таймеры работают в режиме Normal, а не CTC. Почему-то вместо битов WGM настраивались COM. Соответственно, генерация "писка" должна была происходить на частоте 30 Гц, ( 4000000 / 2 / 65535 ). Рекомендую ознакомиться как с оригиналом кода, так и с отформатированным вариантом и убедиться, что второй гораздо лучше подходит для чтения человеком. В частности на функцию IND_UP().

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

uf.rar

Share this post


Link to post
Share on other sites

Ребят! Спасибо. Разобрался. Все правильно. Таймер выставлял в режиме Normal. А надо в ШИМ в СТС. СТС я считал, что это функция выхода совпадения (Outp.A). Писк появился. Правда модулируется чем то (как свисток). Буду копать. Слава богу сдвинулось с мертвой точки.

COKPOWEHEU

Спасибо. Код посмотрю и обязательно проанализирую. Конечно, еще далеко до совершенства. Некоторые моменты может и лишние, иногда ставлю по аналогии с другими примерами. Работает - хорошо. Боюсь запутаться.

Еще раз спасибо. Если не возражаете, может еще что спрошу потом. Обещаю не надоедать)). А то спросить не у кого. Книжек на покупал, но там всех ответов не найдешь.

Какой смысл менять TCNT2 от 0x81 до 0xFF, а сравнивать значение с 0x34?

Это я пытался еще на второй таймер звук вешать. Забыл убрать))

Share this post


Link to post
Share on other sites

В режиме CTC генерацию звука можно сделать целиком аппаратной (WGM13:WGM10 = 0100, COM1x1:COM1x0=01 ) даже без использования прерываний. В Timer2 такое режим тоже есть, можно сравнивать с OCR2 (там всего 1 канал, но для CTC больше не надо). Ну и счетные регистры (TCNTx) лучше без особой надобности не дергать.

В том же IND_UP() нашел странную конструкцию segment[]=0; зачем гасить сегмент?

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

Share this post


Link to post
Share on other sites

Изучаю Ваш код. Конечно чувствуется рука профессионала. Многие моменты упростились. Но я планировал сначала сделать как есть, что бы работало. А потом эксперементировать-оптимизировать. А то оптимизируешь, а потом фиг найдешь из-за чего не работает)). Насчет segment[]=0, хз.. на всякий случай, почему то подумал, что нужно. Потом проверю. На счет IND_UP() Задумка хороша, но там пропала функция мигания минут или секунд в зависимости от того что устанавливаешь(как на эл.часах когда время устанавливаешь) при установке таймера. Сейчас весь вечер просидел, думал как это сделать с учетом вашего варианта кода. Пока не вышло. Много if. И они странные, не как на Fox Pro)). Хочу перейти на AVR Studio. Там и отладчик есть и код читабельней получается чем в CVAVR. Но в начале CVAVR полегче показался, легче освоился. Не подскажете, где почитать про аппаратный звук без прерываний. Я еще не сталкивался. В книжке Белова А.В. то же нет. Согласен, можно и без звука, но делаю все по максимуму. Т.к. Схема спаяна, легко на ней отлаживать и учится. Хочу еще, что бы последнее использованое время запоминало и при включении сразу устанавалось. Но это следующий шаг, еще не вникал. Ем слона частями)). А вообще, задумка, самогонный аппарат компьютерезировать, спирт делать.)) Но пока не освою все элементы не возмусь (температура, термопара, LCD, расход воды, регулировка тенов и прочее). От вариантов ваших программ не откажусь. Благодаря анализу кода, узнаешь алгоритмы и способы решения некоторых задач. Делаю ламповый усилитель, но увлекся прогаммированием, и забросил, блин. Но есть свой плюс, освою AVR, сделаю индикаторы и громкость к нему. Еще раз спасибо за помощь.

Share this post


Link to post
Share on other sites

Точно пропала функция мигания? Вроде алгоритм я не трогал, только переписал без switch'а, вроде этот кусок должен отвечать за мигание.

if(mig1 < 10 && mig == 1)RAZR_PORT = (1<<D1 | 1<<D2 | 1<<D3 | 1<<D4);
   else RAZR_PORT = RAZR_PORTS[razz];
if(mig1 == 25)mig1=0;

На счет переферии - Евстифеева не читали? Это сборка и перевод кучи даташитов. Еще можно почитать Ревича или уроки на этом или других сайтах.

Читабельность кода зависит не от среды разработки а от программиста (за исключением бейсика с его тупым автоформатированием).

Для запоминания последнего выставленного значения можно воспользоваться EEPROM.

Удачи!

Share this post


Link to post
Share on other sites

Там при mig==1 -мигают минуты (первые 2 разряда), при mig==2 -мигают секунды (вторые 2 разряда). При mig==0 ни чего не мигает. mig1 задает частоту мигания. Уже голову сломал. При в ставке старого кода в AtmelStudio, ругается на строчки в case с переменными mig1,2,3,4. Студия не принимает static внутри case ?

case 1:

static unsigned int mig2;

Не могу понять (запомнить, разобраться) что делают комбинации ^,~,|,=, &. Что они значат знаю, как работают-не очень. Поэтому сую их везде пока не заработает)).

За литературу спасибо, возьму на вооружение. У меня книжки (бумажные) Белова А.В. , CVAVR и несколько по С++ ну и интернет.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Similar Content

    • Guest Ростислав
      By Guest Ростислав
      Добрый день. Хотел бы узнать существует ли схема, которая бы могла плавно увеличивать громкость звука через определенное количество времени? Схема нужна для интеграции в будильник, чтобы при активации он не сразу орал на всю мощность, а постепенно увеличивал громкость от минимальной до максимальной на протяжении, например , 15 секунд.
      Спасибо.
    • By Andrew Goldman
      Всем доброго времени суток. Собрал схему из даташита на TDA7297 https://datasheetspdf.com/pdf-file/378802/STMicroelectronics/TDA7297/1 и всё бы хорошо, но звук на правом канале слышен только при максимальной громкости, при том что на левом канале слышно всё начиная от нижнего порога громкости. Грешил на микросхему - заменил, не помогло. Не отрицаю что я криворукий. Может что-то в схеме не так? Мощности БП маловато? 12В 5А. Прошу помощи..
    • By Madcape
      Добрый день, форумчане. Помогите, плиз, разобраться в чем дело.
      Не особо уже и начинающий, правда собрать свой преобразователь напряжения в первый раз решился. Делаю ПН из 14В в 24В.
      Собираю на TL494, требуемая частота преобразование 42 кГц (не генератора частоты самой мк (!), замеряю на ногах 9 или 10), двухтактный режим (нога 13 притянута к плюсу), привожу схему. Трансформатор не подключал пока.Тестовое питание от самодельного БП (на импульсном ПН). Замеряю частоту  и скважность мультиметром Zotek ZT102 (с АлиЭкспресс), осциллографа нету .
      Так вот возникла проблемы:
      1. при изменении входного напряжения почему-то изменяется и частота (при этот на ноге 14 опорное напряжение стабильные 4,98В). При этом выше 11,5В частота не стабильная - плавает +/- 1кГц, и не снижается ниже 43,5 кГц (кручу RV2, замеряю на ноге 9 или 10). .При входном напряжении ниже 11,5В -  всё нормально, регулируется спокойно от 30 до 60  кГц, и при этом стабильна. Частотозадающий конденсатор С12 - керамический (dip, зеленый квадратный, 1nF).
      2. мой мультиметр измеряет не скважность, а обратную ей величину, т.е. Duty Cycle ("заполненность", DC). DC регулируется RV1 (делитель напряжения м/у землей и опорным напряжением с ноги 14, регулируется от 0 до 48-49%), установлено на 35%, на ногах 9 и 10. На затворах мосфетов DC почему-то при этом 85% (замеряю мультиметром) - при снижении DC на мк, на затворах все равно 80-85%, по сути не зависит от DC на МК. При измерении скважности между затворами самих мосфетов DC ~ 50%, что логично. DC на эмиттерах транзюков держится на 70-75%, на базах транзюков DC совпадает с DC на ногах 9 и 10. К сожалению посмотреть осциллографом нет возможности :(.
      По проблеме 1 - нужна стабильная частота во всем диапазоне питающего напряжения, по 2 проблеме - нельзя допускать перекрытия импульсов на затворах мосфетов. Резисторы R5 и R13 вроде бы итак не сильно большие, т.е. заряд-разряд должен быть быстрым,.
      Пробовал менять транзюки на пару 2N5551 и 2n5401, ставил другую TL-ку - ничего не меняется, эти же проблемы. Допустим проблему 1 решить можно стабилизировав напряжение при помощи LM7812, но вторая проблема меня вводит в ступор. Теоретически так не должно, но фактически так есть...
      Заметил еще одну странность - генерация на ногах 9 и 10 продолжается даже если снизить входное напряжение ниже 5В (!!!) и до 3,8В - это как, заводится тоже с 3,8В?!
      Замечание: на схеме у тразюков BD139 и 140 нумерация указана не верная (при разводке не учел тот факт, что база у этих транзюков не по центру, решил при пайке просто погнув нужным образом ножки самих транзюков). Сами TL-ки, транзюки и мосфеты брал в ЧИП_и_ДИПе. 
       
    • By IgnatiusF
      Не могу настроить таймер 0 на работу, и даже не получается понять в чем проблема. Делаю в Proteus, так как это быстрее и нагляднее.
      Пробовал и просто по переполнению делать прерывание (WGM[1..0]  00) и по совпадению (WGM[1..0]  10; OCR0A = 0 - 255), однако прерываний нет. Перед циклом ставлю TCNT0 = 0;
      Тактирование выставляю TCCR0B (CS[2..0] 001, 100, 101).
      Прерывания TIMSK0 (OCIE0A, TOIE0) выставляю, не вызываются. Даже принудительным заносом значения в регистр TIFR0 (OCF0A, TOV0).
      Прерывание пытаюсь выполнить таким образом:
      #include <avr/interrupt.h> volatile unsigned int A = 0; ISR(TIMER0_OVF_vect) { A = 1; } ... while(1) { if (A == 1) PORTB |= (1<<0); } Proteus показывает, что вывод настроен как выход, но всегда 0;
      Конкретный код привести не могу, так как у меня не заработало совсем ничего.
      Внизу я сделал вырезку из даташита на ATMEGA328 по 0 таймеру 8-бит, и занес в один PDF файл.
      ATmega328-106-112.pdf
      Прошу помочь разобраться с таймером и прерываниями для него.
    • Guest Nikit500
      By Guest Nikit500
      Есть простой двухканальный усилитель для наушников, иногда есть необходимость подключать на вход только один канал и при этом звук идёт только в один из динамиков. Нужно сделать что бы шло на два динамика. Как это реализовать, на каком переключателе? Это лучше сделать на входе или на выходе? 
×
×
  • Create New...