TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: campeon1982 en 11 de Noviembre de 2004, 05:08:00
-
Hola pues he hecho esto en i2c y en el proteus no me rula, si me echan un cable lo agradeceré jeje:
MAESTRO:
#include <16F73.h>
#fuses HS, NOWDT, NOPROTECT, PUT, NOBROWNOUT
#byte port_b=06
#use delay(clock=16000000)
#use i2c(MASTER, SDA=PIN_C4, SCL=PIN_C3,FAST,FORCE_HW)
void main(void)
{
int dato;
int buffer;
delay_ms(1000); //retardo, por si acaso no da tiempo al esclavo a "inicializarse" para
//poder esperar a la informacion que le puede enviar el master
set_tris_b( 0xFF ); //los 4 lsb del portB como entradas
while(1)
{
dato=port_b; //dato coge el valor que haya en portB
i2c_start(); //condicion de inicio
i2c_write(0x08); //direccion del esclavo con el que haremos la comunicacion
i2c_write(dato); //enviamos un dato
i2c_stop(); //finalizacion de la comunicacion
delay_ms(1000); //introducimos retardo para que no este constantemte escribiendo
}
}
ESCLAVO:
#include <16f73.h>
#fuses HS,NOWDT,NOPROTECT,PUT,NOBROWNOUT
#byte port_b=06
#use delay(clock=16000000)
#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, ADDRESS=0X08, FAST , FORCE_HW)
void main(void)
{
int dato;
set_tris_b( 0x00 );// todo salidas
while(1)
{
//i2c_poll solo se puede usar por hardware, detecta un byte en el buffer
//seguidamente se llama a la funcion i2c_read que devolvera el byte recibido
if(i2c_poll())
{
dato=i2c_read();
}
port_b=dato;
}
}
Compilado no da ningún error, luego en proteus no rula...
Alguna help.
saludos y gracias
pd: de proteus tampoco controlo mucho jeje
-
Primero que nada te recomiendo usar la directiva #use standard_io antes del #use 12c para que asegures que las salidas son salidas (cuando lo deben ser) y que las entradas tambien sean entradas (cuando lo deban ser).
Por otra parte recuerda en el proteus conectar los cables de sda y scl con unas pullups a VCC porque de otra manera no funciona...
Si estoy mal porfavor corrijanme
-
El programa parece estar bien, de hehco me parece que es muy muy parecido al que hice yo, y a mi me funciona, tambien de la gente que me lo ha pedido, ninguno me ha dicho que no funcionaba, así que creo que el problema no viene por ahí, revisa el esquematico del proteus, como te dice YF-21 no olvides poner las pullups para simular bien, y cuando digo pullups, no digo ressitencias, en el buscador de componentes de proteus busca pullups para que puedas simular bien.
EL fichero de proteus que te pase no te funciono? hasta ahora no me ha dado problemas, por que no lo modificas y trabajas con ese?
Un saludo.
-
Escrito originalmente por oshow
El programa parece estar bien, de hehco me parece que es muy muy parecido al que hice yo, y a mi me funciona, tambien de la gente que me lo ha pedido, ninguno me ha dicho que no funcionaba, así que creo que el problema no viene por ahí, revisa el esquematico del proteus, como te dice YF-21 no olvides poner las pullups para simular bien, y cuando digo pullups, no digo ressitencias, en el buscador de componentes de proteus busca pullups para que puedas simular bien.
EL fichero de proteus que te pase no te funciono? hasta ahora no me ha dado problemas, por que no lo modificas y trabajas con ese?
Un saludo.
Muchas gracias señores, el problema Oshow es que basandome en el tuyo he estado trasteando como un loco y no lo hago rular jeje. Tu esquemático va de lujo pero al sustitur tus pics por los 16f73 y cambiar un #Fuse que creo que no me vale, pues ya no funciona jeje.
Mañana me pondré otra vez con él.
Muchísimas gracias señores.
pd: ya se que este no es el foro pero si tienen alguna duda de ps2 pregúntenme a mí jeje para compensar la ayuda jeje
pd: ya os cuento que tal va esto
-
El programa está bien, pero amigo el 16F73 no está en PROTEUS ¿no entiendo?
-
Hola. NO había usado nunca #use stantdard_io. Lo probaré. Lo que no sé es para qué sirve #fast_io(port). Viene en inglés y no lo tengo muy claro ... ![Helado Helado]()
-
Si no se pone nada creo recordar que asume el standar y cada vez que encuentra un input o un output te reprograma el puerto como entrada o salida.
Con fast consigues que solo lo programe una vez con lo que se gana memoria de programa y velocidad.
Haz la prueba poniendo en un programa standar y en el otro fast, mira el fichero .lst y verás el ahorro de instrucciones.
Un saludo
PD. Oye campeoncete ¿qué versión tienes del PROTEUS?
-
La versión que tengo es la 6.5 sp5 con advanced simulation.
En el código, lo que hago es sustitur el 16f73 por el 16c73b que si está en el proteus y sigue sin rular. He probado lo de standar io y nada de nada jeje
si no es mucha molestia si lo podeis probar vosotros en el proteus que es un momentiko porque yo no le veo solución ![Giño Giño]()
Saludos y muchas gracias de nuevo
pd: yo tengo el ejemplo del i2c que rula a la perfección de oshow, cambio unos pics por otros y nada de nada jeje.
-
A riesgo de parecer pesado.... has probado lo de las pullups verdad? es que como no comentas nada.... Asegurate de ponerlas porque sino no funciona.
-
Pués sí llevas razón, el 16c73 no simula el I2C. Sustitúyelo directamente por un 16F876 que es compatible pin a pin y te funcionará (no es necesario que cambies el include en los códigos del M y del S)
-
Escrito originalmente por oshow
A riesgo de parecer pesado.... has probado lo de las pullups verdad? es que como no comentas nada.... Asegurate de ponerlas porque sino no funciona.
Perdón por no decirlo, pero si que las tengo puestas. Es que lo único que he hecho es cambiar un esquemático que si rula con i2c por el 16c73 y no va ![Muchas risas Muchas risas]()
Bueno, seguiré intentandolo jeje
ta logo y muchas gracias a todos
-
Bueno, he hecho pruebas y POR FIN RULA EN LA PLACA jaja.
No se si lo que he hechoserán chapuzas pero ahí lo que me funciona:
MASTER
#include <16F73.h>
#fuses HS, NOWDT, NOPROTECT, PUT, NOBROWNOUT
#byte puerto_b=06
#use standard_io(c)
#use fast_io(B)
#use delay(clock=16000000)
#use i2c(MASTER, SDA=PIN_C4, SCL=PIN_C3,FAST,FORCE_SW)
void main(void)
{
int dato;
delay_ms(2000); //retardo, por si acaso no da tiempo al esclavo a "inicializarse" para
//poder esperar a la informacion que le puede enviar el master
set_tris_c( 0xFF ); //port c como salidas porque lo pone en el data sheet
set_tris_b(0b00001111);
while(1)
{
dato=puerto_b; //dato coge el valor que haya en portB
i2c_start(); //condicion de inicio
i2c_write(0x08); //direccion del esclavo con el que haremos la comunicacion
i2c_write(dato); //enviamos un dato
i2c_stop(); //finalizacion de la comunicacion
delay_ms(5000); //introducimos retardo para que no este constantemte escribiendo
}
}
SLAVE
#include <16f73.h>
#fuses HS,NOWDT,NOPROTECT,PUT,NOBROWNOUT
#use standard_io(B)
#byte puerto_b=06
#use delay(clock=16000000)
#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, ADDRESS=0X08, FAST , FORCE_SW)
void main(void)
{
int dato;
puerto_b = 0b00000000;
set_tris_b( 0x00 );// todo salidas
while(1)
{
dato=i2c_read();
puerto_b=dato;
}
}
Pues eso, no se si habrá alguna burrada, pero como funciona de momento no lo toco jeje. Por cierto, según el datasheet el 16f73 soporta ssp para poder utilizar i2c_poll pero utilizando esa instrucción no funciona. El montaje digo yo que está bien porque funciona perfectamente por software.
Bueno pues muchas gracias a todos y si me surgen nuevas dudas ya os pregunto (muchas gracias de nuevo).
ta logo
-
Ok, perdona por lo de las pullps, pero leí demasido rápido el hilo y no me di cuenta que estabas modificando el esquemático que funcionaba, pensé que creabas uno nuevo y no las ponías y que por ahí venía el error, por otra parte me alegro de que hayas resuelto el problema y lo tengas funcionando.
Un saludo.