Autor Tema: Problemas con ciclo FOR  (Leído 2395 veces)

0 Usuarios y 4 Visitantes están viendo este tema.

Desconectado bitclock001

  • PIC10
  • *
  • Mensajes: 20
Problemas con ciclo FOR
« 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;
         
       }
    }
 }
« Última modificación: 19 de Abril de 2013, 21:31:35 por amado2761 »

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: Problemas con ciclo FOR
« Respuesta #1 en: 19 de Abril de 2013, 22:01:08 »
Es ++I, no I++...
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problemas con ciclo FOR
« Respuesta #2 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.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Chenao

  • PIC18
  • ****
  • Mensajes: 414
Re: Problemas con ciclo FOR
« Respuesta #3 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. 
Un saludo desde Pereira - Colombia

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Problemas con ciclo FOR
« Respuesta #4 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:

Fuente: http://www.carlospes.com/sintaxis_ansi_c/prioridad_de_operadores.php

Saludos.
« Última modificación: 20 de Abril de 2013, 02:59:19 por BrunoF »
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Problemas con ciclo FOR
« Respuesta #5 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...

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problemas con ciclo FOR
« Respuesta #6 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.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado bitclock001

  • PIC10
  • *
  • Mensajes: 20
Re: Problemas con ciclo FOR
« Respuesta #7 en: 20 de Abril de 2013, 18:08:06 »
Gracias por sus valiosas respuestas, el problema era con la variables short