Помогите найти ошибку в элементарной программе для контроллера PIC12F683.
Доброго всем дня !
Элементарная схема и элементарная программа.
Контроллер, 3 кнопки и 3 диода.
Желаемый алгоритм банален: нажал кнопку - загорелись 2 диода, ещё раз нажал погасли.
Но ведет себя так: после первого нажатия оба загораются, а в дальнейшем один включается и выключается а второй на GP1 постоянно горит.
После установки паузы между ними видно что на втором нажатие они гаснут одновременно а после паузы GP1 загорается снова.
Поведение на железе и в протеусе одинаковое.
В datasheet найти особенность для GP1 не удалось.
Прошу помочь найти в чем не прав.
Скрин из протеуса и программу прикладываю.
Компилятор mplab + xc8
Заранее спасибо!
#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 enabled)
#pragma config FCMEN = ON // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is enabled)
#define _XTAL_FREQ 4000000
#include
unsigned char GP4_otp=0; // Флаг что кнопка отпущена
void main(void) {
TRISIO = 0x38;
GPIO = 0;
ANSEL = 0;
WPU = 0;
while (1) {
if (!GP3) {
if (!GP4_otp) {
GP2 = !GP2;
__delay_ms(1001);
GP1 = !GP1;
GP4_otp = 1;
}
}
if (GP3) {GP4_otp=0;}
}
return;
}

Мне трудно понять вашу логику, но должно быть так, если я ничего не перепутал:
while (1) {
if ((!GP3)&&(!GP4_otp))
{
GP2 = !GP2;
GP1 = !GP1;
__delay_ms(1001);
GP4_otp = 1;
}
if (GP3) { GP4_otp=0; }
}