Ir ao conteúdo

Relógio e calendário com pic 16f628 super simples


cls23

Posts recomendados

Postado

ola amigos eu mesmo tenho muitas duvidas com os códigos escrevi esse para fazer a varredura no lcd e aparecer algo simples mas não estou conseguindo tom com o mickro C e não + com o css eu tenho muitas duvidas sobre esse compilador ele e bom ? so gostaria de saber ....

aqui e ta o codigo ...

void main() {

}

trisb=0

trisa=0

LCD8_Config(PORTA, PORTB, 7, 6, 5, 7, 6, 5, 4, 3, 2, 1, 0)

LCD8_Init(PORTA,PORTB)

loop_principal:

lcd8_cmd(LCD_CLEAR) // limpa o display

LCD8_Out(1,1,"Display LCD") // escreve um texto no lcd

}

nao comlila da muitos erros o q posso ta fazendo de errado ??

preciso de ajuda se alguem poder me ajudar

obrigado

ops é compila ....

Postado
aqui e ta o codigo ... nao compila da muitos erros o q posso ta fazendo de errado ?? preciso de ajuda se alguem poder me ajudar

Existe muitos erros no seu código, além de utilizar uma versão antiga do compilador. Baixe uma versão Pro e seja feliz com um pic que tenha flash até 2K. Funcionalidade total sem precisar de licença.

Tente:

void main() {
trisb=0;
trisa=0;
LCD8_Init(PORTB);
delay_ms(50);
lcd8_cmd(LCD_CLEAR);
while(1){
LCD8_Cmd(LCD_CLEAR); // limpa o display.
LCD8_Out(1,1,"Display LCD"); // escreve um texto no lcd.
delay_ms(1000);
}
}

Não testei o código acima, por não ter o compilador na versão 8. Veja no help dele que existe um projeto inteiro usando o display.

Abraço.

  • 2 semanas depois...
Postado

Boa noite MatheuLPS, se divertiu bastante, espero que sim eu porém quebrei a cabeça tentando implementar os milésimos de segundos ao cronometro más não obtive sucesso conto com sua ajuda nesta implementação, valeu!

Postado

Colega ejss, foi mals a demora.

O circuito permanece o mesmo. O código mudei aqui para adicionar os milésimos de segundo e ficou assim:

#include <16F877A.h> //O PIC utilizado, obrigatório!

#FUSES NOWDT //Sem Watch dog, evitando reset
#FUSES XT //Crystal de oscilação igual a 4mhz
#FUSES PUT //Tempo de início do PIC
#FUSES NOPROTECT //Codigo sem proteção de leitura, software livre!
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection

#use delay(clock=4000000) // Definição do clock utilizado. Obrigatório!
#include <lcd.C> //Inclusão da biblioteca de LCD. Obrigatório!
// D0 enable //Pinos utilizados pelo LCD. Podem ser alterados.
// D1 rs
// D2 rw
// D4 D4
// D5 D5
// D6 D6
// D7 D7
/*=====================
Meu Botões:
=======================*/
#define BOTAO_1 PIN_B0 //Botão de escolha de ajuste das funções.
#define BOTAO_2 PIN_B1 //Botão incremento de variáveis.
#define BOTAO_3 PIN_B2 //Botão de escolha de ajuste das funções.


//Foram utilizados resistores pull-up e
//pull-down em todos os botões para
//evitar ruídos.

/*=====================
Minhas variáveis:
=======================*/
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.

/*int ndia_semana=1; //Variável dos dias da semana, é associada a uma string.
int dia=1; //Variável dos dias do mês. 0 a 31.
int mes=1; //Variável dos meses. 0 a 12.
int16 ano=2010; //Variável dos anos. 2000 a 2099.*/
/*=====================
Minha Interrupção:
=======================*/
#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 (65411); //Preload do Timer1
}
/*=====================
O programa Principal:
=======================*/
void main()
{
lcd_init(); //Inicializa o LCD (obrigatório)!

lcd_gotoxy (2,1); //Coluna 6, linha 1.
lcd_putc("Projeto Tempo:");
delay_ms(1000);
lcd_putc ("\f");
delay_ms(1000);

setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8); //Configuração do Timer1 para clock interno = 1E6 dividido por 8
set_timer1 (65411); //Preload do Timer1
disable_interrupts(INT_TIMER1); //Habilita interrupção timer1
enable_interrupts(global); //habilita interrupcão global

while(TRUE) //Loop Principal
{

if (input(BOTAO_1)) //Teste do botão.
{
delay_ms (100); //Para evitar retorno.

enable_interrupts(INT_TIMER1); //Habilita interrupção timer1
}

if (input(BOTAO_2)) //Teste do botão.
{
delay_ms (100); //Para evitar retorno.

disable_interrupts(INT_TIMER1); //Habilita interrupção timer1
}

if (input(BOTAO_3)) //Teste do botão.
{
delay_ms (100); //Para evitar retorno.
q=0;
s=0;
m=0;
h=0;
}

if (q > 1000)
{
s++;
q=0;
}

if (s==60) //Se for igual a 60, reset em Q e S. M incrementa.
{
q=0;
s=0;
m++;
}

if (m>59)
{
m=0;
h++;
}

lcd_gotoxy (1,1);
printf (lcd_putc, "Inicio: ");
lcd_gotoxy (9,1);
printf (lcd_putc, "\n%02u:%02u:%02u:%04lu", h, m, s,q);
//delay_ms (100);
}
}

Falou

Postado

Apenas um palpite para encher o saco :) .

[CHATISSE] De modo geral é interessante evitar manipular variaveis dentro do main e em uma interruplçao dentro de um mesmo "estado" do seu programa. Obviamente neste especifico programa não ira acontecer nada pois o ciclo do programa é muito pequeno, mas neste caso seria mais "seguro" fazer o controle das variaveis do calendario dentro do timer, e o resto no MAIN. Obviamente não faz diferença neste caso, mas por exemplo os Delays de 100ms poderiam gerar conflito caso fosse utilizados para qualquer coisa diferente de ativar e desativar o timer.

E mais um comentário final.. este segundo não esta com 1001ms não?

E po ejss proxima vez posta seu codigo que a gente ajuda em cima dele... o Matheus ta quase trabalhando como consultor da lista hahaha [/CHATISSE]

ABs

Postado

Bom que o do Matheus dá pra colocar um relé em uma das saidas disponiveis do Pic e programar pra ligar, temporizar e desligar de acordo com o horário.

Dá uma olhada no RTC DS1302 é um relogio bem simples e já tem o drive em C disponivel. Parabéns

Postado

@Sink00, o palpite é bem válido!

Engraçado q já li totalmente o oposto q você disse. Veja q dentro da interrupção do timer, só tem 2 linhas de comando, elas estão dessa forma propositalmente.

Li foi no forum do CCS que qualquer interrupção dve ser o mais rápido possivel, por isso coloquei poucas coisas dentro dela.

Só percebi o erro só hj de manhã. A variável q deve ser maior que 999 para gerar 1 segundo e não maior que 1000. Só trocar lá.

@idel, nesse caso não usei um RTC pelo motivo de não ser um relógio. Esse código é para um cronômetro.

Usei o 16F877A porq o codigo já era p ele. Mas para um aplicação dessa, um 16f628a cai bem. Acredito q até dá pra colocar o LCD nele.

Falou

  • 2 semanas depois...
Postado
Colega ejss, foi mals a demora.

O circuito permanece o mesmo. O código mudei aqui para adicionar os milésimos de segundo e ficou assim:

#include <16F877A.h> //O PIC utilizado, obrigatório!

#FUSES NOWDT //Sem Watch dog, evitando reset
#FUSES XT //Crystal de oscilação igual a 4mhz
#FUSES PUT //Tempo de início do PIC
#FUSES NOPROTECT //Codigo sem proteção de leitura, software livre!
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection

#use delay(clock=4000000) // Definição do clock utilizado. Obrigatório!
#include <lcd.C> //Inclusão da biblioteca de LCD. Obrigatório!
// D0 enable //Pinos utilizados pelo LCD. Podem ser alterados.
// D1 rs
// D2 rw
// D4 D4
// D5 D5
// D6 D6
// D7 D7
/*=====================
Meu Botões:
=======================*/
#define BOTAO_1 PIN_B0 //Botão de escolha de ajuste das funções.
#define BOTAO_2 PIN_B1 //Botão incremento de variáveis.
#define BOTAO_3 PIN_B2 //Botão de escolha de ajuste das funções.


//Foram utilizados resistores pull-up e
//pull-down em todos os botões para
//evitar ruídos.

/*=====================
Minhas variáveis:
=======================*/
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.

/*int ndia_semana=1; //Variável dos dias da semana, é associada a uma string.
int dia=1; //Variável dos dias do mês. 0 a 31.
int mes=1; //Variável dos meses. 0 a 12.
int16 ano=2010; //Variável dos anos. 2000 a 2099.*/
/*=====================
Minha Interrupção:
=======================*/
#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 (65411); //Preload do Timer1
}
/*=====================
O programa Principal:
=======================*/
void main()
{
lcd_init(); //Inicializa o LCD (obrigatório)!

lcd_gotoxy (2,1); //Coluna 6, linha 1.
lcd_putc("Projeto Tempo:");
delay_ms(1000);
lcd_putc ("\f");
delay_ms(1000);

setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8); //Configuração do Timer1 para clock interno = 1E6 dividido por 8
set_timer1 (65411); //Preload do Timer1
disable_interrupts(INT_TIMER1); //Habilita interrupção timer1
enable_interrupts(global); //habilita interrupcão global

while(TRUE) //Loop Principal
{

if (input(BOTAO_1)) //Teste do botão.
{
delay_ms (100); //Para evitar retorno.

enable_interrupts(INT_TIMER1); //Habilita interrupção timer1
}

if (input(BOTAO_2)) //Teste do botão.
{
delay_ms (100); //Para evitar retorno.

disable_interrupts(INT_TIMER1); //Habilita interrupção timer1
}

if (input(BOTAO_3)) //Teste do botão.
{
delay_ms (100); //Para evitar retorno.
q=0;
s=0;
m=0;
h=0;
}

if (q > 1000)
{
s++;
q=0;
}

if (s==60) //Se for igual a 60, reset em Q e S. M incrementa.
{
q=0;
s=0;
m++;
}

if (m>59)
{
m=0;
h++;
}

lcd_gotoxy (1,1);
printf (lcd_putc, "Inicio: ");
lcd_gotoxy (9,1);
printf (lcd_putc, "\n%02u:%02u:%02u:%04lu", h, m, s,q);
//delay_ms (100);
}
}

Falou

Meu caro amigo faz algum tempo que eu estava fora do ar, agradeço imensamente o apoio mas eu não sei o que acontece, pois o programa funciona no proteus mas no protoboard não funciona de jeito nenhum, sei que já enchi o saco mas voce saberia me dizer o porque de não funcionar no protoboard e nem o programa anterior que você escreveu, funcionava direitinho mas agora eu faço a gravação do pic ele aparecece

as mensagens no lcd mas quando aperto para iniciar ele não funciona o que será que pode estar acontecendo? E valeu mesmo pela ajuda!

Postado

Olá pessoal, preciso de um código em C para fazer um relógio. Esse ai do LCD é muito bom! Só que eu preciso é que seja em Display no caso de 7 Segmentos, ou seja, para mostrar horas e minutos será 4 displays. Tem que ser assim porque vou amplificar cada saida dos displays para ligar em vários LEDs, fazer tipo um painel. Se alguém tem um código pronto, pela metade, um link, alguma noção de por onde começar, qualquer coisa ajudaria. Já faço algumas coisas com PICs 16f628, 16F84A e 16F877.

Agradeço desde já...

Postado

eu tenho,peguei esse e modiifiquei para seteseg,e add temperatura.ele por enquanto so mostra a horas ,tem os ajustes e tal,mais ainda to vendo pra mostrar a hora ,data e temperatura. se quiser so falar

  • 2 semanas depois...
Postado

Ola Jorge, você poderia mandar para mim o arquivo do seu relogio, eu preciso fazer um relogio com display grandes. Obrigado

eu tenho,peguei esse e modiifiquei para seteseg,e add temperatura.ele por enquanto so mostra a horas ,tem os ajustes e tal,mais ainda to vendo pra mostrar a hora ,data e temperatura. se quiser so falar
  • mês depois...
Postado

Boa noite meu caro estou novamente precisando da sua ajuda estou fazendo um controle de níveis, o desenho do esquema é este: estou tendo dificuldades em assembler ate fiz um código em assembler mas nãao funcionou direito, conforme o desenho o nível que eu escolher ele tem que ir e parar na posição exemplo se eu esclher o nível 50% tem que parar no sensor 50% se eu apertar 25% tem que parar no nível 25% independente da posição que for escolhida tem que encher ou esvaziar ate o nível desejado o código em assembler é este:


; CONTROLE DE NÍVES
;
;================================================================================
;
; Cristal 4MHZ - Tc = 1us
;
;================================================================================
;errorlevel -302 ; não lista mensagens de erro de banco (302)
#INCLUDE <P16F877A.INC> ;MODELO DO MICROCONTROLADOR UTILIZADO.
__CONFIG _CP_OFF & _LVP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC
;================================================================================
; Variáveis de RAM
;Utilização da RAM de uso geral:.................................................
;--------------------------------------------------------------------------------
;***** banco 0
CBLOCK 20H
PDel0 ; > utilizados na rotina de
PDel1 ; / delay DELAY500MS
TESTE
DESL
DESL1
DESL2
DESL3
DESL4
ENDC
;***** banco 1
;***** banco 2
;***** banco 3
;================================================================================
; Tabela de definiçäes de EEPROM
; 64 bytes de EEPROM
;--------------------------------------------------------------------------------
;================================================================================
; Constantes
;--------------------------------------------------------------------------------
;================================================================================
; Definiçäes de Hardware
;--------------------------------------------------------------------------------
;
;================================================================================
; Macros
; --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
;================================================================================
org 0000H
CALL INIT ; inicialização
GOTO PRINCIPAL ; inicio do programa principal
;================================================================================
; Tratamento de interrupção
org 0004H
; nenhuma interrupção habilitada
RETFIE
;================================================================================
PRINCIPAL
BTFSC PORTA,0 ;O BOTÃO_0 = 0 fica em loop O BOTÃO_0 = 1 salta 1 linha
X6 GOTO X1 ;Salta para X1
GOTO VINTECINCO ;Salta para VINTECINCO
X1 BTFSC PORTA,1 ;O BOTÃO_1 = 0 fica em loop O BOTÃO_1 = 1 salta 1 linha
GOTO X2 ;Salta para X2
GOTO CINQUENTA ;Salta para CINQUENTA
X2 BTFSC PORTA,2 ;O BOTÃO_2 = 0 fica em loop O BOTÃO_2 = 1 salta 1 linha
GOTO X3 ;Salta para X3
GOTO SETENTACINCO ;Salta para SETENTACINCO
X3 BTFSC PORTA,3 ;O BOTÃO_3 = 0 fica em loop O BOTÃO_3 = 1 salta 1 linha
GOTO X4 ;Salta para X4
GOTO CEM ;Salta para CEM
X4 BTFSC PORTB,7 ;O BOTÃO_4 = 0 fica em loop O BOTÃO_4 = 1 salta 1 linha
GOTO P1 ;Salta para P1
GOTO ZERO ;Salta para ZERO
P1 GOTO PRINCIPAL ;Loop principal
;================================================================================
VINTECINCO
BSF PORTB,1 ;Liga solenoide_1
BSF PORTB,0 ;Liga bomba
S1 BTFSC PORTB,3 ;Se sensor_1 = 0 desl. bomba e solenoide_1
GOTO S1 ;Enquanto sensor_1 = 1 sistema em loop
BCF PORTB,0 ;Desliga bomba
BCF PORTB,1 ;Desliga solenoide_1
INCF DESL ;Incrementa variável DESL
BTFSS DESL,1 ;Se bit 1 da variável DESL = 1 salta e liga solenoide_2
GOTO PRINCIPAL ;Salta para loop PRINCIPAL
BSF PORTB,2 ;Liga solenoide_2
S11 BTFSS PORTB,3 ;Se sensor_1 = 1 salta e desliga solenoide_2
GOTO S11 ;Enquanto sensor_1 = 0 sistema em loop
BCF PORTB,2 ;Desliga solenoide_1
CLRF DESL ;Limpa variável DESL
CLRF DESL1 ;Limpa variável DESL1
CLRF DESL2 ;Limpa variável DESL2
CLRF DESL3 ;Limpa variável DESL3
GOTO X1 ;Salta para x1 dentro do prog. principal
GOTO PRINCIPAL
;================================================================================
CINQUENTA
BSF PORTB,1 ;Liga solenoide_1
BSF PORTB,0 ;Liga bomba
S2 BTFSC PORTB,4 ;Se sensor_2 = 0 desl. bomba e solenoide_1
GOTO S2 ;Enquanto sensor_2 = 1 sistema em loop
BCF PORTB,0 ;Desliga bomba
BCF PORTB,1 ;Desliga solenoide_1
INCF DESL1 ;Incrementa variável DESL1
BTFSS DESL1,1 ;Se bit 1 da variável DESL1 = 1 salta e liga solenoide_2
GOTO PRINCIPAL ;Salta para loop PRINCIPAL
BSF PORTB,2 ;Liga solenoide_2
S22 BTFSS PORTB,4 ;Se sensor_2 = 1 salta e desliga solenoide_2
GOTO S22 ;Enquanto sensor_2 = 0 sistema em loop
BCF PORTB,2 ;Desliga solenoide_2
CLRF DESL1 ;Limpa variável DESL1
CLRF DESL2 ;Limpa variável DESL2
CLRF DESL3 ;Limpa variável DESL3
GOTO X2 ;Salta para x2 dentro do prog. principal
;================================================================================

SETENTACINCO
BSF PORTB,1 ;Liga solenoide_1
BSF PORTB,0 ;Liga bomba
S3 BTFSC PORTB,5 ;Se sensor_3 = 0 desl. bomba e solenoide_1
GOTO S3 ;Enquanto sensor_3 = 1 sistema em loop
BCF PORTB,0 ;Desliga bomba
BCF PORTB,1 ;Desliga solenoide_1
INCF DESL2 ;Incrementa variável DESL2
BTFSS DESL2,1 ;Se bit 1 da variável DESL2 = 1 salta e liga solenoide_2
GOTO PRINCIPAL ;Salta para loop PRINCIPAL
BSF PORTB,2 ;Liga solenoide_2
S33 BTFSS PORTB,5 ;Se sensor_3 = 1 salta e desliga solenoide_2
GOTO S33 ;Salta para loop PRINCIPAL
BCF PORTB,2 ;Desliga solenoide_2
CLRF DESL2 ;Limpa variável DESL2
CLRF DESL3 ;Limpa variável DESL3
GOTO X3 ;Salta para x3 dentro do prog. principal
;================================================================================
CEM
BSF PORTB,1 ;Liga solenoide_1
BSF PORTB,0 ;Liga bomba
S4 BTFSC PORTB,6 ;Se sensor_4 = 0 desl. bomba e solenoide_1
GOTO S4 ;Enquanto sensor_4 = 1 sistema em loop
BCF PORTB,0 ;Desliga bomba
BCF PORTB,1 ;Desliga solenoide_1

INCF DESL3 ;Incrementa variável DESL3
BTFSS DESL3,1 ;Se bit 1 da variável DESL3 = 1 salta e liga solenoide_2
GOTO PRINCIPAL ;Salta para loop PRINCIPAL
BSF PORTB,2 ;Liga solenoide_2
S44 BTFSS PORTB,6 ;Se sensor_3 = 1 salta e desliga solenoide_2
GOTO S44 ;Salta para loop PRINCIPAL
BCF PORTB,2 ;Desliga solenoide_2
CLRF DESL3 ;Limpa variável DESL3
CLRF DESL4 ;Limpa variável DESL4
GOTO X6 ;Salta para x6 dentro do prog. principal
;================================================================================
ZERO
BCF PORTB,0 ;Desliga bomba
BCF PORTB,1 ;Desliga solenoide_1
BSF PORTB,2 ;Liga solenoide_2
S0 BTFSS PORTB,3 ;Se sensor_1 = 1 liga tempo de esvaziamento total
GOTO S0 ;Enquanto sensor_1 = 0 sistema em loop
CALL TEMPO1 ;Espera um tempo
CALL TEMPO1 ;Espera um tempo
CALL TEMPO1 ;Espera um tempo
CALL TEMPO1 ;Espera um tempo
CALL TEMPO1 ;Espera um tempo
CALL TEMPO1 ;Espera um tempo
CALL TEMPO1 ;Espera um tempo
CALL TEMPO1 ;Espera um tempo
CALL TEMPO1 ;Espera um tempo
CALL TEMPO1 ;Espera um tempo
CALL TEMPO1 ;Espera um tempo
CALL TEMPO1 ;Espera um tempo
CALL TEMPO1 ;Espera um tempo
CALL TEMPO1 ;Espera um tempo
CALL TEMPO1 ;Espera um tempo
BCF PORTB,2 ;Desliga solenoide_2
CLRF DESL ;Limpa variável DESL
CLRF DESL1 ;Limpa variável DESL1
CLRF DESL2 ;Limpa variável DESL2
CLRF DESL3 ;Limpa variável DESL3
CLRF DESL4 ;Limpa variável DESL4
GOTO PRINCIPAL ;Salta para prog. principal

;================================================================================
TEMPO1:
;--------------------------------------------------------------------------------
; Código gerado pelo PDEL ver 1.0 de 21/08/02 at 14:12:40
; Descrição: espera 250000 ciclos
;--------------------------------------------------------------------------------
PDelay movlw .239 ; 1 set numero de repetição (B)
movwf PDel0 ; 1 |
PLoop1 movlw .116 ; 1 set numero de repetição (A)
movwf PDel1 ; 1 |
PLoop2 clrwdt ; 1 limpa watchdog
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2 goto PDelL3 ; 2 ciclos delay
PDelL3 clrwdt ; 1 ciclos delay
decfsz PDel1, 1 ; 1 + (1) e o tempo sobre? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) e o tempo sobre? (B)
goto PLoop1 ; 2 nao, loop
PDelL4 goto PDelL5 ; 2 ciclos delay
PDelL5 goto PDelL6 ; 2 ciclos delay
PDelL6 goto PDelL7 ; 2 ciclos delay
PDelL7 clrwdt ; 1 ciclos delay
return ; 2+2 Done
;================================================================================
INIT:
CLRF DESL
CLRF DESL1
CLRF DESL2
CLRF DESL3
CLRF DESL4
CLRF PORTB
BSF STATUS,RP0
MOVLW B'00000110'
MOVWF ADCON1
; Portal A
MOVLW 0x0F ;Definição da Porta
MOVWF TRISA ;RAO,RA1,RA2 e RA3 = Entradas
; Portal B
MOVLW 0xF8 ;Definição da Portb
MOVWF TRISB ;RB0,RB1 e RB2 = Saídas De RB3 a RB7 = Entradas
; Portal C
MOVLW 00FH ;Definição da Portc
MOVWF TRISC ;RC0 a RC3 = Entradas
; Portal D
MOVLW 000H ;Definição da Portd
MOVWF TRISD ; Todas saidas
; Portal E
MOVLW 000H ;Definição da Porte
MOVWF TRISE ; Todas saidas
BSF OPTION_REG,NOT_RBPU; pull-up na porta B = des.
BCF OPTION_REG,INTEDG ; interrupção de RB0 = descida
BCF OPTION_REG,T0CS ; clock interno para TMR0
BCF OPTION_REG,T0SE ; incremeta TIMER0 na descida
BCF OPTION_REG,PSA ; prescaler em TMR0
BCF OPTION_REG,PS2 ; \
BCF OPTION_REG,PS1 ; > prescaler = 1:1
BCF OPTION_REG,PS0 ; /
BCF STATUS,RP0
; --- < Inicalização das Variáveis > --- --- --- --- --- --- --- --- --- --- ---

RETURN
;================================================================================
END ; FIM DO CÓDIGO
;================================================================================
;================================================================================

Se você poder me ajudar a solucionar este problema em linguagem c fica rei mais uma vez grato, valeu!

  • mês depois...
Postado

Boa noite a todos do forum que gostam de ajudar os que tem dificuldades, inventei de fazer um controle de níveis, não consegui deixar funcionando do jeito imaginado, por isso recorro aos que tem facilidade de programar pic16f877a usando linguagem c, abaixo segue o link da imagem do circuito:

http://img833.imageshack.us/img833/2555/semttulodo.jpg

E o proposito dessa brincadeira que já esta me deixando careca, é fazer com que quando for selecionada qualquer tecla de forma aleatória encha ou esvazie o balde de agua até o nível referente ao sensor, nesse projetinho uso um balde com agua e uma bomba de aquário, cujo afunção e mandar agua para o outro balde, uma solenoide1 quando acionada libera para encher e outra libera para esvaziar, ficarei muito feliz se puderem me ajudar abaixo segue o programa que fiz mas não esta do jeito esperado quem poder analisar e me ajudar ficarei muito gratificado:

#include <16F877A.h> //O PIC utilizado, obrigatório!

#FUSES NOWDT //Sem Watch dog, evitando reset

#FUSES XT //Crystal de oscilação igual a 4mhz

#FUSES PUT //Tempo de início do PIC

#FUSES NOPROTECT //Codigo sem proteção de leitura, software livre!

#FUSES NODEBUG //No Debug mode for ICD

#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#FUSES NOCPD //No EE protection

#use delay(clock=4000000) // Definição do clock utilizado. Obrigatório!

#include <lcd.C> //Inclusão da biblioteca de LCD. Obrigatório!

// D0 enable //Pinos utilizados pelo LCD. Podem ser alterados.

// D1 rs

// D2 rw

// D4 D4

// D5 D5

// D6 D6

// D7 D7

//set_tris_A(0x0f);

/*=====================

Meu Botões:

=======================*/

#define BOTAO_1 PIN_A0 //NIVEL 1.

#define BOTAO_2 PIN_A1 //NIVEL 2.

#define BOTAO_3 PIN_A2 //NIVEL 3.

#define BOTAO_4 PIN_A3

#define SENSOR_1 PIN_B3

#define SENSOR_2 PIN_B4

#define SENSOR_3 PIN_B5

#define SENSOR_4 PIN_B6

//Foram utilizados resistores pull-up e

//pull-down em todos os botões para

//evitar ruídos.

/*=====================

Minhas variáveis:

=======================*/

//int16 q=0; //Variável que incrementa a cada 0.5s dentro da interupção do timer1.

int N=0; //Variável dos segundos, incrementa na metade de q.

int N1=0; //Variável dos minutos. 0 a 59

int N2=0; //Variável das horas. 0 a 23.

int N3=0;

/*=====================

O programa Principal:

=======================*/

void main()

{

lcd_init(); //Inicializa o LCD (obrigatório)!

lcd_gotoxy (1,1); //Coluna 6, linha 1.

lcd_putc("Controle de Nivel");

delay_ms(1000);

lcd_putc ("\f");

delay_ms(1000);

while(1) //Loop Principal

{

if (input(BOTAO_1)==0) //Teste do botão.

{

delay_ms(100);

OUTPUT_HIGH(PIN_B0);

OUTPUT_HIGH(PIN_B1);

}

IF (INPUT(SENSOR_1)==0)

{

delay_ms(100);

OUTPUT_LOW(PIN_B0);

OUTPUT_LOW(PIN_B1);

while(1)

{

if (input(BOTAO_2)==0) //Teste do botão.

{

delay_ms(100);

OUTPUT_HIGH(PIN_B0);

OUTPUT_HIGH(PIN_B1);

}

IF (INPUT(SENSOR_2)==0)

{

delay_ms(50);

OUTPUT_LOW(PIN_B0);

OUTPUT_LOW(PIN_B1);

while(1)

{

if (input(BOTAO_3)==0) //Teste do botão.

{

delay_ms(100);

OUTPUT_HIGH(PIN_B0);

OUTPUT_HIGH(PIN_B1);

}

IF (INPUT(SENSOR_3)==0)

{

delay_ms(100);

OUTPUT_LOW(PIN_B0);

OUTPUT_LOW(PIN_B1);

while(1)

{

if (input(BOTAO_4)==0) //Teste do botão.

{

delay_ms(100);

OUTPUT_HIGH(PIN_B0);

OUTPUT_HIGH(PIN_B1);

}

IF (INPUT(SENSOR_4)==0)

{

delay_ms(50);

OUTPUT_LOW(PIN_B0);

OUTPUT_LOW(PIN_B1);

}

}

}

}

}

}

}

}

}

Postado

Em primeiro lugar muito obrigado pelo interesse em me ajudar!

A ideia do funcionamento é a seguinte: Se eu clicar a tecla referente ao 1º nível a bomba e a solenoide_1 é acionada e quando a água atingir o sensor_1 deve para nesse nível, se eu clicar a tecla referente ao 2º nível a bomba e a solenoide_1 é acionada e quando a água atingir o sensor_2 deve para nesse nível, caso eu aperte a tecla referente ao nível_1 e a agua estiver no nível_2 a solenoide_2 é acionada permitindo o esvaziamento do balde até o nivel_1 novamente e assim para todos os outros níveis.

Postado
amigo me corrija se estiver equivocado ok?você quer que se setar o nivel 1 por exemplo ele encha,ou esvazie ate atingir este nivel ?

Meu caro amigo só para voce entender como os sensores estão ligados ao pic como na figura:

http://img713.imageshack.us/img713/2601/sensores.png

Observação: Exemplo se a agua estiver no 2º nível o sensor 1 e 2 estarão fechados beleza! Caso eu tecle o botão correspodente ao 1º nível a solenoide_2 abre o nível comessa a baixar, quando a agua baixar o suficiente para que o sensor_1 fique aberto ali pare!

Como funciona esse seu sensor?

è uma boia com cotato nela? Como você saberá que a água chegou em determinado nível?

Falou

Obrigado também pelo interesse em ajudar! Bom eu estou usando sensor como o da figura:

http://img52.imageshack.us/img52/249/sensorf.jpg

Postado

Agora sim deu p entender.

É tipo uma pequena boiba mesmo né. Quando a água passa por ele, ele sobe e fecha.

Qual o nome desse sensor e onde encontrou dele?

O código p isso é mole mole de fazer.

Mais tarde ou no mia tardar amanhã d etarde posto o código para sua situação.

OBS: Tem como criar um outro tópico com essa mesma pegunta sua?

Só para ficar para outros encontrarem pois você entrou num tópico que não tem nada a ver com seu assunto.

Falou

Postado

Exemplo no caso de estar enchedo, quando o sensor fechar pare naquele nível, caso esteja no 2º ou 3º ou 4º nível e eu quiser que volte para o 1º nível quando o sensor_1 abrir o suficiente para que o pic reconhessa o sensor_1 aberto ali pare.

Postado

Comprei esse sensor na Florencio de Abreu no centro de SP, não me lembro o nome da loja. Aqui esta o link com todas as informações desse sensor:

http://www.tron-ce.com.br/bkp_site_10-0723/produtos/pdf/fichas_nivel/sensores.pdf

jorgeletronico e MatheuLPS, abri um novo tópico com o seguinte nome: Linguagem c para pic16f877A ajuda"Controle de níveis" .

O propósito da criação desse tópico para ficar especifico a esse assunto.

Na mensagem anterior o link referente ao sensor ficou incompleto o certo é este:

http://www.tron-ce.com.br/bkp_site_10-07-23/produtos/pdf/fichas_nivel/sensores.pdf

  • 11 meses depois...
Postado

Caro amigo,

Tentei simular esse programa no proteus! porém estou recebendo as seguintes mensagens:

Stack overflow executing CALL instruction

Stack underflow executing RETLW instruction.

Sabe me dizer o porque desse problema?

Executei a montagem prática em um circuito de desenvolvimento que possuo e também não obtive sucesso.

desde já muito obrigado.

  • 3 meses depois...
Postado

Olá Matheus! Não estou conseguindo compilar o código, eu uso melhor o MikroC pra compilar este seu programa compila com outro compilador ? Pode me dizer como devo configurar e como proceder para compilar seu programa ? Obrigado.

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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