Como Programar as Entradas e Saídas do Microcontrolador PIC

Como Programar as Entradas e Saídas do Microcontrolador PIC

Neste post vamos aprender como programar as entradas e saídas do microcontrolador PIC16F628A utilizado no placa CLP PIC Wantronics.

No vídeo a seguir são mostrados os passos para configuração e alguns detalhes importantes que devem ser levados em consideração na hora da programação do microcontrolador.

Código

Abaixo é apresentado o código que foi gravado no CLP PIC Wantronics.

/*
 * File:   pic_teste.c
 * Author: Wandery
 * 
 * CLP PIC Wantronics
 * Created on 18 de Outubro de 2023
 */

// PIC16F628A Configuration Bit Settings

// 'C' source line config statements

// CONFIG
#pragma config FOSC = HS        // Oscillator Selection bits (HS oscillator: High-speed crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON       // Power-up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = ON       // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is MCLR)
#pragma config BOREN = ON       // Brown-out Detect Enable bit (BOD enabled)
#pragma config LVP = OFF         // Low-Voltage Programming Enable bit (RB4/PGM pin has PGM function, low-voltage programming enabled)
#pragma config CPD = OFF        // Data EE Memory Code Protection bit (Data memory code protection off)
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#include <xc.h>

#define _XTAL_FREQ 4000000

void main(void) {
    const int tempo = 150;
    
    CMCON = 0x07; // Desliga os comparadores de tensão do PIC16F628A
    TRISA = 0x3F;
    TRISB = 0x0A;
    PORTA = 0x00;
    PORTB = 0x00;
    
    PORTBbits.RB0 = 1;
    __delay_ms (250);
    PORTBbits.RB0 = 0;
    __delay_ms (250);
    PORTBbits.RB0 = 1;
    
    while (1) {
        // Input 1
        if (PORTBbits.RB3 == 1) {
            PORTBbits.RB4 = 1;
            __delay_ms (tempo);
        }
        else {
            PORTBbits.RB4 = 0;
            __delay_ms (tempo);
        }
        
        // Input 2
        if (PORTAbits.RA4 == 1) {
            PORTBbits.RB5 = 1;
            __delay_ms (tempo);
        }
        else {
            PORTBbits.RB5 = 0;
            __delay_ms (tempo);
        }
        
        // Input 3
        if (PORTAbits.RA3 == 1) {
            PORTBbits.RB6 = 1;
            __delay_ms (tempo);
        }
        else {
            PORTBbits.RB6 = 0;
            __delay_ms (tempo);
        }
        
        // Input 4
        if (PORTAbits.RA2 == 1) {
            PORTBbits.RB7 = 1;
            __delay_ms (tempo);
        }
        else {
            PORTBbits.RB7 = 0;
            __delay_ms (tempo);
        }
        
    }
}

Para configurar o CLP PIC Wantronics é necessário conhecer onde estão conectados cada terminal do microcontrolador em cada entrada e saída. Na tabela abaixo são mostrados a localização de cada terminal.

Tabela com as entradas e saídas do CLP PIC Wantronics

Essa tabela é válida para última versão do CLP PIC Wantronics, com cristal oscilador e barramento para gravação do microcontrolador.

Com isso podemos configurar os registradores TRISA e TRISB, que são registradores responsáveis por configurar se um terminal do microcontrolador vai funcionar como entrada ou como saída. Para configurar como entrada, o terminal deve ser setado como 1 (Input = 1), caso seja necessário usar como saída deve ser setado como 0( Output = 0).

Na figura a seguir é mostrado uma tabela que ajuda a converter o valor binário em hexadecimal.

Tabela com os valores dos registradores TRISA e TRISB

Em TRISA temos RA7 = RA6 = 0 e RA5 = RA4 = 1, e se converter para hexadecimal obteremos o valor de 3, e RA0 =RA1 = RA2 = RA3 = 1, que se convertido para hexadecimal será igual a F, com isso obtemos o valor 0x3F.

Também podemos escrever o código utilizando notação binária, como mostrado no exemplo a seguir:

void main(void) {
    const int tempo = 150;
    
    CMCON = 0x07; // Desliga os comparadores de tensão do PIC16F628A
    TRISA = 0b00111111;
    TRISB = 0b00001010;
    PORTA = 0x00;
    PORTB = 0x00;
    
    PORTBbits.RB0 = 1;
    __delay_ms (250);
    PORTBbits.RB0 = 0;
    __delay_ms (250);
    PORTBbits.RB0 = 1;
    ...

Outro detalhe importante na hora de escrever o código é desligar os comparadores de tensão interno do microcontrolador, pois caso os mesmos estejam, ligados isso pode fazer com que o circuito não funcione adequadamente, gerando leitura das entradas de forma incorreta.

O registrador responsável por desligar os comparadores de tensão do microcontrolador PIC16F628A é mostrado na figura a seguir:

comparadores de tensão do microcontrolador PIC16F628A

Conclusão

Neste post vimos como programar as entradas e saídas do microcontrolador PIC16F628A. Esse tutorial também serve de referência para quem for trabalhar apenas com o microcontrolador em um protoboard e até mesmo para outro microcontrolador da mesma família, como por exemplo o PIC16F887. Todos os detalhes de configuração e de como utilizar o microcontrolador devem ser consultados no datasheet do componente.

Isso é tudo pessoal, e até o próximo post.