generátor ATmega328,
Moderátor: Moderátoři
generátor ATmega328,
Snažil jsem se řešit s Timerem1 a COMPA_vect následovně:
int main(void)
{
DDRB |=(0x04) | (0x02);
TIMSK1 |= (1 << OCIE1A) | (1 << OCIE1B); //ISR(TIMER1_COMPA_vect)
TIFR1 |= (OCF1A) | (OCF1B);
TCCR1A = 0;
TCCR1C = 0;
setFrequency(25000);
on();
a=1;
sei();
while(1)
{
}
return 0;
}
ISR(TIMER1_COMPA_vect)
{
if(a)
{
OCR1A = top - 50; // sestupná
a = 0;
}else
{
OCR1A = top + 50; // vzestupná
a = 1;
}
}
void setFrequency(uint16_t freq)
{
uint32_t requiredDivisor = (F_CPU/2)/freq;
uint16_t prescalerVal;
uint8_t prescalerBits;
if (requiredDivisor < 65536UL)
{
prescalerVal = 1;
prescalerBits = 1;
}
else if (requiredDivisor < 8 * 65536UL)
{
prescalerVal = 8;
prescalerBits = 2;
}
else if (requiredDivisor < 64 * 65536UL)
{
prescalerVal = 64;
prescalerBits = 3;
}
else if (requiredDivisor < 256 * 65536UL)
{
prescalerVal = 256;
prescalerBits = 4;
}
else
{
prescalerVal = 1024;
prescalerBits = 5;
}
top = ((requiredDivisor + (prescalerVal/2))/prescalerVal) - 1;
//TCCR1A = 0;
TCCR1B = (1 << WGM12)| prescalerBits ;
//TCCR1C = 0;
OCR1A = top;//(top & 0xFF);
}
void on()
{
TCNT1H = 0;
TCNT1L = 0;
TCCR1A |= (1 << COM1A0);
}
// Turn the frequency off and turn of the IR LED
void off()
{
TCCR1A &= ~(1 << COM1A0);
}
//******************************************
jak ale zakomponovat fázově posunutý druhý výstup, to nevím. Frekvence je samozřejmě obojí shodná.
sig_b(bool sig_a, uint32_t zpozdeni)
{
static bool pom_a, pom_a1 = 1, pom_b;
if(a & !pom_a)
{
pom_a = a; //vzestupna hrana
}
if(!a & pom_a1)
{
pom_a = a; //sestupna hrana
}
if(ton(pom_a, zpozdeni)
{
pom_b = 1;
pom_a = 0;
pom_a1 = 1;
}
if(ton(!pom_a1, zpozdeni)
{
pom_b = 0;
pom_a = 0;
pom_a1 = 1;
}
return(pom_b);
}
jenom otocis smysl jednoho compare bloku, viz datasheet.