5 votos

Los LED no funcionan, Simple :)

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

http://i.imgur.com/017HpUM.jpg

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.

  1. 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

  2. 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

  3. 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

  4. 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!

3voto

Nate Puntos 3229

Parece que se necesita una resistencia pull-down en INT0,(que no se parecen a mencionar tiene uno), mi idea de la necesidad de un resistor de pull es el problema número uno, donde su cuerpo se afecta el cambio de estado. Este problema surge debido a que tiene una alta impedancia de entrada (INT0) y que está flotando, no hay ninguna garantía de que su INT0 es baja debido a que se queda flotando hasta que se pulsa el botón y se mantiene en lo más alto. La adición de la resistencia pulldown se defualt su INT0 estado a la baja, también recuerde que su sonda se ve como una gorra con una resistencia en paralelo, de manera que cada vez que la sonda de su circuito, que son básicamente, la colocación de una resistencia pulldown. El otro problema que veo es que el botón no es de rebote, la adición de un retraso de un par de milisegundos no de rebote de entrada.

1voto

Ben Puntos 1

La causa de los estados de LED incorrectos fue porque no estaba permitiendo suficiente tiempo entre los comandos de cambio de puerto.

Cuando se escribe:

     PORTBbits.RB6 = 1;
    PORTBbits.RB5 = 1;  
 

En realidad debería ser:

     PORTBbits.RB6 = 1;
    Nop(); //skip cycle
    PORTBbits.RB5 = 1;  
 

La única pista de esto en la hoja de datos es que se necesita un ciclo para transferir los datos desde el puerto de bloqueo al puerto real.

El puerto también puede actualizarse con:

     PORTB = 0x60;
 

Para el mismo efecto.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X