PIC MCU: Contador disparado desde ADC

1

Básicamente, estoy buscando programar un PIC16F917, de modo que un int en particular se incremente en uno cada vez que presiono un botón.

Ahora tengo el ADC en funcionamiento, tengo que contar los bucles, pero parece que carezco del conocimiento y la experiencia para ponerlo por completo, y vuelvo a bloquear la entrada antes de que el int aumente en un número mayor que uno .

El siguiente código es lo que he escrito hasta ahora. El problema con esto es que se incrementa varias veces por pulsación (la cantidad de ciclos de demora para los que se mantuvo el botón), y me encantaría hacer que solo cuente en uno. Estaba pensando en crear una nueva función e int, pero parece que no puedo armarlo, se necesita mucha ayuda.

Gracias por ayudar, Ezra

#include <xc.h>
#include "config-bits.h"

#define _XTAL_FREQ 4000000

int result;
int output;

void delay()
{
    int i;

    for(i=0; i<100; i++)
    {
        /*Timer Stuff*/
    }
}

int main()
{
    TRISA=1;                    //Set all pins to input
    TRISB=1;
    TRISC=1;
    TRISD=1;
    TRISE=1;

    TRISDbits.TRISD0 = 0;       //LED output
    ANSELbits.ANS0 = 1;         //Select ADC input

    ADCON0bits.ADFM = 1;        //ADC result is right justified
    ADCON0bits.VCFG = 0;        //Vdd is the +ve reference
    ADCON1bits.ADCS = 0b001;    //Fosc/8 is the conversion clock
                                //This is selected because the conversion
                                //clock period (Tad) must be greater than 1.5us.
                                //With a Fosc of 4MHz, Fosc/8 results in a Tad
                                //of 2us.
    ADCON0bits.CHS =  0;        //select analog input, AN2
    ADCON0bits.ADON = 1;        //Turn on the ADC

    while(1)
    {
        delay();                        //Wait the acquisition time (about 5us).

        ADCON0bits.GO = 1;              //start the conversion
        while(ADCON0bits.GO==1){};      //wait for the conversion to end

        result = (ADRESH<<8)+ADRESL;    //combine the 10 bits of the conversion

        if(result > 512)
        {
            PORTD=output++;
            delay();
        }
        else
        {
            NOP();
        }
    }
}
    
pregunta ezra_vdj

2 respuestas

0

Use una variable para recordar si el último resultado fue < a 512. Antes de incrementar la variable de salida, verifique si el resultado anterior fue < 512. ¿Podrías haber usado una entrada digital en lugar de una analógica?

    
respondido por el HandyHowie
3

Ok, primero algunas cosas. TRISA=1 no pone todo el PORTA como entrada como está escrito en el comentario, es equivalente a 0b00000001 , así que para poner todo el puerto como entrada debe hacer TRISA=255 o TRISA=0xFF que es igual a 0b11111111 .

No sé cómo conectaste el botón al microcontrolador, pero mirar tu programa debería ser algo como esto:

simular este circuito : esquema creado usando CircuitLab

De esta manera, debería funcionar, obtienes 5V cuando se presiona el botón y 0V cuando está abierto. Sin embargo, aún puede obtener un voltaje inestable en el momento en que se presiona el botón (llamado rebote), se ve así:

Porlotanto,mayparecequeelbotónsepresionavariasvecesdebidoaesteefectorebote.Pararesolveresto,debetomarmásmuestrasypromediarlas,luegousarelresultadopromedioparadecidirquéhacer..

Perohayotraforma,queesmásfácilenestecaso,solodesealeersisepresionaelinterruptor('1')ono('0'),porloquenonecesitayADC,puedehacerloSoloconunaentradadigital,nonecesitasunaanalógica.ElesquemaseríaelmismoperoelprogramaCseríaalgoasí(supongamosqueelconmutadorestáconectadoaRA0):

intmain(){TRISA=1;//SetRA0asinputTRISD=0x00;PORTD=0x00;while(1){if(TRISAbits.RA0){PORTD+=1;delay();//Weusethedelaytoavoidthebouncingeffect(somemilliseconds)while(TRISAbits.RA0);}}}

LasentradasanalógicasavecessonútilescuandotienesqueleermuchosbotonesyquieresguardaralgunasentradasdeMCU:

En este circuito, cada botón produce un voltaje diferente en la entrada ADC. Así que con la entrada analógica lees ese voltaje y determinas qué botón se presionó.

    
respondido por el Andres

Lea otras preguntas en las etiquetas