TODOPIC
Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: lucaspascual en 28 de Abril de 2013, 19:35:40
-
Buenas tardes, estoy realizando un proyecto para realizar ensayo de ruptura de probetas de hormigon cilindrica. Una de las medidas que realizo es de la distancia que se comprime la probeta de hormigon que anda en el orden de 0,50 mm (casi nada).
Despues de pensar en varios metodos encontre un calibre digital con salida de datos.
Encontre informacion mas o menos de como es el protocolo de comunicacion.
Consta de dos pínes, un pin es un clock y el otro pin es la salida de datos. La salida de datos contiene 48 bits donde los primeros 24 bits me indican la medida absoluta del calibre y los segundo 24 bits la medida relativa que es la que me interesa.
Mi problema es la velocidad del clock la cual es de 77khz.
A continuacion adjunto fotos del clock y de los datos.
Necesito alguna idea de como realizar el guardado de los 24 bits
-
no sera SPI? Si es asi ya lo tienes integrado en los pics, haces 3 lecturas de 8bits y ya unes los datos
-
¿Será como este?
Si es así, el protocolo se llama "Chinese digital" y aquí puedes ver un tutorial:
http://pcbheaven.com/exppages/Digital_Caliper_Protocol/?topic=chinesebin
-
Buen dia Nocturno, exactamente es ese el calibre que tengo y ese es el protocolo. Tengo informacion del protocolo que ahora la subo. Pero mi duda es como realizo la lectura de los datos.
Estoy programando en el CCS y una opcion q pense es q se realice una interrupcion con cada pulso del reloj, pero el reloj es de una frecuencia de 77 khz y no le da tiempo a realizar la interrupcion.
-
Aquí envió el archivo word en .*rar del protocolo q usan estos calibres, espero que les sirva también al que este intentando usar estos calibres ya que son muy económicos (alrededor de 43 dolares) y bastante precisos.
-
Yo lo veo bastante parecido al SPI, en cierto modo creo que se podria adaptar por spi asi te olvidas de tener que leer los datos.
Yo tambien tengo ese calibre y no sabia que se le podia hacer eso, es cierto que cuando lo vi tenia para enchufar un conector y simplemente pense que era para calibrarlo o algo asi...
-
Hola Merlinz, ese conector es la salida de datos, vos decis q podria tomar la lectura con SPI? Viste como es la señal de clock?
-
Si vi la señal, sin embargo no se ve muy clara en las fotos porque la han capturado demasiado juntas y habria que interponer los datos encima del clk para ver si concuerdan, de todas formas el SPI tiene varios modos de funcionamiento que entre ellos cambian el tiempo de captura de los datos y tambien el tipo de clk, lo unico que falla es que no tiene el CS para que el SPI sepa cuando se estan enviando los datos.
-
La verdad q no tengo mucha informacion sobre spi, pero ya me pongo a estudiarlo al tema, bien tenga una novedad la comunico
-
Para leer la trama utilicé una función dedicada, en lugar de una interrupción. Básicamente mi función hace lo siguiente:
1. Espera flanco de subida de clock
2. Espera 1ms
3. Bucle de lectura de 24 bits
4. Espera flanco de bajada de clock
5. Lee la señal data y la carga en el bit correspondiente
6. Incrementa contador bucle
7. Espera flanco de subida de clock
8. Fin de bucle
-
Nocturno si pense de esa manera intentar hacerla, ahora me surgieron una preguntas.
Al flanco de subida lo esperas con un puerto de entrada verdad?
Porque esperas 1 ms? A mi me interesa la medicion relativa, osea los segundos 24 bits.
Y porque lees la señal data despues de la bajada de clock?
-
Ufff, no me acuerdo del protocolo, me he limitado a transcribirte el pseudocódigo del código que hice en su día. Pero mira el tutorial que enlacé antes; ahí está explicado el protocolo y seguro que encontrarás tú mismo las respuestas a esas preguntas.
Ese algoritmo que te he descrito es el que usé en el vídeo que te mostré antes, así que funciona bien.
Por cierto, ambos pines, data y clock, son entradas.
-
si estuve viendo el protocolo, me aclaraste una duda que tenia con tu explicación ya que estaba intentando hacer la lectura de cada bits con la interrupción externa del pic en ccs, pero cuando sucedía la interrupción ya habían pasado todos los datos (es demasiado lenta la interrupcion para la frecuencia del clock)
-
si estuve viendo el protocolo, me aclaraste una duda que tenia con tu explicación ya que estaba intentando hacer la lectura de cada bits con la interrupción externa del pic en ccs, pero cuando sucedía la interrupción ya habían pasado todos los datos (es demasiado lenta la interrupcion para la frecuencia del clock)
Hola soy Federico de Comodoro. Acabo de terminar mi proyecto de Calibre a Bluetooth, me base en trabajo realizado por Kevin Timmerman, pero como no tengo camara de fotos disponible ahora, no lo puedo publicar en mi blog. Sin embargo todo lo que necesitas saber esta aca y encima el codigo esta bien explicado.
http://www.compendiumarcana.com/caliper/
esta clarisimo y comprobadisimo que funciona. Es el único código que esta totalmente disponible. Para la aplicación que estas por hacer, te recomiendo armar esto y listo. Si tenes alguna duda del codigo avisame porque yo ya me lo se de memoria de tanto revisarlo para adaptarlo al Bluetooth. Por la alta frecuencia de la senal se adquiere con una rutina de muy alta velocidad, no usa las interrupciones. Otra cosa que te recomiendo es armar un amplificador de 1.5V a 5V con un par de transistores y conectarlo a un analizador logico para comprobar que el calibre transmite 2 grupos de 3 bytes de 8 bits cada uno..
Saludos
Federico
-
Bonito proyecto, pero, ¿dónde está el bluetooth?
-
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
-
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.#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
-
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?
-
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.
-
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.
-
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 (http://concifederico.blogspot.com/2013/05/digital-caliper-to-bluetooth-interface.html)
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
-
Muchas gracias lucaspascual, en cuanto tenga un ratito lo miro.
Saludos.
-
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
#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
-
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..
-
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 (http://concifederico.blogspot.com.ar/2013/05/digital-caliper-to-bluetooth-interface.html)
(http://1.bp.blogspot.com/-omY5qktvB-Q/UZJ7BW_4VrI/AAAAAAAAAYE/cudFFIVYV88/s640/Esquema.jpg)
Seguimos en contacto!
Federico
-
Que berraquera de proyecto lo felicito
-
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
-
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.
#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
-
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) .????
-
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.
-
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.
jaja y encima no sabes lo que me paso, como necesito tres calibres compre los tres en el mismo lugar a la misma hora y los tres calibres eran iguales "supuestamente" pero cuando le coloco el osciloscopio veo q uno de ellos venia con otro protocolo, me queria morir, pero por suerte tenia uno de uso personal que coincidia con el de los otros dos.
Con respecto al pic del calibre no tengo idea q puede llegar a traer, es una placa de 2 cm por 6 cm mas o menos y no trae ni una resistencia solo algo tapado con algo negro.
-
Vamos, q le han puesto la resina esa que tapa todo, pues entonces poco mas podras hacer, quizas interrumpir la alimentacion del calibre o algo asi, no se me ocurre nada mas. Lo del pic lo dije por una captura que vi en un post donde venia un pic12, supongo que sera otro tipo de calibre.
-
No veo cómo conseguir que se sincronicen; cada uno va con su clock y por mucho que quieras encenderlos a la vez, a medida que pasa el tiempo se irán separando. La verdad es que el protocolo es muy sui géneris.
-
No veo cómo conseguir que se sincronicen; cada uno va con su clock y por mucho que quieras encenderlos a la vez, a medida que pasa el tiempo se irán separando. La verdad es que el protocolo es muy sui géneris.
Utilizando las interrupciones de RB, detectando el cambio de nivel del primer pulso de clock??
-
Así podrás leerlos, pero no conseguir que marchen todos al unísono.
-
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) .????
Hola, y felicitaciones por los avances! :-/ No hay forma de indicarles cuando queremos el dato. Cual es el problema de esperar como máximo 300 ms que es mas o menos la frecuencia en que recibimos los datos de cada calibre? Vas a tomar medidas basadas en función del tiempo y a "alta velocidad"? Lo único que se me ocurre es medir con el osciloscopio para los tres calibres cuanto tiempo tardan como máximo desde que reciben el voltaje hasta que envían el primer dato, pero esto implicaría un reseteo progresivo y se perdería la lectura anterior. Desconozco si este tiempo es constante o no para cada calibre, dado que no tengo osciloscopio y el analizador logico que dispongo es un pickit 2 cuyo tiempo maximo a duras penas es de 100 ms..
Saludos!
-
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) .????
Hola, y felicitaciones por los avances! :-/ No hay forma de indicarles cuando queremos el dato. Cual es el problema de esperar como máximo 300 ms que es mas o menos la frecuencia en que recibimos los datos de cada calibre? Vas a tomar medidas basadas en función del tiempo y a "alta velocidad"? Lo único que se me ocurre es medir con el osciloscopio para los tres calibres cuanto tiempo tardan como máximo desde que reciben el voltaje hasta que envían el primer dato, pero esto implicaría un reseteo progresivo y se perdería la lectura anterior. Desconozco si este tiempo es constante o no para cada calibre, dado que no tengo osciloscopio y el analizador logico que dispongo es un pickit 2 cuyo tiempo maximo a duras penas es de 100 ms..
Saludos!
Gracias ya lo solucione, para cada calibre utilice una interrupcion externa, mi problema era q estaba trabajando con el 16f877 q trae una sola interrupcion, despues me di cuenta q tenia un 18f4550 q trae 3 interrupciones externas asi que me salvo la vida.
-
Que tal LucasPascual? despues de años de no participar en el foro vuelvo a tratar de de dar alguna mano a quien lo necesite.. vi que estas tratado de medir desplazamiento del cilindro de una maquina de ensayo de probetas de concreto.. mi pregunta sería, es una maquina de ensayo comercial? Por que no tiene funcionando su sistema original de medición? Te consulto por que trabajo con algunas maquinas del tipo y, si bien parece que lo estas solucionando de forma alternativa, por ahí te puedo ayudar..
Saludos Mariano!