Continuando en mi línea de manejar el PIC desde el PC, vía RS232, he desarrollado
todo un sistema monitor, al estilo de los anteriores Ejemplitos 16F876 y sobre todo
usando lo que hemos estudiado en
Ejemplitos C: Mis Funciones favoritas en CCS CIgual que en los citados ejemplos anteriores hago uso del receptor RS232 sobre
un buffer y su tratamiento posterior ( Ver
Ejemplito Nº 6: Recibiendo ... ) pero
en este caso vamos a implementar los comandos:
eedump, eeread, eewrite y
eefillque nos van a permitir volcar todo el contenido de la EEPROM en el hiperterminal,
leer una posición determinada, escribir sobre ella o rellenar con un valor dado
toda la EEPROM disponible.
En el fondo, con respecto a la EEPROM, solo vamos a utilizar realmente dos
funciones CCS específicas:
read_eeprom(dir) y
write_eeprom(dir, byte). Todo
lo demas lo compone nuestro programa receptor de comandos y ejecutor de
los mismos.
El programa entonces habla con nosotros así:
Codigo:
#include <16f876a.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock=4000000)
#use standard_io(b)
#use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7)
#include <stdlib.h>
// Constantes y definiciones ////////////////////////////////////////////////////////////
int const MAXLENBUFF=24; // Maxima longitud de los bufferes
int const MAXLENCOMMAND=12; // Maxima longitud de un comando (sin argumentos)
int const NUMPAGSEEPROM=7; // Numero de paginas (de 16 bytes) de la EEPROM interna
// Variables Globales ///////////////////////////////////////////////////////////////////
char buffrec[MAXLENBUFF]; // Buffer de Recepcion
int xbuffrec=0x00; // índice del Buffer de Recepcion
int1 new_command=0; // Flag para indicar comando disponible
int1 pdte_send_prompt=0; // Flags para enviar echo fuera de la int_rda
int1 pdte_send_tmp_prompt=0;
char xcommand[MAXLENCOMMAND]; // Comprobador de comando recibido
// Declaracion de Funciones /////////////////////////////////////////////////////////////
void On_reset(void); // Tras RESET del Micro
void Send_listen(void); // Monitoriza RS232 : Comienzo
void Send_opts(void); // Monitoriza RS232 : Presenta opciones
void Send_prompt(void); // Monitoriza RS232 : Presenta el Cursor
void Send_tmp_prompt(void); // Monitoriza RS232 : Presenta el Cursor y el comando actual
void Ini_buffrec(void); // Borra el buffer de recepción
void Add_buffrec(char c); // Añade un caracter al buffer de recepción
int Extrae_arg_hex(char tipo, int lenarg); // Extrae del comando el valor hex tras -tipo
int aschex2int(char d); // Convierte un caracter ascii a hex
void Procesa_comando(void); // Procesado de comandos
void Vuelca_EEPROM(void); // Vuelca el contenido de la EEPROM
void Rellena_EEPROM(int x); // Rellena toda la EEPROM con x
void Write_port(int port, int valor); // Pone a valor el estado del puerto port
// INTERRUPCIONES ///////////////////////////////////////////////////////////////////////
// INTERRUPCION RDA - Recepción USART -
#int_rda
void serial_isr() {
if(kbhit()){ // Si hay algo pendiente de recibir ...
Add_buffrec(getc()); // lo recibo y lo añado al Buffer de Recepcion
}
}
// Control del Buffer de recepcion ---------------------------------------
void Ini_buff_rec(void){ // Inicia a "