TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: cucaracha en 26 de Octubre de 2003, 11:14:00

Título: Ayuda con DS1621
Publicado por: cucaracha en 26 de Octubre de 2003, 11:14:00
Bueno, empiezo a hacer mis pinitos en C. He hecho este programa. La comunicación por RS232 parece que funciona, pero la comunicación con el DS1621 parece no estar bien, o sigo la pautas mal, no se.
Os dejo los archivos y la simulación en proteus para ver si veis mi error.
 Vi unos ejemplos en C para el Hi-tech (creo). Este usa los comandos I2C_COMMAND(X,X), I2C_WRITE(X,X,X) e I2C_ReadWord(X,X). A que equivaldrían en CCS. Mi programa lo hice fijándome en uno hecho en hitech.

Graaaacias!!
Título: RE: Ayuda con DS1621
Publicado por: cucaracha en 26 de Octubre de 2003, 16:05:00
Problema resuelto. Miré más detenidamente el datasheet y...
Al menos ahora funciona.
Tengo una duda con la función I2C_READ(x). Si pongo x=1 o lo dejo en blanco la función devuelve el acuse de recibo ACK. Si pongo x=0 no lo envía.
No se si estoy en lo cierto, pero este acuse de recibo se usa para cuando el esclavo es otro micro, no. Vamos que con el DS1621 se pone siempro I2C_READ(0), no??

Si en mi ejemplo en el último read pongo 0 lo hace bien, pero si lo dejo en blanco (=1), en el siguiente paso por el bucle me lee el registro config como 255 en lugar de 139 que es lo que lee en el primer paso.
El ejemplo es algo cutre, pero es sólo para entender el IC. Cuando lo simulen, pulsan pause y entonces pueden leer lo que está enviando.
Por cierto, creo que en mi ejemplo sobraría algún i2c_stop que otro. Probaré a ver...

Comentenme...

Un saludo.

PD: borro el archivo del mensaje anterior y lo reemplazo por este.
Título: RE: Ayuda con DS1621
Publicado por: cucaracha en 26 de Octubre de 2003, 16:15:00
He quitado todos los i2c_stop. Sólo he puesto uno al final de la función de inicialización y otro al final del bucle while(1), después del if. Y sigue funcionando.

Saludos!
Título: RE: Ayuda con DS1621
Publicado por: pocher en 26 de Octubre de 2003, 23:52:00
Cucaracha mira en los ejemplos que trae el CCS, encontrarás el DS1621.c donde configura y lee este dispositivo.

Si consigues hacer que funcione en PROTEUS, sube al FORO los resultados, haz el favor.

Un saludo
Título: RE: Ayuda con DS1621
Publicado por: cucaracha en 27 de Octubre de 2003, 02:59:00
Si pocher, vi el ejemplo que viene en el CCS. Lo que pasa es que quería hacerlo yo mismo y así entender bien como funciona. La cosa es que ahora se lo que hace ese archivo que comentas y además lo entiendo.
En el archivo que dejé arriba está la simulación de lo que hice. (o te refieres a la simulación del ejemplo del ccs?)

Un saludo!!
Título: RE: Ayuda con DS1621
Publicado por: pocher en 27 de Octubre de 2003, 09:11:00
Del de CCS, ayer intenté simularlo pero no funcionó. Algo debí de hacer mal.

Un saludo
Título: RE: Ayuda con DS1621
Publicado por: cucaracha en 27 de Octubre de 2003, 09:52:00
246, 246 y por que sale 246 ¿!&%·/(!! ...
Estos ingleses...
http://www.futuresource.com/weather/cfcalc.asp
Ahora te lo dejo en el almacén...

Un saludo!
Título: RE: Ayuda con DS1621
Publicado por: cucaracha en 27 de Octubre de 2003, 10:11:00
Aquí está:
http://miarroba.com/foros/ver.php?foroid=132139&temaid=1150363


Saludos!!
Título: RE: Ayuda con DS1621
Publicado por: pocher en 27 de Octubre de 2003, 11:30:00
Gracias Cucaracha. Yo lo tenía igual que tú pero no ponía los dos define DAL_SCL y DAL_SDA .

No sé donde se utilizan, en el programa principal no aparecen y en el DS1621.C de CCS támpoco.

Seguramente perteneceran al dispositivo I2C DS1621. No me he mirado el Datasheet, ¿hay que definirlos previamente?

Un saludo
Título: RE: Ayuda con DS1621
Publicado por: cucaracha en 27 de Octubre de 2003, 14:42:00
En el archivo ds1621 se usan en la función init_temp(). Si te fijas, son los pines por donde se va a transmitir el ic2 (SCL y SDA).
En la línea:
#use i2c(master,sda=DAL_SDA, scl=DAL_SCL)
defines sda como DAL_SDA y luego dices con el define que esto sea el PIN_B7. Si no pones define en tu programa, el ds1621.c lo define como PIN_B1 por defecto. Lo mismo con el otro pin. Al que el programa se le ocurrió llamarlos así... no se.
Por cierto, alguién sabe donde se encuentran las funciones del I2C en el ccs, vamos el código. Me interesa verlas.
Creo que es a esto a lo que te referías no??.

Saludos!
Título: RE: Ayuda con DS1621
Publicado por: pocher en 27 de Octubre de 2003, 23:51:00
Ya está, solucionado, hay días que estás espeso y no ves tres en un burro.

 Te cuento, resulta que tengo instalada las dos versiones del CCS, la pcwh y la antigua pcm, pués en la carpeta de proyecto que creé en PROTEUS copié el DS1621.C de la versión antigua que no tiene nada que ver con la del pcwh. La antigua solo mide de 0-255º y en esta nueva se pueden medir hasta grados negativos, y los "defines" no estan.

Para ver el código en ensamblador de las funciones, quizá te pueda servir el PROTEUS, pone la línea correspondiente de C y debajo las instrucciones en ensamblador de esa línea.

Un saludo
Título: RE: Ayuda con DS1621
Publicado por: J1M en 28 de Octubre de 2003, 03:17:00
pq al ejecutarlo el proteus me pide ds1621.dll????

la verdad nunka he utilizado este programilla.. una introduccion rapidilla me vendria perfecta

gracias
Título: RE: Ayuda con DS1621
Publicado por: pocher en 28 de Octubre de 2003, 11:58:00
Hola Venum, para que simule este dispositivo en PROTEUS debes tener el DALLAS.LIB en la carpeta LIBRARY y el DS1621.dll en la carpeta MODELS.

Parece ser que el que te falta es el .dll, te paso el fichero.

Para saber como se configura el PROTEUS bucea en el apartado de simuladores del FORO hay bastantes explicaciones y un tutorial.

Un saludo
Título: RE: Ayuda con DS1621
Publicado por: J1M en 28 de Octubre de 2003, 14:16:00
ok tngo la SP5 pro, vamos a trastearla un pokilllo parece q ya me voy enterando
gracias

pd: estas dll de donde se sacan?
Título: RE: Ayuda con DS1621
Publicado por: cucaracha en 28 de Octubre de 2003, 14:25:00
Si no tiene el ds1621.dll dudo que tenga la librería.
De aquí te puedes bajar todos los archivo y algún modelo más. Por cierto, a mi el I2C-SPY en la versión del proteus que tengo. No se si en la antigua 5.2 funcionaría
Bájalos aquí: http://undongle.newmail.ru/models.dhtml

Por cierto pocher, en un programa que estoy haciendo, si configuro así el 16877 me funciona
#use I2C(master, sda=PIN_C4, scl=PIN_C3)
pero si lo hago así no??
#use I2C(master, sda=PIN_C4, scl=PIN_C3, force_hw)

Saludos!
Título: RE: Ayuda con DS1621
Publicado por: pocher en 28 de Octubre de 2003, 22:47:00
La opción force_hw no la he visto en el manual, pero sí la NOFORCE_SW (Use hardware I2C functions) que en teoría debe de hacer lo mismo (no forzar sofware <--> forzar hardware). Prueba así, a ver.

Un saludo
Título: RE: Ayuda con DS1621
Publicado por: cucaracha en 29 de Octubre de 2003, 09:39:00
Si, también probé como tu comentas y noforce_hw. Ahora he probado en el programa primero que me hice y me funciona. Pero en uno más largo que estamos realizando no??? raro...
Otra cosa, me es imposible escribir sobre el registro config, TH y TL.
Por ejemplo, escriba lo que escriba en config simpre al leer me devuelve 139 (quiero recordar).
Como no me fio mucho de la dll, estamos esperando que nos lleguen los componentes para probarlo físicamente. Ya os contaré.... Ni que decir tiene que si alguien es capaz de escribir correctamente y al simular en proteus le sale lo que debe que me lo comente... ok!!

Una cosa que no me queda clara es la precisión que tiene el DS1631. El DS1621 dice que tiene una precisión de 0.5ºC y si te fijas en los registros de la temperatura tienes 8bytes para la la parte entera con signo, y 1bit de otro byte (el 7 en concreto) para indicar si es x.5º (pag4 datasheet). Me van entendiendo???. Pues bien, el DS1631 dice al principio que tiene una precisión de 0.5ºC también, pero si nos fijamos, ahora el 2ºbyte, no sólo genera ese 7º bit, sino que genera los 4bit altos. Y en la tabla (pag7 datasheet) donde vienen los ejemplos vemos temperaturas como +25.0625, vamos que tengo una resolución de 0.0625.
Que opinan??

Saludos!!
Título: RE: Ayuda con DS1621
Publicado por: litris en 27 de Noviembre de 2003, 05:51:00
¿Que version as usado de proteus?por que al cargar me da un error de version en la 6 sp1 y en la 5.20.07.

Saludos.

Ya!!! he instalado la 6.2 sp4 y ahora si funciona
Título: Re: Ayuda con DS1621
Publicado por: Blanca Sánchez en 14 de Mayo de 2007, 02:28:49
hola, que tal:

Yo también estoy trabajando con el DS1621 pero he tenido muchas dificultades para poder realizar la comunicación I2C. He revisado otros ejemplos que no incluyen el DS1621, pero si hablan de la comunicación I2C. Es inútil que envíe un comando sensor pues no me envía el ACK (donde el esclavo reconoce su dirección y la operación a realizar sobre él R/W'). Se que tiene mucho tiempo que se escribió en este mensaje pero quisiera saber si puedes subir tu programa nuevamente, pues veo que ya no está.

He visto que tu programa está en CCS... Yo programo en C18 y por tanto no pienso "fusilarme" tu programa, pues yo también quiero entender como funciona a detalle este protocolo de comunicaciones pues quiero implementarlo en memorias y otros dispositivos. De hecho, he estado programando en ensamblador para verificar algunos programas que hay en estos foros, pues en ensamblador habilitas "bit a bit", mientras que en C18 sólo escribes una instrucción y desconoces como funciona a detalle el programa.

Muchas gracias de antemano..
Título: Re: Ayuda con DS1621
Publicado por: vszener en 15 de Mayo de 2007, 05:39:36
En C18 también se escribe bit a bit....

Suerte!!! ;)
Título: Re: Ayuda con DS1621
Publicado por: c4_esp_VR en 05 de Junio de 2009, 04:46:11
Hola compañeros:

Por no escribir un nuevo hilo empiezo en este ya que está relacionado.

Estoy intentando simular el DS1621 con el proteus pero no funciona ni para atrás y no sé porqué, ya que es relativamente sencillo.

Os dejo el circuito del Proteus y el código del PIC que es muy fácil de ver, el ejemplo es el mismo o muy similar al que se puede encontrar en el compilador. Llevo un día entero dándole y nada...que no lo consigo.  :( :( :(

Código: [Seleccionar]
#include <18F4550.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=12000000)
#use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7, stream=PC)

#define RESET_BUTTON    PIN_E2
#include <DS1621.c>

int current_temp, max_temp, min_temp;

void reset_temp()  {

   current_temp = read_temp();
   min_temp=current_temp;
   max_temp=current_temp;
}

void main(void) {

   printf("Hola mundo\r\n");
   init_temp();
   delay_ms(6);

   reset_temp();
   
   while(true)
   {   
    current_temp = read_temp();

   if(input(RESET_BUTTON)==0)
      reset_temp();
   else if(current_temp>max_temp)
      max_temp=current_temp;
   else if(current_temp<min_temp)
      min_temp=current_temp;

   printf("\fCurrent Temp: %U F\nMin: %U Max: %U\r\n",current_temp,min_temp,max_temp);
   delay_ms(1000);     
   }
}

Muchas gracias compañeros foreros.
Título: Re: Ayuda con DS1621
Publicado por: c4_esp_VR en 05 de Junio de 2009, 04:52:31
Bueno ya está solucionado...que le vamos a hacer...me faltaban las resistencias de pull-up  en la comunicación I2C :D :D :D

Muchas gracias por todo compañeros
Título: Re: Ayuda con DS1621
Publicado por: Nocturno en 05 de Junio de 2009, 06:14:00
Jeje, ya puedes tachar ese error de la lista "Errores que todo el mundo comete y te hacen perder un tiempo precioso".

Al menos te servirá como a mí, para que jamás se te vuelva a olvidar.
Título: Re: Ayuda con DS1621
Publicado por: c4_esp_VR en 05 de Junio de 2009, 06:21:00
Citar
Jeje, ya puedes tachar ese error de la lista "Errores que todo el mundo comete y te hacen perder un tiempo precioso".
Al menos te servirá como a mí, para que jamás se te vuelva a olvidar.

Desde luego que no se me vuelve a olvidar  :D :D :D

Por si a alguien como yo se le olvida y ve este link las resitencia de pull up para I2C se recomiendan poner entre 1k8 y 4k7  :mrgreen: :mrgreen: :mrgreen:

Un saludete a todos.
Título: Re: Ayuda con DS1621
Publicado por: linus101 en 12 de Agosto de 2010, 10:56:12
Buenas,

Estoy intentando programar un DS1621 con CCS y no hay manera...

He usado como base el ejemplo que lleva proteus, y no sé dónde puede estar el error.

Lo he montado con un 16F88. Mis conexiones del DS1621 son:

pin 1- al B1 del pic
pin 2- al B0 del pic
pin 8- Vdd
resto de pines a masa

El código en C es este:

#include <16F88.h>
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT - afecta al A6
#FUSES NOPUT                    //No Power Up Timer *
#FUSES NOMCLR                   //Master Clear pin enabled - afecta al A5
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOFCMEN                  //Fail-safe clock monitor disabled
#FUSES NOIESO                   //Internal External Switch Over mode disabled
#FUSES CCPB3

#use delay(clock=8000000)
#include "lcd_refrigerador.c"

#define DAL_SCL   PIN_B0
#define DAL_SDA   PIN_B1

#include <ds1621.c>

void main() {
   signed long value;
   lcd_init();
   delay_ms(1000);

  lcd_putc("\f");
      printf(lcd_putc,"preparando");
      delay_ms(1000);
   init_temp();
   delay_ms(1000);
   
  do {
      value = read_high_temp();
    delay_ms(1500);
     lcd_putc("\f");
      printf(lcd_putc,"%Ld",value);
      delay_ms(1000);
   } while (TRUE);
}




Lo único que obtengo es que el LCD muestra "preparando"... y ahí se queda bloqueado.  ¿Alguna idea?

Gracias.
Título: Re: Ayuda con DS1621
Publicado por: linus101 en 14 de Agosto de 2010, 07:15:01
Arreglado,

No había colocado las resistencias pull-up en SCL y SDA.

Perdonad mi ignorancia...