sexta-feira, 9 de setembro de 2016

Teclados - Atividade 1



Identificando valores de conversão para cada tecla (divisor de tensão)


               Utilizando o programa “Tec_atv01.c” (listado no fim deste post) monte compile um projeto no MPLAB X IDE.




1. Elabore o hardware no simulador.

2. Preencha a tabela abaixo baseado nos dados obtidos do simulador.



3. Elabore o hardware físico.


4. Preencha a tabela abaixo baseado nos dados do obtidos no hardware físico.



5. Compare os valores obtidos no simulador e no hardware físico e explique por que as diferenças.

6. Explique o que deveria ser feito no programa para:

  • Baixar o menor valor
  • Elevar o maior valor

7. Se fossem executadas as mudanças do item 6, o que aconteceria com a faixa entre os valores? Por que? 


Entregue (mostre) escrita as questões 2, 4, 5, 6 e 7.


   


/*
 * File:   Tec_atv01.c
 * Author: Pilger
 *
 * Created on 16 de Setembro de 2017, 09:26
 * Teclado - Atividade 01
 * Entendimento inicial do circuito divisor de tensão no conversor A/D
 * 
 * Utiliza a entrada AN0 como sinal de entrada e converte um sinal entre 0 e 5V
 * Apresenta o resultdo convertido (0 a 1023) na linha 1 do LCD
 *
 */

#define _XTAL_FREQ 48000000

#include <stdio.h>
#include <xc.h>
#include "C:\h\Config_PIC18F4550.h"
#include "c:\h\biblioteca_lcd_2x162_48M_XC.h"

// protótipos de funções
void config_AD(void);
int conv_AD(void);
void delay_ms(int i);

void main(void) {
    // variáveis locais
    int valor_convertido;
    unsigned char buffer[16];
    float tensao;
    // define os pinos de IO
    TRISA = 0b00000001;
    TRISB = 0x00;
    TRISC = 0x00;
    TRISD = 0x00;
    TRISE = 0x00;
    config_AD(); // configura e inicializa o conversor AD
    lcd_inicia(0x28, 0x0f, 0x06); // incializa o LCD com 4 linhas
    lcd_LD_cursor(0); // Desliga o cursor
    lcd_posicao(1, 1);
    imprime_string_lcd("Teclado A/D");

    while (1) {
        valor_convertido = conv_AD();
        // mostra no lcd o valor convertido (0-1023)
        lcd_posicao(2, 1);
        sprintf(buffer, "Conversao= %04d ", valor_convertido);
        imprime_buffer_lcd(buffer, 16);
        delay_ms(1000); // atraso de 1s
    }
}


// função de configuração do conversor A/D
void config_AD (void) {
ADCON0 = 0b00000001; /* canal AN0 selecionado <5:2> 0000
                             * Flag GO - /DONE desligado <1> 0
                             * Módulo conversor ligado <0> 1 */
ADCON1 = 0b00001110; /*  Vref- = VSS <5> 0
                             *  Vref+ = VDD <4> 0
                             * pino RA0/AN0 analógico e demais digitais <3:0> 1110 */
ADCON2 = 0b10110110; /* Resultado justificado a direita <7> 1
                             * Tempo de Aquisição de 16 TDA <5:3> 110 
                             * mínimo recomendado p/ automático = 4TDA
                             * TDA = 1,33us <2:0> 110
                             * 48MHz/64 = 750kHz = 1,33us */
}

// função que efetua uma conversão A/D e retorna um inteiro com o valor convertido
int conv_AD (void) {
int result_AD; // Variável local para armazenar o resultado da conv
ADCON0bits.GO=1; // inicia a conversão
while (ADCON0bits.GO); // Aguarda a o fim da conversão
result_AD = (((int)ADRESH)<<8)|(ADRESL);
return result_AD;
}
// função que gera atraso em mlisegundos
void delay_ms(int i){
    for ( int x = 0; x < i; x++ )     { 
    __delay_ms(1); 
    }
}


   


Nenhum comentário:

Postar um comentário