/*************************************************************************** */ /* sg-generic-pic16F876A-skypic.c Julio 2006 */ /*---------------------------------------------------------------------------*/ /* Servidor Generico */ /* Servidor: sg-generic */ /* Implementado para la tarjeta Skypic a 20MHz */ /*---------------------------------------------------------------------------*/ /* Implementados los servicios de Identificacion, PING, LOAD y STORE */ /* Inicialmente el led de la skypic esta encendido */ /*---------------------------------------------------------------------------*/ /* Juan Gonzalez <juan@iearobotics.com> */ /*---------------------------------------------------------------------------*/ /* LICENCIA GPL */ /*****************************************************************************/ //-- Especificar el pic a emplear #define __16f877 #include "pic16f877.h" /*******************************/ /* DEFINICIONES */ /*******************************/ #define LED 0x02 //-- Bit del puerto B donde se encuentra el LED #include "sci.h" #include "pic16f877.h" /*----------------------------*/ /* CONSTANTES DEL STARGATE */ /*----------------------------*/ //-- Datos devueltos por el servicio de identificacion #define IS 0x20 // IS. Identificacion del servidor #define IM 0x30 // IM. Identificacion del microcontrolador (pic16F876A) #define IPV 0x10 // IPV. Placa Skypic. Version 0. //-- Identificadores de los servicios #define SID 0x49 // Servicio de identificacion #define SPING 0x50 // Servicio de PING (0x50) #define SLD 0x4C // Servicio LOAD #define SST 0x53 // Servicio STORE //-- Identificadores para la respuesta #define RPING 0x4F // Respuesta al Servicio de PING (0x4F) #define RSI 0x49 // RSI. Codigo de respuesta del servicio de identificacion #define RLD 0x4C // Codigo respuesta servicio LOAD #define RST 0x53 // Codigo respuesta servicio STORE /********************************************/ /* REGISTRO PARA DIRECCIONAMIENTO INDEXADO */ /********************************************/ //-- Por razones que desconozco, si se utiliza el registro INDF tal y //-- y como esta definido en el fichero pic16f87X.h, el direccionaimento //-- indirecto no funciona. Con la siguiente definicion no hay problemas sfr at INDF_ADDR INDF2; /*-----------------------------*/ /* VARIABLES GLOBALES */ /*-----------------------------*/ //-- Byte alto de la direccion de memoria donde hacer LOAD/STORE unsigned char dirH; unsigned char valor; /*********************************************************************/ /* Leer la direccion enviada y situarla en los registros adecuados */ /* para poder hacer el direccionamienot indirecto */ /*********************************************************************/ void leer_dir() { //-- El byte bajo se pone en el registro FSR FSR=sci_read(); //-- Poner el bit menos significativo de dirH en el bit IRP del //-- registro de status, para indicar direccionamiento indirecto dirH=sci_read(); IRP=dirH&0x01; } /**************************************************************************/ /* Servicio STORE: se almacena en la direccion indicada, el valor pasado */ /**************************************************************************/ void store(void) { //-- Leer la direccion leer_dir(); //-- Realizar la escritura del valor pasado INDF2=sci_read(); //-- Enviar la respuesta sci_write(RST); } /**************************************************************************/ /* Servicio LOAD: Se devuelve el valor que se encuentra en la direccion */ /* indicada */ /**************************************************************************/ void load(void) { //-- Leer la direccion leer_dir(); //-- Leer el valor valor=INDF2; /* Devolver trama de respuesta con el valor leido */ sci_write(RLD); sci_write(valor); } /*---------------------*/ /* PROGRAMA PRINCIPAL */ /*---------------------*/ void main(void) { unsigned char car; /*----------------------------*/ /* Configurar el sistema */ /*----------------------------*/ //-- Configurar el led de la skypic TRISB=~LED; //-- Activar LED de la Skypic PORTB=LED; /*-----------------------------*/ /* Configurar el puerto serie */ /*-----------------------------*/ sci_init(); /*------------------*/ /* Bucle principal */ /*------------------*/ for (;;) { //-- Esperar a que se solicite un servicio car=sci_read(); switch(car) { //-- Servicio de identificacion case SID: sci_write(RSI); sci_write(IS); sci_write(IM); sci_write(IPV); break; //-- Servicio de PING case SPING: sci_write(RPING); break; //-- Servicio de LOAD case SLD: load(); break; //-- Servicio de STORE case SST: store(); break; } } }