TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: bitclock001 en 19 de Abril de 2013, 20:58:24

Título: Problemas con ciclo FOR
Publicado por: bitclock001 en 19 de Abril de 2013, 20:58:24
Saludos

Soy nuevo en esto de C.  estoy reaizando un programa en C CCS compiler que incremente un contador, lo muestre un display de 3 dígitos y un letrero en la LCD y que a la vez haga rotar un led conectado al puerto A, pero siempre se me queda en el segundo FOR que les coloco en color, realmente no se que es lo que pasa.  Les pego el código para que lo miren

FOR (I = 1; I < 10; I++)
       {
          PORTC = UNI;
          PORTE = 0B00000100;
          DELAY_MS (10);
          PORTC = DEC;
          PORTE = 0B00000010;
          DELAY_MS (10);
          PORTE = 0B00000001;
          PORTC = CENT;
          DELAY_MS (10);  
       }

Código: [Seleccionar]
#INCLUDE <16f887.h> 
#USE DELAY(CLOCK=4000000)
#DEFINE USE_PORTB_LCD TRUE 
#INCLUDE <LCD.C> 
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP
#BYTE PORTA= 5
#BYTE PORTB= 6 
#BYTE PORTC= 7 
#BYTE PORTD= 8
#BYTE PORTE= 9
#DEFINE SW1 PORTB,0
#DEFINE SW2 PORTB,1
#DEFINE SW3 PORTB,2 
#DEFINE TUNI PORTE,2//Definición de variables 
#DEFINE TDEC PORTE,1//Definición de variables
#DEFINE TCEN PORTE,0//Definición de variables

Byte  CONST display[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};
BYTE  CONST DERECHA[8]={0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80};
BYTE  CONST ISQUIR[8]={0X80,0X40,0X20,0X10,0X08,0X04,0X02,0X01};                                                                                                             //un entero, es decir de 8 bits 
INT CONT=0;//Declarar la variable CONTRET
SHORT UNI=0, DEC=0, CENT=0, I=0, J=0, K=0;
 

VOID MOSTRAR ()
 {
   
    LCD_PUTC ("\f"); // BORRA LCD
   
       FOR (J = 1; J<6; J++)
      {
          PORTA = DERECHA[J];
          LCD_GOTOXY (7, 1); //LINEA UNO CARACTER SIETE
          LCD_PUTC ("ARRIBA");
         
       
       FOR (I = 1; I < 10; I++)
       {
          PORTC = UNI;
          PORTE = 0B00000100;
          DELAY_MS (10);
          PORTC = DEC;
          PORTE = 0B00000010;
          DELAY_MS (10);
          PORTE = 0B00000001;
          PORTC = CENT;
          DELAY_MS (10); 
       }
      }
     
 
 
   
   LCD_PUTC ("\f"); // BORRA LCD
   
    FOR (J = 0; J < 6; J++)
    {
       PORTA = ISQUIR[J];
       LCD_GOTOXY (7, 2); //LINEA DOS CARACTER SIETE
       LCD_PUTC ("ABAJO");
       
       FOR (I = 1; I < 10; I++)
       {
          PORTC = UNI;
          PORTE = 0B00000100;
          DELAY_MS (10);
          PORTC = DEC;
          PORTE = 0B00000010;
          DELAY_MS (10);
          PORTE = 0B00000001;
          PORTC = CENT;
          DELAY_MS (10);
       }
    }
 }
 
 VOID MAIN  ()
 {
    SET_TRIS_D (0B00000000);
    SET_TRIS_A (0B00000000);
    SET_TRIS_C (0B00000000);
    SET_TRIS_B (0B00111000);
    SET_TRIS_E (0B00000000);
    // !  ANSEL = 0;
    // !  ANSELH = 0;
    PORTB = 0;
    PORTE = 0;
    PORTA = 0;
    PORTC = 0;
    PORTD = 0;
    CONT =  0;
    LCD_INIT (); //INICIALIZA LCD
    LCD_PUTC ("\f"); // BORRA LCD
   
   
    WHILE (1)
    {
       
       IF ( (BIT_TEST (SW1))&& ( ! BIT_TEST (SW2))&& ( ! BIT_TEST (SW3) ))
       {
          MOSTRAR () ;
         
          IF (CONT == 1000)
          {
             CONT = 0;     
          }
         
          CONT++;
          CENT = CONT / 100;
          DEC = (CONT % 100)/10;
          UNI = (CONT % 100) % 10;
         
       }
    }
 }
Título: Re: Problemas con ciclo FOR
Publicado por: ppyote en 19 de Abril de 2013, 22:01:08
Es ++I, no I++...
Título: Re: Problemas con ciclo FOR
Publicado por: AngelGris en 19 de Abril de 2013, 22:19:30
Es ++I, no I++...

  No sé como será en CCS, pero en XC8 está bien escribir "variable++" para incrementar la variable.
Título: Re: Problemas con ciclo FOR
Publicado por: Chenao en 19 de Abril de 2013, 23:20:36
Citar
No sé como será en CCS, pero en XC8 está bien escribir "variable++" para incrementar la variable.

Personalmente en CCS yo siempre he utilizado la notación que comenta el compañero AngelGris si problema alguno, quizás la diferencia a la notación utilizada por ppyote sea la versión del compilador. 
Título: Re: Problemas con ciclo FOR
Publicado por: BrunoF en 20 de Abril de 2013, 00:02:25
Hola,

son completamente distintos.

++variable se llama pre-incremento y variable++ se llama post-incremento.

pre-incremento, como su nombre sugiere, primero realiza el incremento y luego evalúa la condición. El post-incremento primero evalúa la condición y luego realiza el incremento.

Dependiendo de dónde se encuentra ubicado, la diferencia entre ambos puede resultar relevante o no.

Irrelevante:

uint8_t i = 0;
while(1)
{
    printf("El valor  es: %u", i);
    i++;
}
uint8_t i = 0;
while(1)
{
    printf("El valor  es: %u", i);
    ++i;
}
uint8_t i;
for(i = 0; i < 10 ; i++)
{
    //..
}
uint8_t i;
for(i = 0; i < 10 ; ++i)
{
    //..
}

Relevante:

uint8_t i = 0;
while(i++){
   //No se ejecuta ni una vez
}
uint8_t i = 0;
while(++i){
   //... Se ejecuta 256 veces
}
uint8_t i = 0;
while(1)
{
    //imprime comenzando desde 0
    printf("El valor  es: %u", i++);
}
uint8_t i = 0;
while(1)
{
    //imprime comenzando desde 1
    printf("El valor  es: %u", ++i);
}

La prioridad de operadores es la siguiente en ANSI C:

(http://www.carlospes.com/curso_de_lenguaje_c/imagenes/fig_11_06_prioridad_de_operadores.gif)
Fuente: http://www.carlospes.com/sintaxis_ansi_c/prioridad_de_operadores.php

Saludos.
Título: Re: Problemas con ciclo FOR
Publicado por: MerLiNz en 20 de Abril de 2013, 00:21:21
yo siempre he usado I++, en realidad daria igual porque ahi no se hace ninguna comparacion.

Prueba a poner la variable I como int en vez de como short, puede que short en mayus sea otro tipo de variable de menos bits o algo asi. Tambien puede ser el delay_ms o por ultimo si es CCS que sea un compilador con algun bug y este haciendo ahi cosas raras...
Título: Re: Problemas con ciclo FOR
Publicado por: AngelGris en 20 de Abril de 2013, 09:30:34
  Muy bien por la explicación BrunoF. Yo había leído algo al respecto, pero como no estaba seguro si afectaba o no en los IF, preferí no comentar nada para no confundir.
Título: Re: Problemas con ciclo FOR
Publicado por: bitclock001 en 20 de Abril de 2013, 18:08:06
Gracias por sus valiosas respuestas, el problema era con la variables short