Ir ao conteúdo
  • Cadastre-se

André Sampaio

Membro Pleno
  • Posts

    20
  • Cadastrado em

  • Última visita

Reputação

2
  1. Consegui, está funcionando corretamente , acho que era o problema com o LATX mesmo. Ainda tem um problema que estou tentando arrumar, mas logo vou conseguir, esses PORTA estão sempre em 1, não importa a rotina, if ou qualquer outra coisa, deve ser algo do pic, mas a programação ficou assim: #pragma config WDT=OFF#pragma config FOSC=HS#pragma orgall 0x1000#define trig RB0_bit#define SmartLCDStr lcd_out// Pinos do LCD nas portas B// LCD module connectionssbit LCD_RS at RB6_bit;sbit LCD_EN at RB7_bit;sbit LCD_D4 at RB2_bit;sbit LCD_D5 at RB3_bit;sbit LCD_D6 at RB4_bit;sbit LCD_D7 at RB5_bit;sbit LCD_RS_Direction at TRISB6_bit;sbit LCD_EN_Direction at TRISB7_bit;sbit LCD_D4_Direction at TRISB2_bit;sbit LCD_D5_Direction at TRISB3_bit;sbit LCD_D6_Direction at TRISB4_bit;sbit LCD_D7_Direction at TRISB5_bit;sbit HCSR04_Trigger at RB0_Bit;sbit HCSR04_Echo at RB1_Bit;sbit HCSR04_Trigger_Direction at TRISB0_Bit;sbit HCSR04_Echo_Direction at TRISB1_Bit;#define fator 1.5//Funções auxiliaresvoid trigger();void distance();//Definições e Variáveischar txt[8]; //Conversão de dados em stringchar Tempo_H, Tempo_L, distancia_cm; //Variavéis de tempounsigned int periodo; // Periodo do pulso de ECHOfloat dista;unsigned int aux_dista;void HCSR04_Init( char mode ){ HCSR04_Trigger_Direction = 0; HCSR04_Echo_Direction = 1; TMR1L = 0; TMR1H = 0; //T1CON = 0b00000000; //Clock 4Mhz / Prescaler 1:1 //T1CON = 0b00010000; //Clock 8 Mhz / Prescaler 1:2 //T1CON = 0b00100000; //Clock 16 Mhz / Prescaler 1:4 T1CON = 0b01100000; //Clock 32 Mhz / Prescaler 1:8 T1CON.B4 = mode.B0; T1CON.B5 = mode.B1;}//Funções de interrupção (Foi usado para agilizar mais o processo)void interrupt(){ if(CCP1IF_bit && CCP1CON.B0) //Quando a borda for de subida inicia a contagem { CCP1IF_bit = 0x00; // Limpa a flag para uma nova captura (pag. 69) CCP1IE_bit = 0x00; // Desabilita a interrupção por perifericos [CCP1] (pag. 69) CCP1CON = 0x04; // Configuração de borda para descida (pag. 122) CCP1IE_bit = 0x01; // Habilita a interrupção por perifericos [CCP1] (pag. 69) TMR1H = 0x00; // Zerar registradores do TIMER1 (pag. 129) TMR1L = 0x00; // Zerar registradores do TIMER1 (pag. 129) TMR1ON_bit = 0x01; // Habilita a contagem de tempo } else if(CCP1IF_bit) { CCP1IF_bit = 0x00; // Limpa a flag para uma nova captura (pag. 69) TMR1ON_bit = 0x00; // Desabilita a contagem de tempo CCP1IE_bit = 0x00; // Desabilita a interrupção por perifericos [CCP1] (pag. 69) CCP1CON = 0x05; // Configura a borda de captura para subida CCP1IE_bit = 0x01; // Habilita a interrupção por perifericos [CCP1] (pag. 69) Tempo_H = CCPR1H; // Carrega os valores de tempo (micro seg) (pag. 68) Tempo_L = CCPR1L; // Carrega os valores de tempo (micro seg) (pag. 68) }}// Fim da rotina de interrupçãovoid main() org 0x1000{ PORTB = 0x00; // Inicia PORTB em LOW LATB = 0x00; ADCON1 = 0x0E; TRISB = 0xCF; PORTA = 0x00; // Inicia PORTA em LOW LATA = 0x00; ADCON1 = 0x0E; TRISA = 0x00; PORTA.RA1 = 0; PORTA.RA2 = 0; PORTA.RA3 = 0; PORTA.RA4 = 0; CMCON = 0x07; // Desliga os comparadores TRISB = 0b00000010;// Entrada CCP1, RB1 entrada digital INTCON = 0b11000000;// Liga GIE e PEIE (pag. 87) [Feito em binario para setar GIE/GIEH PEIE/GIEL] TMR1IE_bit = 0x00; // Desabilita TMR1 CCP1IE_bit = 0x01; // Habilita interrupções CCP1CON = 0x05; // Configura CCP1 para subida T1CON = 0b00100000; T1CKPS1_bit = 11; // Prescaller TRM1 1:4 (pag. 129) T1CKPS0_bit = 0; TMR1CS_bit = 0; // clock escolhido [0 = Internal clock (FOSC/4)] TMR1ON_bit = 0; // Desabilita a contagem do TMR1// Funções do display para exibição da distancia Lcd_Init(); // Inicia o Display Lcd_Cmd(_Lcd_Cursor_Off); // Apaga o cursor Lcd_Cmd(_LCD_CLEAR); // Limpa o display Lcd_Out(1,1,"Medidor Teste");// Escreve no display na linha 1 Lcd_Out(2,1,"Distancia: cm");// Escreve no display na linha 2 DELAY_MS(100); while(1) { distance(); }}void distance(){ DELAY_MS(2000); // "ms" usado para milisegundos trigger(); // Dispara o "gate" do sensor aux_dista=dista; if(dista <= 4) Lcd_Out(2,12,"---"); else { IntToStr(aux_dista, txt); // Converte a variavel para o display Lcd_Out(2,12,txt); // Mostra a distancia no LCD }}void trigger(){unsigned time;unsigned i; trig = 0; DELAY_US(2); // "us" usado para microsegundos trig = 1; DELAY_US(10); trig = 0; i = 0xFFFF; while( !HCSR04_Echo && i-- ); TMR1H = 0; TMR1L = 0; TMR1ON_Bit = 1; i = 0xFFFF; while( HCSR04_Echo && i-- ); TMR1ON_Bit = 0; time = *(unsigned*)&TMR1L; dista = ((0.175 * time / fator) / 2 ); //distancia em cm aux_dista=dista; if (aux_dista >20) { PORTA.RA0 = 0; PORTA.RA1 = 1; PORTA.RA2 = 1; PORTA.RA3 = 1; PORTA.RA4 = 1; } else { PORTA.RA0 = 1; PORTA.RA1 = 0; PORTA.RA2 = 0; PORTA.RA3 = 0; PORTA.RA4 = 0; }}
  2. Olá @test man*~ e @Isadora Ferraz Obrigado pelos comentários, percebi que estava cometendo um erro bobo, mas ainda tenho um problema... Vi em um tutorial que o tutor usa a mesma programação mas com o pic 16F877A, comparando os pinos percebi que o pino RB1 do 18F4550 tem as mesmas funções que o RC3 do PIC 16F877A que o tutor usa como trigger, ele usa RC2 como ECHO, que eu ainda posso utilizar, pois tem as mesmas funções os pinos de ambos pics Porém o problema é, como estou usando um display o Pino RB1 está sendo usado para enviar dados para o pino D5 do display, tentei alterar o RB1 para RB4 mas ele não apresenta nenhum sinal quanto faço isso, mostrando que os dados não estão sendo recebidos corretamente, queria saber se há alguma forma de ligar o LCD sem utilizar o pino RB1 para que eu possa utilizar como trigger, minha programação esta desta forma caso queiram conferir e ver se errei em mais alguma coisa /********************************************************************************************************************************************* Ligações no PORTBPino Placa Pino LCDRB0 ------------ 11 (DB4)RB1 ------------ 12 (DB5)RB2 ------------ 13 (DB6)RB3 ------------ 14 (DB7)RB7 ------------ 6 (EN)RB6 ------------ 4 (RS) Ligações no PORTCPino Placa Pino SensorRB5 ------------ (TRIGGER)**********************************************************************************************************************************************/#pragma config WDT=OFF#pragma config FOSC=HS#pragma orgall 0x1000#define trig RB1_bit// Pinos do LCD nas portas Bsbit LCD_RS at RB6_bit;sbit LCD_EN at RB7_bit;sbit LCD_D7 at RB3_bit;sbit LCD_D6 at RB2_bit;sbit LCD_D5 at RB4_bit;sbit LCD_D4 at RB0_bit;sbit LCD_RS_Direction at TRISB6_bit;sbit LCD_EN_Direction at TRISB7_bit;sbit LCD_D7_Direction at TRISB3_bit;sbit LCD_D6_Direction at TRISB2_bit;sbit LCD_D5_Direction at TRISB4_bit;sbit LCD_D4_Direction at TRISB0_bit;//Funções auxiliaresvoid trigger();void distance();//Definições e Variáveischar txt[4]; //Conversão de dados em stringchar Tempo_H, Tempo_L, distancia_cm; //Variavéis de tempounsigned int periodo; // Periodo do pulso de ECHO//Funções de interrupção (Foi usado para agilizar mais o processo)void interrupt(){ if(CCP1IF_bit && CCP1CON.B0) //Quando a borda for de subida inicia a contagem { CCP1IF_bit = 0x00; // Limpa a flag para uma nova captura (pag. 69) CCP1IE_bit = 0x00; // Desabilita a interrupção por perifericos [CCP1] (pag. 69) CCP1CON = 0x04; // Configuração de borda para descida (pag. 122) CCP1IE_bit = 0x01; // Habilita a interrupção por perifericos [CCP1] (pag. 69) TMR1H = 0x00; // Zerar registradores do TIMER1 (pag. 129) TMR1L = 0x00; // Zerar registradores do TIMER1 (pag. 129) TMR1ON_bit = 0x01; // Habilita a contagem de tempo } else if(CCP1IF_bit) { CCP1IF_bit = 0x00; // Limpa a flag para uma nova captura (pag. 69) TMR1ON_bit = 0x00; // Desabilita a contagem de tempo CCP1IE_bit = 0x00; // Desabilita a interrupção por perifericos [CCP1] (pag. 69) CCP1CON = 0x05; // Configura a borda de captura para subida CCP1IE_bit = 0x01; // Habilita a interrupção por perifericos [CCP1] (pag. 69) Tempo_H = CCPR1H; // Carrega os valores de tempo (micro seg) (pag. 68) Tempo_L = CCPR1L; // Carrega os valores de tempo (micro seg) (pag. 68) }}// Fim da rotina de interrupçãovoid main() org 0x1000{ CMCON = 0x07; // Desliga os comparadores TRISC = 0x04; // Entrada CCP1, RC2 entrada digital PORTC = 0x00; // Inicia PORTC em LOW PORTB = 0x00; INTCON = 0b11000000;// Liga GIE e PEIE (pag. 87) [Feito em binario para setar GIE/GIEH PEIE/GIEL] TMR1IE_bit = 0x00; // Desabilita TMR1 CCP1IE_bit = 0x01; // Habilita interrupções CCP1CON = 0x05; // Configura CCP1 para subida T1CKPS1_bit = 1; // Prescaller TRM1 1:4 (pag. 129) T1CKPS0_bit = 0; TMR1CS_bit = 0; // clock escolhido [0 = Internal clock (FOSC/4)] TMR1ON_bit = 0; // Desabilita a contagem do TMR1// Funções do display para exibição da distancia Lcd_Init(); // Inicia o Display Lcd_Cmd(_Lcd_Cursor_Off); // Apaga o cursor Lcd_Cmd(_LCD_CLEAR); // Limpa o display Lcd_Out(1,1,"Medidor de Dist");// Escreve no display na linha 1 Lcd_Out(2,1,"Distancia: cm");// Escreve no display na linha 2 delay_ms(100); while(1) { distance(); }}void distance(){ trigger(); // Dispara o "gate" do sensor delay_ms(100); // "ms" usado para milisegundos periodo = (Tempo_H<<8) + Tempo_L; // Tempo relativo ao ECHO do sensor em us [Tempo_H*256 = Tempo_H<<8) distancia_cm = periodo/58; // Converte a distancia para cm if((distancia_cm < 3)||(distancia_cm > 300)) Lcd_Out(2,12,"---"); else { ByteToStr(distancia_cm, txt); // Converte a variavel para o display Lcd_Out(2,12,txt); // Mostra a distancia no LCD }}void trigger(){ trig = 0x01; delay_us(10); // "us" usado para microsegundos trig = 0x00;}
  3. Olá amigos, estou com dificuldade em compilar uma programação, ele insiste em um erro que não consigo arrumar, vocês poderiam me ajudar? #pragma config WDT=OFF#pragma config FOSC=HS#pragma orgall 0x1000#define trig RC3_bit// Pinos do LCD nas portas Bsbit LCD_RS at RB6_bit;sbit LCD_EN at RB7_bit;sbit LCD_D7 at RB3_bit;sbit LCD_D6 at RB2_bit;sbit LCD_D5 at RB1_bit;sbit LCD_D4 at RB0_bit;sbit LCD_RS_Direction at TRISB6_bit;sbit LCD_EN_Direction at TRISB7_bit;sbit LCD_D7_Direction at TRISB3_bit;sbit LCD_D6_Direction at TRISB2_bit;sbit LCD_D5_Direction at TRISB1_bit;sbit LCD_D4_Direction at TRISB0_bit;//Funções auxiliaresvoid trigger();void distance();//Definições e Variáveischar txt[4]; //Conversão de dados em stringchar Tempo_H, Tempo_L, distancia_cm; //Variavéis de tempounsigned int periodo; // Periodo do pulso de ECHO//Funções de interrupção (Foi usado para agilizar mais o processo)void interrupt(){ if(CCP1IF_bit && CCP1CON.B0) //Quando a borda for de subida inicia a contagem { CCP1IF_bit = 0x00; // Limpa a flag para uma nova captura (pag. 69) CCP1IE_bit = 0x00; // Desabilita a interrupção por perifericos [CCP1] (pag. 69) CCP1CON = 0x04; // Configuração de borda para descida (pag. 122) CCP1IE_bit = 0x01; // Habilita a interrupção por perifericos [CCP1] (pag. 69) TMR1H = 0x00; // Zerar registradores do TIMER1 (pag. 129) TMR1L = 0x00; // Zerar registradores do TIMER1 (pag. 129) TMR1ON_bit = 0x01; // Habilita a contagem de tempo } else if(CCP1IF_bit) { CCP1IF_bit = 0x00; // Limpa a flag para uma nova captura (pag. 69) TMR1ON_bit = 0x00; // Desabilita a contagem de tempo CCP1IE_bit = 0x00; // Desabilita a interrupção por perifericos [CCP1] (pag. 69) CCP1CON = 0x05; // Configura a borda de captura para subida CCP1IE_bit = 0x01; // Habilita a interrupção por perifericos [CCP1] (pag. 69) Tempo_H = CCPR1H; // Carrega os valores de tempo (micro seg) (pag. 68) Tempo_L = CCPR1L; // Carrega os valores de tempo (micro seg) (pag. 68) }}// Fim da rotina de interrupçãovoid main() org 0x1000{ CMCON = 0x07; // Desliga os comparadores TRISC = 0x04; // Entrada CCP1, RC2 entrada digital PORTC = 0x00; // Inicia PORTC em LOW INTCON = 0b11000000;// Liga GIE e PEIE (pag. 87) [Feito em binario para setar GIE/GIEH PEIE/GIEL] TMR1IE_bit = 0x00; // Desabilita TMR1 CCP1IE_bit = 0x01; // Habilita interrupções CCP1CON = 0x05; // Configura CCP1 para subida T1CKPS1_bit = 1; // Prescaller TRM1 1:4 (pag. 129) T1CKPS0_bit = 0; TMR1CS_bit = 0; // clock escolhido [0 = Internal clock (FOSC/4)] TMR1ON_bit = 0; // Desabilita a contagem do TMR1// Funções do display para exibição da distancia Lcd_Init(); // Inicia o Display Lcd_Cmd(_Lcd_Cursor_Off); // Apaga o cursor Lcd_Cmd(_LCD_CLEAR); // Limpa o display Lcd_Out(1,1,"Medidor de Distancia");// Escreve no display na linha 1 Lcd_Out(2,1,"Distancia: cm");// Escreve no display na linha 2 delay_ms(100); while(1) { distance(); }}void distance(){ trigger(); // Dispara o "gate" do sensor delay_ms(100); // "ms" usado para milisegundos periodo = (Tempo_H<<8) + Tempo_L; // Tempo relativo ao ECHO do sensor em us [Tempo_H*256 = Tempo_H<<8) distancia_cm = periodo/58; // Converte a distancia para cm if((distancia_cm < 3)||(distancia_cm > 300)) Lcd_Out(2,12,"---"); else { ByteToStr(distancia_cm, txt); // Converte a variavel para o display Lcd_Out(2,12,txt); // Mostra a distancia no LCD }}void trigger(){ trig = 0x01; delay_us(10); // "us" usado para microsegundos trig = 0x00;} Esse é o erro
  4. @Eletronortico Boas cara, No lugar onde moro é difícil achar casas que abasteçam por caixa d'agua, a água vem direto da rua para o chuveiro, digamos assim, e para o tempo que temos seria meio que loucura trocar o tema, pois dia 17 preciso entregar o caderno de tcc e dia 24 apresentar. Vou atualiza-lo do nosso projeto com base no que temos até agora. Bom, é bem simples, sempre que meu sensor ultrassonico detectar algo entre uma distancia declarada no meu pic ele mandara 5 volts em alguma porta para ativar o rele, assim acionando a valvula e permitindo a vazão da agua, comprei 2 reles para poder realizar duas funções, modo livre e o de 5 minutos, aquele led que coloquei quando ele estiver desligado é que o chuveiro esta ativado e ele pode fazer a contagem, assim que ele ligar ele trava a contagem, se ficar ligado por mt tempo ele reseta os 5 minutos, e caso ele conte os 5 minutos a porta do pic para de mandar tensão o rele por alguns minutos para travar o funcionamento, é basicamente isso, eu até queria mudar de projeto, mas ja acabei comprando o pic 18f4550 o sensor e um display, se você souber de algum projeto legal pra me ajudar, não precisa ser necessariamente ecologico ou algo do tipo, é que toda minha classe esta fazendo sobre isso e eu também queria... Obrigado desde já!
  5. Então cara, eu estava pensando em usar uma dessas, mas o projeto também tem que ser barato para a ideia ser mais aceita pelos professores
  6. Olá a todos, novamente venho pedir ajuda dos amigos do fórum para o me projeto de tcc. Explicando rapidamente, ele se trata de um circuito que visa economizar água, vou utilizar um sensor ultrassonico hc sr04 para ativar 1 relé, que permitirá o vazamento da aguá do chuveiro.Porém tenho algumas duvidas. Bom, tenho pesquisado muito sobre o sensor e achei alguns videos mostrando ele sendo controlado por pic, o que foi indicado pelos professores foi o 18f4550, então comprei o mesmo e queria saber se posso programar o pic para que só permita a vazão de água com certa distancia do sensor...
  7. Nossa Paulo obrigado por me lembrar dos pinos, tinham me dito isso a muito tempo e eu esqueci completamente, vou verificar agora mesmo. Obrigadão!
  8. Olá, como ja venho postando minhas questões no fórum, espero que vocês possam me ajudar novamente. Bom, estou fazendo um tcc e nele irei usar um HC SR04(Sensor ultra sonico) que pode ser programado por pic ou arduino. Eu achei uma programação relacionada com o que terei que fazer, porém ela esta programada para arduino, queria saber se tem diferença, pois talvez usarei algumas linhas de programação como auxilio para o meu trabalho. Irei programar um PIC 18F4550, quero fazer com que o pic libere a passagem de tensão em uma de suas portas apenas quando o sensor detectar uma interrupção no seu campo referente a distancia programada, no caso do código 20 a 60. Aqui estão as linhas de código. //Programa : HC-SR04 - Distancias minima e maxima //Autor : Adilson Thomsen #include //Define os pinos do Arduino ligados ao Trigger e Echo #define PINO_TRG 7 #define PINO_ECHO 6 //Distancias em centimetros float distancia_minima = 20; float distancia_maxima = 60; //Pino a ser acionado em caso de deteccao int pino_saida = 10; //Inicializa o sensor ultrasonico nos pinos especificados Ultrasonic ultrasonic(PINO_TRG, PINO_ECHO); void setup() { //Inicializa a serial Serial.begin(9600); pinMode(pino_saida, OUTPUT); } void loop() { //Variaveis para guardar os valores em //cm (cmSec) e polegadas (inMsec) float cmMsec, inMsec; //Le os valores do sensor ultrasonico long microsec = ultrasonic.timing(); //Atribui os valores em cm ou polegadas as variaveis cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM); inMsec = ultrasonic.convert(microsec, Ultrasonic::IN); if (cmMsec > distancia_minima && cmMsec < distancia_maxima) { //Aciona a porta de saida digitalWrite(pino_saida, HIGH); } delay(1000); }
  9. Olá, preciso da ajuda de vocês para definir qual PIC usar, não conheço muito sobre pic's em geral e queria saber qual poderia usar para programar um sensor ultrasonico hc-sr04, o qual eu acho que irei usar... Preciso de um pic com bastante estradas, pois também quero programar outras coisas nele, mas se no caso precisar de um especifico também posso utilizar 2 pics sem problema. Obrigado desde já!
  10. Então cara, eu vou usar um potenciometro no painel, pro cara poder regular a temperatura do chuveiro conforme ele queira, e pra auxiliar eu vou colocar um Mini termômetro digital pra mostrar a temperatura da água.
  11. Tente procurar por pastas ocultas ou use a ajuda do Ccleaner pra limpar, igual o amigo ai disse.
  12. Você está excluindo como administrador né?
  13. Tente isso, talvez funcione... Aperte a Tecla do Windows + R ou abra o Executar e digite "regedit" sem aspas. Dps vá em HKEY_LOCAL_MACHINE e em seguida SOFTWARE e procure alguma pasta do baidu, se tiver exclua tudo
  14. Então eu pensei em fazer um esqueminha para travar o ligamento por 2 ou 3 minutos para poder reutilizar o chuveiro, assim a pessoa não poderia ficar dando reset no sistema e gastando água desnecessariamente. Usei sua ideia dos beeps para avisar o tempo do banho, na aula não consegui pensar em nada além das portas logicas, então acabei usando elas mesmo, pelo que percebi funcionou, mas o proteus poderia emitir som quando o buzzer é acionado. Agora vou procurar sobre a fonte dos celulares xingling, pode funcionar. Me deram outra ideia, pode funcionar, mas também pode ser complicada pro curto prazo que tenho (1 Mês e alguns dias) Me disseram que um botão que regulasse a temperatura do banho conforme a temperatura ambiente seria legal, mas acho que deve ser muito complicado e posso ficar sem tempo pra isso, você saberia dizer se tem um meio fácil pra fazer isso?
  15. Pelo que pesquisei aqui, o uso da base com cooler diminuiria a temperatura do notebook sim, mas por ele ter a saída de ar lateral, ele não precisa de nenhum cooler secundário para ajudar nessa função, então se você quiser comprar um para resfriar um pouco mais seu notebook vá em frente.

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...