You are on page 1of 6

#include <16F877.H> #include <reg.

h> #fuses HS,NOWDT,NOPROTECT,NOLVP #use delay(clock=20000000) #define #define #define #define #define #define #define #define #define pulsador_1 pulsador_2 pulsador_3 pulsador_4 RECEPTOR_ASC RECEPTOR_DES LED_TEST LED_ON LED_OFF RB3 RB0 RB1 RB2 RC1 RC2 RB4 0 1 //La funcin define nos facilita //nombrar las entradas y salidas //a nuestro gusto para //facilitarnos el nombre de las //variables

//******************************************************************** ******************* // // Para poder usar la funcin printf sobre una direccin de memoria, //equivale a: // sprintf en el C estandar void esc_buff(char c); char *p_buff; //Funcin necesaria para usar printf sobre una //direccin de memoria //Puntero necesario para poder utilizar //la funcin printf sobre algn buffer

// //Encontrado en www.ccsinfo.com dentro de la seccin USER FORUM //Con un compilador "normal" utilizaramos la funcin sprintf // //Con un compilador estndar escribiramos: //sprintf(&buffer_display_1[0],"Vueltas: %5lu",cont_vueltas); // //Con este compilador escribiremos: //p_buff=&buffer_display_1[0]; // printf(esc_buff,"Vueltas: %5lu",cont_vueltas); // //******************************************************************** *******************

unsigned long controlador_minimo=0; //tiempo que requiere un //pulso unsigned senal_transmitida[80]; unsigned valor[80]; unsigned senal_byte[8]; unsigned long contador_array=0; unsigned long cont_array=0; unsigned long controlador_array=0;

//Controla el mnimo de //Almacena la seal ya en //ceros y unos //Almacena la seal ya en //ceros y unos //Almacena los ceros y unos //antes de transmitir //Cuenta la posicin de los //arrays //Controla el relleno de los //arrays duracin //Controla la posicin de los //arrays que se imprimen por //el display //Contador de interrupciones //Controla que un pulsador no //se pulse muchas veces cada //vez que lo pulses

unsigned long cont_int=0; unsigned short anterior_4=0;

unsigned short anterior_3=0;

unsigned unsigned unsigned unsigned

short anterior_2=0; short anterior_1=0; control_borrado; long interrupcion_p=0;

unsigned long interrupcion_n=0; unsigned short flanco_bueno; unsigned long flanco_positivo; unsigned long flanco_negativo; unsigned long resta; unsigned long numero_byte=0; unsigned long bits_llenos=0; unsigned long i=0; unsigned int bit_n=0,byte_n=0;

//Variable de control del borrado //Controla cuando hay una //interrupcin positiva //Controla cuando hay una //interrupcin negativa //Indica cual ha sido el tipo del //ultimo flanco recibido //Tiempo de recepcin de un flanco //positivo //Tiempo de recepcin de un flanco //negativo //Resta de tiempo de flanco //positivo y negativo //Controla el numero de byte que //sacamos por pantalla //Controla el numero mximo de bits //que podemos almacenar //Variable de control de varios /bucles //Controla el relleno de //senal_transimitida

void void void void void void

init_entradas_salidas(void); inicia_temporizador(void); inicia_capture(void); pulsadores(void); senal (unsigned long duracion,unsigned signo); imprimir(void);

#include "display.h"

//Leer las instrucciones para //utilizar el display en este //fichero

#include "display.c" #include "interrupcions.c" //----------------------------------PROGRAMA PRINCIPAL--------------------------------------// void main() { inicia_temporizador(); inicia_capture(); init_entradas_salidas(); init_display(2); init_tmr2();

//Inicializa los puertos de entrada //y salida //2 va con todos los displays. //Inicializa el temporizador 2 para //que produzca una interrupcin //cada ms //Permite interrupciones //Permite adems las interrupciones //de perifricos con menos //prioridad

INTCON_GIE=1; INTCON_PEIE=1;

while (1) { if (actualizando_display==false)

//Solo se debe actualizar //el buffer si el mensaje

//previo se ha actualizado //totalmente en el display { pulsadores(); imprimir(); //Llama al subprograma pulsadores

p_buff=&buffer_display_1[0]; printf(esc_buff,"Numerobyte:%5lu",numero_byte); p_buff=&buffer_display_2[0]; printf(esc_buff," %u %u %u %u %u %u %u %u",senal_byte[0],senal_byte[1],senal_byte[2],senal_byte[3],senal_byte [4],senal_byte[5],senal_byte[6],senal_byte[7]); actualizando_display=true; //Indicamos que hay que //actualizar el display } } } void init_entradas_salidas(void) { PORTA=0b00000000; PORTB=0b00000000; PORTC=0b00000000; PORTD=0b00000000; PORTE=0b00000000; TRISA=0b11111111; TRISB=0b11101111; TRISC=0b11111111; TRISD=0b11111111; //0=salida 1=entrada //Led test salida RB4 //Los datos del display estn aqu //pero solo sern salidas cuando se //vaya a escribir en el display //Esto se hace para poder //multiplexar un teclado con las //seales del display //En el puerto E estn las seales //de control del display //Puerto D de propsito general //Pull-up entradas puerto B no //puesto

TRISE=0b00000000;

TRISE_PSPMODE = 0; OPTION_REG_RBPU=1; } void esc_buff(char c) { *p_buff++ = c; } void inicia_capture(void) { CCP1CON=0b00000101; CCP2CON=0b00000100; CCP1IF=0; CCP1IE=1; CCP2IF=0; CCP2IE=1;

//Este registro activa el CCP1 como //receptor de flancos ascendentes //Este registro activa el CCP2 como //receptor de flancos descendentes //Pone el flag a cero para poder //haber interrupciones //Habilita la generacin de la //interrupcin

} #INT_CCP1 void interrupcion_c_1(void) { unsigned long *p_long; unsigned int *p_int; unsigned long bajo; unsigned long aux; p_long=&CCPR1L; //En el puntero p_long ponemos el //valor que contiene la direccin //de CCPR1L //En bajo ponemos el valor de la //direccin de p_long //Atiende la interrupcin del //capture 1

bajo=*p_long;

aux=bajo; flanco_positivo=aux; interrupcion_p++; if (interrupcion_p>130) { interrupcion_p=130; } if (flanco_bueno==1) { resta=flanco_positivo-flanco_negativo; flanco_bueno=0; senal(resta,0); } CCP1IF=0; //Se ha acabado la interrupcin } #INT_CCP2 void interrupcion_c_2(void) { unsigned long *p_long; unsigned int *p_int; unsigned long bajo; unsigned long aux; p_long=&CCPR2L; bajo=*p_long; aux=bajo; flanco_negativo=aux; controlador_minimo=flanco_negativo-flanco_positivo; if (controlador_minimo<1500) { interrupcion_p=0; interrupcion_n=0; } else { interrupcion_n++; if (interrupcion_n>130) { interrupcion_n=130; } flanco_bueno=1; senal(controlador_minimo,1); //Es de signo positivo //porque es la resta de //Atiende la interrupcin del //capture 1

//la llegada del //flanco negativo menos //el positivo } CCP2IF=0; } void inicia_temporizador(void) { T1CON=0b00000001; } void senal (unsigned long duracion,unsigned signo) { if (bits_llenos<638) { if (duracion>3500 && duracion<5500) { for (i=0;i<2;i++) { senal_transmitida[byte_n]=senal_transmitida[byte_n]<<1; senal_transmitida[byte_n]=senal_transmitida[byte_n] | (signo); bit_n++; bits_llenos++; if (bit_n>=8) { bit_n=0; byte_n++; } } } if (duracion<=3500) { senal_transmitida[byte_n]=senal_transmitida[byte_n]<<1; senal_transmitida[byte_n]=senal_transmitida[byte_n] | (signo); bit_n++; bits_llenos++; if (bit_n>=8) { bit_n=0; byte_n++; } } } }

void pulsadores(void) { if (pulsador_4==0 && anterior_4==1 && numero_byte<78) //El pulsador incrementa el //registro que se imprime por //pantalla { numero_byte++;

anterior_4=0; } if(pulsador_4==1) { anterior_4=1; } if (pulsador_3==0 && anterior_3==1 && numero_byte>0) //El pulsador 3 disminuye el //registro que se imprime por //pantalla { numero_byte--; anterior_3=0; } if(pulsador_3==1) { anterior_3=1; } if (pulsador_2==0 && anterior_2==1) { anterior_2=0; } if(pulsador_2==1) { anterior_2=1; } if (pulsador_1==0 && anterior_1==1) //El pulsador 1 borra el //valor de los arrays { for control_borrado=0;control_borrado<=80;control_borrado++) { senal_transmitida[control_borrado]=0; } for (i=0;i<8;i++) { senal_byte[i]=0; } bits_llenos=0; bit_n=0; byte_n=0; anterior_1=0; } if(pulsador_1==1) { anterior_1=1; } } void imprimir(void) { for (i=0;i<80;i++) { valor[i]=senal_transmitida[i]; } for (i=0;i<8;i++) { senal_byte[i]=valor[numero_byte]&0b00000001; valor[numero_byte]=valor[numero_byte]>>1; } }

You might also like