Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 25.07.2014, 22:48  
ayPinki
Прохожий
 
Регистрация: 25.07.2014
Сообщений: 7
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
ayPinki на пути к лучшему
По умолчанию Программирование под PIC18F452

вот есть программа(часть выложил, в ней вопрос), которая сравнивает поступающий сигнал с нужным( сигнал с 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;
}
Реклама:
ayPinki вне форума  
Непрочитано 15.08.2014, 17:34  
xxparadoxx
Прописка
 
Регистрация: 09.12.2009
Сообщений: 109
Сказал спасибо: 16
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
xxparadoxx на пути к лучшему
По умолчанию Re: программирование под PIC18F452

Добрый день!
В си я не спец - люблю ассемблер, но суть проблемы уловил, а почему бы для значительного упрощения не сделать просто вычитание последнего считанного значения с ацп из предыдущего. Так как длительность уровней измеряемых сигналов большая 200 мс - а это значительно больше времени считывания ацп, Вы, минусуя предыдущий сигнал из последнего считанного, с достаточно большой точностью определите время перехода на следующий уровень, да и сразу же сравните с эталоном -который тоже предлагаю оцифровать. Кажется как то так.
xxparadoxx вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изготовление электроники под заказ elec_avr Предложения по работе 62 29.07.2022 14:09
Linux-ваше мнение Tvenn Делимся опытом 6169 23.08.2015 08:57
Настройки gcc ARM под windows __djan_ Микроконтроллеры, АЦП, память и т.д 7 28.03.2009 02:49
Как уменьшить размер памяти под стек? greafuger Микроконтроллеры, АЦП, память и т.д 1 03.04.2008 08:23


Часовой пояс GMT +4, время: 17:01.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot