Código correto CCS Compiler

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Código correto CCS Compiler

Mensagempor picman62 » 21 Dez 2014 09:18

Olá pessoal. Sou novato em programação e estou utilizando o CCS compiler para fazer meu código. Estou utilizando o PIC 16F877A e o port B para acionar dois botões. Quando aperto em sequência o pushbutton(B4), o LCD vai mudando o texto até que no ultimo pressionamento, ele retorna para o primeiro texto. Para isso utilizei um 'switch-case'. Necessito que quando apertar um outro botão(B5), aa numerações que constam abaixo dos respectivos textos sejam incrementadas em 10 unidades. Já tentei com 'if' entre os cases mas não está funcionando. Alguém poderia me dizer qual código devo escrever para que quando estiver em cada texto determinado, quando apertar o botão B5 em sequência, este vá incrementando em 10 unidades o contador abaixo do respectivo texto?
Abaixo consta o codigo que programei para rolar os textos sem a inclusão do B5 para fazer os incrementos em cada contador. Muito obrigado pela ajuda.

cpp code
#include <button.c>
#include <LCD.C>
#define LCD_ENABLE_PIN PIN_D0
#define LCD_RS_PIN PIN_D1
#define LCD_RW_PIN PIN_D2
#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7

#include <lcd.c>
#int_rb
int Cont;
INT1 SW1;
BOOLEAN ISPRESSED=FALSE; // Boolean logic=0;
// Declare variable




void main()
{
port_B_pullups(0xFF);
setup_adc_ports(AN0);
lcd_init();


lcd_init();



int8 cont;
cont = 0;


WHILE(true)
{

SW1=INPUT(PIN_B4); // Positive input
SET_ADC_CHANNEL(0); // INPUT AN0
DELAY_US(50);

IF (SW1 && !ISPRESSED)
{

DELAY_MS(10);
SW1=INPUT(PIN_B4);

{
ISPRESSED=TRUE;
{


{
switch(cont)

{

case 1:

lcd_putc("\f TEXTO1");
lcd_gotoxy(7,2);
lcd_putc("1000");

if (SW2)

break;

case 2:
lcd_putc("\f TEXTO2");
lcd_gotoxy(7,2);
lcd_putc("2500");
break;

case 3:
printf(lcd_putc,"\f");
lcd_gotoxy(2,1);
lcd_putc("TEXTO3");
lcd_gotoxy(7,2);
lcd_putc("15000");//mensagem e posicionamento no LCD
break;

}
cont++;
if(cont >= 4)
cont = 1;
}

delay_ms(50); // Required for button() function

}
}
}
}

IF(!SW1) // This line must be here
{
ISPRESSED=FALSE; // This line must be here

}
}
}

}

}
picman62
Nibble
 
Mensagens: 53
Registrado em: 21 Dez 2014 08:40

Re: Código correto CCS Compiler

Mensagempor andre_luis » 21 Dez 2014 13:00

Olá...em princípio o código é pequeno e seria tranquilo identificar a causa do problema, mas tentei analizar o código, mas te confesso que o excesso de chaves redundantes {{{{ e a identação em alguns pontos está confundindo bastante. Tenta dar uma limepza e posta aqui depois, ok ?
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Código correto CCS Compiler

Mensagempor picman62 » 21 Dez 2014 18:57

Andre, obrigado pela ajuda.
Como disse, sou novato em programação e por isso estou encontrando essas dificuldades. Abaixo está o código com as chaves que pude 'enxugar'. Mais do que isso o CCS Compiler reclama. Não sei se alterando a ordem das instruções faria diferença. Não tenho esse conhecimento. Mas do jeito que está abaixo está funcionando perfeitamente no simulador do PROTEUS. Como afirmei, o pushbutton no input B4 após ser pressionado e retornado(up state) ativa a rolagem dos textos de acordo com o numero de vezes que o botão é pressionado e a operação é repetida até retornar ao case 1, começando novamente, etc. O que eu quero fazer é ativar um contador de forma que de acordo com o texto que apareça no display do LCD, a sua segunda linha (onde estão os valores) seja incrementado em 10 unidades quando pressionar o pino B5 e o incremento aconteça no up state, e não no down state do botão, ou seja, no retorno deste ao ser pressionado. Na realidade vou fazer também um decremento no pino B6, mas se voce conseguir fazer o código para o incremento, eu me viro e faço o do decremento.
Muito obrigado pela ajuda amigo.
Código: Selecionar todos
#include <button.c>
#include <LCD.C>
#define LCD_ENABLE_PIN PIN_D0
#define LCD_RS_PIN PIN_D1
#define LCD_RW_PIN PIN_D2
#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7

#include <lcd.c>
#int_rb
int Cont;
INT1 SW1;

   BOOLEAN ISPRESSED=FALSE;       // Boolean logic=0;
                   


void main()
{
   port_B_pullups(0xFF);
   setup_adc_ports(AN0);
   lcd_init();
   
   
   lcd_init();

 
   int8 cont;
   cont = 0;
   
   
   WHILE(true)
   {
   
 
   SW1=INPUT(PIN_B4);            // Positive inputs
 
   SET_ADC_CHANNEL(0);     // INPUT AN0
         DELAY_US(50);
         
         IF (SW1 && !ISPRESSED)
         {

         DELAY_MS(10);
         SW1=INPUT(PIN_B4);
         
         {
         ISPRESSED=TRUE;
         
     {
   switch(cont)
   
        {
   
   
   case 1:
   lcd_putc("\fTEXTO1");
   lcd_gotoxy(7,2);
   lcd_putc("1000");
   break;
   
   case 2:
   lcd_putc("\fTEXTO2");
   lcd_gotoxy(7,2);
   lcd_putc("2500");
   break;
         
   case 3:
   printf(lcd_putc,"\f");
   lcd_gotoxy(2,1);
   lcd_putc("TEXTO3");
   lcd_gotoxy(7,2);
   lcd_putc("15000");//mensagem e posicionamento no LCD
   break;
         
   
 }
   cont++;
   if(cont >= 4)
   cont = 1;
     }

   delay_ms(50);  // Required for button() function
   
         
 
  }
  }
   IF(!SW1)                 // This line must be here
         {
         ISPRESSED=FALSE;         // This line must be here
         
               
         }
       
         }
 
 

     
         
   
}
picman62
Nibble
 
Mensagens: 53
Registrado em: 21 Dez 2014 08:40

Re: Código correto CCS Compiler

Mensagempor andre_luis » 21 Dez 2014 20:31

Já desinstalei esse compilador faz tempo, e agora não dá pra conferir o que estou fazendo, de modo que voce vai ter de testar aí, mas segue as dicas abaixo do que eu faria :

cpp code
// Cria uma variavel e inicializa com o valor que voce quizer como default, 
// como por exemplo, 1000 ( o valor na opcao: CASE 1 )
int valor = 1000;

// Cria o botão
int SW2

// Dentro do CASE 1, e respectivamente nos demais, substitua a funcao
// lcd_putc("1000"); por printf(lcd_putc, valor); conforme abaixo, mas
// nao tenho certeza se deve usar o SPRINTF ou o PRINTF
printf(lcd_putc, valor);

// No loop principal faça a leitura do botao
SW2=INPUT(PIN_B5);

// Quando o botão B5 for pressionado, apenas incremente a variável 'valor'
// que já esta definida como global
if ( SW2 ) valor += 10 ;


Nao sei se é exatamente isso que está precisando...
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Código correto CCS Compiler

Mensagempor picman62 » 22 Dez 2014 06:58

Bom dia Andre, agradeço seu interesse no meu caso.
Fiz o que voce sugeriu. Gostaria que olhasse o código para se certificar que inseri as instruções onde devem ser. Tive que fazer algumas mudanças para que o CCS compilasse sem erros.
Primeiro, tive que criar um 'int16 valor', do contrário sem os 16 bits, ele não era reconhecido dentro do 'case'.
Segundo, tive que acrescentar no case "%04LU" e "%05LU", senão a linha dois onde ficam os valores (1000,1500, etc) não apareciam. Tirei essa instrução de um dos diversos sites que vi na internet sobre o assunto.
Assim, o CCS compilou sem erros. Quando testo, o botão B4 que rola os textos, funciona normalmente, mas o B5 que deveria mostrar o incremento da contagem, não funciona.
Gostaria que desse uma olhada de como o código ficou e visse qual a ordem de posicionamento das instruções deve ser inserida, ou mesmo novas instruções devem ser apresentadas para que o comando de contador no B5 funcione.
Muito obrigado.
cpp code
//
#include <hung1.h>
#include <button.c>
#include <LCD.C>
#define LCD_ENABLE_PIN PIN_D0
#define LCD_RS_PIN PIN_D1
#define LCD_RW_PIN PIN_D2
#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7

#include <lcd.c>
#int_rb
int Cont;
INT1 SW1;
INT1 SW2;


BOOLEAN ISPRESSED=FALSE; // Boolean logic=0;

void main()
{
port_B_pullups(0xFF);
setup_adc_ports(AN0);
lcd_init();


lcd_init();


int8 cont;
cont = 0;
Int16 valor;


WHILE(true)
{


SW1=INPUT(PIN_B4); // Positive inputs
SW2=INPUT(PIN_B5);

SET_ADC_CHANNEL(0); // INPUT AN0
DELAY_US(50);

IF (SW1 && !ISPRESSED)
{

DELAY_MS(10);
SW1=INPUT(PIN_B4);


{
ISPRESSED=TRUE;

{

IF(SW2)
valor+=10;

switch(cont)

{
case 1:
valor= 1000;
lcd_putc("\fTEXTO1");
lcd_gotoxy(7,2);
printf(lcd_putc," %04LU ",valor);

break;

case 2:
valor = 2500;
lcd_putc("\fTEXTO2");
lcd_gotoxy(7,2);
printf(lcd_putc," %04LU ",valor);

break;

case 3:
valor = 15000;
printf(lcd_putc,"\f");
lcd_gotoxy(2,1);
lcd_putc("TEXTO3");
lcd_gotoxy(7,2);
printf(lcd_putc," %05LU ",valor);
break;


}
cont++;
if(cont >= 4)
cont = 1;
}

delay_ms(50); // Required for button() function
}
}
IF(!SW1) // This line must be here
{
ISPRESSED=FALSE; // This line must be here


}

}
}
picman62
Nibble
 
Mensagens: 53
Registrado em: 21 Dez 2014 08:40

Re: Código correto CCS Compiler

Mensagempor andre_luis » 22 Dez 2014 08:30

Acabei fazendo a identação que mencionei antes, e também fiz a faxina nas chaves excedentes.
Repare que agora ficou mais fácil entender o programa.
Dá uma testada aí e informa o resultado.

cpp code
//
#include <hung1.h>
#include <button.c>
#include <LCD.C>
#define LCD_ENABLE_PIN PIN_D0
#define LCD_RS_PIN PIN_D1
#define LCD_RW_PIN PIN_D2
#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7

#include <lcd.c>
#int_rb

INT1 SW1;
INT1 SW2;

BOOLEAN ISPRESSED_KEY1=FALSE; // Boolean logic=0;
BOOLEAN ISPRESSED_KEY2=FALSE; // Boolean logic=0;

void main()
{
port_B_pullups(0xFF);
setup_adc_ports(AN0);
lcd_init();

int8 cont;
cont = 0;
Int16 valor;

while (true)
{
SW1=INPUT(PIN_B4); // Positive inputs
SW2=INPUT(PIN_B5);

SET_ADC_CHANNEL(0); // INPUT AN0
DELAY_US(50);

if ( (SW1 && !ISPRESSED_KEY1) || (SW2 && !ISPRESSED_KEY2) )
{
DELAY_MS(10);
if ( (SW1 && !ISPRESSED_KEY1) ) // redefine valores padrão: 1000,2500,15000
{
if(++cont >= 4) cont = 1;
ISPRESSED_KEY1=TRUE ;
}
if ( (SW2 && !ISPRESSED_KEY2) ) // incrementa valor padrao em passos de 10 unidades
{
valor += 10 ;
ISPRESSED_KEY2=TRUE ;
}

switch(cont)
{
case 1:
if ( ISPRESSED_KEY1 ) valor= 1000;
lcd_putc("\fTEXTO1");
lcd_gotoxy(7,2);
printf(lcd_putc," %04LU ",valor);
break;

case 2:
if ( ISPRESSED_KEY1 ) valor = 2500;
lcd_putc("\fTEXTO2");
lcd_gotoxy(7,2);
printf(lcd_putc," %04LU ",valor);
break;

case 3:
if ( ISPRESSED_KEY1 ) valor = 15000;
printf(lcd_putc,"\f");
lcd_gotoxy(2,1);
lcd_putc("TEXTO3");
lcd_gotoxy(7,2);
printf(lcd_putc," %05LU ",valor);
break;
}

delay_ms(50); // Required for button() function
}

if (!SW1) ISPRESSED_KEY1=FALSE; // This line must be here
if (!SW2) ISPRESSED_KEY2=FALSE;
}
}


Observações e dicas:
  • Voce havia declarado 2 variáveis com o nome Cont e cont, mas a 1a não era usada, e apaguei
  • Como não tenho como simular, confirma se apliquei a lógica correta ( positivo/negativo ) nos botoes
  • Notar que o flag ISPRESSED_KEYx possui a funcao apenas de permitir um incremento por acionamento
  • Algumas coisas podem ser otimizadas, mas o foco aqui é fazer funcionar primeiro
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Código correto CCS Compiler

Mensagempor picman62 » 22 Dez 2014 08:58

Andre,
Realmente ficou muito mais arrumado e organizado. Quem sabe, sabe.
Mas infelizmente ainda não há mudanças de contador no input B5. O B4 funciona normalmente rolando os textos, quando aperto o B5, não há mudança nenhuma.
Estou utilizando resistores de 'pullup' entre o LCD e os pushbuttons B4 e B5 no valor de 10k. Não creio que faça diferença, porque se fizesse, a programação no B4 não atuaria também. O que você acha?
picman62
Nibble
 
Mensagens: 53
Registrado em: 21 Dez 2014 08:40

Re: Código correto CCS Compiler

Mensagempor ze » 22 Dez 2014 10:38

oi. me desculpe a senilidade mas confesso que estou com dificuldade em compreender sua problemática. Quem sabe se tentar de novo. Com desenho, fluxograma, video, sei lá. Mas de novo... o defeito é do lado de cá. E + 1 agravante: Ao contrário do amigo andré, nunca instalei o ccs. Mas claro, tenho vontade em te ajudar também. Tenta de novo, mas sem garantias hein...
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: Código correto CCS Compiler

Mensagempor picman62 » 22 Dez 2014 10:59

Olá Ze.
Obrigado por participar.
Vou resumir.
Estou programando o PIC 16F877A para interagir com o LCD e dois pushbuttons. O primeiro pushbutton está ligado por um resistor de 10k em B4, pino 37 do PIC. O outro pushbutton idem em B5, pino 38.

O que quero realizar. Primeiro pressionando seguidas vezes o pushbutton de B4, este role 3 textos e no quarto aperto, volte ao primeiro texto. Isso já consegui e está funcionando. Os textos possuem duas linhas. Na de baixo aparece uma numeração de contagem que pretendo seja incrementada em 10 unidades sempre que pressionar o pushbutton referente a B5, ad infinitum.
O Andre gentilmente está tentando me ajudar e fez uma bela organizada no código que estava programando. Mas ainda não é possivel da maneira como ele postou, que o pino B5 seja ativado e que efetivamente incremente as 10 unidades.
picman62
Nibble
 
Mensagens: 53
Registrado em: 21 Dez 2014 08:40

Re: Código correto CCS Compiler

Mensagempor andre_luis » 22 Dez 2014 11:45

Ok, mas como mencionei antes, provavelmente esse código não funcionasse in natura, tendo talvez de fazer alguns testes aí complementares, mas agora o que precisamos saber com mais exatidão é o que dessa funcionalidade da chave SW2 está funcionando ou não.

Uma dica, é voce arbitrar algum pino disponível aí do uC e adicionar um LED que possa servir como DEBUG, ou seja, insere um código como o abaixo em cada ponto alternadamente do programa acima pra saber se o código está atingindo esses pontos do programa:

Código: Selecionar todos
OUTPUT ( PIN_x , TRUE ) ; // escolhe uma porta e pino livres, e não esquece de setar TRIS correspondente


Isso é uma pratica comum...
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Código correto CCS Compiler

Mensagempor ze » 22 Dez 2014 12:10

isso pode não lhe ser totalmente util... agora. Apesar de vc já ter tido sucesso na apresentação do textos. veja uma alternativa como eu encararia seu desafio. É tão simplista que chega a ser autoexplicativo...
Código: Selecionar todos
#include <seus_includes.h>
#define led RB0
#define SW1 RB4
#define SW2 RB5

const char* texto[] = "texto1","texto2","texto3";//,"texto4","texto5","texton";

void main(void)
{
unsigned char i,j=0;
//inicilaiza hw
for(;;)
{
led^=1; //boa ideia do led... pra dizer que estou vivo! Evite led verde.
//delay(xxx)//mas pra ve-lo piscar, precisa de um delay()
if (!SW1)
   {
   gotoxy(0,0); //1ª linha
   printf(texto[i]); //desculpe, não formatei
   i++;
   if (i>3) i=0;
   while(!SW1); //tire o dedo do meu botão
   }
if (!SW2)
   {
   gotoxy(0,1); //2ª linha
   printf(j);//desculpe, não formatei
   j+=10;
   while(!SW2); //tire o dedo do meu botão
   }
}


desculpa por não formatar os argumentos do printf. De fato, por considerá-lo guloso, não uso prinft para display lcd. Tampouco gotoxy(). Tenho algumas funções de lcd bem simples que já compartilhei neste forum. Se um dia desejares...
Não sei se nos sintonizamos. Mas quis somar. Enfim foi o que defequei.. (tinha que fazê-lo no final né..!)
abç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: Código correto CCS Compiler

Mensagempor andre_luis » 22 Dez 2014 13:51

Gostei da abordagem acima, realmente é bem mais enxuta...
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Código correto CCS Compiler

Mensagempor picman62 » 22 Dez 2014 14:22

ze: Obrigado pelo código, mas o CCS compiler não conseguiu compilar. Deu vários erros. Vou tentar sanar um por um. Apesar de que não formatei totalmente ele. As varáveis i e j ficam sendo reconhecidas como se tivesse RS232 rodando e não há.

Andre: Vou fazer o que sugeriu com os leds. A noite retorno para um resultado. Obrigado.
picman62
Nibble
 
Mensagens: 53
Registrado em: 21 Dez 2014 08:40

Re: Código correto CCS Compiler

Mensagempor andre_luis » 22 Dez 2014 15:07

picman62 escreveu:As varáveis i e j ficam sendo reconhecidas como se tivesse RS232 rodando e não há


Há algumas restrições do CCS.
Pode ser que não aceite isso :
cpp code
unsigned char i,j=0;

...e tenha de separar assim :
cpp code
unsigned char i=0 ; 
unsigned char j=0 ;

...mas é apenas uma suposição.
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Código correto CCS Compiler

Mensagempor ze » 22 Dez 2014 15:17

andre: que bom que gostaste. é simples mas é de coração.
Ah sim, no hitech aquilo é aceitável.

picman62: perdão amigo. é que pra mim é tão óbvio que esqueci de dizer que ctrv-c ctrl-v não ia dar certo mesmo. aquilo está no hitech-c. vc vai ter que converter os #defines e otras cositas más pra sintaxe do seu compilador. p.ex. ler pino deve ser um tal de horroroso inputpin ou algo assim. coisa mínima mas isso prefiro dizer que não posso te ajudar nisso ok? E printf, troque pela função que controla seu lcd. E claro, faça o setup do hw no início do programa. Apesar de ser ccs, um programa tem que ter sim algumas preliminares. o núcleo deve compilar sem erro (espero)
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Próximo

Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x