Easyelectronics.ru

Электроника для всех
Текущее время: 24 сен 2022, 22:03

Часовой пояс: UTC + 5 часов




Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
 Заголовок сообщения: Проблема с PIC16F684
СообщениеДобавлено: 24 июн 2021, 10:11 
Заглядывает иногда

Зарегистрирован: 21 фев 2012, 10:14
Сообщения: 89
Доброго дня всем.
Давно не работал с пиками и тут достался чужой проект

Вот код

Код:
#include <xc.h>
//#include <stdio.h>
//#include <stdlib.h>

// CONFIG
#pragma config FOSC = INTOSCIO  // Oscillator Selection bits (INTOSCIO oscillator: I/O function on RA4/OSC2/CLKOUT pin, I/O function on RA5/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
//#pragma config WDTE = ON        // Watchdog Timer Enable bit (WDT enable)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF      // MCLR Pin Function Select bit (MCLR pin function is digital input, MCLR internally tied to VDD)
#pragma config CP = OFF         // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = OFF      // Brown Out Detect (BOR disabled)
#pragma config IESO = OFF       // Internal External Switchover bit (Internal External Switchover mode is disabled)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled)

/*
********************************************************************************
**                    Definitios
********************************************************************************
*/
#define _XTAL_FREQ       4000000

typedef unsigned char  uint8_t;
typedef signed char    int8_t;
typedef unsigned short uint16_t;
typedef signed short   int16_t;
typedef unsigned long  uint32_t;
typedef signed long    int32_t;

/******************************************************************************/
#define LED_ON               { PORTAbits.RA5 = 1; }
#define LED_OFF              { PORTAbits.RA5 = 0; }
#define LED_TOGGLE           { PORTAbits.RA5 = ~PORTAbits.RA5; }
/******************************************************************************/
#define IR_LED_OFF           { PORTCbits.RC5 = 1; }
#define IR_LED_ON            { PORTCbits.RC5 = 0; }
/******************************************************************************/
typedef struct _ir_led_{
    uint8_t  status;      // включена или выключена
    uint8_t  TimeOut;     // таймаут для отключения
    uint8_t  OffStart;    // флаг запуска таймаута
    uint8_t  Count;       // счетчик сработок
} _ir_led;
/*
********************************************************************************
**                    Variables
********************************************************************************
*/
uint16_t LuxValue    = 0;
uint16_t adc_buffer  = 0;
uint8_t  adc_count   = 0;
uint8_t  delta       = 10;  // Учет возможных ошибок измерения 16 mV

static _ir_led  ir_led;

__eeprom int Limit_On_In_LUX  = 0x02D3;     // 632
__eeprom int Limit_Off_In_LUX = 0x0278;     // 723
__eeprom int Limit_Complete   = 0;

/*$PAGE$*/
/*
********************************************************************************
** Description :
** Parameter   : none
** Return      : none
** Notes       :
********************************************************************************
*/
int main(void)
{
    //WDTCON = 0;
    INTCON = 0;
    CMCON0 = (1 << 2) | (1 << 1) | (1 << 1);         //Выключаем компаратор
   //PCON   = (1 << 1) | (1 << 0);                  //Сбрасываем флаги сброса
   //VRCON  = (1 << 5);                           //Отключаем опорное напряжение компаратора
   OSCCON = 0b01100101;                                  // Internal_RC 4MHz
    //OSCCON = (1 << 6) | (1 << 5) | (1 << 4) | (1 << 0);   //Настраиваем системное тактирование - от внутреннего осциллятора, частота 8МГц   
   //OSCTUNE = 0;
    //OPTION_REG = 0;
   
    TRISA   = 0b00001011;    // RA0,RA1,RA3-входы, RA2 - NC.
    PORTC   = 0b00100000;    // PORTC сбросить в 0  RC5 уст. в 1 !!!
    TRISC   = 0b00001111;    // RC0(C2_IN+),pin10  RC1(C2_IN-),pin9
                             // RC2 ( DigIn !!!) вход кнопка.
                             // RC3(AN7)-(pin7) вход АЦП. Фотодатчик
                             // RC4(C2_OUT),(pin6) to FB LM2576 контроль тока
    PORTA   = 0b00000000;
    ANSEL   = 0b10111011;
   
    // Инициализация светодиода RA5
    //PORTAbits.RA5    = 0;
    //TRISAbits.TRISA5 = 0;
    //LED_OFF;
   
    // Инициализация пина включения ИК подсветки
    //PORTCbits.RC5    = 0;
    //TRISCbits.TRISC5 = 0;
    //IR_LED_OFF;
   
    // Инициализация пина кнопки RC2
    //PORTCbits.RC2    = 0;
    //TRISCbits.TRISC2 = 1;
   
   
   
    CMCON0 = 0b00100110;
    VRCON  = 0b00000000;
   
    ADCON0 = 0b10011101;
    // Иницализация АЦП канал 7 - датчик освещености
    //adc_init ();
   
    // COMP2 Init
    //comparator_init ();
    //comparator_Off ();
   
   
   
    for ( ;; )
    {
       
        /*====================================================================*/
        if ( PORTCbits.RC2 == 0 ) {
            while ( PORTCbits.RC2 == 0 ){};
            __delay_us ( 500 );
            IR_LED_OFF;
            LED_ON;
            __delay_ms ( 1000 );
            LuxValue = adc_read ();
            //Limit_On_In_LUX = LuxValue - delta;
            Limit_On_In_LUX = LuxValue;
            LED_OFF;
           
            while ( PORTCbits.RC2 == 1 ){};
           
            LED_ON;
            __delay_ms ( 5000 );
            LuxValue = adc_read ();
            //Limit_Off_In_LUX = LuxValue + delta;
            Limit_Off_In_LUX = LuxValue;
            LED_OFF;
            __delay_ms ( 1000 );
            for ( ;; ) {
                LED_ON;
            }
        }
        else {
           
            //comparator_On();
            __delay_ms ( 1000 );
            for ( ;; ) {
                //adc_buffer = 0;
                //for ( adc_count = 0; adc_count < 16; adc_count++ ) {
                //    adc_buffer += adc_read ();
                //}
                //LuxValue = adc_buffer >> 4;
                LuxValue = adc_read ();
                 
                __delay_ms ( 100 );
                if ( LuxValue > 600 ) {
                    //LED_ON;
                    //__delay_ms ( 100 );
                    IR_LED_ON;
                    //comparator_On();
                } else {
                    __delay_ms ( 5000 );
                    //LED_OFF;
                    //__delay_ms ( 100 );
                    IR_LED_OFF;
                    //comparator_Off();
                }
#if 0               
                // 632 - 16
                if ( LuxValue >= Limit_On_In_LUX ) {
                    //__delay_ms ( 1000 );
                    //IR_LED_ON;
                    //comparator_On();
                    LED_ON;
                    //ir_led.status = 1;
                    //ir_led.OffStart = 0;
                }
                // 723 + 16
                else if ( LuxValue < Limit_Off_In_LUX  - 25 ) {
                    //__delay_ms ( 5000 );
                    //IR_LED_OFF;
                    //comparator_Off();
                    LED_OFF;
                    //ir_led.status = 0;
                    //ir_led.OffStart = 1;
                }
                else {
                   
                }
#endif               
                /*============================================================*/
#if 0               
                if ( ir_led.status == 1 ) {
                    comparator_On ();
                    IR_LED_ON;
                    LED_ON;
                    ir_led.OffStart = 0;
                    ir_led.TimeOut = 0;
                    CLRWDT();
                }
                else {
                    if ( ir_led.OffStart == 1 ) {
                        CLRWDT();
                        __delay_ms ( 1000 );
                        ir_led.TimeOut++;
                        if ( ir_led.TimeOut >= 5 ){
                            //ir_led.status  = 0;
                            //ir_led.OffStart = 1;
                            //ir_led.TimeOut = 0;
                            IR_LED_OFF;
                            comparator_Off ();
                            LED_OFF;
                        }
                        else {
                            //ir_led.OffStart = 0;
                        }
                    }
                }
#endif       
                /*============================================================*/
            }
        }
    }
}



Проблема в том что когда включается подсветка, то с периодичностью 5 секунд она начинает моргать
Код проверил на 10 раз.
Уже не знаю куда и рыть
Может кто посмотрит незамутненным глазом и увидит косяк?

Вот схема подключения.


Вложения:
Комментарий к файлу: Подключение пика
подключение.jpg
подключение.jpg [ 175.63 Кб | Просмотров: 3964 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с PIC16F684
СообщениеДобавлено: 24 июн 2021, 10:30 
Старожил
Аватара пользователя

Зарегистрирован: 08 сен 2011, 13:39
Сообщения: 1307
Откуда: Беларусь, Гомель
Кровь из глаз читать такое. Вычистите каку из кода, может и сами сразу увидите что не так. Постороннему человеку вникнуть это постараться нужно...
Я так понимаю, если при старте кнопка не нажата, то программа из одного бесконечного цикла проваливается в другой и в нем уже работает? Ну раз мигает, значит ваше LuxValue дрожит возможно, например из-за пульсаций по свету, или электрических наводок на датчик. Влепите туда константу и посмотрите, будет ли мигать. Или выводите на UART значение... Ну или на вход АЦП подайте заведомо стабильный уровень.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с PIC16F684
СообщениеДобавлено: 24 июн 2021, 10:36 
Старожил
Аватара пользователя

Зарегистрирован: 11 фев 2021, 21:02
Сообщения: 1172
Блин, это ж надо ж было открыть эту тему после некоторого отсутствия на форуме :))) У меня аж глаза вывернулись от портянки закоменченого местами текста.
Какая подсветка куда моргает? Там куча сток кода закоменчена, вычеркнута то есть. // - это вычеркнутая строка

_________________
СМЕРТЬ БАЙДЕНУ!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с PIC16F684
СообщениеДобавлено: 24 июн 2021, 10:44 
Заглядывает иногда

Зарегистрирован: 21 фев 2012, 10:14
Сообщения: 89
Закоменчено то что было
Сейчас работает так
Если значение ацп боль 600 единиц то включаем подсветку
если меньше то ждем 5 секунд и отключаем

Код:
int main(void)
{
    INTCON = 0;
    CMCON0 = (1 << 2) | (1 << 1) | (1 << 1);         //Выключаем компаратор
   OSCCON = 0b01100101;                                  // Internal_RC 4MHz
   
    TRISA   = 0b00001011;    // RA0,RA1,RA3-входы, RA2 - NC.
    PORTC   = 0b00100000;    // PORTC сбросить в 0  RC5 уст. в 1 !!!
    TRISC   = 0b00001111;    // RC0(C2_IN+),pin10  RC1(C2_IN-),pin9
                             // RC2 ( DigIn !!!) вход кнопка.
                             // RC3(AN7)-(pin7) вход АЦП. Фотодатчик
                             // RC4(C2_OUT),(pin6) to FB LM2576 контроль тока
    PORTA   = 0b00000000;
    ANSEL   = 0b10111011;
   

    CMCON0 = 0b00100110;
    VRCON  = 0b00000000;
   
    ADCON0 = 0b10011101;
   
   
    for ( ;; )
    {
         
                LuxValue = adc_read ();
                 
                __delay_ms ( 100 );
                if ( LuxValue > 600 ) {
                    IR_LED_ON;
                    LED_ON;
                } else {
                    __delay_ms ( 5000 );
                    IR_LED_OFF;
                    LED_OFF;
                }
    }
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с PIC16F684
СообщениеДобавлено: 24 июн 2021, 10:57 
Заглядывает иногда

Зарегистрирован: 21 фев 2012, 10:14
Сообщения: 89
N1X писал(а):
Кровь из глаз читать такое. Вычистите каку из кода, может и сами сразу увидите что не так. Постороннему человеку вникнуть это постараться нужно...
Я так понимаю, если при старте кнопка не нажата, то программа из одного бесконечного цикла проваливается в другой и в нем уже работает? Ну раз мигает, значит ваше LuxValue дрожит возможно, например из-за пульсаций по свету, или электрических наводок на датчик. Влепите туда константу и посмотрите, будет ли мигать. Или выводите на UART значение... Ну или на вход АЦП подайте заведомо стабильный уровень.


Значение LuxValue не дрожит смотрел осцилоскопом


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с PIC16F684
СообщениеДобавлено: 24 июн 2021, 10:59 
Старожил
Аватара пользователя

Зарегистрирован: 11 фев 2021, 21:02
Сообщения: 1172
Там как я помню, у ПИКов есть проблема с read-modify-write на порту, на котором включен аналоговый канал от АЦП. Если честно, я забыл уже порядок действий. Кто помнит порядок действий, может подскажет.

_________________
СМЕРТЬ БАЙДЕНУ!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с PIC16F684
СообщениеДобавлено: 24 июн 2021, 11:24 
Заглядывает иногда

Зарегистрирован: 21 фев 2012, 10:14
Сообщения: 89
Lambo писал(а):
Там как я помню, у ПИКов есть проблема с read-modify-write на порту, на котором включен аналоговый канал от АЦП. Если честно, я забыл уже порядок действий. Кто помнит порядок действий, может подскажет.


Пока что вижу что один регистр ANSEL сразу идет на два порта A и C


Вложения:
PORT C.jpg
PORT C.jpg [ 89.96 Кб | Просмотров: 3946 ]
PORT A.jpg
PORT A.jpg [ 140.36 Кб | Просмотров: 3946 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с PIC16F684
СообщениеДобавлено: 24 июн 2021, 12:22 
Старожил
Аватара пользователя

Зарегистрирован: 01 дек 2013, 18:06
Сообщения: 285
Откуда: г. Волгоград.
а еще посмотреть что там со сторожевой собачкой нужно


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с PIC16F684
СообщениеДобавлено: 24 июн 2021, 13:08 
Заглядывает иногда

Зарегистрирован: 21 фев 2012, 10:14
Сообщения: 89
losevew писал(а):
а еще посмотреть что там со сторожевой собачкой нужно


Собака отключена фьюзом

Код:
// CONFIG
#pragma config FOSC = INTOSCIO  // Oscillator Selection bits (INTOSCIO oscillator: I/O function on RA4/OSC2/CLKOUT pin, I/O function on RA5/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF      // MCLR Pin Function Select bit (MCLR pin function is digital input, MCLR internally tied to VDD)
#pragma config CP = OFF         // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = OFF      // Brown Out Detect (BOR disabled)
#pragma config IESO = OFF       // Internal External Switchover bit (Internal External Switchover mode is disabled)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled)



Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с PIC16F684
СообщениеДобавлено: 24 июн 2021, 16:11 
Старожил

Зарегистрирован: 19 мар 2011, 05:05
Сообщения: 3469
а то, что наблюдается - это, часом, не ресет?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с PIC16F684
СообщениеДобавлено: 25 июн 2021, 07:37 
Заглядывает иногда

Зарегистрирован: 21 фев 2012, 10:14
Сообщения: 89
Всем спасибо. Проблема решена


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с PIC16F684
СообщениеДобавлено: 25 июн 2021, 09:18 
Старожил
Аватара пользователя

Зарегистрирован: 08 сен 2011, 13:39
Сообщения: 1307
Откуда: Беларусь, Гомель
В чем подвох то был?
А я вчера как раз тоже встрял в pic16 =)
Функция расчета crc16 на stm32 работает нормально, откомпилил gcc под win - тоже все нормально. А на pic16 xc8 контролька не сходится =) Там той функции 3 строчки всего... Мистика. UPD: нет, не мистика, норм все с компилятором :)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB