Режим захвата изображения, не вызывающий прерывания

#embedded #microcontroller #pic

#встроенный #микроконтроллер #изображение

Вопрос:

Я пытаюсь использовать модуль захвата на изображении 16LF1827, но ISR никогда не вводится. Я начал с базового прерывания по падающему фронту (сработало), затем добавил в конфигурацию таймера 1 (все еще работает), затем отключил прерывание IOC и настроил / включил соответствующее прерывание CCP (ISR никогда не вводится). Код приведен ниже: раздел с комментариями представляет собой исходную базовую настройку IOC.

Я проверил с помощью отладчика MPLab, что ISR не введен, и подтвердил это, подключив его к логическому анализатору и просмотрев RB1.

 #include "htc.h"

//config1
//internal osc, no wdt, use power-up timer, enable reset
//  no code protection, brown-out-reset enabled, clkout is gpio, 
//  internal-external switchover off, failsafe clock monitor off
__CONFIG(FOSC_INTOSC amp; WDTE_OFF amp; PWRTE_ON 
  amp; MCLRE_ON amp; CP_OFF amp; CPD_OFF amp; BOREN_ON 
  amp; CLKOUTEN_OFF amp; IESO_OFF amp; FCMEN_OFF);

//config2 (following MPLab's complaints when running debugger)
//low-voltage programming off, debug on, brown-out reset at 2.7 v
//  stack over/under flow triggers reset, no 4x pll, 
//  no flash write protection
__CONFIG(LVP_OFF amp; DEBUG_ON amp; BORV_27 
  amp; STVREN_ON amp; PLLEN_OFF amp; WRT_OFF);

void interrupt isr(void){
    //bounce pin 1
    LATB ^= 0b10;
    LATB ^= 0b10;
    if(IOCIF amp;amp; IOCBF0){
        IOCBF0 = 0;
        IOCIF = 0; 
    }
    if (CCP1IF){
        CCP1IF = 0;
    }
}

void main(void){
    //configure internal oscillator: 
    //PLL = 0, source = from config 1, frequency = 4 mhz 
    //0b0: SPLLEN_OFF
    OSCCONbits.SPLLEN = 0b0;
    //0b00: use config word 1
    OSCCONbits.SCS = 0b00;
    //0b1101: 4 mhz frequency
    OSCCONbits.IRCF = 0b1101;

    //configure peripherals
    //PORT A: LEDs (output), digital
    TRISA = 0x00;
    ANSELA = 0;
    //PORT B: digital, 0 = input, 1 = output, rest don't care
    TRISB = 0b11111101;
    ANSELB = 0;

    //configure timer 1 (not needed for basic IOC)
    //source = instruction clock, prescale = 1:1, disable LP osc, do synchronize (DC)
    //0b00: instruction clock
    T1CONbits.TMR1CS = 0b00;
    //0b00: 1:1
    T1CONbits.T1CKPS = 0b00;
    //0b0: lp osc off
    T1OSCEN = 0b0;
    //0b0: synch (ignored)
    nT1SYNC = 0b0;

    //interrupts
    /*
    //IOC enabled on falling edge for port B 0
    IOCBN0 = 0b00000001;
    IOCIE = 1;
    */

    //Capture on falling edge for port B 0
    //notes in 23.1 of DS: disable interrupt, set operating mode, clear flag, enable interrupt
    CCP1IE = 0b0;
    //0b100: every falling edge
    CCP1CONbits.CCP1M = 0b100;
    CCP1IF = 0b0;
    CCP1IE = 0b1;
    //enable peripheral interrupts, global interrupts
    PEIE = 1;
    GIE = 1;

    //start timer 1
    TMR1ON = 1;
    while(1){
        //Toggle led 0
        LATA ^= 0b1;
    }
}
  

Я использую высокотехнологичный компилятор C (lite), работающий в MPLab.

Любые предложения будут высоко оценены. Прошу прощения, если я искажаю терминологию, это мой первый проект на изображении.

Комментарии:

1. Даг, хотя StackOverflow действительно хорош, не забудьте отразить свой вопрос на специализированных форумах PIC: HI-TECH forum forum.htsoft.com/all/postlist.php/Cat/0/Board/pic , форум Microchip microchip.com/forums .

Ответ №1:

Ваша настройка для TRISB1 используется в качестве выходного сигнала. Согласно спецификации, PIN-код захвата должен быть настроен в качестве входного сигнала. Для выводов GPIO установка бита TRIS 0 является выходом, 1 — входом.

РЕДАКТИРОВАТЬ: Простите за первоначальный глупый ответ, поскольку я не понимал, что вы используете PORTB1 в качестве индикатора GPIO для вашей области.

Итак, изначально вы правильно использовали PORTB0 в качестве PIN-кода для захвата (используя IOC)? Модуль захвата использует другой порт GPIO для своего ввода (ПОРТB3 для CCP1). Вы переместили соединение с PORTB3 для вашего источника захвата?

РЕДАКТИРОВАТЬ: После еще одного просмотра таблицы данных PIC я заметил, что вывод GPIO CCP1 можно переместить из PORTB3 в PORTB0, но я не вижу никаких ссылок на то, как вы устанавливаете бит APFCON0.CCP1SEL. Это было бы еще кое-что, что нужно проверить.

Комментарии:

1. Хорошо, я неправильно прочитал таблицу данных: я посмотрел на схему выводов и увидел CCP1 и RB0 на одном выводе и не заметил сноску. Установка APFCON0.CCP1SEL равным 1 решила проблему. Огромное спасибо!