Pesquisar neste blog

21/07/2022

Menu com PIC 16F877A

Objetivo: Executar um menu de controle por meio de um botão. O programa deve mostrar um menu de 3 funções. Por meio do botão, um dos os 3 elementos e com outro executar a função (neste caso acender um led).

Código feito em CCS C Compiler

#include <16F877A.h>
#fuses XT, NOWDT
#use delay(clock = 20M)
#include <lcd.c>
#use standard_io(C)
#use standard_io(A)

enum funciones {med, cal, ini }; // atribui um valor a cada elemento: med = 0, cal = 1, ini = 2

void medir(void){
   output_toggle(PIN_C0);
}

void calibrar(void){
   output_toggle(PIN_C3);
}

void inicializar(void){
   output_toggle(PIN_C6);
}

void run_func(int numfunc){
   
   switch(numfunc){
      case med:
         medir();
      break;
      
      case cal:
         calibrar();
      break;
      
      case ini:
         inicializar();
      break;
   }
}

void main(){
   char item;
   char n_menus = 3;
   //bit_set(TRISA, 0);
   lcd_init();
   
   while(TRUE){
      if(input(PIN_A0) == 1){
         item++;
         delay_ms(300);
         lcd_putc('\f');
         
         if(item > (n_menus - 1)) {item = 0;           
         }
      }
      
      switch (item) {
         
         case 0:
            lcd_gotoxy(1, 1);
            printf(lcd_putc,"MEDIR");
            lcd_gotoxy(1, 1);
         break;
         
         case 1:
            printf(lcd_putc,"CALIBRAR");
            lcd_gotoxy(1,1);
         break;
         
         case 2:
            printf(lcd_putc,"INICIALIZAR");
            lcd_gotoxy(1,1);
         break;
      }
      
      if (input(PIN_A4) == 1){
         delay_ms(200);
         run_func(item);
      }
   }
}








15/07/2022

Matriz sequencial por colunas

Objetivo: Somar 16 bits por coluna em uma matriz 10 x 10 e imprimir seu resultado.

Resolução feita C/C++

#include <stdio.h>
#define size 10

int matriz[size][size];
int aux = 0, cont = 0, somador = 0;

int c1 = 2, c2 = 5, c3 = 10, c4 = 13, c5 = 20;

int i, j;

int main(){
    
    for(i = 0; i < size; i++){
        for(j = 0; j < size; j++){
            matriz[i][j] = aux;
            aux = aux + 16;
            cont++;
            printf("%d\t",matriz[i][j]);
            
            if(cont >= size){
                somador++;
                aux = somador;
                cont = 0;
                
            }
        }
        printf("\n");
    }
    return 0;
}

Saída gerada


12/07/2022

Decodificador 4511 com PIC 16F877A usando matriz

Objetivo: Fazer um contador com usando o decodificador 4511 utilizando apenas as portas C do PIC, logo depois utilizar as entradas por byte para identificar seu valor.

Resolução feita em CCS C Compiler

#include <16F877A.h>
#include <math.h>
#use delay(clock = 20M)
#define size 10
#include <lcd.c>

const unsigned char matriz[size][size] = {
    {0, 16, 32, 48, 64, 80, 96, 112, 128, 144},
    {1, 17, 33, 49, 65, 81, 97, 113, 129, 145},
    {2, 18, 34, 50, 66, 82, 98, 114, 130, 146},
    {3, 19, 35, 51, 67, 83, 99, 115, 131, 147},
    {4, 20, 36, 52, 68, 84, 100, 116, 132, 148},
    {5, 21, 37, 53, 69, 85, 101, 117, 133, 149},
    {6, 22, 38, 54, 70, 86, 102, 118, 134, 150},
    {7, 23, 39, 55, 71, 87, 103, 119, 135, 151},
    {8, 24, 40, 56, 72, 88, 104, 120, 136, 152},
    {9, 25, 41, 57, 73, 89, 105, 121, 137, 153}   
};

int a, b, c, d, e, f, g, decimal;
unsigned int8 aux, dezena, unidade;

void main(void){
   
    for(int i = 0; i < size; i++){
      for(int j = 0; j < size; j++){
         output_c(matriz[i][j]);
         delay_ms(100);
      }
    }
    delay_ms(500);
    
    lcd_init();
    
   while(TRUE){      
      
      a = input(PIN_B0);
      b = input(PIN_B1);
      c = input(PIN_B2);
      d = input(PIN_B3);
      e = input(PIN_B4);
      f = input(PIN_B5);
      g = input(PIN_B6);
      
      decimal = (a<<6)|(b<<5)|(c<<4)|(d<<3)|(e<<2)|(f<<1)|(g<<0);
      
      printf(lcd_putc,"\fBINARIO = %u%u%u%u%u%u%u \nDECIMAL = %u"a, b, c, d, e, f, g, decimal);
      delay_ms(100);
      
      aux = decimal / 10;
      dezena = (int)floor(aux);
      
      aux = decimal - (10 * dezena);
      unidade = (int)floor(aux);
      
      output_c(matriz[dezena][unidade]);
      delay_ms(100);
      
   }
}























Palavras chave:

Decoder 4511 with PIC16F877A using array
Декодер 4511 с PIC16F877A с использованием массива
Dekoder 4511 med PIC16F877A som bruker array
Dekoder 4511 z PIC16F877A za pomocą tablicy
מפענח 4511 עם PIC16F877A באמצעות מערך
Decoder 4511 le PIC16F877A sebelisa hlophisitsoeng
어레이를 사용하는 PIC16F877A가 있는 디코더 4511
Dekodētājs 4511 ar PIC16F877A, izmantojot masīvu
Декодер 4511 с PIC16F877A, използващ масив
Dekodér 4511 s PIC16F877A pomocí pole
Bộ giải mã 4511 với PIC16F877A sử dụng mảng

09/07/2022

PF 2021/2

Questão 1) Projetar um sistema com PICSimLab que recebe o sinal do potenciômetro e apresenta o valor de 0 a 99% no LCD e no display de 7 segmentos. (Vale 3,0 pontos)










Resolução:

Código feito no CCS C Compiler

#include <16F877A.h>
#device adc = 8
#include <math.h>
#FUSES NOWDT, HS, NOPROTECT, NODEBUG
#FUSES NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(crystal = 20MHz)

#ifndef lcd_enable
   #define lcd_enable   pin_e1 // pino enable do LCD
   #define lcd_rs       pin_e2 // pino rs do LCD
   //#define lcd_rw       pin_e2 // pino rw do LCD
   #define lcd_d4       pin_d4 // pino de dados d4 do LCD
   #define lcd_d5       pin_d5 // pino de dados d5 do LCD
   #define lcd_d6       pin_d6 // pino de dados d6 do LCD
   #define lcd_d7       pin_d7 // pino de dados d7 do LCD
#endif

#include <mod_lcd.c>
unsigned int8 valor, aux, c, d, u;
unsigned int8 vetor[] = {0b00111111, 0b00000110, // 0 a 9
   0b01011011, 0b01001111, 0b01100110, 0b01101101,
   0b01111101, 0b00000111, 0b01111111, 0b01100111 };

void main(){
   setup_adc_ports(AN0);
   setup_adc(ADC_CLOCK_INTERNAL);
   set_adc_channel(0);
   lcd_ini();

   while(TRUE){

      valor = read_adc();
      if(valor >= 99){
         valor = 99;
      }  
      aux = valor/100;     // extrai o primeiro piso das centenas
      c = (int)floor(aux); // converte para inteiro
      
      aux = ((valor/10)-(10*c)); //extrai o primeiro piso das dezenas
      d = (int)floor(aux);       //converte para inteiro
      
      aux = ((valor)-(100*c)-(10*d));  //extrai o primeiro piso das unidades
      u = (int)floor(aux);             //converte para inteiro
      
      printf (lcd_escreve,"\f\t\t\tIFMT\nValor = %u%%",valor);
      delay_ms(20);
      
      output_b(vetor[d]);
      output_c(vetor[u]);
      
   }
}
























Questão 2) Utilize os três timers para fazer três LEDs piscarem com frequência iguais a:

Vermelho (D0) ________________Hz
Azul (D1) _______________ Hz
Amarelo (D2) ________________Hz
Sabendo que no PIC tem um cristal de _______MHz












Resolução:

Aluno1 = 25 Hz, 5 Hz, 12 Hz

Código feito em CCS C Compiler

#include <16F877A.h>
#device adc = 8
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, BROWNOUT, NOLVP, NOCPD, NOWRT, NOWRT
#use delay(clock = 20MHz)

unsigned int16 cont1 = 0, cont2 = 0, cont3 = 0;

#int_TIMER0
void TIMER0_isr(void){
   if(++cont1 >= 394)  { cont1 = 0; output_toggle(pin_B0) ; } 
   if(++cont2 >= 1927) {cont2 = 0;output_toggle(pin_B1); }
   if(++cont3 >= 822) {cont3 = 0; output_toggle(pin_B2); }
}

void main(){
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL | RTCC_DIV_1); // overflow 51,2 us
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   enable_interrupts(INT_TIMER0);
   enable_interrupts(GLOBAL);
   //disable_interrupts(GLOBAL);
   
   while(true);
}

Saída de frequencímetro no Proteus 7.9























04/07/2022

Interrupção no pino B com PIC 16F877A

Código feito em CCS C Compiler

#include <16F877A.h>
#use delay(clock = 20M)

byte i;
#INT_RB
void rb_isr(void){
   i = input_b();
   output_d(i >> 4);
}

void main(){ 
   set_tris_b(0xff);
   clear_interrupt(INT_RB);
   enable_interrupts(INT_RB);
   enable_interrupts(GLOBAL);
}





























01/07/2022

View com SQL Server #144

--VIEW CANAL DE VENDAS
CREATE VIEW V_CRM_CANAL_VENDAS
AS
SELECT *FROM MINIERP.DBO.V_CANAL_VENDAS

--VIEW CONTAS A PAGAR
CREATE VIEW V_CRM_CONTAS_RECEBER
AS
SELECT *FROM MINIERP.DBO.V_CONTAS_RECEBER

--VIEW PEDIDO VENDAS DETALHE
CREATE VIEW V_CRM_PED_VENDAS_DETALHE
AS
SELECT A.NUM_PEDIDO, A.DATA_PEDIDO, A.ID_CLIENTE, B.RAZAO_CLIENTE,
A.TOTAL_PEDIDO, A.SITUACAO,
CASE WHEN A.SITUACAO = 'F' THEN 'FATURADO'
WHEN A.SITUACAO = 'P' THEN 'PLANEJADO'
END SITUA
FROM MINIERP.DBO.PED_VENDAS A
INNER JOIN MINIERP.DBO.CLIENTES B
ON A.ID_CLIENTE = B.ID_CLIENTE