Ir ao conteúdo
  • Cadastre-se

Erro ao compilar no MikroC pro For PIC (18F4550)


Posts recomendados

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

Link para o comentário
Compartilhar em outros sites

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

AAI5aLy.pngPoré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;}
Link para o comentário
Compartilhar em outros sites

@André Sampaio

 

  Ola amigo, o pino de trigger serve apenas para dar um pulso que vai sinalizar o inicio da leitura da distancia, este pino pode ser qualquer um... não necessariamente o RB1, se olhar na rotina 

 
void trigger()

 

  Vai ver que todo que esta função faz é subir o pino, contar 10 micro segundos e baixar o pino, qualquer port IO pode fazer isso.

 

  Como o colega Test Man disse, basta configurar o TRIS normalmente e na hora de escrever no Port use o LAT (o mikroC tem alguns Bugs se usar o registrador Port na serie 18F)...

 

  Se precisar de algum exemplo é só avisar.....

Link para o comentário
Compartilhar em outros sites

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;   }}
Link para o comentário
Compartilhar em outros sites

@André Sampaio

 

  Amigo, de uma olhada no datasheet do PIC que esta usando.

 

  Até onde eu sei, na serie 18F o PORTA é multiplexado para compartilhar os pinos com outros "dispositivos" do PIC (tipo o conversor AD e o comparador de tensão)...  Se não me falha a memoria, para configurar-lo como I/O digital tem que se gravar o valor 0X07  no Registrador CMCON (ou seria o ADCON??  rsrsrs)...  Não me lembro bem, pois faz mais de 1 ano que não mexo com PIC...  Mas tente isso que deve resolver:

CMCON = 0X07;  //Desliga os comparadores de TensãoADCON1 = 0X0F; //Desliga Conversor AD
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber 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...