Ir ao conteúdo

Posts recomendados

Postado

Pessoal, me ajudem por favor a entender o que realmente acontece com o codigo abaixo que nao complina no MIKRO C PRO 5.61.

Estou usando um PIC18F452. Quando removo a linha 62 " Xa = counter1 * enc_const * 1000 ; ", o programa compila, mas foge da ideia de variar o valor de Xa en funcao do valor de Counter. A funcao criada e apenas para exibir numeros com decimais no LCD, sem uso de Float.

Obs: Estou usando um LCD I2C,  abaixo do codigo vou colar a biblioteca do I2C LCD. 

Peco ajuda de vocês.

 

Segue codigo:

 

#include "Lcd_I2C_PCF8574A_Lib.h"

//=============================================================================
// --- Protótipo das Funções ---
void display_dec(long decimal);
//=============================================================================
// --- Variáveis Globais ---

char Lcd_I2C_address ;

const float enc_const = 0.002778;

long counter1, Xa, Xp, decimal;

// --- Função Principal ---
void main()
{

     ADCON1  = 0x0F;                           //Apenas entradas digitais
     TRISB   = 0xFF;                            //RB0 e RB1 como entrada
     TRISC   = 0xF8;                           //RC2,RC4 E RC5 como saida
     TRISD   = 0xFC;                           //Todos como entrada
     
     counter1 = 10;
     
     LATC2_bit = 0x00;                              // en_pwm
     LATD0_bit = 0x00;                             //LATC0_bit do motor 1
     LATD1_bit = 0x00;                             //LATC1_bit do motor 1

     LATC0_bit = 0x00;
     LATC1_bit = 0x00;

     Lcd_I2C_address = 0x7E;

     Xp = 288.520 * 1000;                                   // posicao programada em milimetros  sem virgula 9,000 mm
     //Xa = 135.389 * 1000;

     I2C1_Init(100000);                    //Inicializa protocolo I2
     
     Lcd_I2C_Init();

     Lcd_I2C_Out(1,1,"XP:");

     display_dec(Xp);

    
    while(1)
    {
        Lcd_I2C_Out (3,1,"Xa:");
        Xa = counter1 * enc_const * 1000 ;
        display_dec(Xa);

        counter1--;

        delay_ms(200);

    }//End while

} // end main

//=============================================================================
// --- Desenvolvimento das Funções Auxiliares ---


//=============================================================================

void display_dec(long decimal)
{
     unsigned int  cen, dez, uni, dec1, dec2, dec3;
        long x1, x2;

        x1 = labs(decimal);
        x2 = 1000;

        cen = (x1 / x2)/100;
        dez = ((x1 / x2)%100)/10;
        uni = (x1 / x2)%10;

        dec1 = ((x1 % x2)*10)/ x2;
        dec2 =((((x1%x2)*10)%x2)*10)/ x2;
        dec3 =((((((x1%x2)*10)%x2)*10)%x2)*10)/ x2;

        if (decimal > 0 ) Lcd_I2C_Chr_Cp  ('+');
        else Lcd_I2C_Chr_Cp  ('-');

        Lcd_I2C_Chr_Cp (cen+48);
        Lcd_I2C_Chr_Cp  (dez+48);
        Lcd_I2C_Chr_Cp  (uni+48);
        Lcd_I2C_Chr_Cp  ('.');
        Lcd_I2C_Chr_Cp  (dec1+48);
        Lcd_I2C_Chr_Cp  (dec2+48);
        Lcd_I2C_Chr_Cp  (dec3+48);

}//End display_dec

 

 

Biblioteca LCD I2C

 

/*
Biblioteca Lcd I2C com CI - PCF8574A
Autor: Vitor Santos
MikroC 6.4v
OBS.: Habilitar Biblioteca I2C

Modificado por Leandro Rebello para CI PCF8574A

PCF8574A Pins P 7 6 5 4 3 2  1  0
LCD      Pins D 7 6 5 4 - E RW RS


void Lcd_I2C_Init()
void Lcd_I2C_Cmd(char out_char)
void Lcd_I2C_Chr(char row, char column, char out_char)
void Lcd_I2C_Chr_CP(char out_char)
void Lcd_I2C_Out(char row, char col, char *text)
void Lcd_I2C_Out_CP(char *text)
*/
 
extern char Lcd_I2C_address;

//char Lcd_I2C_address = 0x40; //A0 - 0, A1 - 0, A2 - 0 

#define _LCD_FIRST_ROW          0x80     //Move cursor to the 1st row - ok 
#define _LCD_SECOND_ROW         0xC0     //Move cursor to the 2nd row - ok
#define _LCD_THIRD_ROW          0x94     //Move cursor to the 3rd row - ok
#define _LCD_FOURTH_ROW         0xD4     //Move cursor to the 4th row - ok
#define _LCD_CLEAR              0x01     //Clear display - ok
#define _LCD_RETURN_HOME        0x02     //Return cursor to home position, returns a shifted display to
                                         //its original position. Display data RAM is unaffected. - ok
#define _LCD_CURSOR_OFF         0x0C     //Turn off cursor - ok
#define _LCD_UNDERLINE_ON       0x0E     //Underline cursor on - ok
#define _LCD_BLINK_CURSOR_ON    0x0F     //Blink cursor on - ok
#define _LCD_MOVE_CURSOR_LEFT   0x10     //Move cursor left without changing display data RAM - ok
#define _LCD_MOVE_CURSOR_RIGHT  0x14     //Move cursor right without changing display data RAM - ok
#define _LCD_TURN_ON            0x0C     //Turn Lcd display on - ok
#define _LCD_TURN_OFF           0x08     //Turn Lcd display off - ok
#define _LCD_SHIFT_LEFT         0x18     //Shift display left without changing display data RAM 
#define _LCD_SHIFT_RIGHT        0x1E     //Shift display right without changing display data RAM 

//Enviar um comando para Lcd_I2C-PCF8574
void Lcd_I2C_Cmd(char out_char)
{//Inicio do Lcd_I2C_Cmd

    char I2C_byte;    
    
    I2C_byte = out_char & 0xF0;    

    I2C1_Start();
    I2C1_Wr(Lcd_I2C_address);
    
    I2C_byte.F0 = 0;
    I2C_byte.F2 = 1;
    I2C1_Wr(I2C_byte);    
    I2C_byte.F2 = 0;
    I2C1_Wr(I2C_byte);
    
    I2C_byte = (out_char << 4) & 0xF0;
    
    I2C_byte.F0 = 0;
    I2C_byte.F2 = 1;
    I2C1_Wr(I2C_byte);   
    I2C_byte.F2 = 0;
    I2C1_Wr(I2C_byte);
    
    I2C1_Wr(0x08);
    
    I2C1_Stop();


}//Final LCD_I2C_Cmd

void Lcd_I2C_Cursor(char row, char col)
{//Inicio do Lcd_I2C_Out
    switch(row)
    {
        case 1:
        Lcd_I2C_Cmd(0x80 + (col - 1));
        break;
        case 2:
        Lcd_I2C_Cmd(0xC0 + (col - 1));
        break;
        case 3:
        Lcd_I2C_Cmd(0x94 + (col - 1));
        break;
        case 4:
        Lcd_I2C_Cmd(0xD4 + (col - 1));
        break;
    } ;
}//Final do Lcd_I2C_Cursor


//Inicializa o Lcd_I2C-PCF8574
void Lcd_I2C_Init()
{//Inicio do Lcd_I2C_Init    

    char I2C_byte;

    I2C1_Start();
    I2C1_Wr(Lcd_I2C_address);

    I2C_byte = 0x30;    
    
    I2C_byte.F2 = 1;
    I2C1_Wr(I2C_byte);
    I2C_byte.F2 = 0;
    I2C1_Wr(I2C_byte);

    Delay_ms(10);

    I2C_byte.F2 = 1;
    I2C1_Wr(I2C_byte);
    I2C_byte.F2 = 0;
    I2C1_Wr(I2C_byte);

    Delay_us(120);

    I2C_byte.F2 = 1;
    I2C1_Wr(I2C_byte);
    I2C_byte.F2 = 0;
    I2C1_Wr(I2C_byte);

    Delay_ms(10);

    I2C_byte = 0x20;

    I2C_byte.F2 = 1;
    I2C1_Wr(I2C_byte);
    I2C_byte.F2 = 0;
    I2C1_Wr(I2C_byte);

    Delay_ms(10);
    
    I2C_byte.F2 = 1;
    I2C1_Wr(I2C_byte);
    I2C_byte.F2 = 0;
    I2C1_Wr(I2C_byte);

    Delay_ms(10);
    
    I2C_byte = 0x80;

    I2C_byte.F2 = 1;
    I2C1_Wr(I2C_byte);
    I2C_byte.F2 = 0;
    I2C1_Wr(I2C_byte);
    
    Delay_ms(10);
    
    I2C_byte = 0x00;

    I2C_byte.F2 = 1;
    I2C1_Wr(I2C_byte);
    I2C_byte.F2 = 0;
    I2C1_Wr(I2C_byte);

    Delay_ms(10);
    
    I2C_byte = 0xF0;

    I2C_byte.F2 = 1;
    I2C1_Wr(I2C_byte);
    I2C_byte.F2 = 0;
    I2C1_Wr(I2C_byte);
    
    I2C_byte = 0x00;

    I2C_byte.F2 = 1;
    I2C1_Wr(I2C_byte);
    I2C_byte.F2 = 0;
    I2C1_Wr(I2C_byte);
    
    I2C_byte = 0x10;

    I2C_byte.F2 = 1;
    I2C1_Wr(I2C_byte);
    I2C_byte.F2 = 0;
    I2C1_Wr(I2C_byte);
    
    I2C_byte = 0x00;

    I2C_byte.F2 = 1;
    I2C1_Wr(I2C_byte);
    I2C_byte.F2 = 0;
    I2C1_Wr(I2C_byte);
    
    I2C_byte = 0x60;

    I2C_byte.F2 = 1;
    I2C1_Wr(I2C_byte);
    I2C_byte.F2 = 0;
    I2C1_Wr(I2C_byte);

    Delay_ms(10);
    
    I2C1_Wr(0x08);

    I2C1_Stop();
    Delay_ms(10);
}//Final do I2C_Lcd_Init

//Enviar um caracter para Lcd_I2C-PCF8574A
void Lcd_I2C_Chr_CP(char out_char) 
{//Inicio da Lcd_I2C_Chr_CP

    char byte;

    byte = out_char & 0xF0;    

    I2C1_Start();
    I2C1_Wr(Lcd_I2C_address);
    
    byte.F0 = 1;
    byte.F2 = 1;
    I2C1_Wr(byte);
    byte.F2 = 0;
    I2C1_Wr(byte);
    
    byte = (out_char << 4) & 0xF0;
    
    byte.F0 = 1;
    byte.F2 = 1;
    I2C1_Wr(byte);
    byte.F2 = 0;
    I2C1_Wr(byte);
    
    I2C1_Wr(0x08);

    I2C1_Stop();


}//Final da Lcd_I2C_Chr_CP

//Enviar um texto para o Lcd_I2C-PCF8574A
void Lcd_I2C_Out_CP(char *text)
{//Inicio do Lcd_I2C_Out_CP
    while(*text)
    {
     Lcd_I2C_Chr_CP(*text);
     text++;
    }
}//Final do Lcd_I2C_Out_CP

//Enviar um caracter para uma linha e uma coluna Lcd_I2C-PCF8574A
void Lcd_I2C_Chr(char row, char col, char out_char)
{//Inicio do Lcd_I2C_Chr

    char byte;
    
    Lcd_I2C_Cursor(row, col);

    Lcd_I2C_Chr_CP(out_char);
    
}//Final do Lcd_I2C_Chr

//Enviar um texto para uma linha e uma coluna Lcd_I2C-PCF8574A
void Lcd_I2C_Out(char row, char col, char *text)
{//Inicio do Lcd_I2C_Out
    
    Lcd_I2C_Cursor(row, col);
    
    while(*text)
    {

         Lcd_I2C_Chr_CP(*text);
          text++;
    }
    
    
}//Final do Lcd_I2C_Out

  • Membro VIP
Postado

Ajudaria se você dissesse que erro aparece. De cara vejo esta afirmação atípica

19 horas atrás, Leandro Rebello disse:

const float enc_const = 0.002778;

um #define enc_const 0.002778 me parece bem apropriado

 

E geralmente um long

19 horas atrás, Leandro Rebello disse:

long counter1, Xa, Xp, decimal;

 

não gosta de ser fracionado

19 horas atrás, Leandro Rebello disse:

Xa = counter1 * enc_const * 1000 ;

 

Postado

Isadora

- O erro e apenas 102  Finished whit erro, sem indicar em qual linha, nada, so esse codigo e mensagem.

 

- Vou mudar para #Define, concordo que fica mais apropriado.

- Eu uso variáveis Long porque o counter chegara a mais de 350000, para deslocamento total.

 

Talvez seja algum erro no Mikro c, se puder compilar o código eu agradeço, assim, retiramos umas duvidas, outras sugestões são sempre bem vindas para com código melhor apresentado.

Sou novo em programação e sempre aberto a sugestões.

 

Grato pela ajuda

Leandro

  • Membro VIP
Postado

To sem tempo (e saco) pra baixar o mikroc e testar. Talvez alguém mais possa. Mas estranho a mensagem ser tão superficial. Tenta instalar de novo ou atualizar a versão.

Tenta colocar tudo como float mas não sem antes ver de onde vêm as variáveis e que tipo elas são. Ou se achar que deve, fale exatamente de que se trata o projeto...

Postado

Claro Isadora, eu tentando baixar uma nova atualização do Mikro C, pra ver se não e ele o problema.

Esse código e e inicio ainda de uma projeto de uma esteira que tem que parar em uma posição bem precisa na casa dos +- 01.mm. Resolvi como desafio,  controlar essa posição com motor DC e um encoder e dando tudo certo, usar mesma base desse código para uma maquina CNC, mas isso ainda longe pra mim, vamos devagar.

 

Quanto a usar Float estou tentando evitar para poupar memoria e tempo de processamento visto que usar uma float e depois mais uma conversao FloatToStr ocupa muito espaco e quero usar esssa mesma base de codigo em outro projeto como disse acima.

Fique tranquilo que sei como e F.. baixar outro compilador , instalar, as vezes nao estamos acostumados com eles, sei como e , mas e de suma ajuda , voce comentar sobre organização, ideias, como você falou de coisas simples como o uso do #define e codigo mais apresentavel.

 

Durante a semana esta muito corrido, mas dando certo volto aqui pra fechar o post e dar como resolvido.

 

Obrigado pelas dicas

 

  • Membro VIP
Postado
7 horas atrás, Leandro Rebello disse:

usar uma float e depois mais uma conversao FloatToStr ocupa muito espaco

Aí sim hein! Tamo junto. De fato mc de 8 bits e frações não se dão nada bem. E para este seu desafio penso que bastam variáveis de 16 bits. Não conheço detalhes de teu projeto mas não consigo vislumbrar necessidade de posicionar mais de 65535 pontos de posição de motor mesmo pra 01mm. Mas enfim cada mania com seu lôco.

 

Sinta-se a vontade em compartilhar seus sucessivos sucessos!

abç

Postado

você esta certa Isadora. Para esse projeto poderi trabalhar com variaveis de 16, eu ja atropelando as coisas pensando no proximo projeto.

 

Bom consegui uma folga hoje , instalei a versaoo 7.1.0 acho queisso, e o codigo complilou. Me sentindo um ze arruela por ter aberto esse topico e o problema ser do software, me desculpem ai.

 

O topico ja pode ser fechado e nao sei como funciona aqui no forum, mas gostaria de postar o andamento do projeto.

 

Grato

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!