Кароч, по ТЗ нуна фазу 2Fo и 3Fo двигать по периоду синуса. Бонусы к ТЗ: сохранение параметров в EEPROM.
Код: Выделить всё
//После первого запуска сохрани начальные параметры! Баг (перескок фазы)
//программа генератора синуса 70Hz и 2-й и 3-й гармоник (с ручным изменением фазы 2-й и 3-й гармоники)
//Последнее обновление 9.06.15
//МК PIC16F877A
//Кварц 20MHz
//PORTB выход синуса, RD0 вторая гармоника, RD1 третья
//PORTA клавиатура, RA0, RA1 -/+ подстройка фазы 2-й гармоники, RA2, RA3 -/+ подстройка фазы 3-й гармоники
// RA1+RA2 Запись параметров в EEPROM
#include "pic.h"
#define A0 RE0
#define RW RE1
#define E RE2
__CONFIG(WDTDIS &HS &UNPROTECT &DEBUGDIS &PWRTDIS &LVPDIS);
unsigned char shft1;
unsigned char shft2;
unsigned char tmp;
unsigned char shft1_t;
unsigned char shft2_t;
unsigned char c;
unsigned char sin_pos;
unsigned char sin_pos_0;
const unsigned char s[252] = {127, 130, 133, 136, 140, 143, 146, 149, 152, 155, 158, 161, 164, 167, 170, 173, 176, 179, 182, 185, 188, 190, 193, 196, 199, 201, 204, 206, 209, 211, 213, 216, 218, 220, 222, 224, 226, 228, 230, 232, 234, 235, 237, 239, 240, 241, 243, 244, 245, 246, 247, 248, 249, 250, 251, 251, 252, 253, 253, 253, 254, 254, 254, 254, 254, 254, 254, 253, 253, 253, 252, 252, 251, 250, 249, 248, 247, 246, 245, 244, 243, 241, 240, 239, 237, 235, 234, 232, 230, 228, 226, 224, 222, 220, 218, 216, 213, 211, 209, 206, 204, 201, 199, 196, 193, 191, 188, 185, 182, 179, 176, 174, 171, 168, 165, 162, 159, 155, 152, 149, 146, 143, 140, 137, 134, 130, 127, 124, 121, 118, 115, 111, 108, 105, 102, 99, 96, 93, 90, 87, 84, 81, 78, 75, 72, 69, 66, 64, 61, 58, 56, 53, 51, 48, 46, 43, 41, 39, 36, 34, 32, 30, 28, 26, 24, 22, 20, 19, 17, 16, 14, 13, 11, 10, 9, 8, 7, 6, 5, 4, 3, 3, 2, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 17, 18, 20, 22, 24, 26, 27, 29, 32, 34, 36, 38, 40, 43, 45, 48, 50, 53, 55, 58, 60, 63, 66, 69, 72, 74, 77, 80, 83, 86, 89, 92, 95, 98, 101, 105, 108, 111, 114, 117, 120, 123};
//период синуса 252 отсчета
unsigned char stroka1[16]={'2', 'F', ' ', 'P', 'h', 'a', 's', 'e', ' ', 'a', 'd', 'j', '.', ' ', '0', '0' };
unsigned char stroka2[16]={'3', 'F', ' ', 'P', 'h', 'a', 's', 'e', ' ', 'a', 'd', 'j', '.', ' ', '0', '0' };
//---------------------------------------------------------------------------------------
void DelayMs(unsigned int dl);
void Init_LCD();
void Send_Command(unsigned char command);
void Send_Data(unsigned char data);
void Display_Data();
void Harm_gen (unsigned char d);
void Key_proc(unsigned char key_prc);
//---------------------------------------------------------------------------------------
void DelayMs(unsigned int dl)
{unsigned int d_a;
for(d_a=0;d_a<=dl*3;d_a++) asm("NOP");
}
//---------------------------------------------------------------------------------------
void Init_LCD()
{DelayMs(90);
Send_Command(0b00110000);
Send_Command(0b00110000);
Send_Command(0b00110000);
Send_Command(0b00111000);
Send_Command(0b00001000);
Send_Command(0b00000001);
Send_Command(0b00000110);
}
//---------------------------------------------------------------------------------------
void Send_Command(unsigned char command)
{E=1;
A0=0;
RW=0;
PORTC=command;
E=0;
DelayMs(20);
}
//---------------------------------------------------------------------------------------
void Send_Data(unsigned char data)
{E=1;
A0=1;
RW=0;
PORTC=data;
E=0;
DelayMs(20);
}
//------------------Выводим на экран-----------------------------------------------
void Display_Data()
{ unsigned char i;
Send_Command(0b00001100); // курсор в начало первой строки
for(i=0; i<=15; i++)
{
Send_Command(0x80+i);
Send_Data(stroka1[i]);
}
for(i=0; i<=15; i++)
{
Send_Command(0x80+0x40+i);
Send_Data(stroka2[i]);
}
}
//--------------------Генерим остальные сигналы-------------------------------
void Harm_gen (unsigned char d)
{ unsigned char kp;
if (d==0+shft1 || d==63+shft1 || d==126+shft1 || d==189+shft1)RD0=!RD0;
if (d==0+shft2 || d==42+shft2 || d==84+shft2 || d==126+shft2 || d==168+shft2 || d==210+shft2)RD1=!RD1;
for(c=0; c<=22; c++);//Грубая подстройка частоты
c=c+1; c=c+1;c=c+1; c=c+1; sin_pos_0=0;//Точная подстройка частоты
if(PORTA!=0b001111)
{DelayMs(3000);
kp=PORTA;
while(PORTA!=0b001111);
Key_proc(kp);
}
}
//---------------------------------------------------------------------------------------
void Key_proc(unsigned char key_prc)
{ switch (key_prc){
case 0b1110 : {
if(shft1>0) shft1--;
}
break;
case 0b1101 : {
if(shft1<62) shft1++;
}
break;
case 0b1011 : {
if(shft2>0) shft2--;
}
break;
case 0b0111 : {
if(shft2<41) shft2++;
}
break;
case 0b1001 : {
{EEPROM_WRITE( 0x01 , shft1);
EEPROM_WRITE( 0x02 , shft2);
EEPROM_WRITE( 0x03 , RD0);
EEPROM_WRITE( 0x04 , RD1);
EEPROM_WRITE( 0x05 , sin_pos);
stroka1[14]='O'; stroka1[15]='K';
stroka2[14]='O'; stroka2[15]='K';
Display_Data();
DelayMs(10000);
DelayMs(10000);
}
}
break;
default: {}
break;
}
shft1_t=shft1;
for(c=15;c>=14;c--)
{tmp=shft1_t%10;
stroka1[c]=tmp+0x30;
shft1_t=shft1_t/10;
}
shft2_t=shft2;
for(c=15;c>=14;c--)
{tmp=shft2_t%10;
stroka2[c]=tmp+0x30;
shft2_t=shft2_t/10;
}
Display_Data();
while(PORTA!=0b001111);
}
//--------------------------------------------------- MAIN ---------------------------
void main(void)
{TRISB=0x00;
TRISA=0b001111;
TRISC=0x00;
TRISD=0x00;
TRISE=0x00;
PORTA=0;
ADCON1=0x06;
GIE=0;
shft1=eeprom_read(0x01);
if (shft1>62) {EEPROM_WRITE( 0x01 , 0); EEPROM_WRITE( 0x02 , 0); EEPROM_WRITE( 0x03 , 1); EEPROM_WRITE( 0x04 , 1); EEPROM_WRITE( 0x05 , 0);}//по умолчанию 0xFF
shft1=EEPROM_READ( 0x01);
shft2=EEPROM_READ( 0x02 );
RD0=EEPROM_READ( 0x03);
RD1=EEPROM_READ( 0x04);
sin_pos_0=EEPROM_READ( 0x05 );// начальная позиция синусоиды
shft1_t=shft1;
for(c=15;c>=14;c--)
{tmp=shft1_t%10;
stroka1[c]=tmp+0x30;
shft1_t=shft1_t/10;
}
shft2_t=shft2;
for(c=15;c>=14;c--)
{tmp=shft2_t%10;
stroka2[c]=tmp+0x30;
shft2_t=shft2_t/10;
}
Init_LCD();
Display_Data();
for(;;)
{
//----------------------------------------------------------------------------------------
for(sin_pos=sin_pos_0; sin_pos<=251; sin_pos++)
{PORTB=s[sin_pos];
Harm_gen (sin_pos);
}
//----------------------------------------------------------------------------------------
}
}