Страница 1 из 2

пьезоизлучатель HPM14A + attiny2313

Добавлено: Пн фев 08, 2010 11:41:48
MTF
Всем привет !!!! Кто нибуть имел дело с этим излучателем ,у меня возникла следующая проблема проблема :roll:

Приладил HPM14A к attiny2313 , + вывод к выводу 1 PortB, - соответственно к минусу , нужно чтобы он пикал при нажатии на кнопки на моем устройстве.

Вопрос:
к нему случаем не нужен усилитель на транзисторе (по DATASEET
ток 1ма ,напр 5вольт ) ????
и вообще как им управлять ,что то ни как не пойму,

пробовал просто подавать импульс на 0,5сек
не писчит ????? , со встроенным генератором электромагнитный излучатель при этом коде работает , а этот не хочет.

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

.equ	 OutPort = PORTB 


*********
*********
sbi  OutPort,(1<<OutPin)  ; 
rcall delay                       ;вызов задержки 0,5 сек 
cbi  OutPort,(1<<OutPin)  ; 
*********
Прошу подсказать как надо управлять пьезоизлучателями , может через таймер ???

Добавлено: Пн фев 08, 2010 12:42:05
Секретный кот
А есть ли у него встроенный генератор?..
Может, надо не один, а серию импульсов подавать, определённой частоты (из даташита)?

Добавлено: Пн фев 08, 2010 14:43:04
dron711
HPM14A-просто излучатель. На него надо подавать импульсы с нужной частотой. Со встроенным генератором HPM14AX. Но они уже от 12 вольт питаются.

Добавлено: Вт фев 09, 2010 00:10:45
MTF
частота HPM14A 4000 ± 500 гц
На него надо подавать импульсы с нужной частотой
я так понял что только через таймер можно заставить писчать , может кто нибуть обьяснить как это сделать ,хоть убей не пойму ?????

Добавлено: Вт фев 09, 2010 01:22:37
Секретный кот
Почему сразу через таймер? Дело вкуса.
Можно тот же самый rcall delay задействовать...

Добавлено: Вт фев 09, 2010 01:53:06
ibiza11
MTF писал(а):...хоть убей не пойму ?????
нужно подать серию импульсов какой-либо частоты звукового диапазона на вывод пьезоизлучателя.

Добавлено: Вт фев 09, 2010 06:58:48
Alex72
Не надо человека в заблуждение вводить. Это пьезоизлучатель со встроенным генератоом. Uпит=5В. Проверь полярность подключения. А вообще просто подключи к нему питание, убедись что он исправен.
Усилитель к нему не нужен, так как ток потребления <1mA. Подключать можно прямо к пину МК

Добавлено: Вт фев 09, 2010 09:32:40
ibiza11
Alex72 писал(а):..Это пьезоизлучатель со встроенным генератоом...
не согласен! вообще с чего вы взяли? :o

HPM14A - без встроенного генератора
HPM14AХ - со встроенным генератором
Топикстартер, проверьте маркировку.

Добавлено: Вт фев 09, 2010 11:46:56
MTF
HPM14A - 100% без встроенного генератора

ibiza11
нужно подать серию импульсов какой-либо частоты звукового диапазона на вывод пьезоизлучателя.
В принципе я понял что надо подать серию импульсов !!!
Уважаемые коты , так может кто нибуть обьснить , как подается эта самая серия импульсов для пьезоизлучателя HPM14A, мне надо просто пикнуть на нажатие кнопки !!

у меня таймер T0 работает с делением 256 по переполнению ,тактовая частота 4мгц , (T1 нет возможности использовать) , можно ли использовать T0 для подачи серии импульсов ~ 4000гц ????
допустим в основной программе после нажатия кнопки я установил флаг beep = 1 , а в таймере смотреть если beep = 1 ,то подавать серию импульсов а в конце сбросить beep = 0 , если можно то подскажите как это делается програмно ???

Добавлено: Вт фев 09, 2010 17:39:35
Pooher
А код то в чём пишите?

Добавлено: Вт фев 09, 2010 17:41:12
MTF
Pooher Assembler AVR Studio

Добавлено: Вт фев 09, 2010 21:05:51
Neekeetos
MTF писал(а):Pooher Assembler AVR Studio
Возможно если сделать таймерное прерывание то в твоем случае оно будет давать почти 16килогерц, соотв тебе надо получить частоту в 4 раза меньше, для этого заведи счетчик который будет доступен между прерываниями, я правда не знаю хватит ли тебе длительности но вот самый простой алгоритм(а может и нет, я не проверял :) ).
в прерывании:

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

 dec counter
 brne next
 inc counter
 in temp,PORTB
 andi temp, ИНВЕРСНАЯ_МАСКА_ПИНА_ГДЕ_ВИСИТ_ДИНАМИК (для 1 бита к примеру 0xFD  = (0хFF - 0х02)
 out PORTB,temp
next: 
 ldi temp,0x01
 and temp,counter
 brne no_sound
 out PINB,МАСКА_ПИНА_ГДЕ_ВИСИТ_ДИНАМИК (для 1 бита к примеру 0х02)
no_sound:
 делаешь свои дела в прерывании
работает так , когда у тебя гдето нажата кнопка и ты хочешь чтобы динамик пискнул , загружаешь в counter учетверенное количество тактов, соотв динамик пропищит их и замолкнет когда counter станет единицей.

Добавлено: Ср фев 10, 2010 00:36:49
MTF
Neekeetos а, если я буду использовать таймер без деления частоты , вот что пришло в голову

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


tmkey:   .byte   1 

T1_OVF: 
;код который работает каждые 0,000064 с 
   cpi   beep,  1
   brne no_sound    
   cpi   counter ,62    ; ~  0,004 с   4000гц
   brne no_sound    
   clr   counter          ; 0 
   sbi  OutPort,(1<<OutPin)   ;1
   cbi  OutPort,(1<<OutPin)   ;0
no_sound:
   inc   counter  
   lds   tmp, tmkey 
   inc   tmp 
   sts   tmkey, tmp 
   tst   tmp 
   brne tm_exit   ;      
;код который работает каждые 0,016384 с  

   *********** 
   *********** 
   *********** 
tm_exit:    
reti
вынесите вердикт ??????

Добавлено: Ср фев 10, 2010 08:24:53
ibiza11
MTF писал(а):вынесите вердикт ??????
у Вас же спаяное устройство! вынести вердикт сами не можете? :shock:

Добавлено: Ср фев 10, 2010 10:23:23
Neekeetos
MTF писал(а):Neekeetos а, если я буду использовать таймер без деления частоты , вот что пришло в голову

вынесите вердикт ??????
Лехко :)

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

T1_OVF: 
;код который работает каждые 0,000064 с   это грубо говоря прерывание с частотой 15625 Гц
   cpi   beep,  1
   brne no_sound     ; тут все ок, я на флагах в своем коде экономил но так прямее

   cpi   counter ,62    ; ~  0,004 с   4000гц
   brne no_sound      ; 
   clr   counter          ; 0 
   sbi  OutPort,(1<<OutPin)   ;1 ; вообще то если пишешь в регистр пин то соотв вывод меняет состояние на обратное, надо оставить одну первую команду 
   cbi  OutPort,(1<<OutPin)   ;0  фтопку
no_sound:
   inc   counter  ; счетчик постоянно меняется, даже если звук выключен, соотв ты можешь включить звук когда счетчик больше чем 62 и звук будет пищать 255-x+62 периода а не 63
....
вобщем все окейно но не совсем работает, для частоты 4к надо сделать так:

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

T1_OVF: 
;прерывание с частотой 15625 Гц
   cpi   beep,  1
   brne no_sound  

   сbi  OutPort,(1<<OutPin) ; OutPort это PORTB например, не PIN(X)
  sbrc counter,1 ; выводим единицу в порт только если 1 бит у counter выставлен, это бывает в 4 раза медленней чем прерывание
  sbi  OutPort,(1<<OutPin)   ; раз уж хочется использовать именно регистр PORT

   inc   counter    ; прибавляем счетчик только если звук есть, соотв для запуска звука надо загрузить его длительностью звука
   cpi   counter ,62    ; ~  0,004с  проверено
   brne no_sound      ; 
   clr   counter          ; 0 
no_sound:


Добавлено: Ср фев 10, 2010 11:09:52
MTF
ibiza11
у Вас же спаяное устройство! вынести вердикт сами не можете?
в том то и дело что попробовал и не работает поэтому и попросил посмотреть код в чем может быть дело , так как еще не очень владею ASM?????

Neekeetos
Спасибо за помощь ,попробовал ваш доработанный код , вот что то не пойму , для того чтобы пикало 1 раз , надо ли использовать задержку после beep = 1

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

 ; после нажатой клавиши
 ldi  beep , 1 
 rcall delay  ; задержка к примеру около 1сек 
 clr beep 
или я что то не допонял ?????

Добавлено: Ср фев 10, 2010 11:24:53
Neekeetos
MTF писал(а):вот что то не пойму , для того чтобы пикало 1 раз , надо ли использовать задержку после beep = 1

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

 ; после нажатой клавиши
 ldi  beep , 1 
 rcall delay  ; задержка к примеру около 1сек 
 clr beep 
или я что то не допонял ?????
Задержку не надо никакую, по задумке оно само в фоне пикнет и все. Но вообще прикольно, походу дела надо код еще изменить, тк он при таком раскладе непрерывно должен пикать пока не выключишь, бип то никто не обнулял, так попробуй:

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

T1_OVF:
;прерывание с частотой 15625 Гц
   cpi   beep,  1
   brne no_sound 

   сbi  OutPort,(1<<OutPin) ; OutPort это PORTB например, не PIN(X)
  sbrc counter,1 ; выводим единицу в порт только если 1 бит у counter выставлен, это бывает в 4 раза медленней чем прерывание
  sbi  OutPort,(1<<OutPin)   ; раз уж хочется использовать именно регистр PORT

   inc   counter    ; прибавляем счетчик только если звук есть, соотв для запуска звука надо загрузить его длительностью звука
   cpi   counter ,62    ; ~  0,004с  проверено
   brne no_sound      ;
   clr   counter          ; 0
   clr   beep; отключаем звук тут
no_sound:

Добавлено: Чт фев 11, 2010 01:08:54
MTF
Neekeetos Все OK писчит , но вот только писчит не очень громко , вообщем огромное спасибо :beer:
вопрос не по теме : я не один раз в форуме задавал вопрос ,может вы ответите , в своем устройстве применил TSOP1736 , принимал код как в datasheet avr410 rc5 , хотел сделать чтобы контроллер просыпался от внешнего прерывания TSOP посадил на INT0 , т е от нажатия на пульте , не упростится ли алгоритм приема кода RC5 через внешнее прерывание INT по сравнению с приемом через обычный вход как в avr410 ?????

Добавлено: Чт фев 11, 2010 03:03:26
ibiza11
MTF писал(а):не упростится ли алгоритм приема кода RC5 через внешнее прерывание INT по сравнению с приемом через обычный вход как в avr410 ?????
да вы знаток задавать вопросы) давайте каждый попробует написать алгоритм и проверит, вдруг он упростится!
по делу: Лучше самому один раз разобраться, чем миллион раз задавать один и тот же вопрос на форуме.

Добавлено: Чт фев 11, 2010 07:10:19
Neekeetos
MTF писал(а):Neekeetos Все OK писчит , но вот только писчит не очень громко , вообщем огромное спасибо :beer:
ага, можешь сделать как в любом китайском тетрисе:
Изображение катушка любая, от 100мкгн, тогда будет орать.
MTF писал(а): вопрос не по теме : я не один раз в форуме задавал вопрос ,может вы ответите , в своем устройстве применил TSOP1736 , принимал код как в datasheet avr410 rc5 , хотел сделать чтобы контроллер просыпался от внешнего прерывания TSOP посадил на INT0 , т е от нажатия на пульте , не упростится ли алгоритм приема кода RC5 через внешнее прерывание INT по сравнению с приемом через обычный вход как в avr410 ?????
Не знаю я этого не пробовал делать, попробуй по форуму поищи , кажется ктото делал именно в прерывании, чисто теоретически может и проще будет.