Фронты START/STOP обрабатываются при принятии командного слова CAN/RS, а окончание импульса обслуживается таймером. STOP имеет приоритет, перекрытие выходов исключено, сохранена защита от самопуска при включении. Загрузка параметров больше не подменяет живые команды нагрузки. Добавлены подробные русские комментарии во все собственные C-модули и основные заголовки, описание поведения и host-тест автомата. Обновлены файлы прошивки. Полная сборка TI 22.6.1.LTS и тесты пройдены; проверка на физической плате не выполнялась.
189 lines
3.0 KiB
C
189 lines
3.0 KiB
C
/* Ïðîãðàììíûé êàíàë èíäèêàöèè. digits/readr çàäàþò ñèìâîëû è âûáîð
|
|
* ýëåìåíòîâ, DCLK/DOUT è kanal_Send ôîðìèðóþò ïîñëåäîâàòåëüíîñòü GPIO.
|
|
* Ýòî äðóãîé èíòåðôåéñ, ÷åì dCLK/dCS â DAC.c. Ïîõîæèå èìåíà íå
|
|
* îçíà÷àþò îáùèé ÖÀÏ èëè îáùèé âûõîä çàïóñêà íàãðóçêè.
|
|
*/
|
|
#include "DSP2833x_Device.h" // DSP281x Headerfile Include File
|
|
#include "DSP2833x_SWPrioritizedIsrLevels.h"
|
|
#include "filter_bat2.h"
|
|
#include "measure.h"
|
|
|
|
#include "RS485.h"
|
|
#include "message.h"
|
|
#include "kanal.h"
|
|
#include "pulto.h"
|
|
#include "package.h"
|
|
#include "tools.h"
|
|
|
|
#include "peripher.h"
|
|
|
|
int digits[16] = {63,6,91,79,102,109,125,7,127,111,64,0,0,0,121,0};
|
|
int readr[5] = {0x08,0x0C,0x10,0x00,0x04};
|
|
|
|
void DCLK(int x)
|
|
{
|
|
if(x) GpioDataRegs.GPASET.bit.GPIO6=1;
|
|
else GpioDataRegs.GPACLEAR.bit.GPIO6=1;
|
|
}
|
|
|
|
void DOUT(int x)
|
|
{
|
|
if(x) GpioDataRegs.GPASET.bit.GPIO8=1;
|
|
else GpioDataRegs.GPACLEAR.bit.GPIO8=1;
|
|
}
|
|
|
|
#if CLKMULT==1
|
|
#define POWS0 0L
|
|
#define POWS1 10L
|
|
#endif
|
|
#if CLKMULT==2
|
|
#define POWS0 0L
|
|
#define POWS1 30L
|
|
#endif
|
|
#if CLKMULT==3
|
|
#define POWS0 1L
|
|
#define POWS1 50L
|
|
#endif
|
|
#if CLKMULT==4
|
|
#define POWS0 2L
|
|
#define POWS1 60L
|
|
#endif
|
|
#if CLKMULT==5
|
|
#define POWS0 4L
|
|
#define POWS1 80L
|
|
#endif
|
|
|
|
void RESET()
|
|
{
|
|
DCLK(0);
|
|
#if POWS1>0
|
|
DSP28x_usDelay(POWS1);
|
|
#endif
|
|
DOUT(1);
|
|
#if POWS1>0
|
|
DSP28x_usDelay(POWS1);
|
|
#endif
|
|
DOUT(0);
|
|
#if POWS1>0
|
|
DSP28x_usDelay(POWS1);
|
|
#endif
|
|
}
|
|
|
|
void SENDBIT(int x)
|
|
{
|
|
DOUT(x); DCLK(1);
|
|
#if POWS0>0
|
|
DSP28x_usDelay(POWS0);
|
|
#endif
|
|
DOUT(0);
|
|
DSP28x_usDelay(POWS0+1);
|
|
DCLK(0);
|
|
#if POWS1>0
|
|
DSP28x_usDelay(POWS1);
|
|
#endif
|
|
}
|
|
|
|
void kanal_Send(int adr, long dat, int dot)
|
|
{
|
|
long Word,data,aliq_part,dg[4];
|
|
int i,j,bit,byt,addr,sgn=0,punkt=0,aliq_len=0,full_len, isdot=0;
|
|
|
|
if(adr>1) // Ëàìïî÷êè
|
|
{
|
|
Word =dat;
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
if(dat<0) sgn=1;
|
|
data = labs(dat);
|
|
|
|
if(dot>=0 && dot<4) isdot = 1;
|
|
else dot=0;
|
|
|
|
aliq_part = data;
|
|
for(i=0;i<dot;i++) aliq_part/=10;
|
|
|
|
dat = aliq_part;
|
|
while(dat>0)
|
|
{
|
|
aliq_len++; dat/=10;
|
|
}
|
|
|
|
dat = data;
|
|
|
|
full_len = aliq_len+sgn;
|
|
if(full_len==0) full_len=1;
|
|
full_len += dot;
|
|
|
|
for(i=0; i<(full_len-4);i++)
|
|
{
|
|
dot--; dat/=10;
|
|
}
|
|
if(dot<0) dot=0;
|
|
punkt = 1<<dot;
|
|
if(punkt==1) punkt=0;
|
|
|
|
dg[3] = (dat)/1000;
|
|
dg[2] = (dat%1000)/100;
|
|
dg[1] = (dat%100)/10;
|
|
dg[0] = (dat%10);
|
|
|
|
if(dg[0]+dg[1]+dg[2]+dg[3]==0)
|
|
{
|
|
punkt=0; dot=0; sgn=0;
|
|
}
|
|
|
|
if(isdot)
|
|
for(i=3;i>0;i--)
|
|
{
|
|
if((dg[i]==0)&&(i!=dot))
|
|
dg[i]=0xF; // Ýòî çíà÷èò ïóñòî
|
|
else break;
|
|
}
|
|
|
|
if(sgn)
|
|
for(i=1;i<4;i++)
|
|
{
|
|
if( (dg[i]==0xF)||(i==3))
|
|
{
|
|
dg[i]=0xA; // Ýòî çíà÷èò ìèíóñ
|
|
break;
|
|
} }
|
|
|
|
for(i=0;i<4;i++)
|
|
{
|
|
dg[i] = digits[dg[i]];
|
|
if((punkt>>i)&1) dg[i]+= 128;
|
|
|
|
}
|
|
|
|
Word = ((dg[0] ) & 0x000000FF) | ((dg[1]<<8 ) & 0x0000FF00) |
|
|
((dg[2]<<16) & 0x00FF0000) | ((dg[3]<<24) & 0xFF000000);
|
|
}
|
|
|
|
addr = readr[adr];
|
|
|
|
for (i=0;i<4;i++)
|
|
{
|
|
if(addr>0x10) break;
|
|
|
|
for (j=0;j<8;j++)
|
|
{
|
|
bit = Word & 1; Word >>= 1;
|
|
SENDBIT(bit);
|
|
}
|
|
|
|
byt = addr;
|
|
for (j=0;j<6;j++)
|
|
{
|
|
bit = byt & 1; byt >>= 1;
|
|
SENDBIT(bit);
|
|
}
|
|
addr++;
|
|
|
|
RESET();
|
|
}
|
|
}
|