Прерывание таймера 0 на PIC18F

Я пытаюсь создать программу, которая использует прерывание для таймера 0. Проблема в том, что мне нужно добавить функцию с двумя переменными. Настройка таймера будет производиться определением функции со следующим прототипом: void int_tmr0 (int conf_int, int conf_T0), что я и сделал в таком виде:

void conf(int p1, int p2)
    {
        T0CON=p1;
        INTCON=p2;
    }

Пытаюсь поместить записи: T0CON, INTCON в эти 2 переменные: p1 и p2. Я не уверен, могу ли я вызвать эти 2 переменные в основной функции:

    void main()
    {
        WDTCONbits.ADSHR = 1;
        MEMCONbits.EBDIS = 1;
        TRISD = 0x0;
        INTCONbits.GIE = 1;
        p1=0b10001000;
        INTCONbits.TMR0IE = 0;
    }

Вот весь код:

#include <xc.h>

unsigned char counter;

void interrupt f1()
{
    if(INTCONbits.TMR0IE && INTCONbits.TMR0IF)
    {
        counter++;
        INTCONbits.TMROIF=0     
    }

void conf(int p1, int p2)
    {
        T0CON=p1;
        INTCON=p2;
    }

    void main()
    {
        WDTCONbits.ADSHR = 1;
        MEMCONbits.EBDIS = 1;
        TRISD = 0x0;
        INTCONbits.GIE = 1;
        p1=0b10001000;
        INTCONbits.TMR0IE = 0;
    }
    while(1){
        LATD= counter;
    }
}

person maximus383    schedule 13.01.2020    source источник
comment
Что ты пытаешься сделать? Я не понял, и ваша функция conf никогда не вызывается в вашем коде.   -  person JL. Sanchez    schedule 13.01.2020
comment
Прерывание таймера 0. Конфигурация таймера будет выполняться определением функции вида: void int_tmr0 (int conf_int, int conf_T0) Функция будет использовать регистры, соответствующие таймеру 0. Вместо void int_tmr0 (int conf_int, int conf_T0) я использовал void conf( интервал p1, интервал p2)   -  person maximus383    schedule 13.01.2020


Ответы (1)


Если я правильно понял,

  • Вам нужно иметь функцию, вызываемую прерыванием Timer0
  • Ваш SDK определяет эту функцию как void int_tmr0(int conf_int, int conf_T0)
  • Вам нужна ваша функция для получения некоторых других произвольных параметров

Решением может быть создание функции в соответствии с требованиями SDK и сохранение параметров в глобальных переменных. Затем вы можете вызвать свою функцию из функции «обратного вызова», используя эти переменные в качестве параметров:

int volatile param_1 = 0, param_2 = 0;

void int_tmr0(int conf_int, int conf_T0)
{
  conf(param_1, param_2);
}

void conf(int p1, int p2)
{
  T0CON=p1;
  INTCON=p2;
}

int main()
{
  WDTCONbits.ADSHR = 1;
  MEMCONbits.EBDIS = 1;
  TRISD = 0x0;
  INTCONbits.GIE = 1;
  param_1=0b10001000;
  INTCONbits.TMR0IE = 0;

  while(1){
      LATD= counter;
  }
}
person JL. Sanchez    schedule 13.01.2020
comment
Если я хочу переключаться между этими двумя регистрами T0CON и INTCON. Могу ли я изменить void conf следующим образом: ``` void conf(int p1, int p2) { T0CON=p1; ИНТКОН=p2; if(!p1){ T0CONbits.TMR0ON=1 } else { INTCONbits.TMR0ON=0 } else if (!p2){ T0CONbits.TMR0ON=0 } }```? - person maximus383; 13.01.2020