Поменялись тут условия задачки. Подмогните плиз способ ее решения.
Есть внешний генератор на 485 кГц. Частота поступает на Тини13. На выходе необходимо получить положительные полуволны синуса частотой 100 Гц. Это как синус 50 Гц после диодного моста без конденсаторов. Такую вот форму сигнала надо получить. Частоту к сожалению изменить нельзя. Количество отсчетов изменить впринципи можно, главное чтобы это не сильно плохо повлияло на синус.
Вот код который я сообразил, но к сожалению не работает так как надо.
- Код: Выделить всё
#include <tiny13.h>
//flash char mas_256[]={1,3,6,9,12,15,18,21,24,28,31,34,37,40,43,46,49,52,55,58,61,64,67,70,73,76,79,82,85,88,91,94,97,100,103,106,108,111,114,117,120,122,125,128,130,133,136,138,141,144,146,149,151,154,156,159,161,164,166,168,171,173,175,177,180,182,184,186,188,190,192,194,196,198,200,202,204,206,208,210,211,213,215,216,218,220,221,223,224,226,227,229,230,231,233,234,235,236,237,238,239,241,242,242,243,244,245,246,247,248,248,249,250,250,251,251,252,252,253,253,253,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,253,253,253,252,252,251,251,250,250,249,248,248,247,246,246,246,244,243,242,241,240,239,238,236,235,234,233,232,230,229,227,226,225,223,222,220,218,217,215,214,212,210,208,206,205,203,201,199,197,195,193,191,189,187,185,182,180,178,176,173,171,169,167,164,162,159,157,154,152,149,147,144,142,139,136,134,131,128,126,123,120,118,115,112,109,106,103,101,98,95,92,89,86,83,80,77,74,71,68,65,62,59,56,53,50,47,44,41,38,35,31,28,25,22,19,16,13,10,7,3};
//flash char mas_32[]={22,48,72,96,120,139,160,179,196,211,223,234,243,249,253,254,253,250,244,235,226,213,198,181,162,144,122,99,75,51,28,2};
flash char mas_128[]={1,1,1,2,3,4,5,6,6,8,8,9,10,11,12,13,14,14,15,16,17,18,19,19,20,21,21,22,23,24,24,25,26,26,27,28,28,29,29,30,30,31,31,32,32,32,33,33,34,34,34,35,35,35,35,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,35,35,35,35,34,34,34,33,33,33,32,32,31,31,30,30,29,29,28,28,27,26,26,25,24,24,23,22,22,21,20,19,19,18,17,16,15,14,14,13,12,11,10,9,8,8,7,6,5,4,3,2,1,1};
bit in=0;
int next = 0;
interrupt [TIM0_COMPA] void a1(void)
{
if(in==0){
PORTB.0=0;
in=1;
OCR0A=mas_128[next];
if(next<128){
next++;
}
else{
next=0;
}
}
else{
PORTB.0=1;
OCR0A=37-mas_128[next];
in=0;
}
}
void main(void)
{
#asm("cli")
// Declare your local variables here
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x00;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
DDRB.0=0b11111;
TCNT0=0;
OCR0A=60;
TCCR0A=(0<<7 )| (0<<6) | (0<<5) | (0<<4) | (1<<1) | (0<<0);
TCCR0B=(0<<7 )| (0<<6) | (0<<3) | (0<<2) | (0<<1) | (1<<0);
TIMSK0=(1<<2);
// Global enable interrupts
#asm("sei")
while (1)
{
// Place your code here
};
}
Компилятор: CV AVR 2.03.4