Обсуждаем контроллеры компании Atmel.
Ответить

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

Пт сен 21, 2012 00:41:39

Gudd-Head писал(а):Вот генератор, можешь послушать :)

Прелесть какая демонстрашка ! Долго игрался, завернул синус 7Гц, кот под стол спрятался :)

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

Пт сен 21, 2012 09:18:53

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

для пищалки 1000 Гц, больше уже не приятно для уха, режит слух :shock:

Может DruidCat имеет в виду частоту дискретности звука, в принципе при дискретности звука 8кГц можно сгенерировать вполне разборчивый голос и при качестве 8 бит он занимает аж 8 kB памяти на 1 секунду, но это если без сжатия обычный WAV PCM формат.

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

Пт сен 21, 2012 10:20:30

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

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

Пт сен 21, 2012 10:30:24



как теперь сделать чтобы пыщалка пол минуты пищала а пол молчала ?
завести счетчик который подсчитывает время ?



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

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

Код:

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




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

это самый простой вариант, но не самый оптимальный :kill:

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

Пт сен 21, 2012 11:02:53

jordan писал(а):хотя это не самый лучший вариант так как МК в это время больше ни чего делать не может а занят функцией задержки...

лучше заюзать таймер ?
8 или 16 битный ?

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

Пт сен 21, 2012 11:08:43

ну вообще конечно лучше таймер, зависит от задачи, если от МК нужно что б он только пищал, то и так прокатит, а если нужно что б он в это время что то делал, например проверял какие то датчики или выводил изображение или текст или следил за чем то, то конечно нужно скинуть эту задачу на таймер и освободить ядро

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

Пт сен 21, 2012 11:11:15

у меня, в моей проге часов, уже задействован таймер Т2 по переполнению раз в 2мс и по сравнению, а также есть прерывание раз в 1с

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

Пт сен 21, 2012 11:24:02

веду расчет по данному калькулятору http://eugenemcu.ru/publ/5-1-0-49#auto_t1,t3
только для 0,5мс никакой таймер не подходит....., помогите, пожалуйста :(

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

Пт сен 21, 2012 11:26:27

Тактовая какая?

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

Пт сен 21, 2012 11:28:34

частота МК 8МГц
желаемый интервал времени, мс : 0,5мс

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

Пт сен 21, 2012 11:40:18

4 такта таймера с кварцем (или RC генератором) на 8 МГц и предделителем на 1024 дадут 0,512 мс.

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

Пт сен 21, 2012 11:42:52

Используй свободные регистры как собственные прескалеры.

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

Пт сен 21, 2012 11:54:20

Gudd-Head, спасибо !
zero648, раскажите по подробнгей о вашем методе, плиз :write:

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

Пт сен 21, 2012 11:58:51

FreshMan писал(а):раскажите по подробнгей о вашем методе, плиз

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

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

Пт сен 21, 2012 12:20:15

вот , сваял....., запищало :))
Спойлер
Код:
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

      };
}

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

Пт сен 21, 2012 12:36:43

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

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

Пт сен 21, 2012 13:22:01

вод сделал, чтобы пищалка пищала пол секунды
Спойлер
Код:
#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

      };
}


может кто-либо из МНОГОУВАЖАЕМОЙ публики подскажет более изощренный вариант, плиз :))

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

Пт сен 21, 2012 23:41:33

все господа, с Божьей помощью, я справился и получил такой долгожданный звук пи-пи..., пи-пи.....,
Спойлер
Код:
#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: :))

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

Сб сен 22, 2012 00:05:19

FreshMan писал(а):эх...., знать бы еще как 7 симфонию Баха забабахать......, это был бы вообще высший пилотаж :)) :tea: :))

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