efimius 0 22 июля Опубликовано 22 июля · Жалоба XC8 вер.2.46 MPLAB IDE PIC16F684. Уровень начинающий. Имеется схема: Четыре светодиода 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); } Буду благодарен за любую помощь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
girts 9 22 июля Опубликовано 22 июля · Жалоба А если так? #define LIGHT_R = LATCbits.LATC0 LIGHT_R = ~LIGHT_R; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
efimius 0 22 июля Опубликовано 22 июля · Жалоба Не думаю, ведь синий и жёлтый работают. Нет, видимо дело в интерапте. Что-то не то. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 86 23 июля Опубликовано 23 июля · Жалоба Эти выходы имеют режим аналогового входа на компаратор, и отдельно нужно выключать именно компаратор. Я очень давно не занимался PIC-ами, но такую проблему с компаратором и аналоговыми входами помню еще с тех времён, тоже были затыки. Вообще, не стоит стесняться читать мануалы (даташиты), в них же всё описано Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vasily_ 56 23 июля Опубликовано 23 июля · Жалоба 15 часов назад, efimius сказал: Уровень начинающий. ULN2003 Не нужен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 86 23 июля Опубликовано 23 июля · Жалоба Особенно с гасящими резисторами на 10 кОм. Кстати, автор проводит эксперименты только в Протеусе, или в железе тоже? В Протеусе можно даже без резисторов, пиксели на экране не выгорят. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex11 5 23 июля Опубликовано 23 июля · Жалоба Я с pic'ами не работаю, но надо посмотреть, какой там тип выхода. Может оказаться открытый сток, тогда без подтяжки никак Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vlad_G 8 23 июля Опубликовано 23 июля · Жалоба 18 часов назад, efimius сказал: Вот код: Сдаётся мне (и не мне одному), что: CMCON0=0x00000000; - не правильно. Надо: CMCON0=0x00000111; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 86 24 июля Опубликовано 24 июля · Жалоба Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 86 24 июля Опубликовано 24 июля · Жалоба И еще. запись 0x00000111 - это именно в двоичном формате? Обычно префикс 0x обозначает шестнадцатеричный формат, а двоичный - префикс 0b. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vlad_G 8 24 июля Опубликовано 24 июля · Жалоба 14 минут назад, EdgeAligned сказал: И еще. запись 0x00000111 - это именно в двоичном формате? Обычно префикс 0x обозначает шестнадцатеричный формат, а двоичный - префикс 0b. Я обратил на это внимание, но не стал париться. По смыслу кода у ТС такая запись как двоичный формат. Возможно, это особенность его IDE. В конечном итоге другие выводы со светодиодами у него работают. Или: CMCON0=7; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 62 24 июля Опубликовано 24 июля · Жалоба On 7/24/2024 at 9:00 AM, EdgeAligned said: И еще. запись 0x00000111 - это именно в двоичном формате? Обычно префикс 0x обозначает шестнадцатеричный формат, а двоичный - префикс 0b. У него значения в TRISA и PORT в таком же формате заносятся. Если это действительно HEX, то эти регистры никак не 32-битные. Скорее всего это ошибка в записи. Надо так TRISA = 0xFF; PORTA = 0xFF; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 25 июля Опубликовано 25 июля · Жалоба On 7/24/2024 at 9:00 AM, EdgeAligned said: а двоичный - префикс 0b. А ХС8 это понимает? Hi-Tech C понимал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться