QUE PUTADA, SE PERDIO EL 1º MSG, MENOS MAL QUE LO GUARDARA
hola amis:
cuando el ardu es extension del PC, lo bonito es enviarle "on", "off", "t barrido=01:23:45".
este problema te pones y lo sacas. pero es un rollo, ademas de T de programacion come memoria.
normalmente se hace con una cadena de if(comando="tal cosa"){comando();
para pocos comandos gana en sencillez al que propongo.
2º meter "tales cosas" en progmem,
3º hacer una tabla saltos
y la 4º meter [sato, "comando"] en una estructura en progmem.
ejempo: _ram_igual, "ram=@@@@", //@ son comodines, en este caso asciis de hexadeci, envias por consola (o programa en PC) ram=00B2 y te da el PEEK de esa memoria, que es el timer2, y se vera cambiar, los hexa en MAYUSCULAS.
empeze con un ejemplo de on off pero me lie con utilidades de ram, y rom, el comando "help" da esto:
L I S T A D O D E C O M A N D O S B A S I C O S ,
PONERLOS LITERAL, RESPETAR ESPACIOS, HEXES EN MAYUS
'off' apaga
'on' enciende
'eco 0' anula eco de RS232
'eco 1' activa eco
'ram?' dice donde esta el puntero a RAM, y su PEEK
'ram=@@@@' pone alli el puntero a RAM (@=cifra HEXA MAYUSC)
'poke=@@' hace POKE en puntero a RAM, PELIGRO
'ram dump' vuelca 1k de RAM desde el puntero, puntero termina aumentado
'var0=@@' variables de ejemplo
'var1=@@' @=cifra HEXA MAYUSC
'var ver' muestra las variables
'rom ver' muestra las variables guardadas en los 4 bancos
'rom dump' vuelca el 1º/4k de rom
'save 0' guarda variables en banco 0 de rom, el que carga al inicio
'save 1'
'save 2'
'save 3'
'load 0' recoge variables del banco 0 de rom, el que carga al inicio
'load 1'
'load 2'
'load 3'
'help' esta ayuda
'help 2' ejemplo de mala colocacion en tabla
'h' atajo ayuda
el nucleo esta en e este fichero: GUARDAR COMO interprete.ino
/* GUARDAR COMO interprete.ino */
/**********************************************/
/* I N T E R P R E T E C O M A N D O S */
#include <avr/pgmspace.h> //nesario por usar PROGMEM, pgm_read_byte,,
#include "interprete.h" //decaraciones y definiciones propias de este fichero
#include "main.h" //_ma_off, _ma_on,,, declaradas alli
#include "comandos.h" //muchos comando alli def
typedef void (*fptr) (void); //define una funcion generica
/**********************************************/
/* P O N E R R U T I N A Y S A L T O */
PROGMEM struct { //estrucutura contiene_
void (*pf)(void); //salto a funcion asociada
char coman[10]; //letras comando asociado ! ! ! MAX 9, mejor 8, (O CAMBIAR 10)
}tabsal[coman_top] = {
//con la estructura hago una matriz, EN 'coman_top' PONER CUANTAS SON, esta en .h
_main_off, "off",
_main_on, "on",
//Y POR AQUI PONGO LOS PARES
_main_eco_0, "eco 0", //NOMBRE DE FUNCION Y LETRAS
_main_eco_1, "eco 1", //las mas usadas o urgentes al principio
//asi ahorramos tiempo
_ram_pregun, "ram?",
_ram_igual, "ram=@@@@", //@ ES COMODIN, NO COMPRUEBA,
_ram_poke, "poke=@@", //pueden variar por ser cifras
_ram_dump, "ram dump",
_var0, "var0=@@",
_var1, "var1=@@",
_var_ver, "var ver",
_rom_dump, "rom dump",
_rom_bancos_ver,"rom ver",
_save_0, "save 0",
_save_1, "save 1",
_save_2, "save 2",
_save_3, "save 3",
_load_0, "load 0",
_load_1, "load 1",
_load_2, "load 2",
_load_3, "load 3",
_help0, "help",
_help0, "h",
_help1, "help 2", //PONER 1º LOS NOMBRES LARGOS, PORQUE SI NO
//LO ASUME EL CORTO Y EL EXCESO LETRAS CANTA ERROR, EJEMPLO
//_rom_del, "d0",
};//PONER EN coman_top (esta en .h) CUANTAS SON, o algun mas
/**************************************/
/****** N U C L E O *******/
void _interprete_patrulla(void){ //NUCLEO DEL INTERPRETE DE COMANDOS
fptr f; //crea una funcion generica del tipo definido como fptr, no idea, sacao internet
if(RX_c!=0x0A){ return;} //no llego final de parrafo
if(ptr_bufer < 3){ //si solo llegaron 0x0d y 0x0a
_bufer_reset();
return;}
for(in_k=0;in_k<coman_top;in_k++){ //en in_k el numero de comando
in_ptr=0; //ptr a 0
mem = tabsal[in_k].coman; //mem apunta a inicio tabsal[in_k].coman en la progmem
while (1) { //bucle
in_pgm=pgm_read_byte(mem); //lee de memo prog
// in_pgm=pgm_read_byte(&(mem)); // C O M P R O B A R funciona sin &
in_buf=bufer[in_ptr]; //in_buf = letra a comparar, matrices lentas
in_ptr++; //apunta a siguiente en bufer
mem++; //apunta a siguiente en progmem
if(!in_pgm){ //if(in_pgm==0){ //llego al final?
if( in_buf == 0x0D){ //termino en el bufer
goto _interprete_ok;} //si, antes coincidio, OK
if( in_buf == 0x0A){ //termino en el bufer
goto _interprete_ok;} //si, antes coincidio, OK
goto _interprete_mal; //OTRO GOTO, VIVA RICHIE
}
if( in_buf == 0x0A){ //termino el bufer?
break;} //si, a por otro parrafo
if( in_pgm == '@'){ //llego comodin?
continue;} //si, a por otra letra
if( in_buf != in_pgm){ //coincide?
break;} //no, a por otro parrafo
//fin de bucle, entonces es que coinciden letras, a por otra
}
}//NO ENCONTRO COINCIDENCIA
_interprete_mal: //interprete mal
Serial.print("mal comando, type 'help'\n");
_bufer_reset();
return;
_interprete_ok: //interprete OK
//Serial.print("_interprete_ok\n");
f = (fptr)pgm_read_word(&(tabsal[in_k].pf)); //ESTE ES EL MEOLLO DEL ASUNTO
f();
//NO LO ENTIENDO BIEN, ES REFRITO DE RECORTES DE INTERNET
// tabsal[in_k].pf aqui esta la direcion de inicio de la rutina
// el & �fuerza la direcion?, no entiendo, 2 dias duro me llevo ponerlo
// pgm_read_word(&(tabsal[in_k].pf)); como todo esta en progmem, lo lee
// (fptr)pgm_read_word(&(tabsal[in_k].pf)); �fuerza a que el numero devuelto
// sea del tipo funcion generica (fptr)?
// el tipo 'fptr', es 'normal', no es que este en ram, pero tampoco esta
// fosilizada en la progmem, ella copia el fosil
// f es una del tipo (fptr), por eso puede recibir el vector, carga escopeta
// f() dispara
// todo lo dicho son elucubraciones sin garantias
_bufer_reset();
//return; //es ultimo tonteria ponerlo
}
/**************************************/
/* A U X I L I A R E S */
void _interprete_mal_num(void){
Serial.print("mal numero, (�hexas en mayusculas?)\n");
}
unsigned char _in_arroba_d(char n){//ENTRA UN ASCII DE DECIMAL Y SALE COMO BYTE, o error
in_buf=bufer[n]; //in_buf = letra a traducir a byte/2
//uso in_buf por estar libre
in_buf-=0x30; //ver ascii wikip
if(in_buf>9){ //
bitSet(ma_error,poe);
in_buf=0;
}
return(in_buf);
}
unsigned char _in_arroba_h(char n){//ENTRA UN ASCII DE HEXADE Y SALE COMO BYTE, o error
in_buf=bufer[n]; //in_buf = letra a traducir a byte/2
//uso in_buf por estar libre
in_buf-=0x30; //ver ascii wikip
if(in_buf>9){ //puede tratarse de >9
in_buf-=7; //ver ascii wikip
if(in_buf>15){ //
bitSet(ma_error,poe);
in_buf=0;
}
}
return(in_buf);
}