Перейти к содержанию

Генератор звуковых импульсов на Мега8


Igor-13

Рекомендуемые сообщения

Захотел сделать генератор звуковых импульсов на Мега8. Написал программу на кодевижн.

Вроде все правильно. А он работает, звук есть на всех ножках, но не так как хотел, короткими вспышками. А я хотел, чтобы частоты на выходах шли беспрерывно, одновременно на всех выходах.

В чем ошибка, подскажите пожалуйста.   Код моей программы 

#include <mega8.h>       // внутренний генератор 8мгц.
#include <delay.h>
#define BEEP0             PORTB.0                // назначаем ножки для выхода звука
#define BEEP1             PORTB.1 
#define BEEP2             PORTB.2 
#define BEEP3             PORTB.3 
#define BEEP4             PORTB.4 
void Beep0() { register int i = 0;    // подпрограмма звука
for(i = 0; i<400; i++){ BEEP0 =!BEEP0; delay_us(1900); } }    // частота равна 1/1,9 ms =526 Гц. около
void Beep1() { register int i = 0;  
for(i = 0; i<400; i++){ BEEP1 =!BEEP1; delay_us(1500); } }    // частота равна 1/1,5 ms =700 Гц. около
void Beep2() { register int i = 0;   
for(i = 0; i<400; i++){ BEEP2 =!BEEP2; delay_us(1200); } }    // частота равна 1/1,2 ms =800 Гц. около
void Beep3() { register int i = 0;   
for(i = 0; i<400; i++){ BEEP3 =!BEEP3; delay_us(1000); } }    // частота равна 1/1,0 ms =1000 Гц. около
void Beep4() { register int i = 0;   
for(i = 0; i<400; i++){ BEEP4 =!BEEP4; delay_us(700); } }      // частота равна 1/0,7 ms =1200 Гц. около
void main(void) { PORTB=0x00; DDRB=0xFF; delay_ms(400); // инициализируем ножек порта B.
while(1){ Beep0(); Beep1(); Beep2(); Beep3(); Beep4(); }
}
 

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Вы же сами указываете микроконтроллеру: сначала сделай Beep0, потом сделай Beep1 и т.д.

Изменено пользователем солар

Я не раздаю удочки. Я продаю рыбу.

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Тогда вспомнить курс математики и найти наименьший общий делитель для 0,7мс, 1мс, 1,2мс, 1,5мс и 1,9мс. Во задачка, а? :)

Я не раздаю удочки. Я продаю рыбу.

Ссылка на комментарий
Поделиться на другие сайты

С языка сняли :)
Уже начал писать тоже самое, только более развёрнуто :) 
 

ЗЫ: Только выдержку придётся таймером реализовывать, иначе "битьбеде" :) 


 

Ссылка на комментарий
Поделиться на другие сайты

Млин, я оказался неоригинален. Надо придумать другую мульку.

О! Организовать пять отдельных генераторов. Тупо как на логике.

Я не раздаю удочки. Я продаю рыбу.

Ссылка на комментарий
Поделиться на другие сайты

9 минут назад, Viktor26 сказал:

Запилите на ОС

Избыточно.
Во первых, системный такт, в любом случае, придётся делать кратным делителю каждой выходной частоты.
Во вторых, будут тратится лишние такты на переключение между задачами.

Задача ТС'а реализуется элементарно без всяких ОСей, на одном таймере. Собственно, направление ему уже дали, пусть думает...
 

Ссылка на комментарий
Поделиться на другие сайты

Взять 2 корпуса лог. НЕ и собрать отдельные генераторы.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Aleх сказал:

придётся делать кратным делителю каждой выходной частоты.

кратность допускаю. пусть будет типа 4кГц - 2,5кГц - 1.5кГц - 0,5кГц. 

я уже думал использовать внутренний генератор Т0 и делить его по разному, но пока не хватает знаний.

56 минут назад, COKPOWEHEU сказал:

Взять 2 корпуса лог. НЕ

так не интересно. учусь делать схемы на микроконтроллерах. узнаю их возможности.

1 час назад, Aleх сказал:

на одном таймере

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

или надо искать мк с множеством таймеров?

Изменено пользователем Igor-13
Ссылка на комментарий
Поделиться на другие сайты

Возможно, конечно, и далеко не единственным способом. Тут уже 4 варианта предложили (в частности, мой и Солара вариант вообще без МК). Добавлю еще 5-й: завести таблицу синусов, чтобы сигнал был синусоидальным а не прямоугольным, но ходить по ней с шагом, пропорциональным частоте. Впрочем, рановато пока такое.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

12 минуты назад, COKPOWEHEU сказал:

рановато пока такое.

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

Ссылка на комментарий
Поделиться на другие сайты

Для попищать хватит :wacko: Int RC 2Mhz. На PB0 ~3906Hz, на каждом последующем делится на 2.

//Atmega8 Int RC 2MHz
#include <avr/io.h>
#include <avr/interrupt.h>

uint8_t n;

ISR (TIMER0_OVF_vect){
	PORTB = n;
	if(++n > 31) n=0;
}

int main(void)
{
  DDRB |= (1<<PB4)|(1<<PB3)|(1<<PB2)|(1<<PB1)|(1<<PB0);
  TCCR0 |= (1<<CS00);
  TIMSK |= (1<<TOIE0);
  sei();
  while (1);
}

 

Ссылка на комментарий
Поделиться на другие сайты

@Berg спасибо. запустил на все ножки порта (В0 - В7).

работает отлично. то что надо.

 

Изменено пользователем Igor-13
Ссылка на комментарий
Поделиться на другие сайты

жаль, что на выходе не гамма 7 нот, а одна нота разных октав. продолжил мучить мк.

запустил два таймера Т0 и Т1. хотел получить разные частоты. но на обоих портах одна частота.  пробовал смешивать их сигналы, типа  if (PINB.0==1) PORTD.0=PINB.3  получается трель непонятная, но не сумма. 

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

Ссылка на комментарий
Поделиться на другие сайты

У меги8 три таймера имеют режим аппаратной генерации сигнала на пине, причем в нескольких режимах. Таким образом, вы можете очень легко получить одновременно 3 независимых сигнала. Менять тональность в каждом канале элементарно, так что без всяких ОС и т.п. общих делителей вы можете реализовать трёхголосую полифонию :)

Изменено пользователем ARV

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

Ссылка на комментарий
Поделиться на другие сайты

Только что, ARV сказал:

реализовать трёхголосую полифонию :)

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

генератор 2 кГц.rtf

Изменено пользователем Igor-13
Ссылка на комментарий
Поделиться на другие сайты

Только что, Igor-13 сказал:

мне трудно сообразить как это сделать

Читайте про таймеры и про режимы аппаратного ШИМ и иже с ним. Все просто.

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

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...