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

ATMega644 звук ШИМ

Добавлено: Чт фев 11, 2010 11:31:36
AlexVM
Пытаюсь извлечь звук из контролера :)
К выходу PD5 подключена пищалка через транзисторный ключ.

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

/*****************************************************
CodeWizardAVR V2.04.4a Advanced

Chip type               : ATmega644
Program type            : Application
AVR Core Clock frequency: 8,000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 1024
*****************************************************/

#include <mega644>
......
#include <delay>

void beep(unsigned char fr) ;                       

void main(void)
{
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

PORTA=0x00;
DDRA=0x00;

PORTB=0x00;
DDRB=0xf8;

PORTC=0x00;
DDRC=0x01;

PORTD=0x00;
DDRD=0xe0;
LCD_OFF;

TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

TCCR1A=0x80;
TCCR1B=0x0B;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x10;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

ASSR=0x00;
TCCR2A=0x00;
TCCR2B=0x00;
TCNT2=0x00;
OCR2A=0x00;
OCR2B=0x00;

EICRA=0x00;
EIMSK=0x00;
PCICR=0x00;

TIMSK0=0x00;
TIMSK1=0x00;
TIMSK2=0x00;

ACSR=0x80;
ADCSRB=0x00;

// Global enable interrupts
//#asm("sei")

while (1)
{
    ......

    beep(64) ;
   
    ......
}
};


void beep(unsigned char fr)

    OCR1AL = fr ;
    TCCR1A = 0x40 ;
    delay_ms(150) ;
    TCCR1A = 0x80 ;
}


вот в таком виде звука нет.
если в функции beep изменить задержку:

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

    ...
    delay_ms(1000) ;
    ...

то бипер гудит очень коротко, но явно намного меньше секунды.

Может кто подскажет, что я делаю не так?

Спасибо!

Добавлено: Чт фев 11, 2010 13:01:57
ARV
настройте таймер на генерацию, но не запускайте. а в функции генерации звука просто включите таймер, подождите и выключите.

включение таймера ведется через TCCR1B - TCCR1A трогать не надо

Добавлено: Пт фев 12, 2010 11:18:11
AlexVM
ARV писал(а):настройте таймер на генерацию, но не запускайте. а в функции генерации звука просто включите таймер, подождите и выключите.


А Вы не смогли бы буквально парой строк показать, как это сделать?
Спасибо!

Добавлено: Пт фев 12, 2010 13:47:48
ARV
настройте таймер мастером CVAVR, потом строку в готовом коде мастера, которая заносит в TCCR1B настроечное число перенесите в функцию звука - эта строка ВКЛЮЧИТ звук, а TCCR1B = 0 - выключит.

Добавлено: Пт фев 12, 2010 21:04:33
AlexVM
ARV писал(а):настройте таймер мастером CVAVR, потом строку в готовом коде мастера, которая заносит в TCCR1B настроечное число перенесите в функцию звука - эта строка ВКЛЮЧИТ звук, а TCCR1B = 0 - выключит.


Спасибо! Так работает, только потребление сразу выросло и пищун аж греется. Видимо транзистор остается в открытом состоянии.

Добавлено: Вс фев 14, 2010 01:03:05
Negor
Резистор последовательно с пищалкой нужно ставить.

Добавлено: Вс фев 14, 2010 01:11:58
DrWatson
После выключения таймера записывай в порт, на котором висит пищалка уровень, который закроет транзистор (0 - для npn-транзистора, 1 - для pnp-транзистора).

Добавлено: Вс фев 14, 2010 10:47:26
AlexVM
Negor писал(а):Резистор последовательно с пищалкой нужно ставить.

Это конечно да, только общее потребление ни куда не девается, а прибор имеет и батарейное питание.

Добавлено: Вс фев 14, 2010 11:01:02
ibiza11
AlexVM писал(а):... общее потребление ни куда не девается...
не понял, что вы имеете в виду.
как вариант можно увеличить скважность.

Добавлено: Вс фев 14, 2010 11:26:36
AlexVM
DrWatson писал(а):После выключения таймера записывай в порт, на котором висит пищалка уровень, который закроет транзистор (0 - для npn-транзистора, 1 - для pnp-транзистора).


Я так и делаю. Не помогает.

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

...
#define ClearBit(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT))
...

void beep(unsigned char fr)

    OCR1AL = fr ;
    TCCR1B = 0x0B ;
    delay_ms(50) ;
    TCCR1B = 0x00 ;
    ClearBit(PORTD,5) ;   
}


UPD.

Выясняется интересная штука: я использую пищалку для обозначения нажатия кнопок, так вот на каждое четвертое нажатие кнопки состояние транзистора меняется на противоположное.
Т.е. нажатие кнопки - бип - транзистор остается в открытом состоянии, ток потребления девайса большой, еще два нажатия - два бип - с тем же эффектом. Следующее нажтие кнопки - бип - транзистор остается в закрытом состоянии, ток потребления маленький, и еще два нажатия в таком же виде. Потом все повторяется.
Путанно объяснил, но по другому не знаю как :)

Добавлено: Вс фев 14, 2010 17:54:26
ARV
режим работы порта, как выхода ШИМ, задается в TCCR1A, поэтому пока вы его не обнулите, порт недоступен для управления из программы.

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

Добавлено: Вс фев 14, 2010 18:33:33
ibiza11
поддерживаю ARV

Добавлено: Вс фев 14, 2010 19:55:18
AlexVM
Т.е. в разрыв между PIND5 и резистором к базе транзистора ставить конденсатор. А емкостью какой? Частота ведь маленькая.

Добавлено: Вс фев 14, 2010 20:10:53
ibiza11
я бы поставил любой от 0.1мкф до 4.7мкф.

Добавлено: Вс фев 14, 2010 20:28:48
AlexVM
ibiza11 писал(а):я бы поставил любой от 0.1мкф до 4.7мкф.


С 0,1 не пищит, с 4,7 один раз пискнет, потом тише, еще тише и больше не пищит.

Добавлено: Вс фев 14, 2010 20:46:48
ibiza11
попробуйте так:
Изображение
резистор на землю 47к
второй резистор на базу транзистора оставьте ваш.

Добавлено: Вс фев 14, 2010 21:21:03
AlexVM
2 ibiza11

А так работает, правда снизился уросень звука, но не сильно.
Спасибо!