ATMega644 звук ШИМ

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
AlexVM
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Пт май 22, 2009 18:43:25

ATMega644 звук ШИМ

Сообщение 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) ;
    ...

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

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

Спасибо!
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

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

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

Мой уютный бложик... заходите!
AlexVM
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Пт май 22, 2009 18:43:25

Сообщение AlexVM »

ARV писал(а):настройте таймер на генерацию, но не запускайте. а в функции генерации звука просто включите таймер, подождите и выключите.


А Вы не смогли бы буквально парой строк показать, как это сделать?
Спасибо!
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

настройте таймер мастером CVAVR, потом строку в готовом коде мастера, которая заносит в TCCR1B настроечное число перенесите в функцию звука - эта строка ВКЛЮЧИТ звук, а TCCR1B = 0 - выключит.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
AlexVM
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Пт май 22, 2009 18:43:25

Сообщение AlexVM »

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


Спасибо! Так работает, только потребление сразу выросло и пищун аж греется. Видимо транзистор остается в открытом состоянии.
Аватара пользователя
Negor
Вымогатель припоя
Сообщения: 586
Зарегистрирован: Ср мар 07, 2007 22:58:02
Откуда: Черкассы, Украина
Контактная информация:

Сообщение Negor »

Резистор последовательно с пищалкой нужно ставить.
There is only 10 kind of people: those who understands binary code and those who dont!!!
Аватара пользователя
DrWatson
Опытный кот
Сообщения: 890
Зарегистрирован: Вт янв 20, 2009 14:49:08
Откуда: Гондурас, Мурманск

Сообщение DrWatson »

После выключения таймера записывай в порт, на котором висит пищалка уровень, который закроет транзистор (0 - для npn-транзистора, 1 - для pnp-транзистора).
- Если вы такие умные, то почему тогда строем не ходите?
ἓν οἶδα ὅτι οὐδὲν οἶδα (с) Σωκράτης
AlexVM
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Пт май 22, 2009 18:43:25

Сообщение AlexVM »

Negor писал(а):Резистор последовательно с пищалкой нужно ставить.

Это конечно да, только общее потребление ни куда не девается, а прибор имеет и батарейное питание.
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

AlexVM писал(а):... общее потребление ни куда не девается...
не понял, что вы имеете в виду.
как вариант можно увеличить скважность.
Ставим плюсы: )
AlexVM
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Пт май 22, 2009 18:43:25

Сообщение 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.

Выясняется интересная штука: я использую пищалку для обозначения нажатия кнопок, так вот на каждое четвертое нажатие кнопки состояние транзистора меняется на противоположное.
Т.е. нажатие кнопки - бип - транзистор остается в открытом состоянии, ток потребления девайса большой, еще два нажатия - два бип - с тем же эффектом. Следующее нажтие кнопки - бип - транзистор остается в закрытом состоянии, ток потребления маленький, и еще два нажатия в таком же виде. Потом все повторяется.
Путанно объяснил, но по другому не знаю как :)
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

режим работы порта, как выхода ШИМ, задается в TCCR1A, поэтому пока вы его не обнулите, порт недоступен для управления из программы.

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

Мой уютный бложик... заходите!
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

поддерживаю ARV
Ставим плюсы: )
AlexVM
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Пт май 22, 2009 18:43:25

Сообщение AlexVM »

Т.е. в разрыв между PIND5 и резистором к базе транзистора ставить конденсатор. А емкостью какой? Частота ведь маленькая.
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

я бы поставил любой от 0.1мкф до 4.7мкф.
Ставим плюсы: )
AlexVM
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Пт май 22, 2009 18:43:25

Сообщение AlexVM »

ibiza11 писал(а):я бы поставил любой от 0.1мкф до 4.7мкф.


С 0,1 не пищит, с 4,7 один раз пискнет, потом тише, еще тише и больше не пищит.
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

попробуйте так:
Изображение
резистор на землю 47к
второй резистор на базу транзистора оставьте ваш.
Вложения
cap.JPG
(1.63 КБ) 454 скачивания
Ставим плюсы: )
AlexVM
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Пт май 22, 2009 18:43:25

Сообщение AlexVM »

2 ibiza11

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

Вернуться в «Микроконтроллеры и ПЛИС»