TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado 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!!
-
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.
-
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!
-
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
-
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!!
-
Del de CCS, ayer intenté simularlo pero no funcionó. Algo debí de hacer mal.
Un saludo
-
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!
-
Aquí está:
http://miarroba.com/foros/ver.php?foroid=132139&temaid=1150363
Saludos!!
-
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
-
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!
-
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
-
pq al ejecutarlo el proteus me pide ds1621.dll????
la verdad nunka he utilizado este programilla.. una introduccion rapidilla me vendria perfecta 
gracias
-
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
-
ok tngo la SP5 pro, vamos a trastearla un pokilllo parece q ya me voy enterando

gracias
pd: estas dll de donde se sacan?
-
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!
-
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
-
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!!
-
¿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
-
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..
-
En C18 también se escribe bit a bit....
Suerte!!! ;)
-
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. :( :( :(
#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.
-
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
-
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.
-
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.
-
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.
-
Arreglado,
No había colocado las resistencias pull-up en SCL y SDA.
Perdonad mi ignorancia...