Hola! Ayer y hoy estuve haciendo un curso de PLC, no me pude poner con el PIC.
Tengo dos placas, una con un PIC 16f876A y la otra con el PIC18F4550. Estoy comunicando cada una de las placas con una placa controladora de motores, el modelo es la MD25, que viene con dos motorcitos de corriente contínua. El código que uso para el 18F es el que sigue:
#include <18F4550.h>
#Device ADC=10
#fuses HSPLL,NOMCLR,NOWDT,PROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000)
#use rs232(baud=56000,xmit=pin_c6,rcv=pin_c7)//configuracion del puerto rs232 envia por pin_c6 y recibe por pin_c7
#use i2c (master,scl=PIN_B1,sda=PIN_B0,slow,force_hw) //habilitación y configuración de las funciones I2C por hardware
// Librerías usadas
#include <STDLIB.H>
#include <MATH.H>
#include <STDIO.H>
//Declaración de las librerías para uso de controladora MD25
int I2C_Buffer [16]; //buffer de recepción de un dispositivo I2C
#include <I2C_16-18FXXX.H> //Incluye rutinas I2C básicas de propósito general
#include <MD23_16-18FXXX.H> //Incluye rutinas de control del driver MD25
//Con estas instrucciones evitamos que se este configurando cada vez que usamos alguna instruccion de entrada o salida
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
void main()
{
//Configuración de puertos como entrada y salida
SET_TRIS_A(0xFF); // se configura el puerto A como entrada
SET_TRIS_B(0x00); // se configura el puerto B como salida
SET_TRIS_C(0x00); // activa las resistencias de pull-up
//Configuración del conversor AD
SETUP_ADC(ADC_CLOCK_DIV_64); // configuras esto para que el a/d funcione con un reloj interno del micro
SETUP_ADC_PORTS(ALL_ANALOG||VSS_VDD); // aca determinar que el puerto RA0, RA1 será analógico
//Configuración de la interrupción RTCC
SETUP_COUNTERS(RTCC_INTERNAL,RTCC_DIV_1); //TIMER0: Clock Interno, Preescaler 1
ENABLE_INTERRUPTS(INT_RTCC); // Habilito Interrupción RTCC
ENABLE_INTERRUPTS(GLOBAL); // Habilito Interrupciones
//MD23_Modo(2);
//Definición de variables locales del main
float Bateria=0.0;
while(true)
{
//Leo el voltage de alimentación de la placa
Bateria=MD23_Bat()/10.0; //Esta funcion esta incluida en la libreria de la placa
//Envío valores al PC
printf(" %f ",Bateria);//imprimo datos por puerto serie
}
}
El mismo código con algunas modificaciones como la líbrería del PIC, funciona correctamente para el PIC16F876A.
La única diferencia que encuentro es que estoy trabajando con un bootloader serie diferente para cada PIC. El bootloader del 18F, escribe los Fuses, lo cual no se si afecta.