Таймер 0 прерывания на PIC18F - PullRequest
0 голосов
/ 13 января 2020

Я пытаюсь создать программу, которая использует прерывание для таймера 0. Проблема в том, что я должен добавить функцию с 2 переменными. Конфигурирование таймера будет выполнено путем определения функции со следующим прототипом: 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;
    }
}

1 Ответ

0 голосов
/ 13 января 2020

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

  • Вам нужна функция, вызываемая прерыванием 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;
  }
}
...