пищалка на ATmega8

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6321
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: пищалка на ATmega8

Сообщение Jack_A »

Gudd-Head писал(а): Вот генератор, можешь послушать :)
Прелесть какая демонстрашка ! Долго игрался, завернул синус 7Гц, кот под стол спрятался :)
Реклама
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Re: пищалка на ATmega8

Сообщение zero648 »

jordan писал(а):Друзья, к сожалению мы не можем услышать звуковые колебания на такой частоте - 36036 Гц... это уже ультра звук....

для пищалки 1000 Гц, больше уже не приятно для уха, режит слух :shock:
Может DruidCat имеет в виду частоту дискретности звука, в принципе при дискретности звука 8кГц можно сгенерировать вполне разборчивый голос и при качестве 8 бит он занимает аж 8 kB памяти на 1 секунду, но это если без сжатия обычный WAV PCM формат.
Реклама
Аватара пользователя
jordan
Грызет канифоль
Сообщения: 271
Зарегистрирован: Чт апр 01, 2010 14:14:55

Re: пищалка на ATmega8

Сообщение jordan »

он хотел с помощью таймера с генерировать частоту и подать её на ножку мк, ну и на бузер соответственно...
задумка в том что б не использовать прерывание, задумка не плохая, так как экономится процессорное время, за счет того что ему не нужно обрабатывать прерывание, но эту экономию в таком проекте не заметить.... просто частота выбрана за пределами слышимого человеком :)) диапазона
Аватара пользователя
jordan
Грызет канифоль
Сообщения: 271
Зарегистрирован: Чт апр 01, 2010 14:14:55

Re: пищалка на ATmega8

Сообщение jordan »



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

в вашем случае наверно легче всего с помощью цикла for

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


for( unsigned int=0; i<30000; i++)
{
   PORTC|=(1<<1);
   delay_us(500);
   PORTC&=~(1<<1);
   delay_us(500);
}




30000 это для 30 сек...

это самый простой вариант, но не самый оптимальный :kill:
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Re: пищалка на ATmega8

Сообщение FreshMan »

jordan писал(а):хотя это не самый лучший вариант так как МК в это время больше ни чего делать не может а занят функцией задержки...
лучше заюзать таймер ?
8 или 16 битный ?
Tell Me The Truth
Реклама
Аватара пользователя
jordan
Грызет канифоль
Сообщения: 271
Зарегистрирован: Чт апр 01, 2010 14:14:55

Re: пищалка на ATmega8

Сообщение jordan »

ну вообще конечно лучше таймер, зависит от задачи, если от МК нужно что б он только пищал, то и так прокатит, а если нужно что б он в это время что то делал, например проверял какие то датчики или выводил изображение или текст или следил за чем то, то конечно нужно скинуть эту задачу на таймер и освободить ядро
Реклама
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Re: пищалка на ATmega8

Сообщение FreshMan »

у меня, в моей проге часов, уже задействован таймер Т2 по переполнению раз в 2мс и по сравнению, а также есть прерывание раз в 1с
Tell Me The Truth
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Re: пищалка на ATmega8

Сообщение FreshMan »

веду расчет по данному калькулятору http://eugenemcu.ru/publ/5-1-0-49#auto_t1,t3
только для 0,5мс никакой таймер не подходит....., помогите, пожалуйста :(
Tell Me The Truth
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: пищалка на ATmega8

Сообщение Gudd-Head »

Тактовая какая?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Re: пищалка на ATmega8

Сообщение FreshMan »

частота МК 8МГц
желаемый интервал времени, мс : 0,5мс
Tell Me The Truth
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: пищалка на ATmega8

Сообщение Gudd-Head »

4 такта таймера с кварцем (или RC генератором) на 8 МГц и предделителем на 1024 дадут 0,512 мс.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Re: пищалка на ATmega8

Сообщение zero648 »

Используй свободные регистры как собственные прескалеры.
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Re: пищалка на ATmega8

Сообщение FreshMan »

Gudd-Head, спасибо !
zero648, раскажите по подробнгей о вашем методе, плиз :write:
Tell Me The Truth
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: пищалка на ATmega8

Сообщение Gudd-Head »

FreshMan писал(а):раскажите по подробнгей о вашем методе, плиз
Подозреваю, в прерывании по переполнению таймера инкрементируешь какой-нибудь регистр, например R4. В основной программе его не трогаешь. Когда значение R4 достигнет опр. числа, значит время пришло.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Re: пищалка на ATmega8

Сообщение FreshMan »

вот , сваял....., запищало :))
Спойлер

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

include <mega8.h>

#define BuzzerOn (PORTC|=(1<<1))
#define BuzzerOff (PORTC&=~(1<<1))

bit beep;

// Timer 1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
 beep=~beep; 
 if (beep==1) BuzzerOn; else BuzzerOff;
}

void main(void)
{

PORTC=0x00;
DDRC=0x7F;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 7.813 kHz
// Mode: CTC top=OCR1A
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x0D;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x04;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x10;
// Global enable interrupts
#asm("sei")

while (1)
      {
      // Place your code here

      };
}
Tell Me The Truth
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Re: пищалка на ATmega8

Сообщение FreshMan »

а как теперь сделать чтобы биск был только первые пол секунды ? тоисть прерывистый :))
Tell Me The Truth
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Re: пищалка на ATmega8

Сообщение FreshMan »

вод сделал, чтобы пищалка пищала пол секунды
Спойлер

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

#include <mega8.h>

#define BuzzerOn (PORTC|=(1<<1))
#define BuzzerOff (PORTC&=~(1<<1))

bit beep;
unsigned int counter;


interrupt [TIM1_COMPA] void timer1_compa_isr(void) // Timer срабатывает по совпадению через 0,512мс
{
  beep=~beep;
  if (++counter>=2000) counter=0; // считаем время до 1с
  if ((beep==1)&&(counter<=1000)) BuzzerOn; else BuzzerOff;
  //if (beep==1) BuzzerOn; else BuzzerOff;
}

void main(void)
{

PORTC=0x00;
DDRC=0x7F;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 7.813 kHz
// Mode: CTC top=OCR1A
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x0D;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x04;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x10;
// Global enable interrupts
#asm("sei")

while (1)
      {
      // Place your code here

      };
}
может кто-либо из МНОГОУВАЖАЕМОЙ публики подскажет более изощренный вариант, плиз :))
Tell Me The Truth
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Re: пищалка на ATmega8

Сообщение FreshMan »

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

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

#include <mega8.h>

#define BuzzerOn (PORTC|=(1<<1))
#define BuzzerOff (PORTC&=~(1<<1))

bit beep;
unsigned int counter;


interrupt [TIM1_COMPA] void timer1_compa_isr(void) // Timer ñðàáàòûâàåò ïî ñîâïàäåíèþ ÷åðåç 0,512ìñ
{
  beep=~beep;
  if (++counter>=2000) counter=0; // ñ÷èòàåì âðåìÿ äî 1ñ
  if ((beep==1)&&((counter<=400)||((counter>=600)&&(counter<=1000)))) BuzzerOn; else BuzzerOff;
}

void main(void)
{

PORTC=0x00;
DDRC=0x7F;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 7.813 kHz
// Mode: CTC top=OCR1A
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x0D;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x04;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x10;
// Global enable interrupts
#asm("sei")

while (1)
      {
      // Place your code here

      };
}
эх...., знать бы еще как 7 симфонию Баха забабахать......, это был бы вообще высший пилотаж :)) :tea: :))
Tell Me The Truth
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Re: пищалка на ATmega8

Сообщение zero648 »

FreshMan писал(а):эх...., знать бы еще как 7 симфонию Баха забабахать......, это был бы вообще высший пилотаж :)) :tea: :))
В общем тоже не сильно сложно, но повозиться есть с чем, для ентого нужно один таймер настроить в режим СТС таким образом, чтобы он задавал частоту дискретности нот, длительность дискреты должна быть примерно равна или в несколько крат меньше длительности самой короткой ноты, второй таймер нужен с выходом OCx, его настраиваем тоже в режим СТС, а выход на "toggle on compare match", этим таймером изменяешь высоту нот или частоту, к этой же ноге подключаешь матюкальник.
Ответить

Вернуться в «AVR»