Hola,
Estoy intentando usar el PIC 16F1455, de manera que pueda controlar la salida de uno de los pines (RA4). El problema es que unas veces funciona bien y otras se queda en 3V, o 0V. Con lo cual, no funciona bien.
He usado un analizador lógico, y no hay salida de reloj. Pensaba que estos 3V podrían ser consecuencia de una señal de reloj, pero no.
He configurado todos los registros de configuración, y desactivado todas las funciones adicionales del pin RA4, como el comparador analógico, o la configuracion de pines alternativos (APFCON), pero nada.
Lo curioso es que configuré LATCHA como 0b00110000 y funcionaba. Después como 0b11000000, y no (es normal porque no hay RA6 ni RA7). Volví a configurarlo como 0b00110000, y ya no ha vuelto a funcionar.
Sé que los pines RA0, RA1 y RA2 no los puedo usar como output, por eso estoy usando el RA4. Uso CCS compiler y PICKIT3.
No sé qué más puede ser. ESTE PIC ME ESTÁ VOLVIENDO LOCO!!
![redhot :5]](http://www.todopic.com.ar/foros/Smileys/default/redhot.gif)
Os dejo el código aquí por si le queréis echar un vistazo:
/*--------------------------------------------
PIC DEFINITION AND CONFIGURATION
----------------------------------------------*/
#device PIC16F1455
#include <16F1455.h>
// CONFIG1
#fuses INTRC_IO // Internal Oscillator
#fuses NOWDT // Watch Dog Timer Disabled
#fuses NOPUT // Power-Up Timer Disabled
#fuses NOMCLR // Master Clear Reset pin enabled
#fuses NOPROTECT // Code not protected
#fuses BROWNOUT // BrownOut reset disabled
#fuses NOCLKOUT // No Clock Out
#fuses NOIESO // Internal/external switchover disabled
#fuses NOFCMEN // Fail safe clock monitor disabled
// CONFIG2
#fuses NOWRT // Write protection disabled
#fuses NOCPUDIV // CPU not divided
#fuses LS48MHZ // USB clock 48 MHz
#fuses PLL4X // PLLx4
#fuses PLLEN // PLL disabled
#fuses STVREN // Stack overflow reset enabled
#fuses BORV19 // BrownOut reset v1.9
#fuses NOLPBOR // Low Power BrownOut reset disabled
//#fuses NODEBUG // Debug disabled
#fuses NOLVP // Low Voltage Programming disabled
#use delay(internal=4000kHz)
#BYTE TRISA = 0x08C
#BYTE PORTA = 0x00C
#BYTE LATA = 0x10C
#BYTE TRISC = 0x08E
#BYTE PORTC = 0x00E
#BYTE LATC = 0x10E
#bit LATA4 = 0x10C.4
#bit TRISA4 = 0x08C.4
// IOC Addresses
#bit IOCIE = 0x0B.3 //set to 1
#bit IOCAP0 = 0x391.0 // set to 1 (rising edge. El falling es el registro siguiente, y es IOCAN0 = 0x392.0 set to 1)
#byte IOCAF = 0x393
//#bit IOCAF0 = 0x393.0 // si es 1 hay detección de Rising/Falling Edge. Se puede escribir para borrar flag
// USB Address
#bit USBEN = 0xE8E.3 //set to 0
// Analogic Configuration Address
#bit ANSA4 = 0x18C.4 // set to 0
// Alternative PIN configuration Address
#bit CLKRSEL = 0x11D.7 // set to 1
#bit SDOSEL = 0x11D.6 // set to 0
#bit T1GSEL = 0x11D.3 // set to 1
#bit P2SEL = 0x11D.2 // set to 0 (no necesario. RA5)
#bit SSSEL = 0x11D.5 // set to 0 (no necesario. RA3)
// Option Register
#bit WPUEN = 0x095.7
#bit TMR0CS = 0x095.5
#bit TMR0SE = 0x095.4
/*--------------------------------------------
MAIN FUNCTION
----------------------------------------------*/
void main(void) {
int8 porta_meas;
//PortA_Meas = PORTA; // Get PORTA status for "Interrupt On Change" purpose
TRISA = 0x00;
TRISC = 0x00;
// IOC Configuration
IOCIE = 1; //set to 1
IOCAP0 = 1; // set to 1 (rising edge. El falling es el registro siguiente, y es IOCAN0 = 0x392.0 set to 1)
//flag_IOCA = IOCAF;
//flag_IOCAF0 = IOCAF0; // si es 1 hay detección de Rising/Falling Edge. Se puede escribir para borrar flag
// USB Configuration
USBEN = 0; //set to 0
// ANSELA: Analogic Configuration Address
ANSA4 = 0; // set to 0
// APFCON: Alternative PIN configuration Address
CLKRSEL = 1; // set to 1
SDOSEL = 0; // set to 0
T1GSEL = 1; // set to 1
P2SEL = 0; // set to 0 (no necesario. RA5)
SSSEL = 0;
// OPTION_REG: Option Register
while(1){
LATA4 = 1;
LATC = 0xFF;
delay_ms(1000);
LATA4 = 0;
LATC = 0x00;
delay_ms(1000);
}
}