Реле управления от микросхемы PIC18

У меня есть микросхема PIC18F24K20, и я хочу управлять реле. Он отлично работает с моего RasPI через GPIO, но я не могу заставить его работать через мой микрочип.

Моя тестовая программа такова:

#include <xc.h>

#define R1          LATBbits.LATB0
#define R1_TRIS     TRISBbits.RB0

#define R2          LATBbits.LATB1
#define R2_TRIS     TRISBbits.RB1

void main(void) {

    R1_TRIS = 0;
    R2_TRIS = 0;

    R1 = 1;
    R2 = 0;

    return;
}

Что я делаю неправильно?


person pajzo    schedule 04.09.2016    source источник


Ответы (3)


  1. заменить return;

с:

while(1)
{
   ClrWdt();
}
  1. Согласно техническому описанию, RB0 и RB1 имеют несколько модулей, подключенных к этим контактам, поэтому вы должны убедиться, что они выключены: аналоговый, ECCP, компаратор. Кстати, зачем использовать два контакта для управления одним реле?

3. Вам может понадобиться добавить драйвер для работы реле.

согласно техническому описанию, добавьте следующий код инициализации:

CCP1CON=0;
CCP2CON=0;
ADCON0=0;
CM1CON0=0;
CM2CON0=0;

также бит PBADEN в бите конфигурации должен быть равен нулю.

person Oren Fivlovich    schedule 06.09.2016
comment
Я просто использую два штифта для проверки. Драйвер не нужен, для включения нужен только входной сигнал. Но как я могу отключить другие функции на контактах? - person pajzo; 06.09.2016
comment
Я обновил свой ответ. Попробуйте добавить код инициализации. - person Oren Fivlovich; 06.09.2016

Основная функция никогда не должна возвращаться во встроенных процессорах PIC. В некоторых реализациях это может привести к сбросу программного обеспечения, в результате чего ваши контакты вернутся в режим высокого импеданса. Попробуйте добавить while (1); в конце вашего основного.

person Mathieu L.    schedule 04.09.2016
comment
Я изменил свой код на: void main(void) { R1_TRIS = 0; Р2_ТРИС = 0; Р1 = 0; Р2 = 1; while(1){ // Продолжаем работу программы } } Но она по-прежнему не включает реле ни на RB1, ни на RB0 - person pajzo; 05.09.2016

Проверьте, имеют ли используемые контакты другие функции. Типичная ошибка заключается в том, что контакты дублируются как аналоговые контакты и включены по умолчанию.

Отключите их, посмотрев, какому выводу AN они соответствуют в таблице данных, и отключите их с помощью кода, например

  ANSEL.ANS0 = 0;  
  ANSEL.ANS1 = 0;

Если вы включите функцию сторожевого таймера, вы также можете добавить

  ClrWdt(); 

к основному циклу WHILE (что было хорошим предложением Матье)

person Marco van de Voort    schedule 06.09.2016
comment
Мой компилятор XC8 не может собраться, когда добавляет предоставленный вами код ANSEL? - person pajzo; 06.09.2016
comment
Проверьте таблицу данных, если контакты, которые вы используете, имеют аналоговую функциональность. - person Marco van de Voort; 06.09.2016