Ir ao conteúdo
  • Cadastre-se

Marcio Pizano

Membros Plenos
  • Total de itens

    20
  • Registro em

  • Qualificações

    N/D
  1. Não tem erro no circuito, esse é o terceiro que faço, só troquei o trafo mesmo, os dois primeiros eram de 12v 1A agora 24v 2A. Passa nos diodos para 2A que vai para o capacitor de 2200uf e então para um regulador de tensão 7818. Putz. Acho que a alimentação está alta mesmo. Vou tentar o circuito da bateria. Obrigado! adicionado 3 minutos depois Obrigado por responder. A tensão que chega no pic esta ok e também aciono os relés da forma que informou. Veja o esquema, postei. Não vejo outra alternativa para este aquecimento senão o trafo mesmo que foi trocado de 12v 1A para 24v 2A kkkk, acho que foi isso. Obrigado!
  2. Olá! Preciso de duas informações por favor. Em meu circuito, a última que fiz, o pic esquentou muito e ficou reiniciando, já troquei alguns componentes e nada, continua esquentando, coloquei um dissipador com pasta térmica e melhorou bastante, acredito que foi na troca do trafo, mas ok. O que gostaria desaber é de uma boa prática para evitar esses aquecimentos. A outra coisa que gostaria de fazer na placa, é que quanto faltasse energia, a tensão do pic fosse alimentado por uma bateria, teria como fazer essa troca automático com o reconhecimento da perda da tensão? Obrigado!
  3. Entendi, vou fazer o teste do botão sim. Será que se eu enviar uma frequência do 555 posso recupera-lo do outro lado direto no pino do PIC e determinar com nível lógico alto? Pensei que se SIM, talvez deveria usar um capacitor antes, algo do tipo. Obrigado!
  4. Olá! Preciso fazer um sensor de presença, porém, não trenho muito espaço para o circuito que vai enviar o sinal (tx) ao receptor (rx), então, gostaria de saber se consigo enviar um sinal sem ter que usar decodificador ou até mesmo um pic e etc. Isso é possível? Caso alguém saiba de algum módulo que facilite minha vida me indique por favor, já procurei bastante na internet, achei alguns mas não sei como fazer a montagem no meu circuito e também não sei se vai funcionar da forma que pretendo. Muito obrigado!
  5. Entendi. Show, vou fazer os testes e posto o resultado. Abraço! adicionado 45 minutos depois Funciona realmente, testei e deu certo. Porém acho que não vai funcionar para minha necessidade, então, teria uma forma "congelar" o pic ENQUANTO o botão estiver precionado e só voltar a ler a programação ao soltar o mesmo? O Break seria uma solução? Não testei ainda. Obrigado!
  6. Olá! Fiz um circuito e programação para o pic 12f629, funciona tudo ok, mas agora preciso fazer uma alteração na programação e não estou conseguindo. No trecho do código abaixo, onde identifico o clique no botão, preciso de uma forma que ao SEGURAR o botão precionado o codigo seja executado imediatamente, independente se foi um clique rápido ou se o botão foi mantido precionado. Se poderem me ajudar ficaria muito grato. Obrigado! if(!(input(inicia))){ //PULSO BOTÃO (PINO 6) delay_ms(500); //Evitar retorno output_high(rele_corta); //ACIONO o relé que permite a passagem de corrente (TEMPO) - (PINO 5) output_low(rele_buzina); //ACIONO o relé que permite a passagem de corrente (BUZINA) - (PINO 7) FOCO = 2; //Adiciono 1 ao FOCO para controlar o While SEGUNDOS = 15; //Ao receber o pulso, os segundos devem ser MAIOR do que os segundos para o corte, isso evita erros. goto pega; //VAI PARA o marcador }//IF
  7. Voltando aqui para fechar este tópico rs. Não satisfeito com o resultado apresentado pelo pic 18F4550, fiz um melhor estudo sobre o ciclo de máquina. Cheguei a conclusão de que o pic realmente esta com problemas, pôs os calculos estão corretos como pode ser visto no código acima. Estudo do CICLO DE MÁQUINA (Microcontroladores) Visão geral. 1º - Defina o tipo de cristal que vai trabalhar. 2º - Defina qual timer ira usar, Timer0, Timer1. Dependendo do timer ele pode ser de 8 ou 16bits 8 bits = 255 (Máximo de contagem) 16 bits = 65536 (Máximo de contagem) 3º - Escolha o Prescale que deseja trabalhar. 1:8 1:4 1:2 1:1 etc. Iniciando os cálculos OBS.: Cálculo para achar 1 segundo no ciclo de máquina. Calculando Timer1 de 16bits para um cristal de 4Mhz com prescale de 1:8 1º - Sempre dividimos o cristal por 4 (Constante) 4000000 / 4 = 1Mhz (Frequência útil) 2º - Eleve a 1 1 / 1000000 = 0,000001us (1 micro segundos para cada ciclo de máquina) 3º - Utilizando o prescale selecionado 1:8 1/(1Mhz/8) = 0,000008us (8 micro segundos para cada ciclo de máquina) 4º - Multiplica o resultado pelos bits do timer, neste caso 16bits = 65536 65536 * 0,000008 = 0,524288 (Segundos por ciclo de máquina) 5º - Regra de três X = 0,50 * 65536 / 0,524288 = 62500 (0,50 arredondando o valor para maior precisão) 6º - Subtrai o resultado pelo máximo do ciclo referente aos bits selecionado (16bits = 65536) 65536 – 62500 = 3036 (Valor inicial da contagem) setup_timer_1(T1_INTERNAL | T1_DIV_BY_8); (T0_DIV_BY_Prescale selecionado) set_timer1(3036); (Valor inicial da contagem) enabled_interrupts(INT_TIMER1); enabled_interrupts(GLOBAL); valeu!
  8. Aos amigos meu feedback. Após estudar e seguir as recomendações referentes ao DataSheet do Pic 18F4550, informo que no Proteus funciona perfeitamente, mas quando soldo o PIC na placa, ele simplesmente não funciona como o esperado, usei Timer0 e Timer1 para fazer o processo e nada, porém, quando volto com os valores dos capacitores referente ao PIC 18fr4520 e soldo o pic na placa, tudo funciona perfeitamente. Lembrando que usei 2 PICs 18F4550 comprados na MultoComercial, não sei exatamente se o problema esta no PIC, mas é estranho porque o outro PIC funciona. Em fim. Minha placa segue então com o PIC 18F4520, vou continuar estudadndo o 4550 e ver se descubro algo que talvez eu esteja fazendo de errado. Muito obrigado pelas respostas. Abraço!
  9. Obrigado por responder! Agora fiquei mais inquieto ainda kkk Segundo explicação do aphawk em outro tópico (https://www.clubedohardware.com.br/forums/topic/662735-dúvida-fórmula-timer0/) diz que para um cristal de 4mhz usa a mesma configuração que está no meu programa, e mesmo adicionando o PLL e o CPUDIV ainda não funcionou. Segue o código e obrigado mais uma vez! #include <18F4550.h> #include <stdlib.h> //Para strings /* OBS.: Este código não usa saída (Definições) nas portas D porque este tipo de PIC com mais de 40 pinos, faz buscas diretas no pino D Este código é típico para estes pics. */ //http://www.clubedohardware.com.br/forums/topic/764932-rel%C3%B3gio-e-calend%C3%A1rio-com-pic-16f628-super-simples/ #FUSES NOWDT //Sem Watch dog, evitando reset #FUSES BROWNOUT //Resetar quando detectar brownout (Quando a tensão cair abaixo do previsto no datasheet) //#FUSES HS //Crystal de oscilação de 4mhz alta velocidade //#FUSES XT //Crystal de oscilação de 4mhz #FUSES PUT //Power Up Time Aguarda 72ms para iniciar o pic evitando surto de tensão #FUSES NOPROTECT //Codigo sem proteção de leitura, software livre! #FUSES NODEBUG //Verifica se tem erros no código (desabilitado) #FUSES NOLVP //No low voltage prgming (prog. baixa tensão desabilitado), B3(PIC16) or B5(PIC18) used for I/O #FUSES NOCPD //No EE protection (Sem travar o chip) #pragma config PLL DIV = 1 #pragma config CPUDIV = OSC1_PLL2 #pragma config CPUDIV = OSC2_PLL2 #pragma config FOSC = HSPLL_HS #use delay(clock=4000000) // Definição do clock utilizado. Obrigatório! //***************************************** LCD ***************************************** //Definição de entradas e saídas //Cada bit representa um pino físico de I/O // 0 significa que o pino será uma saída // 1 significa que o pino será uma entrada #define trisa 0b11111111 #define trisb 0b00000000 #define trisc 0b00000000 #define trisd 0b00000000 // Estas são as definições dos pinos que o LCD utiliza. // Definem quais pinos do PIC controlarão os pinos do LCD #define lcd_enable pin_a1 // pino enable do LCD (E) #define lcd_rs pin_a0 // pino rs (register select)do LCD (RS) // (0) para comandos (1) para dados //O pino RW vai no negativo. #define lcd_db4 pin_b4 // pino de dados d4 do LCD #define lcd_db5 pin_b5 // pino de dados d5 do LCD #define lcd_db6 pin_b6 // pino de dados d6 do LCD #define lcd_db7 pin_b7 // pino de dados d7 do LCD #include <lcd.h> //declaração da biblioteca do LCD //***************************************** LCD ***************************************** /*====================================================================================================================================== PINOS I/O ======================================================================================================================================*/ #define BOTAO_MENU PIN_B0 //BOTÃO de escolha de ajuste das funções. #define AJUSTE_1 PIN_B1 //BOTÃO incremento de variáveis. (AJUSTE 1) #define AJUSTE_2 PIN_B2 //BOTÃO de escolha de ajuste das funções. (AJUSTE 2) #define POTENCIOMETRO PIN_D1 //POTENCIOMETRO PINO 20 Trata-se de ligar o led do potenciometro apenas quando for ionizar #define SAIDA_HIONIZADOR_C4 PIN_C4 //SAÍDA DO IONIZADOR PINO 23 #define SAIDA_HIONIZADOR_C5 PIN_C5 //SAÍDA DO IONIZADOR PINO 24 #define SAIDA_BOMBA PIN_C7 //SAÍDA DA BOMBA PINO 26 #define BOMBA_DIRETO PIN_D3 //SAÍDA DA BOMBA DIRETO PINO 22 (Trata-se do botão, quem liga a bomba) //pull-down em todos os botões para evitar ruídos. /*====================================================================================================================================== PINOS I/O ======================================================================================================================================*/ /*====================================================================================================================================== Minhas variáveis: ======================================================================================================================================*/ int MENU = 0; //0 = MOSTRA RELÓGIO /// 1 = NÃO MOSTRA RELÓGIO (TEMPO REAL) int FOCO = 1; //FOCO - 0=HORA REAL - 1=HORA (AJUSTES) - 2=DATA (AJUSTES) - 3=DIA DA SEMANA (AJUSTE) - 4=Bomba ligada inicio - 5=Bomba ligada FIM - 6=Agendando dias int dia_semana = 0; //1 = SEGUNDA... int dia_semana_bomba = 0; //Para o ajuste da bomba ligada ou não BOTÃO 2 int final_mes = 31; //para saber quantos dias tem um determinado mes. char SEMANA[] = "SEGUNDA"; //Inicio na SEGUNDA int LIGADO = 0; //Para informar se a bomba ou o Hionizador sera ligado ou não int contador = 1; //Para fazer a alteração no pino do hionizador (A1) int troca = 0; //Para fazer a alteração nos RELÉS int DIRETO = 0; //INFORMA SE A BOMBA FOI LIGADA DIRETO OU NÃO int CONDICAO = 0; //Para determinar a hora e minutos que vai ligar a bomba e ou o tratamento. int EXIBE = 0; //Somente para exiber dados no LCD, ficar trocando //char DT[] = "02/07/2017"; //Esse é o tipo de var texto aceito pelo LCD, mantive aqui só para lembrar, acho que não estou usando-o ai para baixo //int ndia_semana=1; //Variável dos dias da semana, é associada a uma string. int dia = 0; //Variável dos dias do mês. 0 a 31. int mes = 0; //Variável dos meses. 0 a 12. int ano = 17; //Variável dos anos. 2017 a 2099. int bomba_h_i = 0; //Variável da programação da bomba (horas ligada INICIO) int bomba_m_i = 0; //Variável da programação da bomba (minutos ligado INICIO) int bomba_h_f = 0; //Variável da programação da bomba (horas ligada FIM) int bomba_m_f = 0; //Variável da programação da bomba (minutos ligado FIM) //Variáveis que informa se a bomba e o hionizador estarão igados nos determinados dias da semana int seg_b = 0; int seg_h = 0; int ter_b = 0; int ter_h = 0; int qua_b = 0; int qua_h = 0; int qui_b = 0; int qui_h = 0; int sex_b = 0; int sex_h = 0; int sab_b = 0; int sab_h = 0; int dom_b = 0; int dom_h = 0; /*====================================================================================================================================== Minhas variáveis: ======================================================================================================================================*/ /*====================================================================================================================================== Minha Interrupção: ======================================================================================================================================*/ //HORAS --------------------------------------------------------------------------------------------------------------- //********************************* Variáveis da HORA *********************************** int16 q=0; //Variável que incrementa a cada 0.5s dentro da interupção do timer1. int s=0; //Variável dos segundos, incrementa na metade de q. int m=0; //Variável dos minutos. 0 a 59 int h=0; //Variável das horas. 0 a 23. //******************************* Interrupção do timer ********************************** #int_TIMER1 //Interrupção do Timer1 void temp1s(void) //Funcão. O que deverá ser feito a cada interrupão. { q++; //Variável q incrementada a cada estouro do Timer1 set_timer1 (3036); //Preload do Timer1 } //HORAS --------------------------------------------------------------------------------------------------------------- /*====================================================================================================================================== Minha Interrupção: ======================================================================================================================================*/ //?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? /*====================================================================================================================================== Programa Principal: ======================================================================================================================================*/ void main() { inicializa_lcd(); //Inicializa o LCD //TRATAMENTO DE INTRERRUPÇÃO, AQUI EU INICIALIZO O TIMER******************************************************************************* setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8); //Configuração do Timer1 para clock interno = 1E6 dividido por 8 set_timer1 (3036); //Preload do Timer1 enable_interrupts(INT_TIMER1); //Habilita interrupção timer1 enable_interrupts(global); //habilita interrupcão global ::: CONTINUA :::
  10. Isadora, então vou eliminar um tandcoiz rs. Acho que sei o que pode estar acontecendo. Olhando a programação, reparei que estava 18f4520, era o que eu usava mesmo, agora comprei pics 18F4550, então, pode ser o Prescaler mesmo, porém, qual seria para o 18F4550? Mais uma coisa, devo usar o XT ou HS para o cristal de 4Mhz? No Datasheet existem as duas opções. Obrigado mais uma vez pela ajuda.
  11. O código é enorme, postei parte relacionado ao Timer. Os fuses. #FUSES NOWDT //Sem Watch dog, evitando reset #FUSES BROWNOUT //Resetar quando detectar brownout (Quando a tensão cair abaixo do previsto no datasheet) #FUSES HS //Crystal de oscilação de 4mhz alta velocidade //#FUSES XT //Crystal de oscilação de 4mhz #FUSES PUT //Power Up Time Aguarda 72ms para iniciar o pic evitando surto de tensão #FUSES NOPROTECT //Codigo sem proteção de leitura, software livre! #FUSES NODEBUG //Verifica se tem erros no código (desabilitado) #FUSES NOLVP //No low voltage prgming (prog. baixa tensão desabilitado), B3(PIC16) or B5(PIC18) used for I/O #FUSES NOCPD //No EE protection (Sem travar o chip) #use delay(clock=4000000) // Definição do clock utilizado. Obrigatório! Obrigado!
  12. Olá! Gravei o segundo pic 18F4550 e todos os dois apresentam o mesmo "problema". Para contar 1 segundo é preciso se passarem 2 ou 3 segundos em um relógio digamos normal. Esta programação é do meu costume usar, ela sempre funciona, porém agora esta dando este problema, o que pode ser, o pic? Uso MPLAB para fazer estaprogramação. Códigos do relógio (Timer) //HORAS --------------------------------------------------------------------------------------------------------------- //********************************* Variáveis da HORA *********************************** int16 q=0; //Variável que incrementa a cada 0.5s dentro da interupção do timer1. int s=0; //Variável dos segundos, incrementa na metade de q. int m=0; //Variável dos minutos. 0 a 59 int h=0; //Variável das horas. 0 a 23. //******************************* Interrupção do timer ********************************** #int_TIMER1 //Interrupção do Timer1 void temp1s(void) //Funcão. O que deverá ser feiro a cada interrupão. { q++; //Variável q incrementada a cada estouro do Timer1 set_timer1 (3036); //Preload do Timer1 } //HORAS --------------------------------------------------------------------------------------------------------------- Após o void main() //TRATAMENTO DE INTRERRUPÇÃO, AQUI EU INICIALIZO O TIMER******************************************************************************* setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8); //Configuração do Timer1 para clock interno = 1E6 dividido por 8 set_timer1 (3036); //Preload do Timer1 enable_interrupts(INT_TIMER1); //Habilita interrupção timer1 enable_interrupts(global); //habilita interrupcão global Muito obrigado!
  13. Olá! Realmente tinha feito uma cagadinha no circuito kkk Então para sanar as dúvidas, peguei uma placa que tinha certeza do seu bom funcionamento, tirei o pic que enviava 5v no botão e coloquei outro gravado com a programação que postei e tudo funcioneou lindamente. É claro que tive que cortar uma trilha na pci para enviar um sinal negativo, mas tudo ok agora. Agradeço por sua ajuda que foi de grande importância. Realmente não preciso definir o TRIS, isso deixa agente meio "cego" mesmo. Abraço!
  14. Ok. O circuito funciona (Na prática) se eu não inverter o sinal negativo enviado pelo botão, ou seja, se eu enviar positivo ao pic e manter a programação sem a opção de inversão do sinal. Se eu enviar negativo ao pic e mudar a programação, funciona somente no Proteus e não na prática. Segue a imagem.
  15. Olá! Fiz o circuito e ainda não funcionou na prática. Estou enviando o código para se possível (Questão de tempo) identificar algo que devo modificar. Estou tentando fazer o mais próximo possível do outro modelo que esta funcionando, porém, enviando o sinal negativo. Retirei o uso do Zener e voltei com o 7805 e capacitor para evitar os ruídos. As imagens eu não estou conseguindo anexar. #include<12F629.h> #use delay(clock=4000000) // Oscilador interno #fuses XT,nomclr,nowdt //Trocando XT para INTRC_IO, fica oscilando INTERNAMENTE sem o auxilio do cristal. #define inicia PIN_A1 //pino INICIA - (PINO 6) #define rele_buzina PIN_A2 //pino RELÉ BUZINA - (PINO 5) #define rele_corta PIN_A0 //pino RELÉ CORTA - (PINO 7) //Tipo inteiro int FOCO = 1; int BUZI = 0; int CONTA = 0; void main() { setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); setup_timer_1(T1_DISABLED); setup_comparator(NC_NC); setup_vref(FALSE); //Estágio 1 - RELÉ DESATIVADO - NÃO PEGA //************************************************************************************************************************************************************************ nao_pega: //RÓTULO do goto (é o inicio) while( FOCO == 1 ){ if(!(input(inicia))){ //PULSO BOTÃO (PINO 6) delay_ms(500); //Evitar retorno output_high(rele_corta); //ACIONO o relé que permite a passagem de corrente (TEMPO) - (PINO 5) output_low(rele_buzina); //ACIONO o relé que permite a passagem de corrente (BUZINA) - (PINO 7) (INVERTIDO, leia a obs.) FOCO = 2; //Adiciono 1 ao FOCO para controlar o While goto pega; //VAI PARA o marcador }//IF }//FOCO //************************************************************************************************************************************************************************ //Estágio 2 - RELÉ ATIVADO - PEGA //************************************************************************************************************************************************************************ pega: //RÓTULO do goto (é o outro índice do goto) while( FOCO == 2 ){ if(!(input(inicia))){ //PULSO BOTÃO (PINO 6) delay_ms(200); FOCO = 3; //Adiciono 0 ao FOCO para controlar o While goto contando; //VAI PARA o marcador }//IF }//FOCO //************************************************************************************************************************************************************************ //Estágio 3 - RELÉ ATIVADO - CONTANDO //************************************************************************************************************************************************************************ contando: //RÓTULO do goto (é o outro índice do goto) while( FOCO == 3 ){ delay_ms(500); //Preciso do valor baixo para aceitrar o clique do botão com rapidez (Precisão) CONTA++; if(!(input(inicia))){ //PULSO BOTÃO (PINO 6) delay_ms(500); //Evito o retorno FOCO = 2; //Adiciono 0 ao FOCO para controlar o While CONTA = 0; goto pega; //VAI PARA o marcador }//IF // if(CONTA == 1260){ //um segundo = 10,5 if(CONTA == 14){ //um segundo = 10,5 FOCO = 4; //Adiciono 0 ao FOCO para controlar o While CONTA = 0; goto cortado; }//IF }//FOCO //************************************************************************************************************************************************************************ //Estágio 4 - RELÉ DESATIVADO - CORTADO //************************************************************************************************************************************************************************ cortado: //RÓTULO do goto (é o outro índice do goto) while( FOCO == 4 ){ delay_ms(500); //Neste caso apenas desligando a moto para voltar ao normal output_low(rele_corta); //DESACIONO o relé que permite a passagem de corrente (CORTA) - (PINO 7) output_low(rele_buzina); //DESACIONO o relé que permite a passagem de corrente (BUZINA) - (PINO 5) buzi++; if (buzi == 2){ output_high(rele_buzina); delay_ms(100); buzi = 0; }//IF }//FOCO //************************************************************************************************************************************************************************ }//Void main Muito obrigado!

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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: minicurso “Como ganhar dinheiro montando computadores”

Gabriel TorresGabriel Torres, fundador e editor executivo do Clube do Hardware, acaba de lançar um minicurso totalmente gratuito: "Como ganhar dinheiro montando computadores".

Você aprenderá sobre o quanto pode ganhar, como cobrar, como lidar com a concorrência, como se tornar um profissional altamente qualificado e muito mais!

Inscreva-se agora!