-
Posts
78 -
Cadastrado em
-
Última visita
Tópicos solucionados
-
O post de Lucas Pereira de Souza em calcular defasagem de sinal no pic18f4550 foi marcado como solução
No fim consegui fazer a leitura do sinal, utilizei o modo ccp em borda de subida de borda de descida, sendo assim o timer1 armazena o tempo do pulso na interrupção do modulo ccp, veja:
void interrupt()
{
//BORDA DE DESCIDA
if(CCP1IF_bit == 1 && CCP1M0_bit == 1 && CCP1M1_bit == 0 && CCP1M2_bit == 1 && CCP1M3_bit == 0)
{
CCP1IF_bit = 0; // LIMPAR FLAG DE INTERRUPCÃO
CCP1IE_bit = 0; // DESABILITAR INTERRUPCÃO
CCP1M0_bit = 0; // CCP MODO DE EM BORDA DE DESCIDA
CCP1M1_bit = 0;
CCP1M2_bit = 1;
CCP1M3_bit = 0;
CCP1IE_bit = 1; // HABILITAR INTERRUPCÃO
TMR1H = 0x00;
TMR1L = 0x00;
TMR1ON_bit = 1; // LIGAR O TIMER1
}
//BORDA DE SUBIDA
else if(CCP1IF_bit == 1 && CCP1M0_bit == 0 && CCP1M1_bit == 0 && CCP1M2_bit == 1 && CCP1M3_bit == 0)
{
CCP1IF_bit = 0; // LIMPAR FLAG DE INTERRUPCÃO
TMR1ON_bit = 0; // TIMER1 DESLIGADO
CCP1IE_bit = 0; // DESABILITA INTERRUPCÃO
CCP1M0_bit = 1; // CCP MODO DE EM BORDA DE SUBIDA
CCP1M1_bit = 0;
CCP1M2_bit = 1;
CCP1M3_bit = 0;
CCP1IE_bit = 1; // HABILITA INTERRUPCÃO
tempo_H = CCPR1H;
tempo_L = CCPR1L;
}
-
O post de Lucas Pereira de Souza em Ajude em circuito impresso foi marcado como solução
Maravilha camarada, não conhecia essa placa de composite valeu pela dica.
-
O post de Lucas Pereira de Souza em Conversor AD com PIC16F676 foi marcado como solução
aí valeu por tentar ajudar eu,
Fiquei se matando aqui até conseguir puts alegria consegui configurar o conversor AD, quando eu terminar o projetinho do voltimetro vou postar ele no forum para a galera ver veja como o código ficou polido agora:
// Voltimetro de Bancada digital
// Autor: Lucas Pereira de Souza Pinto DATA: 21/04/2015
// Projeto com crystal de 20mhZ
// TOSC = 1/FOSC
// FOSC: Frequêcia do oscilador
// TOSC: Oscilador interno
// Formula para o timer Tempo_requerido = (4)*[(1)/(FOSC)]*Prescaler*(8bits_our_16bits - Carga_do_timer)
// Cálculos para este projeto
// Ciclo de maquina = (1/20mhZ)*4 = 200*10^-9S ou 0,2uS//200uS
// 500000*10^-6 = (0,2*10^-6)*(8)*(65536 - Q)
//Include
#include <stdio.h>
#include <stdlib.h>
#include <pic16f676.h>
//#include <xc.h>
#define _XTAL_FREQ 20000000 // cristal de 20 Mhz
//#define delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000.0)))
//define delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0)))
//CONFIG
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator: High speed crystal/resonator on RA4/OSC2/CLKOUT and RA5/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 // RA3/MCLR pin function select (RA3/MCLR pin function is MCLR)
#pragma config BOREN = OFF // Brown-out Detect Enable bit (BOD disabled)
#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)
//Definições
#define A PORTCbits.RC0
#define B PORTCbits.RC1
#define C PORTCbits.RC2
#define D PORTCbits.RC3
#define Q1 PORTCbits.RC4
#define LED PORTCbits.RC5
//Protótipos de Funções
void bank(char num); //Protótipo da função do banco para acesso do banco da memória
void delay_mS_125(); //Protótipo da função Timer1 125mS
void delay_ms_5(); //Protótipo da função Timer1 5mS
void delay_ms_1(); //Protótipo da função Timer1 1mS
void pic_init(); //Protótipo para iniciar o pic
void config_AD(); //Protótipo para configurar conversor AD
int read_AD(); //Protótipo para conversão AD
void Dysplay_7_segmentos(char digito); //Protótipo para display 7 Segmentos
void interrupt interrup(void) // Vetor nterrupção
{
}
int main()
{
pic_init(); //START PIC
config_AD(); //CONFIG AD
float var = 0; //VARIAVEl GLOBAL
while(1)
{
var = ((float)read_AD());
var = var*5;
var = var/1023;
if(var > 2.5)
{
LED = 1;
}
else
{
LED = 0;
}
}//End_while
}//End_main
//Trabalhos das funções
void delay_mS_125()
{
//start
TMR1H = 0x31; //Timer 1 para 125mS
TMR1L = 0x2D;
T1CONbits.TMR1ON = 1;
while(!PIR1bits.TMR1IF && !PIR1bits.T1IF);
T1CONbits.TMR1ON = 0;
PIR1bits.TMR1IF = 0;
PIR1bits.T1IF = 0;
TMR1H = 0x00;
TMR1L = 0x00;
}
void delay_ms_5()
{
//start
TMR1H = 0xF3; //Timer 1 para 5mS
TMR1L = 0xCA;
T1CONbits.TMR1ON = 1;
while(!PIR1bits.TMR1IF && !PIR1bits.T1IF);
T1CONbits.TMR1ON = 0;
PIR1bits.TMR1IF = 0;
PIR1bits.T1IF = 0;
TMR1H = 0x00;
TMR1L = 0x00;
}
void delay_ms_1()
{
//start
TMR1H = 0xFF; //Timer 1 para 5mS
TMR1L = 0xC1;
T1CONbits.TMR1ON = 1;
while(!PIR1bits.TMR1IF && !PIR1bits.T1IF);
T1CONbits.TMR1ON = 0;
PIR1bits.TMR1IF = 0;
PIR1bits.T1IF = 0;
TMR1H = 0x00;
TMR1L = 0x00;
}
void pic_init()
{
CMCON = 0b00000111; //Desliga todos os comparadores
bank(1); //Seleciona banco 1 da memória
TRISA = 0b00000001; //RA0 como entrada e as demais como saída
TRISC = 0x00; //PORTC todos como saída
bank(0); //Seleciona banco 0 da memória
//TIMER1
INTCONbits.GIE = 1; //GIE:Global Habilitar Interrupção global
INTCONbits.PEIE = 1; //Habilitar Interrupção periférico
//PIE1 ? PERIPHERAL INTERRUPT ENABLE REGISTER 1 (ADDRESS: 8Ch)
PIE1bits.TMR1IE = 0; //TMR1 Desabilitar estouro do Timer1
PIE1bits.T1IE = 0;
//PIR1 ? PERIPHERAL INTERRUPT REGISTER 1 (ADDRESS: 0Ch)
PIR1bits.TMR1IF = 0; //TMR1IF: TMR1 Flag de estouro
PIR1bits.T1IF = 0;
//T1CON ? TIMER1 CONTROL REGISTER (ADDRESS: 10h)
T1CONbits.T1CKPS0 = 1; //T1CKPS1:T1CKPS0: Timer1 Input Clock Prescale Select bits
T1CONbits.T1CKPS1 = 1; //T1CKPS1:T1CKPS0: Timer1 Input Clock Prescale Select bits
T1CONbits.TMR1CS = 0; //TMR1CS: Timer1 Clock Source Select bit
T1CONbits.TMR1ON = 0; //TIMER 1 DESABILITADO
T1CONbits.TMR1ON = 0; //TIMER 1 OFF
}
void Dysplay_7_segmentos(char digito)
{
switch(digito)
{
case 0://escreve 0
A=0;B=0;C=0;D=0;
break;
case 1://escreve 1
A=1;B=0;C=0;D=0;
break;
case 2://escreve 2
A=0;B=1;C=0;D=0;
break;
case 3://escreve 3
A=1;B=1;C=0;D=0;
break;
case 4://escreve 4
A=0;B=0;C=1;D=0;
break;
case 5://escreve 5
A=1;B=0;C=1;D=0;
break;
case 6://escreve 6
A=0;B=1;C=1;D=0;
break;
case 7://escreve 7
A=1;B=1;C=1;D=0;
break;
case 8://escreve 8
A=0;B=0;C=0;D=1;
break;
case 9://escreve 9
A=1;B=0;C=0;D=1;
break;
}
}
void bank(char num)
{
//Banco 0
if(num == 0)
{
STATUSbits.RP0 = 0;
}
//Banco 1
else if(num == 1)
{
STATUSbits.RP0 = 1;
}
}
void config_AD()
{
//CONFIGURAÇÃO DO REGISTRADOR ADCON0
ADCON0bits.ADFM = 1; //Justificar resultado para direita
ADCON0bits.VCFG = 0; //Tensão de referência do pic padrão 5V
ADCON0bits.CHS0 = 0; //Seleção do canal (AN0)
ADCON0bits.CHS1 = 0; //Seleção do canal (AN0)
ADCON0bits.CHS2 = 0; //Seleção do canal (AN0)
ADCON0bits.ADON = 1; //Conversor Analógico - Digital ligado
//CONFIGURAÇÃO DO REGISTRADOR ADCON1
ADCON1bits.ADCS0 = 1; //Clock do conversor analógico digital FOSC/8
ADCON1bits.ADCS1 = 0; //Clock do conversor analógico digital FOSC/8
ADCON1bits.ADCS2 = 0; //Clock do conversor analógico digital FOSC/8
//CONFIGURAÇÃO DO REGISTRADOR ANSEL
ANSELbits.ANS0 = 1; //Apenas RA0 como analógica
ANSELbits.ANS1 = 0; //Apenas RA0 como analógica
ANSELbits.ANS2 = 0; //Apenas RA0 como analógica
ANSELbits.ANS3 = 0; //Apenas RA0 como analógica
ANSELbits.ANS4 = 0; //Apenas RA0 como analógica
ANSELbits.ANS5 = 0; //Apenas RA0 como analógica
ANSELbits.ANS6 = 0; //Apenas RA0 como analógica
ANSELbits.ANS7 = 0; //Apenas RA0 como analógica
//CONFIGURAÇÃO DO REGISTRADOR PIE1
PIE1bits.ADIE = 0; //Interrupçao do para conversor A/D desligado
//CONFIGURAÇÃO DO REGISTRADOR PIR1
PIR1bits.ADIF = 0; //Flag de interrupção para conversor A/D, limpa por software
}
int read_AD()
{
int result_AD; //Declaração variavel local
ADCON0bits.GO = 1; //Inicia conversão
while(ADCON0bits.GO); //aguarda conversão
delay_ms_1(); //delay_1ms
result_AD = (((int)ADRESH)<<8)|(ADRESL); //Obtem o valor da conversão
return result_AD; //Retorna para result_AD
}
Sobre o Clube do Hardware
No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais
Direitos autorais
Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais