Autor Tema: PIC 16F1455 no me hace caso  (Leído 2010 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado tito melli

  • PIC12
  • **
  • Mensajes: 84
PIC 16F1455 no me hace caso
« en: 23 de Octubre de 2017, 15:39:59 »
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!! :5]

Os dejo el código aquí por si le queréis echar un vistazo:

Código: [Seleccionar]
/*--------------------------------------------
   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);
   }
}

Desconectado tito melli

  • PIC12
  • **
  • Mensajes: 84
Re:PIC 16F1455 no me hace caso
« Respuesta #1 en: 26 de Octubre de 2017, 04:37:40 »
Hola a todos,

Ayer probé a usar el Debugger con MPLAB, y para mí completo asombro, funcionaba todo correctamente. Increíble pero cierto.

Probé a debuguear sin poner ningún breakpoint (corriendo el codigo con normalidad y sin pararse) y me di cuenta de que en el momento en el que media el voltaje en el pin RA4, el programa se quedaba congelado, como si se durmiese, o tuviese un breakpoint en el Debugger. Sin interferir en el RA4, todo funcionaba bien.

He mirado las interrupciones de este pin, y solo está la de IOC. Ha he desactivado, junto con la global, y nada.

Os ha pasado alguna vez algo parecido?

Saludos!