Hola gente, recurro nuevamente a ustedes para aclarar una duda y quizas puedan ayudarme.
Estoy comunicando dos Atmega8 de forma serial, el TX tiene conectado un pulsador a PC0 y otro a PC1, que al ser presionados envian un dato por el puerto serial.
El RX tiene conectado a PD7 un pulsador que mientras este presionado y llegue un dato por el puerto serial, lo graba en la EEPROM del mismo uC. Si el dato ya fue grabado, desactivo PD7 y cuando presiono algun pulsador de TX, este envia un dato que es comparado en el RX con el almacenado en su EEPROM y asi poder activar o desactivar el parpadeo de unos leds conectados al puerto C del RX.
Mi problema es que solo me esta permitiendo grabar el dato de un solo pulsador y asi puedo activar pero no puedo grabar el otro pulsador para desactivar la funcion del parpadeo.
Adjunto los codigos fuente y el esquema electrico mas archivos para aquel que pueda ayudarme u orientarme a resolverlo. Desde ya, muchas gracias.

Codigo TX:
Codigo RX:
Estoy comunicando dos Atmega8 de forma serial, el TX tiene conectado un pulsador a PC0 y otro a PC1, que al ser presionados envian un dato por el puerto serial.
El RX tiene conectado a PD7 un pulsador que mientras este presionado y llegue un dato por el puerto serial, lo graba en la EEPROM del mismo uC. Si el dato ya fue grabado, desactivo PD7 y cuando presiono algun pulsador de TX, este envia un dato que es comparado en el RX con el almacenado en su EEPROM y asi poder activar o desactivar el parpadeo de unos leds conectados al puerto C del RX.
Mi problema es que solo me esta permitiendo grabar el dato de un solo pulsador y asi puedo activar pero no puedo grabar el otro pulsador para desactivar la funcion del parpadeo.
Adjunto los codigos fuente y el esquema electrico mas archivos para aquel que pueda ayudarme u orientarme a resolverlo. Desde ya, muchas gracias.

Codigo TX:
PHP:
/*
Nombre: TX.c
*/
/* Configuraciones Generales */
#define F_CPU 8000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "usart.h"
/* Variables a Utilizar */
uint8_t encender = 'a';
uint8_t apagar = 'b';
int main(void)
{
// Comunicacion serial a 4800 baudios
SerialBegin(103);
// PC0 y PC1 como entrada
DDRC = (0<<PC1)|(0<<PC0);
// PORTB como entrada
DDRB = 0x00;
// Limpiamos PORTC
PORTC = 0x00;
//Habilito las interrupciones globales
sei();
while(1)
{
// Testeo estado de PC0
if (bit_is_clear(PINC,PC0) == 0)
{
// Retardo para verificar la pulsacion
_delay_ms(50);
// Testeo nuevamente PC0
if (bit_is_clear(PINC,PC0) == 0)
{
// Envio el dato "encender"
SerialWrite(encender);
}
}
// Testeo estado de PC1
if (bit_is_clear(PINC,PC1) == 0)
{
// Retardo para verificar la pulsacion
_delay_ms(50);
// Testeo nuevamente PC1
if (bit_is_clear(PINC,PC1) == 0)
{
// Envio el dato "apagar"
SerialWrite(apagar);
}
}
}
}
Codigo RX:
PHP:
/*
Nombre: RX.c
*/
/* Configuraciones Generales */
#define F_CPU 8000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/eeprom.h>
#include <util/delay.h>
#include "usart.h"
/* Variables a utilizar */
uint8_t dato_serial;
uint8_t contador;
ISR (TIMER0_OVF_vect)
{
// Incrementa variable
contador++;
// Pregunto si el contador es igual a 7
if (contador == 7)
{
// Invierte el valor de PORTC
PORTC = ~ PORTC;
// Pone contador a 0
contador = 0 ;
}
}
ISR(USART_RXC_vect)
{
// Almaceno el dato recibido por puerto serial en la variable "dato_serial"
dato_serial = SerialRead();
// Pregunto si el pulsador de prog. esta presionado y el codigo recibido en "dato_serial"...
if ((dato_serial) && (bit_is_clear(PIND,PD7) == 0))
{
// Lo almacenado en la EEPROM del microcontrolador
eeprom_write_byte((uint8_t*)0,dato_serial);
// Si el codigo ya fue grabado...
}else{
// Compara el codigo recibido, con el codigo almacenado en la EEPROM, y si coinciden...
if ((dato_serial) == eeprom_read_byte((uint8_t*)0))
{
// Habilita la interrupcion por overflow - Parpadeo de leds
TIMSK = (1<<TOIE0);
}
}
}
void InterrupOvf(void)
{
// Prescaler = FCPU/1024
TCCR0 = (1<<CS02)|(1<<CS00);
// Inicio interrupcion por Overflow deshabilitada
TIMSK = (0<<TOIE0);
// Inicializo contador en 0
TCNT0 = 0;
}
int main(void)
{
// Comunicacion serial a 4800 baudios
SerialBegin(103);
// Funcion de interrupcion por Overflow
InterrupOvf();
// Puerto C [3,2,1,0] como salida
DDRC = 0x0F ;
// Limpio PORTC
PORTC = 0x00;
// Habilito interrupciones globales
sei();
while(1)
{
//...
}
}