Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.07.2014, 22:03   #1
ayPinki
Пользователь
 
Регистрация: 11.12.2009
Сообщений: 97
По умолчанию программирование под PIC контроллер, проверить алгоритм.

вот есть программа(часть выложил, в ней вопрос), которая сравнивает поступающий сигнал с нужным( сигнал с 2 разными величинами, первая часть с одной величиной, вторая часть с другой), суть в том что они идут длительностью по 250+-50 мс каждая , и нужно это учесть. т.е. функция readSignal должна не посчитать ошибкой если уже после 200 мс пойдёт сигнал с величиной два, и в то же время если только через 300 мс пойдёт сигнал с величиной второй.

так то на железе запускали(не это) всё работает
а тут ... в 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;
}
ayPinki вне форума Ответить с цитированием
Старый 27.07.2014, 21:29   #2
ayPinki
Пользователь
 
Регистрация: 11.12.2009
Сообщений: 97
По умолчанию

контроллер - PIC18F452

А не превышен ли "лимит вложенности"(кол-во уровней кода или как там, напроч забыл как называется)? где его можно посмотреть для данного микроконтроллера(datasheet пересмотрел)?
ayPinki вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверить выделена ли память под объект Sibedir Общие вопросы Delphi 58 21.03.2011 11:48
микроконтроллер pic проверить usb Volt Микроконтроллеры, робототехника, схемотехника, 3D принтеры 5 19.03.2011 16:33
Нужна программа под PIC гость. Фриланс 3 02.03.2011 13:13
Нужно проверить одну программку под WM Mclaren Общие вопросы .NET 3 25.05.2010 22:16