Guardar datos en la calculadoras
Buenas:
Esas Calculadoras tienen el USB como dices y el puerto serie. En mi caso se puede conectar que es menos complicado el puerto serie al puerto serie virtual del PC en el cual se conecta Arduino UNO.
Antes lo comunicaba con un RS232 entre medio para la comunicación del puerto serie puro y duro del PC a la calculadora.
No te preocupes por ello.
Aquí lo que se basa es entender el protocolo de comunicación.
Aquí explica algo.
CALCULADORAS CASIO
PROTOCOLOS DE COMUNICACIONES para las series: FX9750G,FX9850G,FX9950G,CFX-9850GB PLUS,CFX-9950GB PLUS. (caso de enviar o recibir un datos de forma aislada, series anteriores a estas, no lo pueden hacer; solo mandan archivios).
Me encontre con una calculadora que presenta comunicacion serial en formato TTL, es de lo mejor. Las aplicaciones, una vez nos apropiemos de su protocolo, son infinitas.
Somos solo dos personas en internet que reportamos aplicaciones de estas caracteristicas:
Alberto Ricci Biti (EL DATALOGGER)
Gustavo Ramirez P. (UN-2000)
Puedes con esta aplicación convertir esta calculadora en una poderosa herramienta para aplicaciones de monitoreo, control y registro de datos, si la combinas con un hardware que pueda comunicarse con ella; sea un PC o una aplicación con microcontrolador.
Pronto publicare en este webb, una aplicación con el pic 16F84 para enviar y recibir datos del mundo real. Te remito a otro sitio con aplicaciones de esta calculadora en busca por alberto ricci bitti (no hay mas en internet que yo sepa, si lo encuestras por favor mandame un correo) Ademas hay muchos sitios de interes de casio para bajar progranas,te indicare como hacer tu cable serial y de mi pagina podras baja el programa FA-122 para transferir programas desde y hacia el PC. Yo usare esta aplicación para implementar un robot sobre la calculadora.
CUANDO SE EJECUTA LA INSTRUCCIÓN RECIVE ( variable ) SE DAN LOS SIGUENTES EVENTOS EN EL PUERTO DE LA CASIO
1 - la calculadora manda 15h
2 - el transmisor debe devolver un 13h
3 - la calculadora manda luego, un frame de 50 bytes (INICIO); donde el primer caracter es 3Ah y el ultimo es el checksum invertido.
de los 49 primeros caracteres (a modo de byte), el byte 12 es el valor que la calculadora le asigna a la variable que es su valor ASCII, el resto son caracteres de control y se deben respetar tal como aca se presentan.
4 - El transmisor debe mandar 06h de respuesta; es el ok o con 22h si hay errores.
5 - la calculadora responde con 06h; si no hay errores, pero si los hay ella manda un 22h, o un cero.
6 - El transmisor manda el FRAME DE RESPUESTA.
7 - La calculadora manda un 06h si no reporta errores, o un 22h si los reporta.
8 - Ahora el transmisor debe mandar los datos en el formato siguiente:(ACA SE MANDA EL FRAME DE DATOS)
a- basicamente aca se mandan 16 bytes (TAMAÑO DEL FRAME de Datos)repartidos asi:
-Los 5 primeros Bytes, los copia de la tabla-3
-luego, los que siguen son los datos en formato BCD, donde el nibble mas significativo del sexto byte es cero apartir de aca se coloca luego la mantiza del numero a transmitir; para esto se usan los bytes desde el seis hasta el trece; el byte numero catorce indica los signos de el dato que el protocolo de la calculadora debe representa asi::
Pone 50h cuando la mantiza y exponente son negativos
Pone 51h cuando solo la mantiza es negativa
Pone 01h cuando los dos son positivos
Pone 00h cuando solo el exponente es negativo
Si el exponente es positivo se representa en BCD; pero si es negativo se representa asi; 69h menos el valor (real) del exponente y este resultado es el valor que se debe enviar; este calculo lo realiza el transmisor.
La representacion tipica es asi:
Var = 3Ah-00h-01h-00h-01h-x1h-x2h-x3h-x4h-x5h-x6h-x7h-x8h-x9h-x10h-x11h-x12h-x13h-(Signos h)-(Exponenteh)-(CHECKSUM INVERTIDOh).
EL CHECKSUM INVERTIDO, se calcula asi; se suman todos los primeros 15 datos (frame de datos), le restamos 3Ah, luego efectuamos con el resultado anterior una XOR con FFh y luego le sumamos 01h y asi se calculan siempre el ultimo Byte en todos los frames; sean estos de 16Bytes como el de datos o como los de 50Bytes.
Done el primer carácter del numero representado se coloca apartir del segundo nibble del sexto Byte.
9 - La calculadora manda 06H si no reporta errores
10 - El transmisor envia el paquete final
Ejemplo:
Si se va a mandar los numeros 123456789. La calculadora los interpreta así 1.23456789 e + 8, Pero los representa así en hex: Apartir del sexto byte en el frame de datos es para los bytes entre el sexto hasta el cheksum es así:
3Ah,00h,01h,00h,01h,01h,23h,45h,67h, 89h, 00h, 00h, 00h, 01h, 08h, (CHEKSUM INVERTIDOh)
Nota: 01h antes del 08h indica que los dos son positivos mantisa y exponente.
Ejemplo: Si se va a mandar los números 5436, La calculadora los interpreta así 5.436 e + 3, Pero los representa así en hex:
Apartir del sexto byte en el frame de datos quedaria asi:
05h-43h-60h-00h-00h-00h-00h-00h-01h-03h-(CHEKSUM INVERTIDOh)
01h antes del 03h indica que los dos son positivos mantisa y exponente. El 03h indica el exponente
Ejemplo: Si se va a mandar los números -546.7896 e-4. La calculadora los interpreta así -5.46789 e -2, Pero los representa así en hex: apartir del sexto byte en el frame de datos es así: 05h-47h-67h- 89h-00h-00h-00h-00h-50h-67h-(CHEKSUM INVERTIDOh)
El 50h, indica que los dos son negativos .el 67h = 69h menos el valor del exponente (02h)
67h=69h - 02h
Segundo caso: la casio transmite un dato, instrucción SEND( variable )
1 - La calculadora envía el numero 15h
2 - El receptor debe enviar un 13h (ok)
3 - La calculadora envía un frame de inicio, con el mismo formato (es el mismo frame de respuesta del caso anterior), el bit doce es el valor de la variable en este frame, cambia un poco por que debe indicar que es de transmisión desde la calculadora, Y el ultimo es un cheksum.
4 - El receptor contesta con 06h si no reporta errores o responde con 22h o 00h si los hay.
5 - La calculadora envía el frame de datos (16 Bytes) es el mismo del caso Receive( ); la calculadora envía los datos apatir del sexto byte pero acá surge algo diferente, el valor del exponente para el caso negativo se calcula así: 9Ah - valor absoluto del exponente negativo = valor a enviar al dispositivo receptor. De resto, todo es igual.
6 - El receptor contesta con 06h si no reporta errores o 22h si los hay o con 00h.
7 - la calculadora envía el frame de fin, que es el mismo de la instrucción Receive( ).
FRAME DE RESPUESTA, INSTRUCCIÓN RECEIBE(A) o DE INICIO EN INSTRUCCIÓN SEND(A) donde antes A tiene un valor de: A=123456789
SEND(A) ; A es la Variable
3A, 56, 41, 4C, 00, 56, 4D, 00, 01, 00
01, 41, FF, FF, FF, FF, FF, FF, FF, 56
61, 72, 69, 61, 62, 6C, 65, 52, 0A, FF
FF, FF, FF, FF, FF, FF, FF, FF, FF, FF
FF, FF, FF, FF, FF, FF, FF, FF, FF, D0
D0 es el valor del cheksum invertido
41 = Chr$(A) codigo ascci de A (hex)
FRAME DE DATOS (A=123456789) o tambien asi, A=1.23456789 e+8
3A, 00, 01, 00, 01, 01, 23, 45, 67, 89
00, 00, 00, 01, 08, 9C
FRAME DE FINAL
3A, 45, 4E, 44, FF, FF, FF, FF, FF, FF
FF, FF, FF, FF, FF, FF, FF, FF, FF, FF
FF, FF, FF, FF, FF, FF, FF, FF, FF, FF
FF, FF, FF, FF, FF, FF, FF, FF, FF, FF
FF, FF, FF, FF, FF, FF, FF, FF, FF, 56
( 45,4E,44 ) es E,N,D (END en formato ascci),56 es el cheksum invertido
FRAME DE INICIO (INSTRUCCIÓN RECEIBE(A)
3A, 52, 45, 51, 00, 56, 4D, FF, FF, FF
FF, 41, FF, FF, FF, FF, FF, FF, FF, FF
FF, FF, FF, FF, FF, FF, FF, FF, FF, FF
FF, FF, FF, FF, FF, FF, FF, FF, FF, FF
FF, FF, FF, FF, FF, FF, FF, FF, FF, 5D
D0 cambia, si cambia 41 = Chr$(A); el nombre de la variable
5D es el cheksum invertido