Objetivo
Estoy tratando de cambiar el estado de un pin en el PIC24FV16KA304 dependiendo de que se pulse un botón. Inicialmente los pines están configurados como entradas, al presionar un botón, los pines de cambio para una salida con un estado bajo, otro botón de pulsación de mantener los pines como salidas, pero cambiar el estado a la altura. Finalmente el 3er botón pulse va a cambiar los pines de vuelta a los insumos. Este bucle para siempre. Circuito de VDD es de 3V y el suelo es de 0V.
Hardware
El botón está conectado a INT0 (Pin 43) de esta foto y VDD. Al presionar el botón Pin 43 se está tirando a alta. Los pernos que están siendo manipulados por la prensa el botón de son números de pin 42(RB6) y 41(RB5).
En cada pin hay 2 LEDS, con un total de 4 LED a través de ambos pines. Cada pin se usa la siguiente estructura:
VDD -> Resistencia -> LED ROJO 1-> RB6(SENS1) -> LED VERDE 2-> Resistencia -> Tierra.
VDD -> Resistencia -> LED ROJO 3-> RB5(DEBUG_LED) -> LED VERDE 4-> Resistencia -> Tierra.
Los valores de la resistencia y el LED de umbrales han sido seleccionados de manera que si el pin está configurado como entrada (alta impedancia), ni de los LEDS. Si el pin es una salida de 3V el LED verde se encenderá exclusivamente, si su 0V el LED rojo se enciende de forma exclusiva.
El depurador utilizado es el MPLAB ICD3
Firmware
He escrito el siguiente firmware para este objetivo:
//main.c
#include "main.h"
//configuration registers
_FDS( DSWDTEN_OFF & DSBOREN_ON )
_FICD( ICS_PGx1 )
_FPOR( BOREN_BOR0 & LVRCFG_ON & PWRTEN_ON & I2C1SEL_PRI & BORV_LPBOR & MCLRE_ON )
_FWDT( WDTPS_PS32768 & FWPSA_PR128 & FWDTEN_OFF & WINDIS_OFF )
_FOSC( POSCMOD_NONE & OSCIOFNC_OFF & POSCFREQ_HS & SOSCSEL_SOSCLP & FCKSM_CSDCMD )
_FOSCSEL( FNOSC_FRC & SOSCSRC_ANA & LPRCSEL_HP & IESO_OFF)
_FGS(GWRP_OFF & GSS0_OFF )
_FBS(BWRP_OFF & BSS_OFF )
//variables
unsigned char index;
unsigned char continuity = 1; //will become more clear at problem.
//main
int main()
{
INTCON2bits.INT0EP = 0; //Sets to trigger on rising edge
IEC0 = IEC0 | 0x0001; //turn on INT0 interrupt default priority 4
IFS0bits.INT0IF = 0; // Clearing interrupt flag
while(1) //inf loop
{
if((index == 0) && (continuity == 1))
{
TRISBbits.TRISB6 = 1; //sets direction
TRISBbits.TRISB5 = 1;
continunity = 0;
}else if((index == 1) && (continuity == 1))
{
TRISBbits.TRISB6 = 0;
TRISBbits.TRISB5 = 0;
PORTBbits.RB6 = 0; //sets port value
PORTBbits.RB5 = 0;
continunity = 0;
}else if((index == 2) && (continuity == 1))
{
PORTBbits.RB6 = 1;
PORTBbits.RB5 = 1;
continunity = 0;
}else if(index == 3)
{
index = 0;
}
}
}
void __attribute__((interrupt, auto_psv)) _INT0Interrupt(void)
{
//clear the interrupt flag
__delay_us(50);
if(PORTBbits.RB7 == 1)
{
index++;
continuity = 1;
}
IFS0bits.INT0IF = 0;
}
Problemas
Hay varios problemas, voy a tratar de mantener la cohesión.
Los estados de cambio en sus propias mayoría del tiempo. Esto tiene(a veces) correlación directa con los movimientos de mi cuerpo. Me puede amplificar este error si me quedo con el metal en mi teléfono mientras que su carga y pase mi mano por encima de la placa. Actúa como un PERFECTO proxy detector. ¿Por qué es este consejo actúa como una antena?? ¿Tienes alguna depuración sugerencias para entender lo que está pasando? Si necesita más información, hágamelo saber. SOLUCIONADO
Los estados de los LED están equivocados. Como puede verse en el código no puede ser nunca la posibilidad de 1 rojo(RB6) y 1 verde(RB5) LED de encendido, sin embargo cuando se ejecuta a toda velocidad este problema se produce aunque la expectativa es para tanto ser de color verde, por ejemplo(índice = 2). Una observación interesante respecto a este problema es que tengo ejecutar el código a toda velocidad sin la continuidad de la variable, me han permitido constantemente entrar en el mismo bloque IF, índice 2, la expectativa es que los dos LEDs ser de color verde, pero uno de ellos es de color rojo en la realidad. Yo, a continuación, detener el código y empezar a progresar en pasos individuales en lugar de eso, y de repente se empieza a trabajar. SOLUCIONADO
El botón no funciona. Cuando presione el botón no tiene efecto. Sin embargo si puedo conectar un osciloscopio a una vía que lo conecta con el PIC, de repente empieza a funcionar correctamente, y en el osciloscopio se está comportando como debería. Si puedo quitar el osciloscopio, deja de funcionar de nuevo. Pensé que tal vez la sonda está contribuyendo en algunos de capacitancia, así que os adjunto el más pequeño condensador que tengo(10uF) en el exacto a través de un punto, y no hay cambio. ¿De qué otra manera el Osciloscopio sondas de contribuir a la junta? SOLUCIONADO
Si la continuidad es eliminado de código, número de Pin 43 comienza a oscilar en 400 Hz en promedio. Cuando esto sucede, ambos indicadores parecen ser al mismo tiempo para mí. Esta oscilación no es periódico, es muy aleatorio. Yo no entiendo cómo un solo pin puede ser afectado como este cuando el código no tiene ningún tipo de estado. Ha Desaparecido
Notas
Personalmente creo que el hardware se ha basado bueno, y yo personalmente no he visto ningún evidentes problemas de hardware.
Si ustedes necesitan cualquier información adicional me avisas.
AYUDA!
Soluciones o métodos de depuración puede ofrecer será apreciado mucho, estoy empezando a perder el cabello gracias a este problema.
Todos los síntomas anteriores se sienten como que son causados por el mismo exacto posiblemente un problema de hardware? Si ustedes han experimentado algo similar estoy mirando adelante a oír de ti!