Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Fiz a programação que segue abaixo usando o MPLAB X IDE, para uma central de chamada a ser utilizada em enfermaria de um hospital. Ou seja quando um paciente chama declarei como C (chamada), e esta chamada é registrada no led com o número do quarto do paciente (p. ex. C101), ao ser atendido no quarto, quem está atendendo aciona um botão que é identificado no led como P (presença) e se ao chegar for necessário, o atendente pode acionar outro botão que é definido por E (emergência). Depois de ter terminado a programação, numa sumulação, se 10 quartos diferentes chamarem ao mesmo, o programa está pulando um quarto. Revisei toda a programação e também o hardware, e não encontro o problema. Será que pode me dar uma dica porque está acontecendo este erro de pular o quarto que está chamando? Segue abaixo os códigos.
O programa tem 2574 linhas.
#include <p18f4620.h> //Aqui é informado o processador que será utilizado pelo projeto
#include <string.h>
#include "lcd.h"
#include <delays.h>
#pragma config OSC = INTIO67 //clock interno
#pragma config WDT = OFF //desliga watchdog
#pragma config LVP = OFF //desliga programação em baixa tensão
void lcd_texto(char *texto);
void main (void)
{
//OSCCON=0b01100011;
char dado [20];
int x;
char y;
lcd_inic();
TRISAbits.RA4=1;
TRISAbits.RA3=1;
TRISEbits.RE3=0;
PORTEbits.RE0=0;
y=17;
volta:
x=1;
lcd_locate(1,1);
strcpypgm2ram(dado,"Hospital São Lucas");
lcd_texto(dado);
/*************************************************************************
QUARTOS 1~10
**************************************************************************/
if (PORTA==0B00000001)
{
/* y=y+1;
if (y==11)
{ Fazer a andar no display
y=1;
}*/
lcd_locate(2,1);
strcpypgm2ram(dado," ");
lcd_texto(dado);
lcd_locate(2,1);
strcpypgm2ram(dado,"C101");
lcd_texto(dado);
PORTEbits.RE0=1;
Delay10KTCYx(25);
PORTEbits.RE0=0;
Delay10KTCYx(25);
}
if(PORTA==0B00000010)
{
lcd_locate(2,1);
strcpypgm2ram(dado," ");
lcd_texto(dado);
/* y=y+1;
if (y==11)
{ Fazer a andar no display
y=1;
}*/
lcd_locate(2,1);
strcpypgm2ram(dado,"C102");
lcd_texto(dado);
PORTEbits.RE0=1;
Delay10KTCYx(25);
PORTEbits.RE0=0;
Delay10KTCYx(25);
}
if(PORTA==0B00000011)
{
lcd_locate(2,1);
strcpypgm2ram(dado," ");
lcd_texto(dado);
/* y=y+1;
if (y==11)
{ Fazer a andar no display
y=1;
}*/
lcd_locate(2,1);
strcpypgm2ram(dado,"C103");
lcd_texto(dado);
PORTEbits.RE0=1;
Delay10KTCYx(25);
PORTEbits.RE0=0;
Delay10KTCYx(25);
}
if(PORTA==0B00000100)
{
lcd_locate(2,1);
strcpypgm2ram(dado," ");
lcd_texto(dado);
/* y=y+1;
if (y==11)
{ Fazer a andar no display
y=1;
}*/
lcd_locate(2,1);
strcpypgm2ram(dado,"C104");
lcd_texto(dado);
PORTEbits.RE0=1;
Delay10KTCYx(25);
PORTEbits.RE0=0;
Delay10KTCYx(25);
}
if(PORTA==0B00000101)
{
lcd_locate(2,1);
strcpypgm2ram(dado," ");
lcd_texto(dado);
/* y=y+1;
if (y==11)
{ Fazer a andar no display
y=1;
}*/
lcd_locate(2,1);
strcpypgm2ram(dado,"C105");
lcd_texto(dado);
PORTEbits.RE0=1;
Delay10KTCYx(25);
PORTEbits.RE0=0;
Delay10KTCYx(25);
}
if(PORTA==0B00000110)
{
lcd_locate(2,1);
strcpypgm2ram(dado," ");
lcd_texto(dado);
/* y=y+1;
if (y==11)
{ Fazer a andar no display
y=1;
}*/
lcd_locate(2,1);
strcpypgm2ram(dado,"C106");
lcd_texto(dado);
PORTEbits.RE0=1;
Delay10KTCYx(25);
PORTEbits.RE0=0;
Delay10KTCYx(25);
}
if(PORTA==0B00000111)
{
lcd_locate(2,1);
strcpypgm2ram(dado," ");
lcd_texto(dado);
/* y=y+1;
if (y==11)
{ Fazer a andar no display
y=1;
}*/
lcd_locate(2,1);
strcpypgm2ram(dado,"C107");
lcd_texto(dado);
PORTEbits.RE0=1;
Delay10KTCYx(25);
PORTEbits.RE0=0;
Delay10KTCYx(25);
}
if(PORTA==0B00001000)
{
lcd_locate(2,1);
strcpypgm2ram(dado," ");
lcd_texto(dado);
/* y=y+1;
if (y==11)
{ Fazer a andar no display
y=1;
}*/
lcd_locate(2,1);
strcpypgm2ram(dado,"C108");
lcd_texto(dado);
PORTEbits.RE0=1;
Delay10KTCYx(25);
PORTEbits.RE0=0;
Delay10KTCYx(25);
}
if(PORTA==0B00001001)
{
lcd_locate(2,1);
strcpypgm2ram(dado," ");
lcd_texto(dado);
/* y=y+1;
if (y==11)
{ Fazer a andar no display
y=1;
}*/
lcd_locate(2,1);
strcpypgm2ram(dado,"C109");
lcd_texto(dado);
PORTEbits.RE0=1;
Delay10KTCYx(25);
PORTEbits.RE0=0;
Delay10KTCYx(25);
}
if(PORTA==0B00001010)
{
lcd_locate(2,1);
strcpypgm2ram(dado," ");
lcd_texto(dado);
/* y=y+1;
if (y==11)
{ Fazer a andar no display
y=1;
}*/
lcd_locate(2,1);
strcpypgm2ram(dado,"C110");
lcd_texto(dado);
PORTEbits.RE0=1;
Delay10KTCYx(25);
PORTEbits.RE0=0;
Delay10KTCYx(25);
}
if(PORTA==0B00001011)
{
/*lcd_locate(2,6);
strcpypgm2ram(dado," ");
lcd_texto(dado);
/* y=y+1;
if (y==11)
{ Fazer a andar no display
y=1;
}*/
PORTEbits.RE0=0;
lcd_locate(2,6);
strcpypgm2ram(dado,"P101");
lcd_texto(dado);
Delay10KTCYx(50);
}
if(PORTA==0B00001100)
{
/* lcd_locate(2,6);
strcpypgm2ram(dado," ");
lcd_texto(dado);
/* y=y+1;
if (y==11)
{ Fazer a andar no display
y=1;
}*/
PORTEbits.RE0=0;
lcd_locate(2,6);
strcpypgm2ram(dado,"P102");
lcd_texto(dado);
Delay10KTCYx(50);
}
if(PORTA==0B00001101)
{
lcd_locate(2,6);
strcpypgm2ram(dado," ");
lcd_texto(dado);
/* y=y+1;
if (y==11)
{ Fazer a andar no display
y=1;
}*/
PORTEbits.RE0=0;
lcd_locate(2,6);
strcpypgm2ram(dado,"P103");
lcd_texto(dado);
Delay10KTCYx(50);
}
if(PORTA==0B00001110)
{
lcd_locate(2,6);
strcpypgm2ram(dado," ");
lcd_texto(dado);
/* y=y+1;
if (y==11)
{ Fazer a andar no display
y=1;
}*/
PORTEbits.RE0=0;
lcd_locate(2,6);
strcpypgm2ram(dado,"P104");
lcd_texto(dado);
Delay10KTCYx(50);
}
if(PORTA==0B00001111)
{
lcd_locate(2,6);
strcpypgm2ram(dado," ");
lcd_texto(dado);
/* y=y+1;
if (y==11)
{ Fazer a andar no display
y=1;
}*/
PORTEbits.RE0=0;
lcd_locate(2,6);
strcpypgm2ram(dado,"P105");
lcd_texto(dado);
Delay10KTCYx(50);
}
if(PORTA==0B00010000)
{
lcd_locate(2,6);
strcpypgm2ram(dado," ");
lcd_texto(dado);
/* y=y+1;
if (y==11)
{ Fazer a andar no display
y=1;
}*/
PORTEbits.RE0=0;
lcd_locate(2,6);
strcpypgm2ram(dado,"P106");
lcd_texto(dado);
Delay10KTCYx(50);
}
if(PORTA==0B00010001)
{
lcd_locate(2,6);
strcpypgm2ram(dado," ");
lcd_texto(dado);
/* y=y+1;
if (y==11)
{ Fazer a andar no display
y=1;
}*/
PORTEbits.RE0=0;
lcd_locate(2,6);
strcpypgm2ram(dado,"P107");
lcd_texto(dado);
Delay10KTCYx(50);
}
if(PORTA==0B00010010)
{
lcd_locate(2,6);
strcpypgm2ram(dado," ");
lcd_texto(dado);
/* y=y+1;
if (y==11)
{ Fazer a andar no display
y=1;
}*/
PORTEbits.RE0=0;
lcd_locate(2,6);
strcpypgm2ram(dado,"P108");
lcd_texto(dado);
Delay10KTCYx(50);
}
if(PORTA==0B00010011)
{
lcd_locate(2,6);
strcpypgm2ram(dado," ");
lcd_texto(dado);
/* y=y+1;
if (y==11)
{ Fazer a andar no display
y=1;
}*/
PORTEbits.RE0=0;
lcd_locate(2,6);
strcpypgm2ram(dado,"P109");
lcd_texto(dado);
Delay10KTCYx(50);
}
if(PORTA==0B00010100)
{
PORTEbits.RE0=0;
lcd_locate(2,6);
strcpypgm2ram(dado," ");
lcd_texto(dado);
/* y=y+1;
if (y==11)
{ Fazer a andar no display
y=1;
}*/
lcd_locate(2,6);
strcpypgm2ram(dado,"P110");
lcd_texto(dado);
Delay10KTCYx(50);
}
if(PORTA==0B00010101)
{
lcd_locate(2,11);
strcpypgm2ram(dado," ");
lcd_texto(dado);
/* y=y+1;
if (y==11)
{ Fazer a andar no display
y=1;
}*/
lcd_locate(2,11);
strcpypgm2ram(dado,"E101");
lcd_texto(dado);
PORTEbits.RE0=1;
Delay10KTCYx(12);
PORTEbits.RE0=0;
Delay10KTCYx(12);
PORTEbits.RE0=1;
Delay10KTCYx(12);
PORTEbits.RE0=0;
Delay10KTCYx(12);
}
if(PORTA==0B00010110)
{
lcd_locate(2,11);
strcpypgm2ram(dado," ");
lcd_texto(dado);
/* y=y+1;
if (y==11)
{ Fazer a andar no display
y=1;
}*/
lcd_locate(2,11);
strcpypgm2ram(dado,"E102");
lcd_texto(dado);
Delay10KTCYx(12);
PORTEbits.RE0=0;
Delay10KTCYx(12);
PORTEbits.RE0=1;
Delay10KTCYx(12);
PORTEbits.RE0=0;
Delay10KTCYx(12);
}
if(PORTA==0B00010111)
{
lcd_locate(2,11);
strcpypgm2ram(dado," ");
lcd_texto(dado);
/* y=y+1;
if (y==11)
{ Fazer a andar no display
y=1;
}*/
lcd_locate(2,11);
strcpypgm2ram(dado,"E103");
lcd_texto(dado);
Delay10KTCYx(12);
PORTEbits.RE0=0;
Delay10KTCYx(12);
PORTEbits.RE0=1;
Delay10KTCYx(12);
PORTEbits.RE0=0;
Delay10KTCYx(12);
}
if(PORTA==0B00011000)
{
lcd_locate(2,11);
strcpypgm2ram(dado," ");
lcd_texto(dado);
/* y=y+1;
if (y==11)
{ Fazer a andar no display
y=1;
}*/
lcd_locate(2,11);
strcpypgm2ram(dado,"E104");
lcd_texto(dado);
Delay10KTCYx(12);
PORTEbits.RE0=0;
Delay10KTCYx(12);
PORTEbits.RE0=1;
Delay10KTCYx(12);
PORTEbits.RE0=0;
Delay10KTCYx(12);
}
if(PORTA==0B00011001)
{
lcd_locate(2,11);
strcpypgm2ram(dado," ");
lcd_texto(dado);
/* y=y+1;
if (y==11)
{ Fazer a andar no display
y=1;
}*/
lcd_locate(2,11);
strcpypgm2ram(dado,"E105");
lcd_texto(dado);
Delay10KTCYx(12);
PORTEbits.RE0=0;
Delay10KTCYx(12);
PORTEbits.RE0=1;
Delay10KTCYx(12);
PORTEbits.RE0=0;
Delay10KTCYx(12);
}
if(PORTA==0B00011010)
{
lcd_locate(2,11);
strcpypgm2ram(dado," ");
lcd_texto(dado);
/* y=y+1;
if (y==11)
{ Fazer a andar no display
y=1;
}*/
lcd_locate(2,11);
strcpypgm2ram(dado,"E106");
lcd_texto(dado);
Delay10KTCYx(12);
PORTEbits.RE0=0;
Delay10KTCYx(12);
PORTEbits.RE0=1;
Delay10KTCYx(12);
PORTEbits.RE0=0;
Delay10KTCYx(12);
}
if(PORTA==0B00011011)
{
/* lcd_locate(2,11);
strcpypgm2ram(dado," ");
lcd_texto(dado);
/* y=y+1;
if (y==11)
{ Fazer a andar no display
y=1;
}*/
lcd_locate(2,11);
strcpypgm2ram(dado,"E107");
lcd_texto(dado);
Delay10KTCYx(12);
PORTEbits.RE0=0;
Delay10KTCYx(12);
PORTEbits.RE0=1;
Delay10KTCYx(12);
PORTEbits.RE0=0;
Delay10KTCYx(12);
}
if(PORTA==0B00011100)
{
/*lcd_locate(2,11);
strcpypgm2ram(dado," ");
lcd_texto(dado);
/* y=y+1;
if (y==11)
{ Fazer a andar no display
y=1;
}*/
lcd_locate(2,11);
strcpypgm2ram(dado,"E108");
lcd_texto(dado);
Delay10KTCYx(12);
PORTEbits.RE0=0;
Delay10KTCYx(12);
PORTEbits.RE0=1;
Delay10KTCYx(12);
PORTEbits.RE0=0;
Delay10KTCYx(12);
}
if(PORTA==0B00011101)
{
lcd_locate(2,11);
strcpypgm2ram(dado," ");
lcd_texto(dado);
/* y=y+1;
if (y==11)
{ Fazer a andar no display
y=1;
}*/
lcd_locate(2,11);
strcpypgm2ram(dado,"E109");
lcd_texto(dado);
Delay10KTCYx(12);
PORTEbits.RE0=0;
Delay10KTCYx(12);
PORTEbits.RE0=1;
Delay10KTCYx(12);
PORTEbits.RE0=0;
Delay10KTCYx(12);
}
if(PORTA==0B00011110)
{
lcd_locate(2,11);
strcpypgm2ram(dado," ");
lcd_texto(dado);
/* y=y+1;
if (y==11)
{ Fazer a andar no display
y=1;
}*/
lcd_locate(2,11);
strcpypgm2ram(dado,"E110");
lcd_texto(dado);
Delay10KTCYx(12);
PORTEbits.RE0=0;
Delay10KTCYx(12);
PORTEbits.RE0=1;
Delay10KTCYx(12);
PORTEbits.RE0=0;
Delay10KTCYx(12);
}Gabriel, eu peguei esta programação como finalizada. Não conheço o programa MPLAB X IDE, e conheço pouco de eletrônica. Quando fui testar a central de chamadas anotei os erros que continha. Examinei a programação consegui resolver um problema na chamada dita em linha, ou seja, numa sequencia de 10 chamadas simultâneas. Mas ao executar chamadas simultâneas do quarto 101, 102, 103, 109, 112, 115 e 116, uma chamada é pulada.
Veja abaixo como esta descrito na programação.
#include <p18f4620.h> //Aqui é informado o processador que será utilizado pelo projeto
#include <delays.h>
#include <delays.h>
#pragma config WDT = OFF //desliga watchdog
#pragma config LVP = OFF //desliga programação em baixa tensão
#pragma config OSC = INTIO67 //Oscillator(LP,XT,HS,RC,EC,ECIO,HSPLL,RCIO,INTIO67,INTIO7
#define ch PORTAbits.RA0
#define pr PORTAbits.RA1
#define em PORTAbits.RA2
#define sg1 PORTCbits.RC0
#define sg2 PORTCbits.RC1
#define s_ch PORTBbits.RB0
#define s_pr PORTBbits.RB1
#define s_em PORTBbits.RB2
#define led_ch PORTBbits.RB3
#define led_pr PORTBbits.RB4
#define led_em PORTBbits.RB5
#define led_sg PORTBbits.RB6
void main (void)
{
ADCON1=0b00001111;
TRISA=1; //Trasnforma Port A em entrada
PORTA=0; //Zera todas as entradas em A
TRISB=0; //Trasnforma Port B em saida
PORTB=0; //Zera todas as saidas em B
TRISCbits.RC0=0; //Trasnforma Port sg1 em saida
//PORTC=0; //Zera todas as saidas em C
TRISCbits.RC1=1; //Trasforma RC1 em Entrada
loop:
if (ch==1 && s_pr==0) //Se Chamada apertada e Presença desligada
{
s_ch=1; //Envia sinal de chamada pra central
led_ch=1; //Acende os leds de chamada
sg1=1; //liga siga-me 1
Delay10KTCYx(5);
}
if (pr==1 && s_pr==0) //Se precença apertada 1° vez
{
sg1=0;
Delay10KTCYx(5);
s_ch=0; //Desliga sinal de chamada para central
led_ch=0; //Desliga leds de chamada
s_pr=1; //Liga sinal de Presença para central
led_pr=1; //Liga led de precença
Delay10KTCYx(5);
}
if (sg2==1 && s_pr==1) //Se siga-me liga enquanto presença ligada
{
led_sg=1; //Acende led Siga-me
}
else //se não siga-me desliga apaga led siga-me
{
led_sg=0;
}
if (pr==1 && s_pr==1) //Se precença apertada estando ativada
{
s_pr=0; //Desliga sinal de Presença para central
led_pr=0; //Desliga led de precença
led_em=0; //Desliga led de emergência
s_em=0; //Desliga sinal de emergência
Delay10KTCYx(5);
}
if (s_em==0 && em==1 && s_pr==1) //Se emergência estiver desligada e for apertada
{
s_em=1; //Liga sinal de emergência
led_em=1; //Liga led de emergência
Delay10KTCYx(5);
}
if (s_em==1 && em==1) //se emergência estiver ligada e for apertada novamente
{
s_em=0; //desliga sinal de emergência
led_em=0; //desliga led de emergência
Delay10KTCYx(5);
}
goto loop;
}
>
Rosilene,
O seu código é um pouco longo demais, pela descrição do teu problema, verifique se você não tem alguma variável de controle de quantidade de quartos que esteja limitada em 10 ou algo parecido.
Analisar seu código, sem connhecer o algorítmo, fica complicado de entender a sua solução para o problema.
Gabriel, eu peguei esta programação como finalizada. Não conheço o programa MPLAB X IDE, e conheço pouco de eletrônica. Quando fui testar a central de chamadas anotei os erros que continha. Examinei a programação consegui resolver um problema na chamada dita em linha, ou seja, numa sequencia de 10 chamadas simultâneas. Mas ao executar chamadas simultâneas do quarto 101, 102, 103, 109, 112, 115 e 116, uma chamada é pulada.
Veja abaixo como esta descrito na programação.
#include <p18f4620.h> //Aqui é informado o processador que será utilizado pelo projeto
#include <delays.h>
#include <delays.h>
#pragma config WDT = OFF //desliga watchdog
#pragma config LVP = OFF //desliga programação em baixa tensão
#pragma config OSC = INTIO67 //Oscillator(LP,XT,HS,RC,EC,ECIO,HSPLL,RCIO,INTIO67,INTIO7
#define ch PORTAbits.RA0
#define pr PORTAbits.RA1
#define em PORTAbits.RA2
#define sg1 PORTCbits.RC0
#define sg2 PORTCbits.RC1
#define s_ch PORTBbits.RB0
#define s_pr PORTBbits.RB1
#define s_em PORTBbits.RB2
#define led_ch PORTBbits.RB3
#define led_pr PORTBbits.RB4
#define led_em PORTBbits.RB5
#define led_sg PORTBbits.RB6
void main (void)
{
ADCON1=0b00001111;
TRISA=1; //Trasnforma Port A em entrada
PORTA=0; //Zera todas as entradas em A
TRISB=0; //Trasnforma Port B em saida
PORTB=0; //Zera todas as saidas em B
TRISCbits.RC0=0; //Trasnforma Port sg1 em saida
//PORTC=0; //Zera todas as saidas em C
TRISCbits.RC1=1; //Trasforma RC1 em Entrada
loop:
if (ch==1 && s_pr==0) //Se Chamada apertada e Presença desligada
{
s_ch=1; //Envia sinal de chamada pra central
led_ch=1; //Acende os leds de chamada
sg1=1; //liga siga-me 1
Delay10KTCYx(5);
}
if (pr==1 && s_pr==0) //Se precença apertada 1° vez
{
sg1=0;
Delay10KTCYx(5);
s_ch=0; //Desliga sinal de chamada para central
led_ch=0; //Desliga leds de chamada
s_pr=1; //Liga sinal de Presença para central
led_pr=1; //Liga led de precença
Delay10KTCYx(5);
}
if (sg2==1 && s_pr==1) //Se siga-me liga enquanto presença ligada
{
led_sg=1; //Acende led Siga-me
}
else //se não siga-me desliga apaga led siga-me
{
led_sg=0;
}
if (pr==1 && s_pr==1) //Se precença apertada estando ativada
{
s_pr=0; //Desliga sinal de Presença para central
led_pr=0; //Desliga led de precença
led_em=0; //Desliga led de emergência
s_em=0; //Desliga sinal de emergência
Delay10KTCYx(5);
}
if (s_em==0 && em==1 && s_pr==1) //Se emergência estiver desligada e for apertada
{
s_em=1; //Liga sinal de emergência
led_em=1; //Liga led de emergência
Delay10KTCYx(5);
}
if (s_em==1 && em==1) //se emergência estiver ligada e for apertada novamente
{
s_em=0; //desliga sinal de emergência
led_em=0; //desliga led de emergência
Delay10KTCYx(5);
}
goto loop;
}Existe uma tag CODE p/ postar código no fórum. Use.
Rosilene,
O seu código é um pouco longo demais, pela descrição do teu problema, verifique se você não tem alguma variável de controle de quantidade de quartos que esteja limitada em 10 ou algo parecido.
Analisar seu código, sem connhecer o algorítmo, fica complicado de entender a sua solução para o problema.