add functionnality: memory is erased when holding button for 5s

This commit is contained in:
King Kévin 2014-08-02 23:50:05 -07:00
parent bd339641ad
commit e0cd617537
1 changed files with 36 additions and 3 deletions

View File

@ -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*/
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 hold = 0; /* how long has the button been held, in 250ms steps */
/* configuration bits */
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 */
TRISB |= SWITCH1|SWITCH2; /* switches are inputs (with external pull-ups) */
TRISB &= ~(LED); /* LED is an output (used a sink) */
led_off(); /* starting state */
LATB |= LED; /* switch LED off */
/* configure switches input */
IOCIE = 1; /* enable interrupt on individual GPIO (typo in the lib) */
@ -100,7 +101,7 @@ void init (void) {
TMR0IF = 0; /* clear timer 0 interrupt */
/* 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 */
T2CKPS1 = 1; /* use prescaler of 64 */
T2OUTPS0 = 0; /* use postscale of 1 */
@ -111,7 +112,19 @@ void init (void) {
TMR2IE = 1; /* enable 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
* 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
@ -317,8 +330,11 @@ static void interrupt(void) __interrupt 0
if (PORTB&SWITCH1) { /* switch 1 released */
led_off(); /* reset LED */
new = 0; /* clear new code status */
TMR4ON = 0; /* stop counting how long the button is held */
} else { /* switch 1 pressed */
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 */
@ -338,6 +354,23 @@ static void interrupt(void) __interrupt 0
TMR2 = 0xff; /* set timer 2 count to maximum */
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)