PIC MCU: два входа АЦП помогают

Так что в настоящее время возился с АЦП на моем PIC16F917. У меня есть функции одной кнопки, и все работает хорошо.

В чем я действительно хотел бы помочь, так это в том, как заставить MCU принимать 2 входа, чтобы второй не был ISR.

Как я могу изменить этот код, чтобы он был таким, когда, скажем, AN1 становится > 512, PORTDbits.RD1 становится высоким, наряду с AN0 и RD0. Действующие как две отдельные системы, но работающие одновременно. Это вообще возможно?

Еще раз спасибо, Эзра

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

#define _XTAL_FREQ 4000000

void delay()
{
    int i;

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

int main()
{
    TRISD=1;                    //Set all D pins to input

    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

    int result;

    while(1)
    {
        __delay_us(5);                  //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)
        {
            PORTDbits.RD0 = 1;
            delay();
            PORTDbits.RD0 = 0;
            delay();
        }
        else
        {
            PORTDbits.RD0 = 0;
        }
    }
}

Ответы (1)

С этим PIC истинная одновременность невозможна, так как есть только одна выборка и удержание и один преобразователь. Если почти достаточно хорошо, то сработает настройка вашего кода для простого переключения между входами. Если нет, то лучше использовать PIC с более чем одним ADC/Sample и Holds, например, dsPIC, такой как dsPIC33FJ128GP802 . Или, конечно, вы можете добавить внешний АЦП.

Замечательно! Я не подумал об этом, поэтому вы бы предложили функцию, подобную мультиплексированию, для проверки входов и запуска их через АЦП? Ограничены ли доступные порты АЦП только от AN0 до AN7, или вы можете направить любой ввод на АЦП?
Да, такие вещи - просто переключите переменную и проверьте значение в коде, затем переключитесь на соответствующий вход (или для большего количества входов увеличьте значение, а затем выполните случай переключения). Вы можете использовать только аналоговые входы (AN *)
Так скажем, для 3 входов счетчик, который считает только до трех, и попутно проверяя входы 1, 2 и три 3 на соответствующее число? И частота проверки ограничена временем аналого-цифрового преобразования 5 мкс, верно?
Да, это то, что я имею в виду.