Autor Tema: protocolo de comunicacion para calibre digitial con salida de datos  (Leído 11069 veces)

0 Usuarios y 6 Visitantes están viendo este tema.

Desconectado cfede1984

  • PIC10
  • *
  • Mensajes: 6
Re: protocolo de comunicacion para calibre digitial con salida de datos
« Respuesta #15 en: 03 de Mayo de 2013, 13:08:25 »
Bonito proyecto, pero, ¿dónde está el bluetooth?

Esta noche publico un avance para armar todo con Bluetooth. Quise hacerlo ahora pero no acepta algunos archivos el blog!
Saludos,

Federico

Desconectado lucaspascual

  • PIC10
  • *
  • Mensajes: 31
Re: protocolo de comunicacion para calibre digitial con salida de datos
« Respuesta #16 en: 03 de Mayo de 2013, 16:43:38 »
hola cfede1984 recien veo esto q publicaste, el programa para este calibre esta hecho en ccs? Podrias pegar aca el programa hecho? ya tengo la señal acondicionada y estoy trabajando en el software.
Pensaba q lo q habia hecho iba andar pero me esta dando un poco de dolor de cabeza ya que no me toma los datos del calibre.
El programa q hice detecta el primer flanco del clock mediante una interrupcion y luego por temporizacion hago el muestro de cada dato. Uso un cristal de 20 Mhz para tener tiempo de hacer todo.
Este es el programa q hice, ya no se por donde buscar el error.
Código: [Seleccionar]
#include <16f877.h>
#fuses hs,nowdt,put,nowrt,nolvp,noprotect
#use delay(clock=20000000)
#use fast_io(b)
#include <lcd.c>

int8 dato=0x00;   


#int_ext

void ext_isr()
{
disable_interrupts(global);
delay_us(498);   
output_high(pin_b7);
output_low(pin_b7);
if (input(pin_b1)==1){
bit_set(dato,0);}
else{
bit_clear(dato,0);}
delay_us(12);
output_high(pin_b7);
output_low(pin_b7);
if (input(pin_b1)==1){
bit_set(dato,1);}
else{
bit_clear(dato,1);}
delay_us(12);
output_high(pin_b7);
output_low(pin_b7);
if (input(pin_b1)==1){
bit_set(dato,2);}
else{
bit_clear(dato,2);}
delay_us(12);
output_high(pin_b7);
output_low(pin_b7);
if (input(pin_b1)==1){
bit_set(dato,3);}
else{
bit_clear(dato,3);}
delay_us(12);
output_high(pin_b7);
output_low(pin_b7);
if (input(pin_b1)==1){
bit_set(dato,4);}
else{
bit_clear(dato,4);}
delay_us(12);
output_high(pin_b7);
output_low(pin_b7);
if (input(pin_b1)==1){
bit_set(dato,5);}
else{
bit_clear(dato,5);}
delay_us(12);
output_high(pin_b7);
output_low(pin_b7);
if (input(pin_b1)==1){
bit_set(dato,6);}
else{
bit_clear(dato,6);}
delay_us(12);
output_high(pin_b7);
output_low(pin_b7);
if (input(pin_b1)==1){
bit_set(dato,7);}
else{
bit_clear(dato,7);}
enable_interrupts(global);

}

void main()
{

set_tris_b(0x03);
output_low(PIN_B7);
output_low(PIN_B6);
port_b_pullups(true);
lcd_init();
enable_interrupts(int_ext);
ext_int_edge(l_to_h);
enable_interrupts(global);

for(;;)
{

printf(lcd_putc,"\ndato= %u",dato);
delay_ms(50);
}
}

Ustedes pueden ver algun error q se me esta pasando a mi?
Saludos

Desconectado lucaspascual

  • PIC10
  • *
  • Mensajes: 31
Re: protocolo de comunicacion para calibre digitial con salida de datos
« Respuesta #17 en: 03 de Mayo de 2013, 17:32:44 »
El problema esta en la toma de lectura, cuando desconecto la entrada de datos al pic y la coloco a 5 V me muestra el valor 255 en el display (osea 11111111 en binario) y cuando esta a masa me muestra el valor 0. Pero cuando conecto la salida de datos del calibre al micro me muestra el valor 0 en el display, osea q no esta tomando ningun valor. Puede ser q la lectura del puerto no se haga con tanta rapidez como el dato y no tome la lectura?

Desconectado AcoranTf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1093
Re: protocolo de comunicacion para calibre digitial con salida de datos
« Respuesta #18 en: 03 de Mayo de 2013, 18:46:11 »
Hola gente, me llamo la atencion este hilo y mas aun al comprobar que el calibre que se ve en el video es igual a uno que compre hace algunos dias en Lidl.
Ya desde el principio observe que tiene un conector, pero pense igual que otro de vosotros que era para calibrarlo o algo asi. Al ver este hilo y el video, he mirado de nuevo mi calibre y ahora estoy aun mas confuso ya que vosotros hablais de dos pines y el mio tiene un "edge conector" de 4 pines, o sea un conector compuesto por cuatro pistas de circuito impreso. No tienen leyenda alguna y se encuentra justo donde Manolo tiene el dedo puesto en el video, o sea justo encima de la pila.
¿Alguien sabe algo al respecto?.

Saludos.

Desconectado lucaspascual

  • PIC10
  • *
  • Mensajes: 31
Re: protocolo de comunicacion para calibre digitial con salida de datos
« Respuesta #19 en: 03 de Mayo de 2013, 19:01:58 »
Hola acorantf si es el mismo del que estamos hablando de 4 pines, pero descartamos el de masa y de alimentacion (1,5V).
Quedaria asi:
1 pin de masa
1 pin de clock
1 pin de dato
1 pinde 1,5V
Te adjunto un archivo rar con informacion del protocolo, a ver si lo hacemos andar aqui.

Desconectado cfede1984

  • PIC10
  • *
  • Mensajes: 6
Re: protocolo de comunicacion para calibre digitial con salida de datos
« Respuesta #20 en: 03 de Mayo de 2013, 23:01:46 »
hola cfede1984 recien veo esto q publicaste, el programa para este calibre esta hecho en ccs? Podrias pegar aca el programa hecho? ya tengo la señal acondicionada y estoy trabajando en el software.
Pensaba q lo q habia hecho iba andar pero me esta dando un poco de dolor de cabeza ya que no me toma los datos del calibre...

No no, lo de CSS ni lo conozco, recien estoy empezando con C a traves de SDCC, pero por suerte al Assembler lo domino lo suficiente y para este tipo de proyectos (Y en base a mi previa experiencia en PICBASIC) les digo que el ASM es lo mejor por su constante y preciso control de los tiempos. El PIC de este proyecto corre con el OSC interno a solo 1 MHZ es decir que apenas puede ejecutar 6 o 7 instrucciones por cada cambio del CLOCK del calibre.
Bueno, ahora si lo prometido es deuda, dense una vuelta por mi blog recién armado para ver lo que estaba prometiendo (Ya que ustedes me impulsaron a hacerlo):

Digital Caliper to Bluetooth Interface

Lamentablemente lo escribí en Ingles, se que algunos protestaran :5] :5]  pero es para poder darle mas difusión, ya había escrito otro articulo en español y no paso nada :( con las visitas y eso q lo promocione a los 4 digivientos.
De todas formas google puede traducirlo todo y lo que no se entienda, pregunten tranquilos que lo que hice lo entiendo..
Si analizan, y como dije al principio, el firmware es 80% de lo que hizo Kevin Timmerman. El es el genio  ((:-)) yo solo una especie de Mac Gyver  :D :D.
Abrazo y espero que se prendan..

Federico

Desconectado AcoranTf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1093
Re: protocolo de comunicacion para calibre digitial con salida de datos
« Respuesta #21 en: 04 de Mayo de 2013, 11:25:35 »
Muchas gracias lucaspascual, en cuanto tenga un ratito lo miro.

Saludos.

Desconectado lucaspascual

  • PIC10
  • *
  • Mensajes: 31
Re: protocolo de comunicacion para calibre digitial con salida de datos
« Respuesta #22 en: 08 de Mayo de 2013, 22:52:17 »
hola cfede1984 muy interesante y util lo q hiciste con la comunicacion Te felicito. Pero antes de ir tan lejos recien estoy tratando de realizar la lectura y mostrarla en un display. Vos le entendes a la logica que sigue el programa grabado en el pic? Si es asi me gustaria hacerte unas consultas ya que no logro ver el valor correcto de la medida en el lcd. Por ejemplo cuando el calibre voy aumentando la medida en incrementos de 0,01 en el lcd visualizo incrementos de 1 en 1. Pero el problema aparece cuando llega al valor 0.09 en el calibre, en vez de pasar en el lcd de 9 a 10 coomienza de nuevo en 0. Pongo el codigo en ccs abajo por si alguien me puede dar algunas indicaciones de lo q este haciendo mal

Código: [Seleccionar]
#include <16f877.h>
#fuses hs,nowdt,noput,nowrt,nolvp,noprotect
#use delay(clock=20000000)
#use fast_io(b)
#include <lcd.c>
#include <STDLIB.H> 
#include <stdio.h>
int16 dato=0x00;
//float medida=0x00;
int1 bandera=false;
 
#INT_ext
void ext_isr()
{
   bandera = true;
}
 
void main()

   
   set_tris_b(0x03);
   output_low(PIN_B7);
   output_low(PIN_B6);
   
   lcd_init();
   enable_interrupts(INT_ext);
   ext_INT_edge(l_to_h);
   enable_interrupts(global);
 
   WHILE(true)
   {
      if(bandera==true)
      { 
         disable_interrupts(global);
         dato=0x00;
         delay_us(494);
         output_high(pin_b7);
         
 
         IF (input(pin_b1)==1)
         {
            bit_set(dato,0) ;
         }
 
         ELSE
         {
            bit_clear(dato,0) ;
         
         }
         output_low(pin_b7);
         delay_us(12);
         output_high(pin_b7);
         
 
         IF (input(pin_b1)==1)
         {
            bit_set(dato,1);
         }
 
         ELSE
         {
            bit_clear(dato,1);
         
         }
         output_low(pin_b7);
         delay_us(12);
         output_high(pin_b7);
         
 
         IF (input(pin_b1)==1)
         {
            bit_set(dato,2);
         }
 
         ELSE
         {
            bit_clear(dato,2);
         
         }
         output_low(pin_b7);
         delay_us(12);
         output_high(pin_b7);
         
 
         IF (input(pin_b1)==1)
         {
            bit_set(dato,3);
         }
 
         ELSE
         {
            bit_clear(dato,3);
         
         }
         output_low(pin_b7);
         delay_us(12);
         output_high(pin_b7);
         
 
         IF (input(pin_b1)==1)
         {
            bit_set(dato,4);
         }
 
         ELSE
         {
            bit_clear(dato,4);
         
         }
         output_low(pin_b7);
         delay_us(12);
         output_high(pin_b7);
         
 
         IF (input(pin_b1)==1)
         {
            bit_set(dato,5);
         }
 
         ELSE
         {
            bit_clear(dato,5);
         
         }
         output_low(pin_b7);
         delay_us(12);
         output_high(pin_b7);
         
 
         IF (input(pin_b1)==1)
         {
            bit_set(dato,6);
         }
 
         ELSE
         {
            bit_clear(dato,6);
         
         }
         output_low(pin_b7);
         delay_us(12);
         output_high(pin_b7);
         
 
         IF (input(pin_b1)==1)
         {
            bit_set(dato,7);
         }
 
         ELSE
         {
            bit_clear(dato,7);
         
         }
         output_low(pin_b7);
         //medida=dato/10;
         //bit_clear(bandera,0);
         
         printf(lcd_putc,"\ndato= %Lu",dato);
         bandera = false;
         delay_ms(20);
         
         //delay_ms(280);
         
         enable_interrupts(global);
     
      }
         
   }
}
 
Espero la colaboracion de alguien jajaj. Saludos

Desconectado cfede1984

  • PIC10
  • *
  • Mensajes: 6
Re: protocolo de comunicacion para calibre digitial con salida de datos
« Respuesta #23 en: 09 de Mayo de 2013, 21:59:47 »
hola cfede1984 muy interesante y util lo q hiciste con la comunicacion Te felicito. Pero antes de ir tan lejos recien estoy tratando de realizar la lectura y mostrarla en un display. Vos le entendes a la logica que sigue el programa grabado en el pic? Si es asi me gustaria hacerte unas consultas ya que no logro ver el valor correcto de la medida en el lcd. Por ejemplo cuando el calibre voy aumentando la medida en incrementos de 0,01 en el lcd visualizo incrementos de 1 en 1. Pero el problema aparece cuando llega al valor 0.09 en el calibre, en vez de pasar en el lcd de 9 a 10 coomienza de nuevo en 0. Pongo el codigo en ccs abajo por si alguien me puede dar algunas indicaciones de lo q este haciendo mal
...
Espero la colaboracion de alguien jajaj. Saludos

Hola Lucas! Una mano no se le niega a nadie. Primero que nada, vamos a dejar en claro algunas cosas.. Abramos el png adjunto. Puse un ejemplo midiendo 0.00 y otro con 0.01 mm. Los datos que sirven son los marcados en verde en el diagrama. (Cambie el modo operativo de la interface desde la misma terminal (en este caso CuteCom) para que transmita TAL CUAL LO QUE RECIBE -mas un byte de inicio mas un byte de checksum atras-) Resumiendo:
Violeta: Un byte de inicio generado por el PIC, no sirve para nada porque no lo genera el calibre.
Azul: 3 bytes absolutos, los genera el calibre pero no son utiles.
Verde: 3 bytes de posición relativa, son lo que tenes que utilizar!!!
Rojo: checksum ES GENERADO POR EL PIC no por el calibre, no sirve para nada.
Entonces a lo que voy, es que necesitas hacer algo equivalente con tu programa, tratar de leer los bytes tal cual y una vez que nos aseguramos que esto ESTA OCURRIENDO BIEN despues nos abocamos a transformar la data. Claro que esto implica multiplicar por 127/1024 para los mm al valor de los 3 bytes verdes y corre el punto dos lugares, o sea dividir por 100 en la practica.
Un detalle que quiero que se entienda, veras que pese a que el valor es 0.00 hay lecturas DIFERENTES. Esto es normal porque el calibre te esta transmitiendo info para armar muchos mas decimales que los que te muestra en pantalla. Sin embargo errores de todo tipo hacen que ese ultimo byte quede oscilando sin efectos a la hora en que transformamos los datos y truncamos el numero a una cantidad estable.
Otra cosa que te queria preguntar es si probaste conectar un analizador logico a la senal acondicionada a 5V del calibre, solo para asegurarte que esta todo bien conectado y los cables y formas de onda bien identificados. Te adjunto tambien una captura de esta hecha con el Pickit 2 Clone.
Repasando el ASM, tenemos el inicio de la lectura del calibre en la linea 479 clocksync, ahi busca una senal de clock con cierta longitud minima, y recien ahi cuando sabemos cuando va a terminar porque nos cercioramos con el analizador cuanto mide ese clock inicial, ahi nos mandamos con un bucle de alta velocidad a capturar los 3 bytes absolutos, totalmente inutiles para nuestro fin, despues esperamos el clock largo del medio con igual tecnica y nos largamos de nuevo por los 3 bytes utiles.
El resto es transformar los datos.
Por lo que mi recomendacion seria que trates de capturar esos bytes verdes como sea, si queres los azules tambien, y empezar a mostrarlos en la pantalla del LCD. Ahi si no se si se van a transformar en ASCII o que porque nunca me intereso su manejo.
Respecto a tu programa, te recomiendo ponerle algunos comentarios, pero creo que entiendo que queres hacer y creo que se lo que pasa.. la variable DATO son dos bytes de 8 bits, pero el calibre te transmite TRES bytes de 8 bits. Aparentemente vos con la interrupcion activas el mecanismo de lectura, esperas delay_us(494); y ahi te enterras hasta un punto que cae dentro de la lectura de los 2 ultimos. Vos deberias aterrizar en el clock alto del medio (ver timing.pdf) y leer los TRES BYTES para despues analizar cual es el numero. Porque medida NO ES IGUAL A dato/10 ES IGUAL A DATO (De 24 bits) / 1024 * 1.27 (Entiendo que la linea esta comentada con //)
Desconozco como es el manejo de los 16 bits que hace C, puede que la cosa venga por aqui.. de paso, con 16 bits tenemos como maximo 81.27 mm (2^16 /1024 *1.27)
Otra idea, casi siempre los compiladores de C permiten mandar ASM en el medio. Porque no pegar las rutinas de lectura y despues retomar con C a la parte feliz de mandar la data de la ruptura al LCD?? Si o si tiene que ser un dispositivo independiente? No puede una PC capturar diferentes datos en serie y graficar como se produce la ruptura??
Abrazo,

Federico

p/d: La semana proxima subo fotos al blog, para que se entienda que quise hacer..

Desconectado cfede1984

  • PIC10
  • *
  • Mensajes: 6
Re: protocolo de comunicacion para calibre digitial con salida de datos
« Respuesta #24 en: 14 de Mayo de 2013, 16:31:34 »
Lo prometido era deuda, actualice el blog con muchas fotos y detalles constructivos para que se entienda el proyecto y para que se prenda mas gente armando los suyos.

http://concifederico.blogspot.com.ar/2013/05/digital-caliper-to-bluetooth-interface.html



Seguimos en contacto!

Federico

Desconectado leobiofa

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 371
Re: protocolo de comunicacion para calibre digitial con salida de datos
« Respuesta #25 en: 14 de Mayo de 2013, 16:35:23 »
Que berraquera de proyecto lo felicito

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re: protocolo de comunicacion para calibre digitial con salida de datos
« Respuesta #26 en: 14 de Mayo de 2013, 17:09:31 »
Lamentablemente lo escribí en Ingles, se que algunos protestaran :5] :5]  pero es para poder darle mas difusión, ya había escrito otro articulo en español y no paso nada :( con las visitas y eso q lo promocione a los 4 digivientos.


Cuanta razón tienes, yo estoy preparando varios sitios web para proyectos comerciales y otros de tipo lúdico, y desde un principio me he planteado hacerlo TODO en inglés, por el mismo motivo, si lo pones en español no lo visita nadie (o como diríamos en España, no le interesa ni al tato).

Es una pena que la comunidad de habla hispana sea tan pobre, vale que USA es enorme y hay más gente de habla inglesa, pero en lengua hispana, aparte de España está toda Sudamérica y también en parte de Estados Unidos hay mucho hispanoparlante, lo que me parece a mi es que hay muy poca cultura técnica, por no decir "analfabetismo tecnológico", y eso ya es preocupante.

Uno de los sitios web que estoy montando, lo he habilitado como bilingue, pero al final, si hay que escribir todos los contenidos en dos idiomas, es un tostón, terminaré escribiéndolo todo en inglés, y quien lo quiera ver en español, que use el traductor de Google.


Salu2



Desconectado lucaspascual

  • PIC10
  • *
  • Mensajes: 31
Re: protocolo de comunicacion para calibre digitial con salida de datos
« Respuesta #27 en: 16 de Mayo de 2013, 20:35:37 »
Te felicito por el trabajo que hiciste cfede1984, yo hice funcionar el programa al fin (despues de renegar bastante).
El programa lo hice para 8 bits (osea que puedo medir hasta 2,55 mm) pero realizando unas pequeñas modificaciones en el programa podemos medir toda la escala. Para ampliar el rango de medida lo unico que debemos agregar son mas IF-ElSE dentro de la interrupcion RB0 y  guardar mas bits en dato como lo hice hasta el bit 8 (hay q declarar la variable dato como un entero de mayor tamaño).
Voy a poner el programa que hice por si alguien le interesa.
Código: [Seleccionar]
#include <16f877.h>
#fuses hs,nowdt,put,nowrt,nolvp,noprotect
#use delay(clock=20000000)
#use fast_io(b)
#include <lcd.c>
#include <STDLIB.H>   
 

float medida=0.0; 
int8  dato=0;
int8  dato1=0;
int8  dato2=0;
int8  dato3=0;
#INT_ext
void ext_isr()
{
   disable_interrupts(global);
         dato=0;
         medida=0;
         delay_us(499);
         output_high(pin_b7);
         
 
         IF (input(pin_b1)==1)
         {
            bit_set(dato,0) ;
         }
 
         ELSE
         {
            bit_clear(dato,0) ;
         
         }
         output_low(pin_b7);
         delay_us(12);
         output_high(pin_b7);
         
 
         IF (input(pin_b1)==1)
         {
            bit_set(dato,1);
         }
 
         ELSE
         {
            bit_clear(dato,1);
         
         }
         output_low(pin_b7);
         delay_us(12);
         output_high(pin_b7);
         
 
         IF (input(pin_b1)==1)
         {
            bit_set(dato,2);
         }
 
         ELSE
         {
            bit_clear(dato,2);
         
         }
         output_low(pin_b7);
         delay_us(12);
         output_high(pin_b7);
         
 
         IF (input(pin_b1)==1)
         {
            bit_set(dato,3);
         }
 
         ELSE
         {
            bit_clear(dato,3);
         
         }
         output_low(pin_b7);
         delay_us(12);
         output_high(pin_b7);
         
 
         IF (input(pin_b1)==1)
         {
            bit_set(dato,4);
         }
 
         ELSE
         {
            bit_clear(dato,4);
         
         }
         output_low(pin_b7);
         delay_us(12);
         output_high(pin_b7);
         
 
         IF (input(pin_b1)==1)
         {
            bit_set(dato,5);
         }
 
         ELSE
         {
            bit_clear(dato,5);
         
         }
         output_low(pin_b7);
         delay_us(12);
         output_high(pin_b7);
         
 
         IF (input(pin_b1)==1)
         {
            bit_set(dato,6);
         }
 
         ELSE
         {
            bit_clear(dato,6);
         
         }
         output_low(pin_b7);
         delay_us(12);
         output_high(pin_b7);
         
 
         IF (input(pin_b1)==1)
         {
            bit_set(dato,7);
         }
 
         ELSE
         {
            bit_clear(dato,7);
         
         }
         output_low(pin_b7);
         medida=dato/100.0;
         //bit_clear(bandera,0);
         
         printf(lcd_putc,"\fdato= %1.2fmm",medida);
         
         delay_ms(20);
         
         //delay_ms(280);
         clear_interrupt(INT_ext);
         enable_interrupts(global);
       
   
}
 
void main()

   
   set_tris_b(0x0F);
   output_low(PIN_B7);
   delay_ms(200);
   output_high(PIN_B4);
   delay_ms(20);
   dato1=0;
   dato2=0;
   dato3=0;
   lcd_init();
   enable_interrupts(INT_ext);
   ext_INT_edge(l_to_h);
   enable_interrupts(global);
 
   for(;;)
   {
    }
}
 

Por el pin RB0 entramos con la señal de reloj y por RB1 con el dato.
Por el pin RB7 coloque un pulso en queda IF_else para ver en que lugar de la señal hace el muestreo.

Espero q sirva. Saludos

Desconectado lucaspascual

  • PIC10
  • *
  • Mensajes: 31
Re: protocolo de comunicacion para calibre digitial con salida de datos
« Respuesta #28 en: 16 de Mayo de 2013, 20:46:51 »
cfede1984 ya que trabajaste a fondo con el calibre me gustaria preguntarte algo (igual va para cualquiera que haya trabajado con este calibre jaja).
Te paso a comentar mi problema, necesito tomar las medidas de 3 calibres y sacar un promedio de ellos, (pense que iba tener la suerte de poder sincronizarlos haciendo un ajuste de cero y utilizar un solo clock para tomar las medidas de los tres calibres pero no se sincronizan.) La verdad q ahora no se me ocurre otra idea para poder lograrlo, porquencima el calibre esta enviando los datos todo el tiempo. Se me hubiera facilitado mucho si me enviaran los datos solo cuando los necesito ( aca va la pregunta: tu sabes si existe alguna forma de que me envie un dato solo cuando yo le pida) .????

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: protocolo de comunicacion para calibre digitial con salida de datos
« Respuesta #29 en: 16 de Mayo de 2013, 21:20:16 »
La verdad es que esta un poco mal diseñado el protocolo, deberian haberlo puesto estilo SPI en modo slave pero estos chinos son como son... Creo que para hacer lo que quieres tendrias que modificarlo, sabiendo que tiene un pic el calibre puedes intentar leerlo y cambiarlo a tu gusto.


 

anything