TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Deckblank en 06 de Febrero de 2012, 13:54:52
-
Saludos a TOdos , bueno llendo al grano quiero implementar una EEPROM externa a un proyecto con 18f asi q estoy aprenciendo acerca de la EEPROM 24LC256
para descartar errores en una les digo q la Version del Compilador es 4.104
asi que este es mi pequeño codigo
#include <18F4550.h>
#fuses HSPLL,MCLR,NOWDT,PROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN
#use delay( CRYSTAL=4000000,CLOCK=5000000)
#include "EEPROM24256.c"
#byte porta = 0xf80
#byte portb = 0xf81
#byte portc = 0xf82
#byte portd = 0xf83
#byte porte = 0xf84
#byte adcon = 0xFC1
void main ()
{
int dato;
adcon=0x0F;
set_tris_d(0x00);
portd=255;
DISable_interrupts(GLOBAL);
init_ext_eeprom();
delay_ms(100);
write_ext_eeprom(10,15);
delay_ms(100);
dato = read_ext_eeprom(0);
portd=dato;
while(1)
{
}
}
ALgunos detalles del porque de mi codigo
bueno mi codigo tiene una particularidad #use delay( CRYSTAL=2000000,CLOCK=5000000) esto porque como quiero acoplar una EEPROM a un proyecto que ya tengo (que usa USB y esta es la unica manera que consegui que funcionara , ademas de que en proteus parece correr a 1.8x osea un segundo en proteus dura menos esta como acelerado)
la Libreria que uso para el 24LC256 es la misma que da CCS pero le cambie de nombre para conservar la original
SI he puesto resistencias PULLUP en ISIS
SI e puesto los puertos SDA Y SCL en RB0 Y RB1 (por harware),
SI puse #use i2c(... FORCE_HW ) en la libreria EEPROM24256 (la unica variante que hize) para forzar por hardware
Un pequeño Rastreo del error
Un artilugio que utilizo para saber en que funcion mis codigos se quedan plantados cuando la cosa ya no me da mas es
usar un puerto para descarte
delay_ms(1000);
portd=0;
y como inicialmente el portd = 255 , entonces si se pasa una funcion X la siguiente instruccion apaga el puerto y lo puedo ver en el compilador
y asi di con que en la parte de la libreria
void write_ext_eeprom(long int address, BYTE data)
{
short int status;
i2c_start();
i2c_write(0xa0);
delay_ms(1000);
portd=0;
i2c_write(address>>8);
i2c_write(address);
i2c_write(data);
y es en i2c_write(0xa0); donde el programa se queda pegado , osea no apaga al puerto d como deberia
Bueno espero que le den solucion a mi problema , sigo buscando entre tanto ..... :-/ ... y gracias ((:-)) siempre e avanzado con este foro
-
tengo el mismo problema,igualito,jeje cuando llega a esa instruccion se cuelga y no hace mas,yo estoy utilizando una eeprom 24C02 y un PIC12F683 con CCS 4.140
-
los fuses los tienes mal....
segun veo, usas un cristal de 4mhz.... osea que deberia de ser XTPLL....
despues tienes el PLL5.... cosa que deberias de tenerlo en NOPLL
y si a eso le sumamos que tienes mal definido el #use delay.... ya tienes un posible error de programacion...
asi lo tienes....
#fuses HSPLL,MCLR,NOWDT,PROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN
#use delay( CRYSTAL=4000000,CLOCK=5000000)
prueba asi....
#fuses XTPLL,MCLR,NOWDT,PROTECT,NOLVP,NODEBUG,USBDIV,NOPLL,CPUDIV1,VREGEN,NOPBADEN
#use delay( CRYSTAL=48mhz)
haz la prueba y cuentas los resultados....
-
hola ppyote
jeje creo que decir que lo tengo "igualito" estuvo mal jajaja,no esa parte no la tengo asi,mas bien debi decir que me da el mismo problema,pero extrañamente es hasta ahora que lo tengo,nunca me habia fallado la escritura de las eeprom de la serie 24C02, mira lo que yo tengo:
#include<12f683.h>
#fuses INTRC,MCLR,NOWDT,PUT,NOPROTECT,NOCPD,NOBROWNOUT,NOFCMEN,NOIESO
#use delay(clock=8000000)
#use I2C(MASTER,SDA=PIN_A5,SCL=PIN_A4,FORCE_SW)
no se igual tengo por ahi un detalle,revisare bien mis conexiones y probare llegando a casa
-
hola ppyote
jeje creo que decir que lo tengo "igualito" estuvo mal jajaja,no esa parte no la tengo asi,mas bien debi decir que me da el mismo problema,pero extrañamente es hasta ahora que lo tengo,nunca me habia fallado la escritura de las eeprom de la serie 24C02, mira lo que yo tengo:
#include<12f683.h>
#fuses INTRC,MCLR,NOWDT,PUT,NOPROTECT,NOCPD,NOBROWNOUT,NOFCMEN,NOIESO
#use delay(clock=8000000)
#use I2C(MASTER,SDA=PIN_A5,SCL=PIN_A4,FORCE_SW)
no se igual tengo por ahi un detalle,revisare bien mis conexiones y probare llegando a casa
revisa la libreria del 24c02 ya que estan definidos los pines y el tipo de comunicacion i2c en la misma libreria y a lo mejor esta ahi tu problema...aunque lo dudo ya que el 12F no tiene pin_C3 y C4...
#ifndef EEPROM_SDA
#define EEPROM_SDA PIN_C4
#define EEPROM_SCL PIN_C3
#endif
#use i2c(master, sda=EEPROM_SDA, scl=EEPROM_SCL)
-
asi es ppyote,pues mira,cuando regrese a casa lo volvi a checar con el que yo sabia que funcionaba,y comparando con el codigo que hice en mi trabajo,solo cambia en el bit del oscilador interno,en el codigo que publique hace unas horas puse: INTRC y no funciona
en el de mi casa en mi amada computadora jaja,tengo INTRC_IO y con la version 4.138 del CCS,creo que es evidente que ha sido error mio pero no lo veia,lo comprobe,gracias por ayudar
-
asi es ppyote,pues mira,cuando regrese a casa lo volvi a checar con el que yo sabia que funcionaba,y comparando con el codigo que hice en mi trabajo,solo cambia en el bit del oscilador interno,en el codigo que publique hace unas horas puse: INTRC y no funciona
en el de mi casa en mi amada computadora jaja,tengo INTRC_IO y con la version 4.138 del CCS,creo que es evidente que ha sido error mio pero no lo veia,lo comprobe,gracias por ayudar
si solucionaste el fallo, me alegro Jajaja
-
si jaja es de risa porque creo que en ocaciones a todos nos ha pasado que ya no vemos que mas moverle y resulta que es una tontera jajaja pero si ya quedo gracias