Na poczatku dziekuje Wam za zainteresowanie sie tematem! atom1477 Załączam Ci program (zmodyfikowany dla siebie ze strony kursu avr cz.4 www.hobby.abxyz.bplaced.net) Tam jest mały generatorek, jak odznaczysz zadeklarowanie PWM wtedy już regulacja tonów nie działa, ale za to jest regulacja dźwięku nsvinc zgadza się, wypełnienie się zmienia, piezo gra ciszej/glośniej ale nie wiem jak zmieniać wtedy częstotliwość, to co zrobiłem działa ale osobno :( Nie potrzebuje głośnika, nie zależy mi na jakości dźwięku, podpatrywałem układ gdzie jest to zrobione, to dźwięk na piezo jest wzmocniony przez dławik i osobne zasilanie i załączone kluczem tranzystorowym, na razie pasuje sam dźwięk uzyskać a później wezmę ten układzik "wzmacniacza". A dlatego o tym mówię by powiedzieć że jest to zrobione na układzie chińskiego mikrokontrolera EM78P156NP pin 1 (P52) wg datasheet jest to: * P50~P53 are bi-directional I/O pins. (we/wy) * P50~P52 can be pulled-down by software. Jak oni to zrobili??
/*****************************************************
PORTD 7 lub 8 - buzzer i do GND
PORTA 1 - regulacja tonow
PORTA 2 - regulacja glosnosci
PORTA 3 - wywolanie dzwieku
--------------------------------------------------------------
*****************************************************/
// Testowanie przerwañ zewnêtrznych
#include & lt; avr/io.h & gt; // dostêp do rejestrów
#include & lt; avr/interrupt.h & gt;
#define F_CPU 1000000UL // 1 MHz
#include & lt; util/delay.h & gt;
volatile int n=0; //zmienna globalna odpowiadajaca za numer tablicy w funkcji tonow
volatile int g=0; //zmienna globalna odpowiadajaca za glosnosc
//-------------------------------------------
//==========Tablica glosnosci==========
int glos[5]={
200,
240,
245,
250,
254,
};
//-------------------------------------------
//==========Tablica tonow==========
int ton[5]={
500,
600,
700,
800,
900,
};
//------------------------------------------
//=========Definicja funkcji beep===========
void beep(unsigned int frequency, unsigned int duration)
{ unsigned int i,t,n;
t = 125000/frequency;
n = (250UL*duration)/t;
PORTD |= 0x40;
PORTD & = ~0x80;
for(i=0; i & lt; n; i++)
{
OCR2 = glos[g]; //wpis do OCR poziomu odpowiadajacego za glosnosc
PORTD ^= 0x40;
PORTD ^= 0x80;
_delay_loop_2(t);
OCR2 = 255; //wylaczenie
}
}
//------------------Definicja funkcji odtwarzania beep-------------------
void play(int nots[], int d)
{
beep(nots[n],d);
}
//-----------------------------------------
int main(void) // program g³ówny
{
//----------------porty tonow i piezo-----------------------
DDRB = 0xFF;
PORTB = 0x00;
DDRA = 0x00;
PORTA = 0xFF;
DDRD = 0xF0;
// TCCR2 = _BV(COM21)|_BV(COM20)|_BV(WGM20)|_BV(CS20);
// czasomierz 2 w trybie PWM
// taktowany F_CPU
//--------------------------------------------------------------
while(1) // pêtla nieskoñczona
{
if(!(PINA & 0x01)) //jesli 1 pin portu A wcisniety
{
n++; //zmieniaj tablice tonow
if (n & gt; =5)
{
n=0;
}
play(ton,300);
_delay_ms(80);
while(!(PINA & 0x01)) {} //zabezpieczenie klawisza
_delay_ms(80);
}
//--------------------------------------------------
if(!(PINA & 0x02)) //jesli 2 pin portu A wcisniety
{
g++; //zmieniaj glosnosc
if (g & gt; =5)
{
g=0;
}
play(ton,300);
while(!(PINA & 0x02)) {} //zabezpieczenie klawisza
_delay_ms(80);
}
// wpisz pwm do OCR2
_delay_loop_2(2500); // pêtla opóniaj¹ca
//---------------------------------------------------
if(!(PINA & 0x04)) //jesli 3 pin portu A wcisniety wywolanie dzwieku
{
play(ton,50); // sygnal dzwiekowy
}
}
}