generátor ATmega328,
Napsal: 07 črc 2016, 08:59
Dobrý den, měl bych otázku na někoho z Vás, a sice, jde li generovat s AT328 průběh viz příloha? Nastavení frekvence by mělo být cca od 5 do 50kHz.
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á.
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á.