Перейти к содержанию
    

Из 4 светодиодов работают только 2

XC8 вер.2.46 MPLAB IDE PIC16F684. Уровень начинающий.

Имеется схема:

Cbase.thumb.jpg.caa8ec01716251e420d663768aea6f49.jpg

Четыре светодиода RGBY должны включаться и выключаться с собственным периодом. Для этого используется интерапт от таймера TMR0, который инкрементирует счётчики и по достижению ими заданного числа, светодиоды меняю своё состояние на противоположное.

Проблема в том, что синий и жёлтый светодиоды RC3 RC4 работают, как было задумано, а на выводах МК RC0 RC1 уровень "0".

Вот код:

/* 
 * File:   Base_PIC16F684.c
 * Author: efimius
 *
 * Created on June 24, 2024, 2:07 PM
 */
// CONFIG
// PIN 2-LEDS button,PIN 11-MOTOR button,PIN 3=MUSIC button
#pragma config FOSC = INTOSCIO // Oscillator Selection bits (INTOSC oscillator: CLKOUT function on RA4/OSC2/CLKOUT pin, I/O function on RA5/OSC1/CLKIN)
#pragma config WDTE = OFF        // Watchdog Timer Enable bit (WDT enabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF       // MCLR Pin Function Select bit (MCLR pin function is MCLR)
#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 enabled)
#pragma config IESO = OFF        // Internal External Switchover bit (Internal External Switchover mode is enabled)
#pragma config FCMEN =OFF       // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is enabled)
#define OPTION_REG &= 0x7F
#define WPUA = 0x00
#define _XTAL_FREQ 4000000
#define MOTOR PORTCbits.RC5 //PIN #5 Launch DC motor
#define LIGHT_Y PORTCbits.RC3 //PIN #7 Controls yellow leds
#define LIGHT_B PORTCbits.RC2 //PIN #8 Controls blue leds
#define LIGHT_G PORTCbits.RC1 //PIN #9 Controls green leds
#define LIGHT_R PORTCbits.RC0 //PIN #10 Controls red leds
#define MUSIC PORTCbits.RC4 //PIN #6 Controls music chip
#define BUT3 PORTAbits.RA5 //PIN #2) TOGGLE BUTTON  log "0" or log "1"
#define BUT2 PORTAbits.RA2 //PIN #11 TOGGLE BUTTON  log "0" or log "1"
#define BUT1 PORTAbits.RA4 //PIN #3  TOGGLE BUTTON  log "0" or log "1"


#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
int tickMOT=0;
int tickR=0;
int tickG=0;
int tickB=0;
int tickY=0;
//=======================================
void ROTATE(void)
{   
    tickMOT++;
    if(tickMOT<=2)MOTOR=1; 
    else if(tickMOT>=3){MOTOR=0;tickMOT=0;} 
    
}
//==============================================
void SONG(void)
{
   if(BUT1==1)    // IF toggle button3 is "ON" (log"1")
    { 
       MUSIC=0;         //Than set log "0" on PIN 10. launch music
    }
   else MUSIC=1;   
}
//=====================================
    void __interrupt() LEDS()
{
    INTCONbits.T0IF=0; //Reset interrupt flag to 0
    tickR++; //Increment counter interrupts f0r RED
    tickG++; //Increment counter interrupts f0r GREEN
    tickB++; //Increment counter interrupts f0r BLUE
    tickY++; //Increment counter interrupts f0r YELLOW
  
    {
    
    if (tickR == 4000){LIGHT_R=!LIGHT_R; tickR=0;} //Toggle pin LIGHT_R
    if (tickG == 3000){LIGHT_G=!LIGHT_G;  tickG=0;} //Toggle pin LIGHT_G    
    if (tickB == 2000){LIGHT_B=!LIGHT_B;  tickB=0;} //Toggle pin LIGHT_B
    if (tickY == 1000){LIGHT_Y=!LIGHT_Y;  tickY=0;} //Toggle pin LIGHT_Y
    }
}
//===========================================================void main(void    
void main(void)
{
ANSEL=0x00000000; //Disconnect analog iputs
TRISA=0x11111111; //TRISA input
TRISC=0x00000000; //TRISC output
PORTA=0x11111111; //PORTA input
PORTC=0x00000000; //PORTC output
CMCON0=0x00000000;
ADCON0bits.ADON=0;
//INTCONbits. GIE=1; //Enable all interrupts
INTCONbits.T0IF=0;  //reset interrupt flag
INTCONbits.T0IE=1;  //Enables TMR0 interruptOPTION_REGbits.
OPTION_REGbits.T0CS=0; //CLOCK- internal instruction cycle
OPTION_REGbits.PSA=1; //Pre scaler
OPTION_REGbits.PS0=1;
OPTION_REGbits.PS1=1;
OPTION_REGbits.PS2=1;
LIGHT_R=1;
while(1);
}

Буду благодарен за любую помощь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не думаю, ведь синий и жёлтый работают. Нет, видимо дело в интерапте. Что-то не то.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Эти выходы имеют режим аналогового входа на компаратор, и отдельно нужно выключать именно компаратор. Я очень давно не занимался PIC-ами, но такую проблему с компаратором и аналоговыми входами помню еще с тех времён, тоже были затыки.

Вообще, не стоит стесняться читать мануалы (даташиты), в них же всё описано

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Особенно с гасящими резисторами на 10 кОм.

Кстати, автор проводит эксперименты только в Протеусе, или в железе тоже? В Протеусе можно даже без резисторов, пиксели на экране не выгорят.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я с pic'ами не работаю, но надо посмотреть, какой там тип выхода. Может оказаться открытый сток, тогда без подтяжки никак

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

18 часов назад, efimius сказал:

Вот код:

Сдаётся мне (и не мне одному), что:

CMCON0=0x00000000; - не правильно.

Надо: CMCON0=0x00000111;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И еще. запись 0x00000111 - это именно в двоичном формате? Обычно префикс 0x обозначает шестнадцатеричный формат, а двоичный - префикс 0b. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 минут назад, EdgeAligned сказал:

И еще. запись 0x00000111 - это именно в двоичном формате? Обычно префикс 0x обозначает шестнадцатеричный формат, а двоичный - префикс 0b. 

Я обратил на это внимание, но не стал париться. По смыслу кода у ТС такая запись как двоичный формат. Возможно, это особенность его IDE. В конечном итоге другие выводы со светодиодами у него работают.

Или: CMCON0=7; 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 7/24/2024 at 9:00 AM, EdgeAligned said:

И еще. запись 0x00000111 - это именно в двоичном формате? Обычно префикс 0x обозначает шестнадцатеричный формат, а двоичный - префикс 0b. 

У него значения в TRISA и PORT в таком же формате заносятся.
Если это действительно HEX, то эти регистры никак не 32-битные.
Скорее всего это ошибка в записи.

Надо так 

TRISA = 0xFF;
PORTA = 0xFF;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 7/24/2024 at 9:00 AM, EdgeAligned said:

а двоичный - префикс 0b. 

А ХС8 это понимает?

Hi-Tech C понимал.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...