Problema variable en un swicth programación en CCS

#1
Hola a todos! A ver si me podeis echar una mano con esto:
¿Cómo es posible que el valor de la variable "cont" se me vaya a -3?
Sólo mirad el "SWITCH" y la variable "CONT" ,lo demás es indiferente.
No entiendo cómo se puede ir la variable a valores negativos.
PHP:
#include <16f877.h>
#device adc=10
#fuses xt,nowdt
#use delay(clock=4000000)
#include <lcd.c>
#use standard_io(b)
#use standard_io(d)

void main(){
int16 q;
int16 j;
int l,bitaux,cont=0;
float p;

port_b_pullups(true);
setup_adc_ports(an0);
setup_adc(adc_clock_internal);
set_tris_b(0x00);
lcd_init();
for(;{
set_adc_channel(0);
delay_us(20);
q=read_adc();//Valor ADC
p=5.0*q/1024.0;//Voltage


printf(lcd_putc,"\fcont= %6d",cont);
printf(lcd_putc,"\nVoltage= %01.2fV",p);
delay_ms(100);
if(cont<=0)
cont=0;
switch(cont){

case(0):
output_high(pin_d5);

if((input(pin_a1)==1)&&(input(pin_a2)==0)){
output_low(pin_d0);
delay_ms(500);
output_high(pin_d1);
cont++;
delay_ms(5);}

else
output_high(pin_d0);

break;

case(1):

if((input(pin_a1)==1)&&(input(pin_a2)==0)){
   output_low(pin_d0);
   delay_ms(500);
   output_high(pin_d2);
   cont++;
   delay_ms(5);}
   
else if((input(pin_a1)==0)&&(input(pin_a2)==1)){
   output_high(pin_d0);
   output_low(pin_d5);
   delay_ms(500);
   output_low(pin_d1);
   cont--;
   delay_ms(5);}

else{
   output_high(pin_d0);
   output_high(pin_d5);}
   

case(2):

if((input(pin_a1)==1)&&(input(pin_a2)==0)){
   output_low(pin_d0);
   delay_ms(500);
   output_high(pin_d3);
   cont++;
   delay_ms(5);}
   
else if((input(pin_a1)==0)&&(input(pin_a2)==1)){
   output_high(pin_d0);
   output_low(pin_d5);
   delay_ms(500);
   output_low(pin_d2);
   cont--;
   delay_ms(5);}

else{
   output_high(pin_d0);
   output_high(pin_d5);}
   
case(3):

if((input(pin_a1)==1)&&(input(pin_a2)==0)){
   output_low(pin_d0);
   delay_ms(500);
   output_high(pin_d4);
   cont++;
   delay_ms(5);}
   
else if((input(pin_a1)==0)&&(input(pin_a2)==1)){
   output_high(pin_d0);
   output_low(pin_d5);
   delay_ms(500);
   output_low(pin_d3);
   cont--;
   delay_ms(5);}

else{
   output_high(pin_d0);
   output_high(pin_d5);}

case(4):
  
if((input(pin_a1)==0)&&(input(pin_a2)==1)){
   output_high(pin_d0);
   output_low(pin_d5);
   delay_ms(500);
   output_low(pin_d4);
   cont--;
   delay_ms(5);}

else{
   output_high(pin_d0);
   output_high(pin_d5);}


}



}}
 
Última edición por un moderador:
#2
Pues no deberia, al desbordarse cont deberia pasar a ser 255 y no un numero negativo, el CCS por default lo considera como un entero sin signo pero aun asi intenta declarar la variable con el modificador unsigned y prueba amigo.
 
#3
Te faltan los break tras los cases 1,2,3 y 4. También te faltan llaves, pero solo afectan a la claridad del código:
Código:
#include <16f877.h>
#device adc=10
#fuses xt,nowdt
#use delay(clock=4000000)
#include <lcd.c>
#use standard_io(b)
#use standard_io(d)

void main()
{
  int16 q;
  int16 j;
  int l,bitaux,cont=0;
  float p;

  port_b_pullups(true);
  setup_adc_ports(an0);
  setup_adc(adc_clock_internal);
  set_tris_b(0x00);
  lcd_init();
  
  for(;
  {
    set_adc_channel(0);
    delay_us(20);
    q=read_adc();//Valor ADC
    p=5.0*q/1024.0;//Voltage

    printf(lcd_putc,"\fcont= %6d",cont);
    printf(lcd_putc,"\nVoltage= %01.2fV",p);
    delay_ms(100);
    if(cont<=0)
      cont=0;
    switch(cont)
    {
      case(0):
      output_high(pin_d5);

      if((input(pin_a1)==1)&&(input(pin_a2)==0))
      {
        output_low(pin_d0);
        delay_ms(500);
        output_high(pin_d1);
        cont++;
        delay_ms(5);
      }
      else
        output_high(pin_d0);
      break;

      case(1):
      if((input(pin_a1)==1)&&(input(pin_a2)==0))
      {
        output_low(pin_d0);
        delay_ms(500);
        output_high(pin_d2);
        cont++;
        delay_ms(5);
      }
      else
      {  // FALTA 
        if((input(pin_a1)==0)&&(input(pin_a2)==1))
        {
          output_high(pin_d0);
          output_low(pin_d5);
          delay_ms(500);
          output_low(pin_d1);
          cont--;
          delay_ms(5);
        }
        else
        {
          output_high(pin_d0);
          output_high(pin_d5);
        }
      }  // FALTA
      [B]break; // FALTA[/B]
      
      case(2):
      if((input(pin_a1)==1)&&(input(pin_a2)==0))
      {
        output_low(pin_d0);
        delay_ms(500);
        output_high(pin_d3);
        cont++;
        delay_ms(5);
      }
      else 
      {  // FALTA  
        if((input(pin_a1)==0)&&(input(pin_a2)==1))
        {
          output_high(pin_d0);
          output_low(pin_d5);
          delay_ms(500);
          output_low(pin_d2);
          cont--;
          delay_ms(5);
        }
        else
        {
          output_high(pin_d0);
          output_high(pin_d5);
        }      
      } // FALTA
      [B]break; //FALTA[/B]
      
      case(3):
      if((input(pin_a1)==1)&&(input(pin_a2)==0))
      {
        output_low(pin_d0);
        delay_ms(500);
        output_high(pin_d4);
        cont++;
        delay_ms(5);
      }
      else 
      { // FALTA  
        if((input(pin_a1)==0)&&(input(pin_a2)==1))
        {
          output_high(pin_d0);
          output_low(pin_d5);
          delay_ms(500);          
          output_low(pin_d3);
          cont--;
          delay_ms(5);
        }
        else
        {
          output_high(pin_d0);
          output_high(pin_d5);
        }
      } //FALTA
      [B]break; //FALTA[/B]  
      
      case(4):
      if((input(pin_a1)==0)&&(input(pin_a2)==1))
      {
        output_high(pin_d0);
        output_low(pin_d5);
        delay_ms(500);
        output_low(pin_d4);
        cont--;
        delay_ms(5);
      }
      else
      {
        output_high(pin_d0);
        output_high(pin_d5);
      }
      [B]break; //FALTA, pero ya no es necesario[/B]
    }
  }
}
 

Temas similares

Arriba