Psal mi to bývalý kolega, který už má jinou práci a jiné zájmy...
Jde o to, že výsledný tón 3720hz (odvozený z kmitočtu krystalu 3,93Mhz, v současné podobě programu nepřerušovaný)
je potřeba klíčovat, aby výsledný signál tvořil tón, přerušovaný v rytmu cca 5-8hz tak, aby tón tvořil 80% a přerušení 20% každého "pípnutí".
Toho dosahuji dalším obvodem, podle mě zbytečným, když by to hravě zvládl ten MCU.
Potřebuji celé zařízení miniaturizovat, ten přerušovač mi tam zachází.
Byl bych vděčný, kdyby se mi na ten program někdo podíval, v céčku se vůbec nevyznám.
Děkuji předem za laskavost...
Kód: Vybrat vše
/*
*
* Created: 9.8.2012 20:02:00
* Author: Michal
*/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdio.h>
#define F_CPU 3800000UL
// cas = x * (1 / 3.8E+6)
// frekvence= 3.8E+6 / x
// x = 3.8E+6 * pozadovany cas
// x = 3.8E+6 / pozadovana frekvence (pul periody!!!!!)
char compare = 0x80;
int i;
int main(void)
{
PORTB |= (0<<DDB2) | (1<<DDB1) | (1<<DDB0); //nastaveni pull up
DDRB |= (1<<DDB2) | (0<<DDB1) | (0<<DDB0); //smerovz registr
asm( "NOP");
PCMSK |= (1<<PCINT1) | (1<<PCINT0); //tlacitka povoleni pcint 1,0
GIMSK |= (1<<PCIE); //povoleni pcint
asm("NOP");
TIMSK |= (1<<OCIE0A); //citac preruseni pri porovnání
TCCR0B |= (0<<CS02) | (0<<CS01) | (1<<CS00);//preddelicka 0
GTCCR |= (1<<TSM)|(1<<PSR0); //zastaveni
OCR0A = compare; //zapsani komparacni hodnoty
TCNT0 = 0x00; //citac=0
GTCCR &= 01111110; //zapnuti
sei(); //vsechna preruseni
while(1)
{} //SMYCKA!!!!!!
return(1);
}
ISR (PCINT0_vect)
{
for (i=0;i<10;i++)
{
asm( "NOP");
}
if bit_is_clear(PINB,0) compare--;
if bit_is_clear(PINB,1) compare++;
}
ISR (TIMER0_COMPA_vect)
{
GTCCR |= (1<<TSM)|(1<<PSR0); //vypnuti
for (i=0;i<72;i++)
{
asm( "NOP");
}
PORTB ^= (1<<PORTB2); //zmena vystupu
OCR0A = compare; //zapsani komparacni hodnoty
TCNT0 = 0x00; //citac=0
GTCCR &= 01111110; //zapnuti
}