Buenas a todos, tengo un problema que no se como salir de el, se me han agotado las ideas a ver si alguien me puede ayudar.
Utilizo CCS C + PIC18F4550 + ENC28J60 + DS1621 y todo realizado con el IDE MPLAB
Resulta que estoy implementando un pic18F4550 con el periférico para Ethernet ENC28J60, en el micro tengo alojada una página web muy sencilla, solo para pruebas, hasta ahí va todo perfecto.
El problema llega a la hora de intentar añadirle algún periférico más por medio del protocolo I2C, al intentar conectarle un detector de temperatura el chip se bloquea.
Al llegar a
i2c_start(); el programa se mete en
#use i2c(Master….) de ahí no sale.
He estado ejecutando el código en modo debugger por medio de un ICD2 y al llegar a
#use i2c (…) entra en la rutina de ese protocolo y se queda saltando entre
dos registros o variables, no se como llamarlo, cuelgo foto :
Los registros son :
BTFSS 0xf82 , 05 ACESS
Y
BRA 0x462
Y de ahí no sale, con lo cual se interrumpe el programa.
He probado con SPI por hardware y por software y en los dos casos le pasa lo mismo
No sé si esto es un bug del compilador o es que me falta algo que añadirle al código o que.
Sé que el problema está con el driver del ENC28J60, porque he desnudado todo el programa y solo he dejado el driver del ENC y una función sola y a la hora de meterle el I2C le pasa lo mismo.
Cuelgo rutina para que le echen un vistazo.
#include <18F4550.h>
#fuses HSPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN // Ocupa cristal 4Mhz, cambiar a PLL5 para ocuparlo con 20Mhz.
#use delay(clock=48000000)
#define ON output_high
#define OFF output_low
#define LedV PIN_A3
#define LedR PIN_A4
// Conexión entre el PIC18F4550 y el Modulo ENC28J60 (Se conecta directamente sin adaptador de voltajes).
// Se adjunta el datasheet del Modulo ENC28J60.
#ifndef PIN_ENC_MAC_SO
#define PIN_ENC_MAC_SO PIN_C7 // Conectar con PIN MISO del ENC28J60.
#define PIN_ENC_MAC_SI PIN_B4 // Conectar con PIN MOSI del ENC28J60.
#define PIN_ENC_MAC_CLK PIN_B2 // Conectar con PIN SCK del ENC28J60.
#define PIN_ENC_MAC_CS PIN_B3 // Conectar con PIN CS del ENC28J60.
#define PIN_ENC_MAC_RST PIN_B5 // Conectar con PIN RST del ENC28J60.
#define PIN_ENC_MAC_INT PIN_D2 // Conectar con PIN INT del ENC28J60.
#define PIN_ENC_MAC_WOL PIN_D3 // Conectar con PIN WOL del ENC28J60.
#define mac_enc_spi_tris_init() *0xF93=*0xF93 | 7; *0xF95=*0xF95 & 0xF0
#endif
#ifndef ENC_MAC_USE_SPI
#define ENC_MAC_USE_SPI TRUE
#endif
#include "Drivers/enc28j60.c"
#ifndef DAL_SCL
#define DAL_SCL PIN_C5
#define DAL_SDA PIN_C4
#endif
#include "Drivers/DS1621M.C"
void main(void){
int16 dato;
ON(LedR);
OFF(LedV);
mac_spi_init();
mac_reg_init();
init_temp(0x00);
while(TRUE){
ON(LedR);
delay_ms(50);
OFF(LedR);
delay_MS(50);
dato=enc_mac_read_phy_word(0x00);
}
}
el driver del ENC y del DS1621 son los que están en PICC