Ir ao conteúdo

Posts recomendados

Postado

Boa noite a todos;

 

Estou com uma certa dificuldade em configurar a PORD de um pic 18f4580 como entrada alguém poderia me dar alguma orientação, abaixo segue o codigo fonte do projeto.

 

sbit LCD_RS at RB0_bit;
sbit LCD_EN at RB1_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 TRISB0_bit;
sbit LCD_EN_Direction at TRISB1_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;

unsigned short TempDia, TempMes, TempAno;
unsigned TelaControl, TelaCall;
bit BtPress;
char TempTxtDia[8];
char TempTxtMes[3];
char TempTxtAno[3];

void main() {

     ADCON1 = 0x0F;                  // Configure AN pins as digital
     CMCON  = 7;                     // Turn off comparators
     ECCP1CON = 0x00;
     trisa  = 0b11111111;
     porta  = 0x00;
     trisb = 0b00000000;
     portb = 0x00;
     trisd = 0b11111111;              // Configura os pinos como entrada ou saida
     portd = 0xff;
     TRISE = 0b11111111;
     PORTE = 0x00;
     BtPress = 0;
     
     Lcd_Init();                        // Initialize LCD
     Lcd_Cmd(_LCD_CLEAR);               // Clear display
     Lcd_Cmd(_LCD_CURSOR_OFF);          // Cursor off
     TelaControl = 110;

     while(1){
         switch (TelaControl) {

            case 100:

               Lcd_chr(2,2,'T');
               Lcd_chr(2,3,'R');
               Lcd_chr(2,4,'O');
               Lcd_chr(2,5,'C');
               Lcd_chr(2,6,'A');
               Lcd_chr(2,7,'D');
               Lcd_chr(2,8,'O');
               Lcd_chr(2,9,':');

               Lcd_chr(2,12,'0');
               Lcd_chr(2,13,'0');
               Lcd_chr(2,14,'/');
               Lcd_chr(2,15,'0');
               Lcd_chr(2,16,'0');
               Lcd_chr(2,17,'/');
               Lcd_chr(2,18,'0');
               Lcd_chr(2,19,'0');


               Lcd_chr(3,2,'P');
               Lcd_chr(3,3,'R');
               Lcd_chr(3,4,'O');
               Lcd_chr(3,5,'X');
               Lcd_chr(3,7,'T');
               Lcd_chr(3,8,'R');
               Lcd_chr(3,9,'O');
               Lcd_chr(3,10,'C');
               Lcd_chr(3,11,':');

               Lcd_chr(3,12,TempTxtDia[4]);
               Lcd_chr(3,13,TempTxtDia[5]);
               Lcd_chr(3,14,'/');
               Lcd_chr(3,15,TempTxtMes[4]);
               Lcd_chr(3,16,TempTxtMes[5]);
               Lcd_chr(3,17,'/');
               Lcd_chr(3,18,TempTxtAno[4]);
               Lcd_chr(3,19,TempTxtAno[5]);

               
               TelaControl = TelaCall;

            break;

            case 110:  // Tela Vencimento H2S

               Lcd_chr(1,6,'S');
               Lcd_chr(1,7,'E');
               Lcd_chr(1,8,'N');
               Lcd_chr(1,9,'S');
               Lcd_chr(1,10,'O');
               Lcd_chr(1,11,'R');

               Lcd_chr(1,13,'H');
               Lcd_chr(1,14,'2');
               Lcd_chr(1,15,'S');
               
                Lcd_chr(2,9,'/');
                
                TempDia = 20   ;

               IntToStr(TempDia, TempTxtDia);
               IntToStr(TempMes, TempTxtMes);
               IntToStr(TempAno, TempTxtAno);

               if (portd.f4 == 1){
                   TelaControl = 120; 
                   TelaCall = 120;

               }

               if (portd.f5 == 1){
                   TelaControl = 110;
                   TelaCall = 110;
               }

               if (portd.f4 == 0 && portd.f5 == 0 ){
                   BtPress    = 0;
                   TelaCall = 110;
                   TelaControl = 100;
               }

            break;

            case 120:  // Tela Vencimento O2

               Lcd_chr(1,6,'S');
               Lcd_chr(1,7,'E');
               Lcd_chr(1,8,'N');
               Lcd_chr(1,9,'S');
               Lcd_chr(1,10,'O');
               Lcd_chr(1,11,'R');

               Lcd_chr(1,13,'O');
               Lcd_chr(1,14,'2');
               //Lcd_chr(1,15,'');

               IntToStr(TempDia, TempTxtDia);
               IntToStr(TempMes, TempTxtMes);
               IntToStr(TempAno, TempTxtAno);

               if (portd.f4 == 1){
                   TelaControl = 130;
                   TelaCall = 130;

               }

               if (portd.f5 == 1){
                   TelaControl = 110;
                   TelaCall = 110;
               }

               if (portd.f4 == 0 && portd.f5 == 0 ){
                   TelaCall = 120;
                   TelaControl = 100;
               }
            break;


         }
    }
}

  • Membro VIP
Postado

Não entendi sua ...

6 horas atrás, rodolfogravena disse:

certa dificuldade em configurar a PORD de um pic 18f4580 como entrada

você sabe exatamente o que fez abaixo? Baseou numa mínima leitura do datasheet?

6 horas atrás, rodolfogravena disse:

trisd = 0b11111111;              // Configura os pinos como entrada ou saida
     portd = 0xff;
     TRISE = 0b11111111;
     PORTE = 0x00;

Porquê colocou minúsculas e maiúsculas? Seu compilador não faz distinção?

Reflita, repense, resolva, retorne...rêrêrêrê 🤪

  • Curtir 2
Postado

.if bom dia, muito obrigado por analisar a minha duvida, respondendo ao seu questionamento, o compilador não gera erro de compilação em então entendo que ele não faz diferenciação entre maiúscula e minúscula, bem entendido nas configurações dos pinos do 18f e com relação a registradores, já nas logicas sim, ele faz diferenciação dando erro de compilação,  fiz testes com maiúscula e  minúscula já para tira esta duvida, e o comportamento foi o mesmo, sim consultei os datasheet e no meu entendimento estaria ok, pois configurei as entradas analógicas como pinos digitais e desabilitei os comparadores.

A lógica funciona, o display mostra as informações, a única parte em que estou enfrentando problema é que a checagem if ( PORTD.F4 == 1) por exemplo nunca é satisfeita mesmo quando tem 5v no pino RD4, sempre o controlador enxerga a PORTD em nível logico 0. 

 

  • Membro VIP
Postado

Entendi. Observemos então esta sequência:

11 horas atrás, rodolfogravena disse:

 if (portd.f4 == 1){
                   TelaControl = 130;
                   TelaCall = 130;

               }

               if (portd.f5 == 1){
                   TelaControl = 110;
                   TelaCall = 110;
               }

               if (portd.f4 == 0 && portd.f5 == 0 ){  // <--
                   TelaCall = 120;
                   TelaControl = 100;
               }

Tente usar

 if ( (portd.f4 == 0) && (portd.f5 == 0) )

e claro, mantenha RD5 em 1

 

11 horas atrás, rodolfogravena disse:

 Lcd_chr(1,6,'S');
               Lcd_chr(1,7,'E');
               Lcd_chr(1,8,'N');
               Lcd_chr(1,9,'S');
               Lcd_chr(1,10,'O');
               Lcd_chr(1,11,'R');

               Lcd_chr(1,13,'O');
               Lcd_chr(1,14,'2');

 

off 1/2 on...

Verifique se seu compilador tem função algo como

Lcd_print("SENSOR2");

(e alguns etc que não comento agora)

Deixa o código mais enxuto

Postado
11 horas atrás, rodolfogravena disse:

Boa noite a todos;

 

Estou com uma certa dificuldade em configurar a PORD de um pic 18f4580 como entrada alguém poderia me dar alguma orientação, abaixo segue o codigo fonte do projeto.

 

sbit LCD_RS at RB0_bit;
sbit LCD_EN at RB1_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 TRISB0_bit;
sbit LCD_EN_Direction at TRISB1_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;

unsigned short TempDia, TempMes, TempAno;
unsigned TelaControl, TelaCall;
bit BtPress;
char TempTxtDia[8];
char TempTxtMes[3];
char TempTxtAno[3];

void main() {

     ADCON1 = 0x0F;                  // Configure AN pins as digital
     CMCON  = 7;                     // Turn off comparators
     ECCP1CON = 0x00;
     trisa  = 0b11111111;
     porta  = 0x00;
     trisb = 0b00000000;
     portb = 0x00;
     trisd = 0b11111111;              // Configura os pinos como entrada ou saida
     portd = 0xff;
     TRISE = 0b11111111;
     PORTE = 0x00;
     BtPress = 0;
     
     Lcd_Init();                        // Initialize LCD
     Lcd_Cmd(_LCD_CLEAR);               // Clear display
     Lcd_Cmd(_LCD_CURSOR_OFF);          // Cursor off
     TelaControl = 110;

     while(1){
         switch (TelaControl) {

            case 100:

               Lcd_chr(2,2,'T');
               Lcd_chr(2,3,'R');
               Lcd_chr(2,4,'O');
               Lcd_chr(2,5,'C');
               Lcd_chr(2,6,'A');
               Lcd_chr(2,7,'D');
               Lcd_chr(2,8,'O');
               Lcd_chr(2,9,':');

               Lcd_chr(2,12,'0');
               Lcd_chr(2,13,'0');
               Lcd_chr(2,14,'/');
               Lcd_chr(2,15,'0');
               Lcd_chr(2,16,'0');
               Lcd_chr(2,17,'/');
               Lcd_chr(2,18,'0');
               Lcd_chr(2,19,'0');


               Lcd_chr(3,2,'P');
               Lcd_chr(3,3,'R');
               Lcd_chr(3,4,'O');
               Lcd_chr(3,5,'X');
               Lcd_chr(3,7,'T');
               Lcd_chr(3,8,'R');
               Lcd_chr(3,9,'O');
               Lcd_chr(3,10,'C');
               Lcd_chr(3,11,':');

               Lcd_chr(3,12,TempTxtDia[4]);
               Lcd_chr(3,13,TempTxtDia[5]);
               Lcd_chr(3,14,'/');
               Lcd_chr(3,15,TempTxtMes[4]);
               Lcd_chr(3,16,TempTxtMes[5]);
               Lcd_chr(3,17,'/');
               Lcd_chr(3,18,TempTxtAno[4]);
               Lcd_chr(3,19,TempTxtAno[5]);

               
               TelaControl = TelaCall;

            break;

            case 110:  // Tela Vencimento H2S

               Lcd_chr(1,6,'S');
               Lcd_chr(1,7,'E');
               Lcd_chr(1,8,'N');
               Lcd_chr(1,9,'S');
               Lcd_chr(1,10,'O');
               Lcd_chr(1,11,'R');

               Lcd_chr(1,13,'H');
               Lcd_chr(1,14,'2');
               Lcd_chr(1,15,'S');
               
                Lcd_chr(2,9,'/');
                
                TempDia = 20   ;

               IntToStr(TempDia, TempTxtDia);
               IntToStr(TempMes, TempTxtMes);
               IntToStr(TempAno, TempTxtAno);

               if (portd.f4 == 1){
                   TelaControl = 120; 
                   TelaCall = 120;

               }

               if (portd.f5 == 1){
                   TelaControl = 110;
                   TelaCall = 110;
               }

               if (portd.f4 == 0 && portd.f5 == 0 ){
                   BtPress    = 0;
                   TelaCall = 110;
                   TelaControl = 100;
               }

            break;

            case 120:  // Tela Vencimento O2

               Lcd_chr(1,6,'S');
               Lcd_chr(1,7,'E');
               Lcd_chr(1,8,'N');
               Lcd_chr(1,9,'S');
               Lcd_chr(1,10,'O');
               Lcd_chr(1,11,'R');

               Lcd_chr(1,13,'O');
               Lcd_chr(1,14,'2');
               //Lcd_chr(1,15,'');

               IntToStr(TempDia, TempTxtDia);
               IntToStr(TempMes, TempTxtMes);
               IntToStr(TempAno, TempTxtAno);

               if (portd.f4 == 1){
                   TelaControl = 130;
                   TelaCall = 130;

               }

               if (portd.f5 == 1){
                   TelaControl = 110;
                   TelaCall = 110;
               }

               if (portd.f4 == 0 && portd.f5 == 0 ){
                   TelaCall = 120;
                   TelaControl = 100;
               }
            break;


         }
    }
}

 

Também não funcionou, estou achando que seja algo relacionado as configurações dos registradores iniciais, uma vez que os pinos da PORTD tem 3 funções cada 

11 horas atrás, rodolfogravena disse:

void main() {

     ADCON1 = 0x0F;                  // Configure AN pins as digital
     CMCON  = 7;                     // Turn off comparators
     ECCP1CON = 0x00;

 

  • Membro VIP
Postado

Apanhamos de 1 bit? Tá braba a coisa hein..

Faça algo como

if ( PORTD | 0b00001000) PORTB|=1; else PORTB&=0; //led em RB0

o mesmo que

RB0=RD4;

Na simulação funciona? Se sim verifique sua montagem do circuito

 

1 hora atrás, rodolfogravena disse:

os pinos da PORTD tem 3 funções cada

RD4 tem 4

Dica: pra não ficar confuso adote maiúsculo nos nomes dos registros do mc

  • Curtir 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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!