add functionnality: memory is erased when holding button for 5s
This commit is contained in:
parent
bd339641ad
commit
e0cd617537
|
@ -51,6 +51,7 @@ static uint8_t switches; /* save the last switch state */
|
||||||
#define START 208 /* starting timer 0 value to wait up to 12ms in start_timer*/
|
#define START 208 /* starting timer 0 value to wait up to 12ms in start_timer*/
|
||||||
static uint8_t code[3] = {0xf1, 0x11, 0x11}; /* the received code (24 bits) */
|
static uint8_t code[3] = {0xf1, 0x11, 0x11}; /* the received code (24 bits) */
|
||||||
static uint8_t new = 0; /* has a new code been detected (clear using button) */
|
static uint8_t new = 0; /* has a new code been detected (clear using button) */
|
||||||
|
static uint8_t hold = 0; /* how long has the button been held, in 250ms steps */
|
||||||
|
|
||||||
/* configuration bits */
|
/* configuration bits */
|
||||||
uint16_t __at(_CONFIG1) __CONFIG1 = _FCMEN_ON & /* enable fail-safe clock monitor */
|
uint16_t __at(_CONFIG1) __CONFIG1 = _FCMEN_ON & /* enable fail-safe clock monitor */
|
||||||
|
@ -80,7 +81,7 @@ void init (void) {
|
||||||
LATA &= ~(RELAY1|RELAY2); /* switch relays off */
|
LATA &= ~(RELAY1|RELAY2); /* switch relays off */
|
||||||
TRISB |= SWITCH1|SWITCH2; /* switches are inputs (with external pull-ups) */
|
TRISB |= SWITCH1|SWITCH2; /* switches are inputs (with external pull-ups) */
|
||||||
TRISB &= ~(LED); /* LED is an output (used a sink) */
|
TRISB &= ~(LED); /* LED is an output (used a sink) */
|
||||||
led_off(); /* starting state */
|
LATB |= LED; /* switch LED off */
|
||||||
|
|
||||||
/* configure switches input */
|
/* configure switches input */
|
||||||
IOCIE = 1; /* enable interrupt on individual GPIO (typo in the lib) */
|
IOCIE = 1; /* enable interrupt on individual GPIO (typo in the lib) */
|
||||||
|
@ -100,7 +101,7 @@ void init (void) {
|
||||||
TMR0IF = 0; /* clear timer 0 interrupt */
|
TMR0IF = 0; /* clear timer 0 interrupt */
|
||||||
|
|
||||||
/* use timer 2 to measure pulse durations (max 16.384ms) */
|
/* use timer 2 to measure pulse durations (max 16.384ms) */
|
||||||
TMR2ON = 1; /* stop timer 2 */
|
TMR2ON = 0; /* stop timer 2 */
|
||||||
T2CKPS0 = 1; /* use prescaler of 64 */
|
T2CKPS0 = 1; /* use prescaler of 64 */
|
||||||
T2CKPS1 = 1; /* use prescaler of 64 */
|
T2CKPS1 = 1; /* use prescaler of 64 */
|
||||||
T2OUTPS0 = 0; /* use postscale of 1 */
|
T2OUTPS0 = 0; /* use postscale of 1 */
|
||||||
|
@ -111,7 +112,19 @@ void init (void) {
|
||||||
TMR2IE = 1; /* enable timer 2 interrupt */
|
TMR2IE = 1; /* enable timer 2 interrupt */
|
||||||
TMR2IF = 0; /* clear timer 2 interrupt */
|
TMR2IF = 0; /* clear timer 2 interrupt */
|
||||||
|
|
||||||
/* the MDR originally uses a PIC16C54A
|
/* use timer 4 to measure button hold (250ms per interrupt) */
|
||||||
|
TMR4ON = 0; /* stop timer 4 */
|
||||||
|
T4CKPS0 = 1; /* use prescaler of 64 */
|
||||||
|
T4CKPS1 = 1; /* use prescaler of 64 */
|
||||||
|
T4OUTPS0 = 1; /* use postscale of 16 */
|
||||||
|
T4OUTPS1 = 1; /* use postscale of 16 */
|
||||||
|
T4OUTPS2 = 1; /* use postscale of 16 */
|
||||||
|
T4OUTPS3 = 1; /* use postscale of 16 */
|
||||||
|
PR4 = 244; /* set interrupt on overflow on this value to get 250ms */
|
||||||
|
TMR4IE = 1; /* enable timer 4 interrupt */
|
||||||
|
TMR4IF = 0; /* clear timer 4 interrupt */
|
||||||
|
|
||||||
|
/* the MDR originally uses a PIC16C54A (PDIP for MDR/MDR2, SOIC for MDR-U)
|
||||||
* this does does not provide hardware I2C function
|
* this does does not provide hardware I2C function
|
||||||
* they implement I2C in software (it's even a bit buggy)
|
* they implement I2C in software (it's even a bit buggy)
|
||||||
* it even does not used open collectors (with pull-ups), but drives the signals
|
* it even does not used open collectors (with pull-ups), but drives the signals
|
||||||
|
@ -317,8 +330,11 @@ static void interrupt(void) __interrupt 0
|
||||||
if (PORTB&SWITCH1) { /* switch 1 released */
|
if (PORTB&SWITCH1) { /* switch 1 released */
|
||||||
led_off(); /* reset LED */
|
led_off(); /* reset LED */
|
||||||
new = 0; /* clear new code status */
|
new = 0; /* clear new code status */
|
||||||
|
TMR4ON = 0; /* stop counting how long the button is held */
|
||||||
} else { /* switch 1 pressed */
|
} else { /* switch 1 pressed */
|
||||||
led_on(); /* test LED */
|
led_on(); /* test LED */
|
||||||
|
hold = 0; /* reset counter how long the button is held */
|
||||||
|
TMR4ON = 1; /* start counting how long the button is held */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (switches&SWITCH2) { /* switch 2 changed */
|
if (switches&SWITCH2) { /* switch 2 changed */
|
||||||
|
@ -338,6 +354,23 @@ static void interrupt(void) __interrupt 0
|
||||||
TMR2 = 0xff; /* set timer 2 count to maximum */
|
TMR2 = 0xff; /* set timer 2 count to maximum */
|
||||||
TMR2IF = 0; /* clear timer 2 interrupt */
|
TMR2IF = 0; /* clear timer 2 interrupt */
|
||||||
}
|
}
|
||||||
|
if (TMR4IF) { /* timer 4 overflow, 250ms passed during button press */
|
||||||
|
hold++; /* increment 250ms counter */
|
||||||
|
/* toggle LED */
|
||||||
|
if (hold%2) {
|
||||||
|
led_off();
|
||||||
|
} else {
|
||||||
|
led_on();
|
||||||
|
}
|
||||||
|
/* pressed for 5s, clear memory */
|
||||||
|
if (hold==20) {
|
||||||
|
led_on();
|
||||||
|
clear_memory();
|
||||||
|
led_off();
|
||||||
|
TMR4ON = 0;
|
||||||
|
}
|
||||||
|
TMR4IF = 0; /* clear timer 4 interrupt */
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void main (void)
|
void main (void)
|
||||||
|
|
Loading…
Reference in New Issue