decodificar HT6P20B

ola pessoal alguém já decodificou o ht6p20b no freescale hcs08, estou há algum tempo tentando mas sem sucesso , fiz um programa em c , usando o módulo TPM função de captura em ambas as bordas , e guardo os bits recebidos em 3 variaveis , estou usando duas matrizes , uma para setar o bit quando recebe um e outra matriz para zerar o bit quando recebe zero, esses bits são decodificados em uma função de interrupção que primeiro identifica o start_bit para depois decodificar os bits , há um botão que quando pressionado guarda o código recebido em outras 3 variaveis, o problema é que quando pressiono o botão qualquer controle se torna válido, segue abaixo a listagem do programa, se alguem que já tenha decodificado
esse Ci no freescale hcs08 puder me ajudar agradeço desde já.
////// Programa p/ decodificar HT6P20B /// Data criação 20/08/11 ///
#include <mc9s08sh8.h>
#include <hidef.h>
#include "derivative.h"
#define cpu_clock 20000
#include "delay.c"
#define led PTCD_PTCD2
#define bottom PTCD_PTCD3
volatile char in,cont1,cont2,cont3,bit_in,start_bit=0;
volatile unsigned int cap,caps,capd;
unsigned char calibrar @0xFFAF;
volatile char dados_recebidos=0;
char end_rc=0;
char byt1=0;
char byt2=0;
char byt3=0;
char byte1=1;
char byte2=1;
char byte3=1;
const unsigned char seta_bit[] = {
0b00000001,
0b00000010,
0b00000100,
0b00001000,
0b00010000,
0b00100000,
0b01000000,
0b10000000,
};
const unsigned char zera_bit[] = {
0b11111110,
0b11111101,
0b11111011,
0b11110111,
0b11101111,
0b11011111,
0b10111111,
0b01111111,
};
void interrupt 6 captura (void)
{
TPM1C1SC_CH1F=0;
in=0;
bit_in=2;
if(PTBD_PTBD5==1){
caps=TPM1C1V;
}else {
capd=TPM1C1V;
}
if (capd>caps){
cap=capd-caps;
}else {
cap=(15000-caps)+capd;
}
if((cap>350)&&(cap<480)&&(start_bit)){
bit_in=1;
in=1;
}
if((cap>720)&&(cap<950)&&(start_bit)){
bit_in=0;
in=1;
}
if((cap>10000)&&(cap<13000)) {
start_bit=1;
dados_recebidos=0;
cont1=0;
cont2=0;
cont3=0;
}
if(in && cont1<8){
in=0;
}
if(in && cont2<8){
in=0;
}
if(in && cont3<8){
in=0;
}
if (end_rc==1){
start_bit=0;
dados_recebidos=1;
}
}
void main(void) {
SOPT1=0b00000010; // Desabilita Watchdog (cão de guarda)
PTCDD_PTCDD2=1; // led saída
PTCDD_PTCDD3=0; // bottom entrada
ICSTRM = calibrar;
TPM1SC=0b00001010; // configura TPM clock BUSCLK , divisão do clock por 4
TPM1C1SC=0b01001100; // habilita interrupção canal 1 captura,ambas as bordas
TPM1MOD=15000; // carrega valor de contagem do TPM
EnableInterrupts; // habilita interrupções
while(1){
while(start_bit) {
if (bit_in==1 && cont1<8){ //seta bitN
byte1 |= seta_bit[cont1];
cont1++;
}
if (bit_in==1 && cont2<8 && cont1==8){ //seta bitN
byte2 |= seta_bit[cont2];
cont2++;
}
if (bit_in==1 && cont3<8 && cont2==8){ //seta bitN
byte3 |= seta_bit[cont3];
cont3++;
}
if (bit_in==0 && cont1<8){ //zera bitN
byte1 &= zera_bit[cont1];
cont1++;
}
if (bit_in==0 && cont2<8 && cont1==8){ //zera bitN
byte2 &= zera_bit[cont2];
cont2++;
}
if (bit_in==0 && cont3<8 && cont2==8){ //zera bitN
byte3 &= zera_bit[cont3];
cont3++;
}
end_rc=1;
}
if (start_bit==0){ end_rc=0;}
delay_ms(30);
if (bottom==1) {
if (dados_recebidos==1){
led=1;
delay_ms(20);
byt1=byte1;
byt2=byte2;
byt3=byte3;
byte1=3;
byte2=3;
byte3=3;
delay_ms(20);
led=0;
}
}
if (dados_recebidos==1 && PTBD_PTBD5==1){
if (byt1 ^ byte1==0 && byt2 ^ byte2==0 && byt3 ^ byte3==0){
delay_ms(50);
led=1;
delay_ms(70);
led=0;
delay_ms(150);
led=1;
delay_ms(70);
led=0;
}
byte1=3;
byte2=3;
byte3=3;
}
}
}
esse Ci no freescale hcs08 puder me ajudar agradeço desde já.
////// Programa p/ decodificar HT6P20B /// Data criação 20/08/11 ///
#include <mc9s08sh8.h>
#include <hidef.h>
#include "derivative.h"
#define cpu_clock 20000
#include "delay.c"
#define led PTCD_PTCD2
#define bottom PTCD_PTCD3
volatile char in,cont1,cont2,cont3,bit_in,start_bit=0;
volatile unsigned int cap,caps,capd;
unsigned char calibrar @0xFFAF;
volatile char dados_recebidos=0;
char end_rc=0;
char byt1=0;
char byt2=0;
char byt3=0;
char byte1=1;
char byte2=1;
char byte3=1;
const unsigned char seta_bit[] = {
0b00000001,
0b00000010,
0b00000100,
0b00001000,
0b00010000,
0b00100000,
0b01000000,
0b10000000,
};
const unsigned char zera_bit[] = {
0b11111110,
0b11111101,
0b11111011,
0b11110111,
0b11101111,
0b11011111,
0b10111111,
0b01111111,
};
void interrupt 6 captura (void)
{
TPM1C1SC_CH1F=0;
in=0;
bit_in=2;
if(PTBD_PTBD5==1){
caps=TPM1C1V;
}else {
capd=TPM1C1V;
}
if (capd>caps){
cap=capd-caps;
}else {
cap=(15000-caps)+capd;
}
if((cap>350)&&(cap<480)&&(start_bit)){
bit_in=1;
in=1;
}
if((cap>720)&&(cap<950)&&(start_bit)){
bit_in=0;
in=1;
}
if((cap>10000)&&(cap<13000)) {
start_bit=1;
dados_recebidos=0;
cont1=0;
cont2=0;
cont3=0;
}
if(in && cont1<8){
in=0;
}
if(in && cont2<8){
in=0;
}
if(in && cont3<8){
in=0;
}
if (end_rc==1){
start_bit=0;
dados_recebidos=1;
}
}
void main(void) {
SOPT1=0b00000010; // Desabilita Watchdog (cão de guarda)
PTCDD_PTCDD2=1; // led saída
PTCDD_PTCDD3=0; // bottom entrada
ICSTRM = calibrar;
TPM1SC=0b00001010; // configura TPM clock BUSCLK , divisão do clock por 4
TPM1C1SC=0b01001100; // habilita interrupção canal 1 captura,ambas as bordas
TPM1MOD=15000; // carrega valor de contagem do TPM
EnableInterrupts; // habilita interrupções
while(1){
while(start_bit) {
if (bit_in==1 && cont1<8){ //seta bitN
byte1 |= seta_bit[cont1];
cont1++;
}
if (bit_in==1 && cont2<8 && cont1==8){ //seta bitN
byte2 |= seta_bit[cont2];
cont2++;
}
if (bit_in==1 && cont3<8 && cont2==8){ //seta bitN
byte3 |= seta_bit[cont3];
cont3++;
}
if (bit_in==0 && cont1<8){ //zera bitN
byte1 &= zera_bit[cont1];
cont1++;
}
if (bit_in==0 && cont2<8 && cont1==8){ //zera bitN
byte2 &= zera_bit[cont2];
cont2++;
}
if (bit_in==0 && cont3<8 && cont2==8){ //zera bitN
byte3 &= zera_bit[cont3];
cont3++;
}
end_rc=1;
}
if (start_bit==0){ end_rc=0;}
delay_ms(30);
if (bottom==1) {
if (dados_recebidos==1){
led=1;
delay_ms(20);
byt1=byte1;
byt2=byte2;
byt3=byte3;
byte1=3;
byte2=3;
byte3=3;
delay_ms(20);
led=0;
}
}
if (dados_recebidos==1 && PTBD_PTBD5==1){
if (byt1 ^ byte1==0 && byt2 ^ byte2==0 && byt3 ^ byte3==0){
delay_ms(50);
led=1;
delay_ms(70);
led=0;
delay_ms(150);
led=1;
delay_ms(70);
led=0;
}
byte1=3;
byte2=3;
byte3=3;
}
}
}