Чего мне не хватает в этой конфигурации PIC 12F675? - PullRequest
0 голосов
/ 30 января 2019

Мне не удается получить GP4 в качестве цифрового выхода (даже GP2 не настроен как GPIO, так что это может быть проблемой конфигурации аналогового вывода?) Я должен был отключить все функции, кроме регистра TRIS, на GP4 иGP2, но это не так ...

Это код (не обращайте слишком много внимания на правильность аналоговых данных, потому что я работаю над этим и все еще учусь;не против даже комментарии на итальянском):

// PIC12F675 Configuration Bit Settings // 'C' source line config statements // 

#pragma config FOSC = INTRCIO // Oscillator Selection bits (INTOSC oscillator: I/O function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN) 
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled) 
#pragma config PWRTE = OFF // Power-Up Timer Enable bit (PWRT disabled) 
#pragma config MCLRE = OFF // GP3/MCLR pin function select (GP3/MCLR pin function is GP3) 
#pragma config BOREN = ON // Brown-out Detect Enable bit (BOD enabled)
#pragma config CP = OFF // Code Protection bit (Program Memory code protection is disabled) 
#pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled) 

#define _XTAL_FREQ 4000000 
#include <xc.h> 

/* ADCON serve, tra l'altro a selezionare il canale analogico da convertire in digitale * e, quindi, se si hanno piu' canali in un ciclo, da convertire, bisogna agire sempre * su questo registro */

int i = 0;
int j = 0;
unsigned short int A = 0;

void main(void) { 
    OSCCAL= 0x80; 
    CMCON = 0b00000111; 
    T1CON = 0b00000100; 
    OPTION_REG = 0b11000000; 

    // TRISIO = 0b001011;
    TRISIObits.TRISIO0 = 1;
    TRISIObits.TRISIO1 = 1;
    TRISIObits.TRISIO2 = 0;
    TRISIObits.TRISIO3 = 1;
    TRISIObits.TRISIO4 = 0;
    TRISIObits.TRISIO5 = 0; 

    ADCON0 = 0x00; 
    ANSEL = 0b00000011; // analog and digital channel selection 

    while(1) { 

        ADCON0 = 0b10000011; // select channel and start AD conversion cycle 
        __delay_ms(10); 

        A = ((ADRESH <<8)+ ADRESL);

        for(i=10;i>=0;i--) { // controlla i singoli bit 

            j = A >> i; 
            if (j & 1) { // se = 1, manda un segnale sul canale GP5
                GPIObits.GP5 = 1; 
                __delay_ms(250);
                GPIObits.GP5 = 0; 
                __delay_ms(250); 
            } 

            if (j & 0) { // se = 1, manda un segnale sul canale GP4
                GPIObits.GP4 = 1; __delay_ms(250);
                GPIObits.GP4 = 0; __delay_ms(250);
            }

            __delay_ms(1000); 

        } 
    }

    return; 
}

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

@ Michele Giglio,

Назначение кода, который вы разместили, похоже на то, где результат АЦП проверяется от старшего значащего до младшего значащего бита.Для каждого бита, равного единице, импульс выводится на GP5, для каждого бита, равного нулю, импульс выводится на GP4.

Это ваш цикл while, измененный для выполнения, как описано:

while(1) { 

    ADCON0 = 0b10000011; // select channel and start AD conversion cycle 
    __delay_ms(10); 

    A = ((ADRESH <<8)+ ADRESL);

    for(i=(1<<9);i!=0;i>>=1) { // controlla i singoli bit 

        if ((j & i) == 1) { // se = 1, manda un segnale sul canale GP5
            GPIObits.GP5 = 1; 
            __delay_ms(250);
            GPIObits.GP5 = 0; 
            __delay_ms(250); 
        } 

        if ((j & i) == 0) { // se = 1, manda un segnale sul canale GP4
            GPIObits.GP4 = 1;
            __delay_ms(250);
            GPIObits.GP4 = 0;
            __delay_ms(250);
        }

        __delay_ms(1000); 

    } 
}
0 голосов
/ 01 февраля 2019

Я не уверен, что у вас что-то не так с вашими выходами, дважды проверил, и они выглядят правильно настроенными.

Я немного сбит с толку утверждением if:

if (j & 0) { // se = 1, manda un segnale sul canale GP4
                GPIObits.GP4 = 1; __delay_ms(250);
                GPIObits.GP4 = 0; __delay_ms(250);
            }

Это, если оператор выполняет побитовое И 0 и j, который ВСЕГДА 100% гарантированно равен 0, поэтому GP4 никогда не будет переключаться, и вы также можете удалить этот код.

Я думаю, именно поэтомуGP4 не работает


Также взгляните на https://www.microforum.cc/ - отличный ресурс для информации о микроконтроллерах PIC и AVR и встроенном программировании в целом.

...