Ir ao conteúdo
  • Cadastre-se

Lucas Pereira de Souza

Membro Pleno
  • Posts

    78
  • Cadastrado em

  • Última visita

Tudo que Lucas Pereira de Souza postou

  1. Amigo, eu fiz o procedimento que você falou o erro persistiu, não faço ideia o que seja o erro, estou montando o projeto físico para ver o que descubro.
  2. Eu concordo com você Paulo, entre tanto, a graça é você fazer o próprio instrumento. Estou desconfiado da eletrônica, acredito que o AD e o compilador esta normal, o voltímetro não tem esse problema, apenas com o ACS712 provavelmente pode ser ele, será que essa montagem que eu fiz no Proteus esta correta em relação a ele ? vou dar uma olhada na folha de dados dele.
  3. Amigo, primeiro coloque todo PORTB como digital, da uma olhada lá na folha de dados dele, onde fica o ADCON1 ou ADCON configura todos PORT como digital, depois faça o seguinte: int main() { TRISBbits.RB0 = 1; // RB0 como entrada TRISDbits.RD0 = 0;// RD0 como saída while(1) { if(!PORTBbits.RB0) // Verifica se o botão foi apertado { PORTDbits.RD0 = 1; } else { PORTDbits.RD0 = 0; } }//END WHILE }//END
  4. Olá pessoal, eu estou finalizando um projeto, entre tanto, está complicado de resolver o erro acumulativo que ocorre com o sensor ASC712, fora isso o projeto está pronto, gostaria de uma ajuda para resolver esse problema, eu utilizei o compilador XC8 para o projeto. Segue o código do projeto e o vídeo do mesmo. adicionado 2 minutos depois //INSTRUMENTO DE BANCADA BY (TERRIBLE_LAB) //AUTOR:LUCAS PEREIRA DE SOUZA PINTO //DATA:21/05/2015 //INCLUDES #include <stdlib.h> #include <stdio.h> #include <pic16f677.h> #include <xc.h> //******************************************************************************************************************************************************** //CONFIG #pragma config FOSC = HS // Oscillator Selection bits (INTOSC oscillator: I/O function on RA4/OSC2/CLKOUT pin, I/O function on 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 = ON // RESET ON #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) #pragma config IESO = OFF // Internal External Switchover bit (Internal External Switchover mode is disabled) #pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled) //******************************************************************************************************************************************************** //DEFINES #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))) //Definição de linhas de endereço do display***************** #define T1 PORTCbits.RC4 //NPN1 #define T2 PORTCbits.RC5 //NPN2 #define T3 PORTCbits.RC6 //NPN3 #define T4 PORTCbits.RC7 //NPN4 //Definição linhas de dados do display ********************** #define A PORTCbits.RC0 //A #define B PORTCbits.RC1 //B #define C PORTCbits.RC2 //C #define D PORTCbits.RC3 //D //************************************************************ #define LAMP PORTAbits.RA2 //PISCA PISCA #define B_T PORTBbits.RB4 //tensão #define B_A PORTBbits.RB5 //AMPER #define tensão PORTBbits.RB6 //tensão/LED #define CORRENTE PORTBbits.RB7 //CORRENTE/LED //******************************************************************************************************************************************************** //**************************************************************************** //PROTOTIPO DE FUNÇÃO void pic_start(); void bank(char num); void aciona_display(int numero, int casa); void escrever_variavel(int valor); void escrever_unidade(int unidade); void escrever_dezena(int dezena); void escrever_centena(int centena); void escrever_milhar(int milhar); int read_AD(); //**************************************************************************** //PROGRAMA PRINCIPAL int main() { pic_start(); //START PIC float var = 0; //VARIAVEl GLOBAL while(1) { //START //ROTINA MODO NORMAL if(B_T == 0 && B_A == 0 || B_T == 1 && B_A == 1) { ADCON0bits.ADON = 0; tensão = 0; CORRENTE = 0; LAMP = !LAMP,delay_ms(200); A=1,B=1,C=1,D=1,T1=1,T2=1,T3=1,T4=1; } //ROTINA DO VOLTIMETRO else if(B_T == 1 && B_A == 0) { ADCON0bits.CHS0 = 0; ADCON0bits.CHS1 = 0; ADCON0bits.CHS2 = 0; ADCON0bits.CHS3 = 0; tensão = 1; CORRENTE = 0; LAMP = 0; ADCON0bits.ADON = 1; var = read_AD(); var = read_AD()*25.00; //Pega sinal do AD e multiplica pela tensão que você ira medir var = var/1024; //Divide por 1024 para achar volts/bits var = var * 100; //multiplica por 100 para aparecer no display de 7 segmentos, ja que a variavel esta framentada escrever_variavel(var); //Escreve variavel no display 7 Segmentos var = 0x00; //Limpa variavel } //ROTINA DO AMPERIMETRO else if(B_T == 0 && B_A == 1) { ADCON0bits.CHS0 = 1; ADCON0bits.CHS1 = 0; ADCON0bits.CHS2 = 0; ADCON0bits.CHS3 = 0; tensão = 0; CORRENTE = 1; LAMP = 0; ADCON0bits.ADON = 1; var = read_AD(); //Faz Leitura do converso AD e iguala a variavel a ser trabalhada var = var -512; //Faz subttação de 512 do sesor, devido ele trabalhar em -5 e +5 ou seja 512 = 2.5 V = 0A var = var*0.004882812; //Pega a variavel e multiplica pela divisão de 5/1024 para ad de 10 bits var = var/0.185; //Pega a resolção do sensor divide pela variavel var = var*1000; //multiplica por 1000 para aparecer no display de 7 segmentos, ja que a variavel esta framentada escrever_variavel(var); //Escreve variavel no display 7 Segmentos*/ var = 0x00; } //END } } //***************************************************************************** //TRATAMENTO DE PROTOTIPO void pic_start() { bank(1); //SELECT BANK ONE TRISC = 0b00000000; //ALL PORTC WITH OUT TRISA = 0b00111011; //VOLT,AMP,RESET,RA4,RA5 = IN , LAMP = OUT TRISB = 0b00110000; //ONLY RB4 e RB5 IN bank(0); //SELECT BANK ZERO CORRENTE = 0; tensão = 0; ADCON0bits.ADFM = 1; //Conversor justificado para direita ADCON0bits.VCFG = 0; //Tensão do microcontrolador //Conversor AD SELEÇÃO DO CANAL AN0 PARA TENSÃO PARA INICIO ADCON0bits.CHS0 = 0; ADCON0bits.CHS1 = 0; ADCON0bits.CHS2 = 0; ADCON0bits.CHS3 = 0; //Ligando conversor AD ADCON0bits.ADON = 1; //Ligado //Configurando fonte de clock para AD ADCON1bits.ADCS0 = 1; ADCON1bits.ADCS1 = 0; ADCON1bits.ADCS2 = 0; //Configurando se o pino é analógico ou digiral ANSEL = 0b00000011; ANSELH = 0b00000000; } void bank(char num) { //Banco 0 if(num == 0) { RP0 = 0, RP1 = 0; } //Banco 1 else if(num == 1) { RP0 = 0, RP1 = 1; } //Banco 2 else if(num == 2) { RP0 = 1, RP1 = 0; } //Banco 3 else if(num == 3) { RP0 = 1, RP1 = 1; } } void aciona_display(int numero, int casa) { if(casa == 1) { switch(numero) { case 0: A=0,B=0,C=0,D=0,T1=1,T2=0,T3=0,T4=0; break; case 1: A=1,B=0,C=0,D=0,T1=1,T2=0,T3=0,T4=0; break; case 2: A=0,B=1,C=0,D=0,T1=1,T2=0,T3=0,T4=0; break; case 3: A=1,B=1,C=0,D=0,T1=1,T2=0,T3=0,T4=0; break; case 4: A=0,B=0,C=1,D=0,T1=1,T2=0,T3=0,T4=0; break; case 5: A=1,B=0,C=1,D=0,T1=1,T2=0,T3=0,T4=0; break; case 6: A=0,B=1,C=1,D=0,T1=1,T2=0,T3=0,T4=0; break; case 7: A=1,B=1,C=1,D=0,T1=1,T2=0,T3=0,T4=0; break; case 8: A=0,B=0,C=0,D=1,T1=1,T2=0,T3=0,T4=0; break; case 9: A=1,B=0,C=0,D=1,T1=1,T2=0,T3=0,T4=0; break; } } if(casa == 2) { switch(numero) { case 0: A=0,B=0,C=0,D=0,T1=0,T2=1,T3=0,T4=0; break; case 1: A=1,B=0,C=0,D=0,T1=0,T2=1,T3=0,T4=0; break; case 2: A=0,B=1,C=0,D=0,T1=0,T2=1,T3=0,T4=0; break; case 3: A=1,B=1,C=0,D=0,T1=0,T2=1,T3=0,T4=0; break; case 4: A=0,B=0,C=1,D=0,T1=0,T2=1,T3=0,T4=0; break; case 5: A=1,B=0,C=1,D=0,T1=0,T2=1,T3=0,T4=0; break; case 6: A=0,B=1,C=1,D=0,T1=0,T2=1,T3=0,T4=0; break; case 7: A=1,B=1,C=1,D=0,T1=0,T2=1,T3=0,T4=0; break; case 8: A=0,B=0,C=0,D=1,T1=0,T2=1,T3=0,T4=0; break; case 9: A=1,B=0,C=0,D=1,T1=0,T2=1,T3=0,T4=0; break; } } if(casa == 3) { switch(numero) { case 0: A=0,B=0,C=0,D=0,T1=0,T2=0,T3=1,T4=0; break; case 1: A=1,B=0,C=0,D=0,T1=0,T2=0,T3=1,T4=0; break; case 2: A=0,B=1,C=0,D=0,T1=0,T2=0,T3=1,T4=0; break; case 3: A=1,B=1,C=0,D=0,T1=0,T2=0,T3=1,T4=0; break; case 4: A=0,B=0,C=1,D=0,T1=0,T2=0,T3=1,T4=0; break; case 5: A=1,B=0,C=1,D=0,T1=0,T2=0,T3=1,T4=0; break; case 6: A=0,B=1,C=1,D=0,T1=0,T2=0,T3=1,T4=0; break; case 7: A=1,B=1,C=1,D=0,T1=0,T2=0,T3=1,T4=0; break; case 8: A=0,B=0,C=0,D=1,T1=0,T2=0,T3=1,T4=0; break; case 9: A=1,B=0,C=0,D=1,T1=0,T2=0,T3=1,T4=0; break; } } if(casa == 4) { switch(numero) { case 0: A=0,B=0,C=0,D=0,T1=0,T2=0,T3=0,T4=1; break; case 1: A=1,B=0,C=0,D=0,T1=0,T2=0,T3=0,T4=1; break; case 2: A=0,B=1,C=0,D=0,T1=0,T2=0,T3=0,T4=1; break; case 3: A=1,B=1,C=0,D=0,T1=0,T2=0,T3=0,T4=1; break; case 4: A=0,B=0,C=1,D=0,T1=0,T2=0,T3=0,T4=1; break; case 5: A=1,B=0,C=1,D=0,T1=0,T2=0,T3=0,T4=1; break; case 6: A=0,B=1,C=1,D=0,T1=0,T2=0,T3=0,T4=1; break; case 7: A=1,B=1,C=1,D=0,T1=0,T2=0,T3=0,T4=1; break; case 8: A=0,B=0,C=0,D=1,T1=0,T2=0,T3=0,T4=1; break; case 9: A=1,B=0,C=0,D=1,T1=0,T2=0,T3=0,T4=1; break; } }//desabilita todos os 4511 } void escrever_variavel(int valor) { escrever_unidade(valor); escrever_dezena(valor); escrever_centena(valor); escrever_milhar(valor); if(valor >= 9999) { A=1,B=1,C=1,D=1,T1=1,T2=1,T3=1,T4=1; } else { valor = valor; } } void escrever_unidade(int unidade) { unidade = ((unidade/1000)%10);//Primeiro digito aciona_display(unidade,4),delay_ms(125); } void escrever_dezena(int dezena) { dezena = ((dezena/100)%10);//Segundo digito aciona_display(dezena,3),delay_ms(125); } void escrever_centena(int centena) { centena = ((centena/10)%10);//Terceiro digito aciona_display(centena,2),delay_ms(125); } void escrever_milhar(int milhar) { milhar = (milhar%10);//Quarto digito aciona_display(milhar,1),delay_ms(125); } int read_AD() { int result_AD; //Declaração variavel local ADCON0bits.GO = 1; //Inicia conversão while(ADCON0bits.GO); //aguarda conversão result_AD = (((int)ADRESH)<<8)|(ADRESL); //Obtem o valor da conversão return result_AD; //Retorna para result_AD } adicionado 19 minutos depois
  5. Olá amigos, gostaria de tirar uma duvida, atualmente estou tentando fazer um teclado matriz. Eu fiz o seguinte procedimento, configurei as coluna como saída e as linhas como entrada, sendo assim, logo em seguida coloquei a coluna 1 um em modo pulsante liguei direto na linha 1, porém o microcontrolador não reconhece essa transição, ele só reconhece quando deixo a coluna 1 ligada de forma direta. veja o exemplo: /* * File: Main.c * Author: lucas * * Created on 12 de Outubro de 2016, 17:40 */ #include <stdio.h> #include <stdlib.h> #include <pic16f628a.h> #include <xc.h> // 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 = OFF // Brown-out Detect Enable bit (BOD enabled) #pragma config LVP = OFF // Low-Voltage Programming Enable bit (RB4/PGM pin has digital I/O function, HV on MCLR must be used for programming) #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) //Definição para tempo #define _XTAL_FREQ 4000000 // cristal de 4 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))) //Definição para colunas do teclado #define X1 PORTAbits.RA0 #define X2 PORTAbits.RA1 #define X3 PORTAbits.RA2 #define X4 PORTAbits.RA3 //Definições para linha do teclado #define Y1 PORTBbits.RB4 #define Y2 PORTBbits.RB5 #define Y3 PORTBbits.RB6 #define Y4 PORTBbits.RB7 void bank(char num); int main() { bank(1); TRISA = 0x00; TRISB = 0b11110000; bank(0); CMCON = 0x07; //Desable CCP PORTB = 0x00; PORTA = 0x00; while(1) { X1 = 1; delay_ms(1000); X1 = 0; delay_ms(1000); if(X1 == 1 && Y1 == 1) { PORTBbits.RB0 = 1; } } } void bank(char num) { //Banco 0 if(num == 0) { RP0 = 0, RP1 = 0; } //Banco 1 else if(num == 1) { RP0 = 0, RP1 = 1; } //Banco 2 else if(num == 2) { RP0 = 1, RP1 = 0; } //Banco 3 else if(num == 3) { RP0 = 1, RP1 = 1; } } adicionado 48 minutos depois kkkkkkkkkk, descobri o erro, foi um coisa tão besta que fiquei com vontade de dar um tiro na minha cabeça.
  6. Então amigo, a placa se encontra em estado de funcionamento normal, entre tanto, a troca do capacitor eu mesmo iria substituir só queria saber se vale a pena trocar o capacitor já que ele esta estufado.
  7. Olá amigos do fórum, gostaria de saber se vale a pena trocar o capacitor estufado da minha placa mãe aparentemente a placa mãe funciona sem problemas alguns, será que vale a pena trocar ? Obs: ECS-GF8200A uma plaquinha bem antiga já.
  8. Olá amigo, como você consegue deixar a placa azul ? e deixar a parte para o furo certinho para solda ?
  9. Olá amigo, parabéns sua placa ficou ótima, queria saber se você conseguiu fazer a parte escrita em cima da placa, ou seja, o top silk. Você vai fazer tutorial desse metodo ?
  10. Maravilha camarada, não conhecia essa placa de composite valeu pela dica.
  11. Eu recomendo um PIC16F ou PIC18F ou ATMEGA 328, tanto a microchip e atmel são otimos frabricantes, eu atualmente estou focando nesses dois fabricantes de microcontroladores por causa que é mais fácil achar material, porém, também tem a Renesas que é muito boa também, resumindo tudo, a ATMEL E MICROCHIP são mais utilizadas nos crusos de eletrônica, entre tanto, isso não limita você ir para outros fabricantes.
  12. Olá amigos do forum, a um tempo venho estudando como construir minha PCB, entre tanto, eu consegui bons resultados usando o metodo de transfrerência térmica, porém, não obtive sucesso na parte superior da placa, ou seja, a descrição de VCC GND ETC... Queria saber, se alguem sabe algum metodo de transferir a partes escritas da minha placa em cima do fenolite, porém, na parte superior e não na parte de cobre. OBs: Ja tentei no método térmico fica toda falhada não pega direito. Veja a minha plaquinha que eu estava querendo transferir a parte de cima:
  13. O prescaler vai depender do seu projeto, no caso do meu projeto eu usei prescaler 8 e para esse projetinho eu usei o PIC18F4520 e um crystal de 4MHz O pulso é do foto transistor, eu usei dois timers porque um timer 0 conta o pulso de fototransistor e o timer 1 serve para dar um delay 0.5, ou seja, quando eu disparo o timer 0 e o timer 1 eu espero a contagem, sendo assim, depois de 0.5 segundos desligo o timer 0 e 1 e ai eu pego a carga do timer 0 multiplico por 2 para dar uma amostra de 1s, entre tanto, pego o valor do timer 0 multiplico por 60 para virar RPM e divido pelo numero de hélices do cooler. Fica ai uma dica para fazer os calculos para seu timer: Tempo_requerido = (4)*[(1)/(FOSC)]*Prescaler*(8bits_our_16bits - Carga_do_timer) É so você isolar a carga do timer e depois carregar TMRL e TMRH. Obs: Esse é um metodo que usei, mas existe outro que é o modo CCP, porém se o seu projeto esta muito em cima faça do jeito que você começou mesmo. Obs: Eu poderia usar uma rotininha de delay comum no lugar do TIMER1 também, porém, eu queria contar pelo timer 1 o tempo para o professor dar uma boa nota e isso foi necessário para eu aprender, muitas das vezes facilitar um projeto demais pode atrapalhar no aprendizado.
  14. Ola amigo, eu desenvolvi um projeto que contava rotações, porém, eu trabalhei com timer0 como contador de pulsos externo e timer1 como contador interno , entretanto o código foi realizado pelo compilador XC8. veja como ficou o código base: pic_init(); //START PIC PORTCbits.RC1 = 0; lcd_init(); //START LCD cont(); //START CONT TRISC = 0x00; OpenTimer2(TIMER_INT_OFF & T2_PS_1_16); //TIMER2 DESABILITADO E PRESCALER PARA 16 SetOutputPWM1(SINGLE_OUT, PWM_MODE_1); //output PWM in respective modes OpenPWM1(255); SetDCPWM1(0); lcd_cmd(0x80); // Posiciona LCD na primeira linha lcd_data('L'); // Escreve lcd_data('U'); lcd_data('C'); lcd_data('A'); lcd_data('S'); lcd_data(' '); // Escreve lcd_data('L'); lcd_data('U'); lcd_data('A'); lcd_data('N'); Delay10KTCYx(250); while(1) { SetDCPWM1(550); // Duty cicle +- 54% lcd_cmd(0x80); // Posiciona LCD na primeira linha lcd_data('R'); // Escreve lcd_data('P'); lcd_data('M'); lcd_data(' '); lcd_data('C'); lcd_data('A'); lcd_data('N'); //obs: amostragem em 0.5 segundos TMR0L = 0; //TMR0 PARTE BAIXA TMR0H = 0; //TMR0 PARTE ALTA TMR1L = 0x24; //TMR1 PARTE BAIXA TMR1H = 0x1E; //TMR1 PARTE ALTA PIR1bits.TMR1IF = 0; //FLAG DE INTERRUPÇÃO //start T0CONbits.TMR0ON = 1; //habilita CONTAGEM DO TIMER0 T1CONbits.TMR1ON = 1; // habilita TEMPO DO TIMER1 while(!PIR1bits.TMR1IF); //ESPERA 0.5s Para interrupção T1CONbits.TMR1ON = 0; //DESABILITA TIMER1 T0CONbits.TMR0ON = 0; //DESABILITA TIMER0 rpm = TMR0L; //AMOSTRAGEM DO TIMER0 rpm = rpm*2; //MULTIPLICADO POR 2 PORQUE É NECESSÁRIO 1 SEGUNDO DE AMOSTRA rpm = rpm*60; //TRANSFORMAÇÃO PARA SEGUNDO rpm = rpm /9; //UM CICLO EQUIVALE A 9 ou 7 PARTES lcd_cmd(0b00000001); // Limpa o display lcd_cmd(0xc0); // Posiciona LCD na segunda linha lcd_number(rpm); Delay1KTCYx(1); } Obs: esse projeto era para contar a rotação de um cooler com 9 hélices ou 7 hélices, sendo assim, para gerar o sinal para o uC eu usei um diodo LED e um foto transistor, quando a hélice passava na frente do led mandava um sinal para o foto transistor e gerava um pulso, a partir desse principio eu mandava os pulsos para o pino do TMR0 para contar.
  15. Eu recomendo o XC8, mesmo não tendo bibliotecas facilitadas igual a do miKroC, porém, você aprende mais o uC e sem falar que ele é oficial do fabricante do chip. Recomendo também o Livro do Wagner Zanco: Microcontroladores PIC18 com linguagem C, uma bordagem pratica e objetiva.
  16. valeu Isadora, você iluminou minha mente aqui, eu fiz uma gambiarra usando um esquema parecido com o seu separando unidade, centena, dezena etc... veja a gambiarra auhuhahua. #include <stdio.h> #include <stdlib.h> #include <p18f4550.h> #include <delays.h> #pragma config FOSC = HS // Oscillator Selection bits (HS oscillator (HS)) #pragma config WDT = OFF // Watchdog Timer Enable bit (WDT disabled (control is placed on the SWDTEN bit)) //Definição linhas de dados do display*********************** #define A PORTDbits.RD0 //A #define B PORTDbits.RD1 //B #define C PORTDbits.RD2 //C #define D PORTDbits.RD3 //D //Definição de linhas de endereço do display***************** #define T1 PORTDbits.RD4 //NPN1 #define T2 PORTDbits.RD5 //NPN2 #define T3 PORTDbits.RD6 //NPN3 #define T4 PORTDbits.RD7 //NPN4 //************************************************************ //************************************************************ //Protótipos de Funções void aciona_display(int numero, int casa); void escrever_variavel(int valor); void escrever_unidade(int unidade); void escrever_dezena(int dezena); void escrever_centena(int centena); void escrever_milhar(int milhar); int main () { TRISD = 0x00; while(1) { escrever_variavel(8458); } } void aciona_display(int numero, int casa) { if(casa == 1) { switch(numero) { case 0: A=0,B=0,C=0,D=0,T1=1,T2=0,T3=0,T4=0; break; case 1: A=1,B=0,C=0,D=0,T1=1,T2=0,T3=0,T4=0; break; case 2: A=0,B=1,C=0,D=0,T1=1,T2=0,T3=0,T4=0; break; case 3: A=1,B=1,C=0,D=0,T1=1,T2=0,T3=0,T4=0; break; case 4: A=0,B=0,C=1,D=0,T1=1,T2=0,T3=0,T4=0; break; case 5: A=1,B=0,C=1,D=0,T1=1,T2=0,T3=0,T4=0; break; case 6: A=0,B=1,C=1,D=0,T1=1,T2=0,T3=0,T4=0; break; case 7: A=1,B=1,C=1,D=0,T1=1,T2=0,T3=0,T4=0; break; case 8: A=0,B=0,C=0,D=1,T1=1,T2=0,T3=0,T4=0; break; case 9: A=1,B=0,C=0,D=1,T1=1,T2=0,T3=0,T4=0; break; } } if(casa == 2) { switch(numero) { case 0: A=0,B=0,C=0,D=0,T1=0,T2=1,T3=0,T4=0; break; case 1: A=1,B=0,C=0,D=0,T1=0,T2=1,T3=0,T4=0; break; case 2: A=0,B=1,C=0,D=0,T1=0,T2=1,T3=0,T4=0; break; case 3: A=1,B=1,C=0,D=0,T1=0,T2=1,T3=0,T4=0; break; case 4: A=0,B=0,C=1,D=0,T1=0,T2=1,T3=0,T4=0; break; case 5: A=1,B=0,C=1,D=0,T1=0,T2=1,T3=0,T4=0; break; case 6: A=0,B=1,C=1,D=0,T1=0,T2=1,T3=0,T4=0; break; case 7: A=1,B=1,C=1,D=0,T1=0,T2=1,T3=0,T4=0; break; case 8: A=0,B=0,C=0,D=1,T1=0,T2=1,T3=0,T4=0; break; case 9: A=1,B=0,C=0,D=1,T1=0,T2=1,T3=0,T4=0; break; } } if(casa == 3) { switch(numero) { case 0: A=0,B=0,C=0,D=0,T1=0,T2=0,T3=1,T4=0; break; case 1: A=1,B=0,C=0,D=0,T1=0,T2=0,T3=1,T4=0; break; case 2: A=0,B=1,C=0,D=0,T1=0,T2=0,T3=1,T4=0; break; case 3: A=1,B=1,C=0,D=0,T1=0,T2=0,T3=1,T4=0; break; case 4: A=0,B=0,C=1,D=0,T1=0,T2=0,T3=1,T4=0; break; case 5: A=1,B=0,C=1,D=0,T1=0,T2=0,T3=1,T4=0; break; case 6: A=0,B=1,C=1,D=0,T1=0,T2=0,T3=1,T4=0; break; case 7: A=1,B=1,C=1,D=0,T1=0,T2=0,T3=1,T4=0; break; case 8: A=0,B=0,C=0,D=1,T1=0,T2=0,T3=1,T4=0; break; case 9: A=1,B=0,C=0,D=1,T1=0,T2=0,T3=1,T4=0; break; } } if(casa == 4) { switch(numero) { case 0: A=0,B=0,C=0,D=0,T1=0,T2=0,T3=0,T4=1; break; case 1: A=1,B=0,C=0,D=0,T1=0,T2=0,T3=0,T4=1; break; case 2: A=0,B=1,C=0,D=0,T1=0,T2=0,T3=0,T4=1; break; case 3: A=1,B=1,C=0,D=0,T1=0,T2=0,T3=0,T4=1; break; case 4: A=0,B=0,C=1,D=0,T1=0,T2=0,T3=0,T4=1; break; case 5: A=1,B=0,C=1,D=0,T1=0,T2=0,T3=0,T4=1; break; case 6: A=0,B=1,C=1,D=0,T1=0,T2=0,T3=0,T4=1; break; case 7: A=1,B=1,C=1,D=0,T1=0,T2=0,T3=0,T4=1; break; case 8: A=0,B=0,C=0,D=1,T1=0,T2=0,T3=0,T4=1; break; case 9: A=1,B=0,C=0,D=1,T1=0,T2=0,T3=0,T4=1; break; } }//desabilita todos os 4511 } void escrever_variavel(int valor) { escrever_unidade(valor); escrever_dezena(valor); escrever_centena(valor); escrever_milhar(valor); } void escrever_unidade(int unidade) { unidade = ((unidade/1000)%10);//Primeiro digito aciona_display(unidade,1),Delay1KTCYx(1); } void escrever_dezena(int dezena) { dezena = ((dezena/100)%10);//Segundo digito aciona_display(dezena,2),Delay1KTCYx(1); } void escrever_centena(int centena) { centena = ((centena/10)%10);//Terceiro digito aciona_display(centena,3),Delay1KTCYx(1); } void escrever_milhar(int milhar) { milhar = (milhar%10);//Quarto digito aciona_display(milhar,4),Delay1KTCYx(1); }
  17. Olha, tem duas faculdades que conheço de ótimos cursos, como a FATEC que lhe propociona ótimos cursos como, Eletrônica Industrial, Eletrônica Automotiva e por ai vai, também existe a faculdade do SENAI que lhe oferece cursos no mesmo panorama da FATEC, porém, o que vai fazer de você ser um ótimo profissional vai depender de você mesmo, quando o sujeito se interessa, não importa a onde ele esteja ele sempre vai se superar, eu dei exemplo dessas duas faculdades por ter um curso de tecnologia de 3 anos, caso você queira fazer engenharia você poderá dispensar as matérias e dar continuidade.
  18. Paulo beleza, então esse uC ele usa o IDE online e o compilador também, você pode salvar seu projeto em um servidor, portanto,a programação dele esta muito simples ela foi facilitada igual ao Arduino veja esse PDF:http://lusorobotica.com/index.php?PHPSESSID=mqpj796hip9gfqgagjbsm90jm1&action=dlattach;topic=7164.0;attach=2633, o sinistro é que você grava ele igual pendrive kkkkkkkkkkk
  19. Esses dias eu vi uma palestra da plataforma da freescale, nunca usei ela, porém, você programa ele igual arduino e o compilador é online, veja essa maravilha: http://www.farnellnewark.com.br/product.aspx?idproduct=28W5033, fica ai a dica,porém, é salgadinho no preço, mas o uC é bom veja se ele tem o que você precisa da uma pesquisada.
  20. Olá pessoal beleza, eu atualmente estou fazendo um projetinho aqui, meu objetivo é fazer um voltímetro e amperímetro para um fonte de bancada variável de 0 a 25V com um trafo de v2 = 25 e 6A, porém eu preciso de um voltímetro e um amperímetro, portanto, eu resolvi fazer um instrumento de medição com o PIC16F676 que é bem baratinho ele custa uns 5 reais. O projeto do voltímetro esta quase pronto, porém, eu sou novato e estou aprendendo a programar e eu queria umas dicas para fazer uma programação com o display 7segmentos para mostrar a tensão da variável do AD, porque eu achei minha rotina muito ruim, eu uso muito if e else, acredito que se vocês podem me dar umas dicas para melhorar esse código. Também peço umas dicas para fazer o amperímetro. Eu uso o MPLABX e o compilador XC8, veja o código do meu projeto: //******************************************************************************************************************************************************** // 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 = INTRCIO // Oscillator Selection bits (INTOSC oscillator: I/O function on RA4/OSC2/CLKOUT pin, I/O function on 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 = ON // RESET ON #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 BUTTON PORTAbits.RA2 //BOTÃO PARA TROCAR DE V/A #define Q1 PORTCbits.RC4 //NPN1 #define Q2 PORTAbits.RA4 //NPN2 #define Q3 PORTAbits.RA5 //NPN3 #define A PORTCbits.RC0 //A #define B PORTCbits.RC1 //B #define C PORTCbits.RC2 //C #define D PORTCbits.RC3 //D #define LED PORTCbits.RC5 //AMPERIMETRO //******************************************************************************************************************************************************** const unsigned char display[] ={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09}; //******************************************************************************************************************************************************** //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 interrupt interrup(void) // Vetor nterrupção { } //******************************************************************************************************************************************************** //******************************************************************************************************************************************************** // Programa Principal int main() { pic_init(); //START PIC config_AD(); //CONFIG AD float var = 0; //VARIAVEl GLOBAL while(1) { var = read_AD()*25.0; var = var/1024; if(var == 0) { PORTC = display[0x00]; Q1 = 1; Q2 = 0; Q3 = 0; delay_ms_5(); PORTC = display[0x00]; Q1 = 0; Q2 = 1; Q3 = 0; delay_ms_5(); PORTC = display[0x00]; Q1 = 0; Q2 = 0; Q3 = 1; delay_ms_5(); } else if(var >= 00.5) { PORTC = display[0x05]; Q1 = 1; Q2 = 0; Q3 = 0; delay_ms_5(); PORTC = display[0x00]; Q1 = 0; Q2 = 1; Q3 = 0; delay_ms_5(); PORTC = display[0x00]; Q1 = 0; Q2 = 0; Q3 = 1; delay_ms_5(); } else if(var >= 01.0) { PORTC = display[0x00]; Q1 = 1; Q2 = 0; Q3 = 0; delay_ms_5(); PORTC = display[0x01]; Q1 = 0; Q2 = 1; Q3 = 0; delay_ms_5(); PORTC = display[0x00]; Q1 = 0; Q2 = 0; Q3 = 1; delay_ms_5(); } else { LED = 1; } }//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); 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); 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); 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 = 0b00001111; //RA0 como entrada e as demais como saída TRISC = 0b00000000; //PORTC todos como saída bank(0); //Seleciona banco 0 da memória //TIMER1 INTCONbits.GIE = 0; //GIE:Global Habilitar Interrupção global INTCONbits.PEIE = 0; //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 Q3 = 0; A = 0; } 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) //CONFIGURAÇÃO DO REGISTRADOR ADCON1 ADCON1bits.ADCS0 = 0; //Clock do conversor analógico digital FOSC/4 ADCON1bits.ADCS1 = 0; //Clock do conversor analógico digital FOSC/4 ADCON1bits.ADCS2 = 1; //Clock do conversor analógico digital FOSC/4 //CONFIGURAÇÃO DO REGISTRADOR ANSEL ANSELbits.ANS0 = 1; //Apenas RA0/RA1 como analógica ANSELbits.ANS1 = 1; //Apenas RA0/RA1 como analógica ANSELbits.ANS2 = 0; //Apenas RA0/RA1 como analógica ANSELbits.ANS3 = 0; //Apenas RA0/RA1 como analógica ANSELbits.ANS4 = 0; //Apenas RA0/RA1 como analógica ANSELbits.ANS5 = 0; //Apenas RA0/RA1 como analógica ANSELbits.ANS6 = 0; //Apenas RA0/RA1 como analógica ANSELbits.ANS7 = 0; //Apenas RA0/RA1 como analógica ADCON0bits.ADON = 1; //Conversor Analógico - Digital ligado //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 result_AD = (((int)ADRESH)<<8)|(ADRESL); //Obtem o valor da conversão return result_AD; //Retorna para result_AD } //******************************************************************************************************************************************************** Veja o esquemático do projeto em anexo:
  21. 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 }
  22. Olá pessoa,l eu venho trabalhando em um voltimetro, porém, encontrei dificuldades com o vonversor AD, eu ja configurei, porntanto, o meu programa não funcionou queria saber se alguem pode me ajudar.... veja o código: // 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) //Voltimetro de Bancada #include <stdio.h> #include <stdlib.h> #include <pic16f676.h> #include <delays.h> #include <xc.h> // 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) #define A PORTAbits.RA0 #define B PORTCbits.RC0 #define C PORTCbits.RC1 #define D PORTCbits.RC2 #define Q1 PORTCbits.RC3 #define Q2 PORTCbits.RC4 #define Q3 PORTCbits.RC5 void interrupt interrup(void) // Interrupção de Alta Prioridade { //PIR1bits.TMR1IF = 0; // PIR1bits.T1IF = 0; } void Configura_AD(); void bank(int num); //Protótipo da função do banco para acesso do banco da memório void delay_mS_125(); //Protótipo da função Timer1 125mS void delay_ms_5(); //Protótipo da função Timer1 5mS void pic_init(); //Protótipo para iniciar o pic void Dysplay_7_segmentos(char digito); //Protótipo para display void var_dysplay(char var); int main() //Programa principal { float long tensão = 0; pic_init(); //Iniciar configurações do PIC Configura_AD(); while(1) { float long Result_AD; ADCON0bits.GO = 1; ADCON0bits.GO_DONE = 1; ADCON0bits.GO_nDONE = 1; while(ADCON0bits.GO); //while(ADCON0bits.GO_DONE); //while(ADCON0bits.GO_nDONE); Result_AD = (((char)ADRESH)<<8)|(ADRESL); Result_AD = tensão; tensão = tensão*5.0/1023; if (tensão > 2.5) { //Dysplay_7_segmentos(2); Q1 = 1; delay_ms_5(); Q1 = 0; } else { //Dysplay_7_segmentos(4); Q2 = 1; delay_ms_5(); Q2 = 0; } } } void bank(int num) { //Banco 0 if(num == 0) { STATUSbits.RP0 = 0; } //Banco 1 else if(num == 1) { STATUSbits.RP0 = 1; } } 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 125mS TMR1L = 0xCA; 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; bank(1); TRISA = 0x00; TRISC = 0x00; bank(0); //TIMER1 INTCONbits.GIE = 1; //GIE:Global Habilitar Interrupção bit INTCONbits.PEIE = 1; //Habilitar Interrupção bit Peripheral //PIE1 ? PERIPHERAL INTERRUPT ENABLE REGISTER 1 (ADDRESS: 8Ch) PIE1bits.TMR1IE = 0; //TMR1 Overflow Interrupt Enable bit PIE1bits.T1IE = 0; //PIR1 ? PERIPHERAL INTERRUPT REGISTER 1 (ADDRESS: 0Ch) PIR1bits.TMR1IF = 0; //TMR1IF: TMR1 Overflow Interrupt Flag bit PIR1bits.T1IF = 0; //T1CON ? TIMER1 CONTROL REGISTER (ADDRESS: 10h) T1CONbits.T1CKPS0 = 1; 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 //TMR1H = 0x31; //Timer 1 para 125mS //TMR1L = 0x2D; T1CONbits.TMR1ON = 0; } void Dysplay_7_segmentos(char digito) { switch(digito) { case 0: A=0;B=0;C=0;D=0; break; case 1: A=1;B=0;C=0;D=0; break; case 2: A=0;B=1;C=0;D=0; break; case 3: A=1;B=1;C=0;D=0; break; case 4: A=0;B=0;C=1;D=0; break; case 5: A=1;B=0;C=1;D=0; break; case 6: A=0;B=1;C=1;D=0; break; case 7: A=1;B=1;C=1;D=0; break; case 8: A=0;B=0;C=0;D=1; break; case 9: A=1;B=0;C=0;D=1; break; } } void Configura_AD() { ANSEL = 0b00000010; // APENAS PORTA1 COMO ANALÓGICA ADCON0bits.VCFG = 0; // Tensão de referencia di PIC ADCON0bits.CHS0 = 1; //Selecionando canal 1 ADCON0bits.CHS1 = 0; ADCON0bits.CHS2 = 0; ADCON0bits.ADON = 1; //Conversor desligado ADCON1bits.ADCS0 = 0; //FOSC/2 ADCON1bits.ADCS1 = 0; ADCON1bits.ADCS2 = 0; ADCON0bits.ADFM = 1; //Justificado para Direita }
  23. Olá amigo, primeira coisa, ao tentar mudar o chuveiro você tera que fazer um cálculo para saber qual vai ser o diâmetro do fio se o seu fio não tiver o diâmetro necessario não adianta você trocar apenas o disjuntor terá que trocar a afiação do chuveiro, e esse é o grande problema em usar 127V para chuveiro. Se os calculos do diâmetro do fio der certo mude apenas o disjuntor. Obs: usar 127V para chuveiro acaba gastando mais em fiação apenas, ja que a afiação com diâmetro maior é mais caro.
  24. Olá amigo o que se passa ? eu estou tentando fazer um tutorial para ele porque ja tive problema igual a ele e perdi muito fenolite por causa disso.

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

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!