implemented save_code()
This commit is contained in:
parent
42d4dbdc2d
commit
7af0a8a5b8
118
pic/MDR/MDR.c
118
pic/MDR/MDR.c
|
@ -49,7 +49,7 @@
|
||||||
/* variables */
|
/* variables */
|
||||||
static uint8_t switches; /* save the last switch state */
|
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]; /* the received code (24 bits) */
|
static uint8_t code[3] = {0xf1, 0x11, 0x11}; /* the received code (24 bits) */
|
||||||
|
|
||||||
/* 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 */
|
||||||
|
@ -151,6 +151,111 @@ void start_pulse_timer()
|
||||||
TMR2ON = 1; /* start timer 2 */
|
TMR2ON = 1; /* start timer 2 */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* write code (global variable) in EEPROM at specifoed address */
|
||||||
|
void write_code(uint16_t address)
|
||||||
|
{
|
||||||
|
/* use I2C to select address */
|
||||||
|
send_start();
|
||||||
|
if (send_byte(0xa0)) { /* write eeprom at 0xA0/0x50 */
|
||||||
|
send_stop();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (send_byte((uint8_t)(address>>8))) { /* go to address */
|
||||||
|
send_stop();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (send_byte((uint8_t)(address&0xff))) { /* go to address */
|
||||||
|
send_stop();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* write bytes */
|
||||||
|
if (send_byte(code[0])) {
|
||||||
|
send_stop();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (send_byte(code[1])) {
|
||||||
|
send_stop();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (send_byte(code[2])) {
|
||||||
|
send_stop();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* finish transaction */
|
||||||
|
send_stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* look in the memory for the code (global variable)
|
||||||
|
* if not present, write it a the next free memory space */
|
||||||
|
void save_code()
|
||||||
|
{
|
||||||
|
uint16_t address;
|
||||||
|
uint8_t stored[3];
|
||||||
|
/* start at begining of the memory */
|
||||||
|
send_start();
|
||||||
|
if (send_byte(0xa0)) { /* write address to eeprom at 0xA0/0x50 */
|
||||||
|
send_stop();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (send_byte(0x00)) { /* go to address 0x0000 */
|
||||||
|
send_stop();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (send_byte(0x00)) { /* go to address 0x0000 */
|
||||||
|
send_stop();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* start reading */
|
||||||
|
send_start();
|
||||||
|
if (send_byte(0xa1)) { /* read eeprom at 0xA0/0x50 */
|
||||||
|
send_stop();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* go through memory */
|
||||||
|
for (address=0; address<0x7FFF-2; address+=3) {
|
||||||
|
/* read stored code */
|
||||||
|
stored[0] = read_byte(1);
|
||||||
|
stored[1] = read_byte(1);
|
||||||
|
stored[2] = read_byte(1);
|
||||||
|
if ((stored[0]&0x80)==0) { /* code always have the MSb to 1 */
|
||||||
|
read_byte(0); /* send a NACK to stop reading */
|
||||||
|
send_stop(); /* finish transaction */
|
||||||
|
write_code(address); /* write code at this space */
|
||||||
|
return;
|
||||||
|
} else if (stored[0]==code[0] && stored[1]==code[1] && stored[2]==code[2]) { /* code already stored */
|
||||||
|
read_byte(0); /* send a NACK to stop reading */
|
||||||
|
send_stop(); /* finish transaction */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void clear_memory(void)
|
||||||
|
{
|
||||||
|
uint16_t address;
|
||||||
|
uint8_t stored[3];
|
||||||
|
/* start at begining of the memory */
|
||||||
|
send_start();
|
||||||
|
if (send_byte(0xa0)) { /* write address to eeprom at 0xA0/0x50 */
|
||||||
|
send_stop();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (send_byte(0x00)) { /* go to address 0x0000 */
|
||||||
|
send_stop();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (send_byte(0x00)) { /* go to address 0x0000 */
|
||||||
|
send_stop();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* go through memory */
|
||||||
|
for (address=0; address<0x7FFF; address++) {
|
||||||
|
send_byte(0x00); /* clear byte */
|
||||||
|
}
|
||||||
|
send_stop(); /* finish transaction */
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/* funcion called on interrupts */
|
/* funcion called on interrupts */
|
||||||
/* interrupt 0 is only one on PIC16 */
|
/* interrupt 0 is only one on PIC16 */
|
||||||
static void interrupt(void) __interrupt 0
|
static void interrupt(void) __interrupt 0
|
||||||
|
@ -161,14 +266,7 @@ static void interrupt(void) __interrupt 0
|
||||||
if (switches&SWITCH1) { /* switch 1 changed */
|
if (switches&SWITCH1) { /* switch 1 changed */
|
||||||
if (PORTB&SWITCH1) { /* switch 1 released */
|
if (PORTB&SWITCH1) { /* switch 1 released */
|
||||||
led_off(); /* reset LED */
|
led_off(); /* reset LED */
|
||||||
send_start();
|
clear_memory();
|
||||||
send_byte(0xa0);
|
|
||||||
send_byte(0x1c);
|
|
||||||
send_byte(0x17);
|
|
||||||
send_start();
|
|
||||||
send_byte(0xa1);
|
|
||||||
read_byte();
|
|
||||||
send_stop();
|
|
||||||
} else { /* switch 1 pressed */
|
} else { /* switch 1 pressed */
|
||||||
led_on(); /* test LED */
|
led_on(); /* test LED */
|
||||||
}
|
}
|
||||||
|
@ -232,6 +330,8 @@ void main (void)
|
||||||
}
|
}
|
||||||
if (bit==24) { /* received all 24 bits */
|
if (bit==24) { /* received all 24 bits */
|
||||||
led_on();
|
led_on();
|
||||||
|
save_code();
|
||||||
|
led_off();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (bit==0) { /* sync pulse (can be the current one it it is not a continuation */
|
if (bit==0) { /* sync pulse (can be the current one it it is not a continuation */
|
||||||
|
|
Loading…
Reference in New Issue