вот есть программа(часть выложил, в ней вопрос), которая сравнивает поступающий сигнал с нужным( сигнал с 2 разными величинами, первая часть с одной величиной, вторая часть с другой), суть в том что они идут длительностью по 250+-50 мс каждая , и нужно это учесть. т.е. функция readSignal должна не посчитать ошибкой если уже после 200 мс пойдёт сигнал с величиной два, и в то же время если только через 300 мс пойдёт сигнал с величиной второй.
SetFreq - устанавливает величину
SendValAD9833 - передает величину
StartTmrInvalid - запускает таймер неправильных считываний
StartTmrSuccess- запускает таймер правильных считываний
ReadCompare - сравнивает непосредственно сигнал с уровнем.
readSignal - считает кол-во времени( верного и неверного, также заложена максимальная пропажа сигнала в 2 по 5 или 1 10 мс) выдаёт итоговый yes,- и в нем наверное проблема, если не в прерываниях...
так то на железе запускали(не это) всё работает
а тут ... в if(res1) Answer();- не заходит и всё.
посмотрите пожалуйста.
А не превышен ли "лимит вложенности"(кол-во уровней кода или как там, напроч забыл как называется)? где его можно посмотреть для данного микроконтроллера?
Код:
|
#pragma code
#pragma interrupt inter
void inter(void) {
stattmp = STATUS;
wtmp = WREG;
bsrtmp = BSR;
if(INTCONbits.TMR0IE && INTCONbits.TMR0IF) {
WriteTimer0(0x1B1E);
m1ctr++;
if(m1ctr==0) {
m1ctr = 0xFC;
EVENTS.T01 = 1;
m15ctr++;
if(m15ctr==0) {
m15ctr = 0xF1;
EVENTS.T015 = 1;
}
}
INTCONbits.TMR0IF = 0;
}
if(INTCONbits.RBIE && INTCONbits.RBIF) {
Delay1KTCYx(100); //delay 100ms
if(!PORTBbits.RB4 && !EVENTS.LBOFF) {
EVENTS.LBACC = 1;
LATDbits.LATD6 = 0;
}
if(!EVENTS.SBOFF && !PORTBbits.RB5) {
EVENTS.SBACC = 1;
LATDbits.LATD7 = 0;
}
if(!PORTBbits.RB7) EVENTS.ASDON = 1;
INTCONbits.RBIF = 0;
}
if(PIE1bits.TMR1IE && PIR1bits.TMR1IF) {
ctr = ctr+1;
if (ctr==6) {
ADCREAD.RD_PASS = 1;
ADCREAD.RD_ERR = 0;
}
WriteTimer1(0xCEAE);
PIR1bits.TMR1IF = 0;
}
if(PIE1bits.TMR2IE && PIR1bits.TMR2IF) {
ADCREAD.RD_ERR = 1;
ADCREAD.RD_PASS = 0;
WriteTimer2(0x0);
PIR1bits.TMR2IF = 0;
}
STATUS = stattmp;
WREG = wtmp;
BSR = bsrtmp;
return;
}
void AccidentOn() {
for(;;) {
res1 = readSignal(0x40F258A2,0x40F87C10);
if(res1) {
res1 = readSignal(0x40F87C10,0);
if(res1) Answer();
}
}
}
void SetFreq (unsigned long int freq) {
lo = freq&0xFFFF;
hi = (freq››16)&0xFFFF;
SendValAD9833(lo);
SendValAD9833(hi);
}
void SendValAD9833(unsigned int a) {
LATDbits.LATD2 = 1;
LATDbits.LATD0 = 0;
for(i=32768;i›=1;i/=2) {
if(i&a) LATDbits.LATD1 = 1;
else LATDbits.LATD1 = 0;
LATDbits.LATD2 = 0;
Nop();
LATDbits.LATD2 = 1;
}
LATDbits.LATD0 = 1;
}
char readSignal(unsigned long int freq1, unsigned long int freq2) {
SetFreq(freq1);
ctr=0;
n_ctr=0;
ADCREAD.RD_ERR = 0;
ADCREAD.RD_PASS = 0;
WriteTimer1(0xCEAE); //to 50ms
WriteTimer2(0x0); //to 5ms
while (!ADCREAD.RD_PASS && !ADCREAD.RD_ERR) {
res = ReadCompare();
if(res) StartTmrSuccess();
else {
if (freq2) {
SetFreq(freq2);
res = ReadCompare();
if (res && (ctr›3)) {
ADCREAD.RD_PASS = 1;
ADCREAD.RD_ERR = 0;
}
else {
SetFreq(freq1);
StartTmrInvalid();
}
}
else {
if (ctr›3) {
ADCREAD.RD_PASS = 1;
ADCREAD.RD_ERR = 0;
}
else {
if (n_ctr‹2) StartTmrInvalid();
else {
ADCREAD.RD_PASS = 0;
ADCREAD.RD_ERR = 1;
}
}
}
}
}
T3CONbits.TMR3ON = 0;
T1CONbits.TMR1ON = 0;
if (ADCREAD.RD_PASS && !ADCREAD.RD_ERR) { return 0x1; }
else { return 0x0; }
}
void StartTmrSuccess() {
if(T2CONbits.TMR2ON) T2CONbits.TMR2ON = 0;
if(!T1CONbits.TMR1ON) T1CONbits.TMR1ON = 1;
WriteTimer2(0x0);
}
void StartTmrInvalid StartTmrSuccess() {
if(!T2CONbits.TMR2ON) T2CONbits.TMR2ON = 1;
n_ctr = n_ctr+1;
}
char ReadCompare () {
OpenADC(ADC_FOSC_8 & ADC_RIGHT_JUST & ADC_3ANA_0REF, ADC_CH0 & ADC_INT_OFF);
SetChanADC(ADC_CH0); //select AN0 channel
Delay10TCYx(1);
ConvertADC();
while(BusyADC());
sin = ReadADC();
sin = sin››2;
SetChanADC(ADC_CH1); //select AN1 channel
Delay10TCYx(1);
ConvertADC();
while(BusyADC());
cos = ReadADC();
cos = cos››2;
CloseADC();
if((sin‹256) && (cos‹256)) {
sin = sin-127;
cos = cos-127;
sqrSum = (sin^2)+(cos^2);
if(sqrSum‹449) return 1;
}
return 0;
} |