Autor Tema: Como están anidadas las funciones "if"  (Leído 9077 veces)

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

Desconectado ramirez

  • PIC16
  • ***
  • Mensajes: 195
Como están anidadas las funciones "if"
« en: 27 de Mayo de 2009, 20:05:46 »
Buenas tardes a todos, sigo intentando aprender C con los ejemplos propuestos por nuestro colega VSZENER, pero no logro entender como están anidadas las distintas funciones "if" de su ejemplo que expongo a continuación. Además he intentado ver en distintos hilos de este foro como funciona la interrupción del timer0 pero tampoco la entiendo, por lo tanto si alguien puede ayudarme con estas dos dudas para comprender el ejemplo y seguir avanzando se lo agradecería.

////////////////////////////////////////////////////////////////////////////////////
//                     VsZeNeR'05
//                     22/Agosto/05
//                     vszener@gmail.com
//   Programa:   Contador del 00 al 99 y viceversa automaticamente
//   Version:   0.0
//
//   Dispositivo: PIC 16F648A         Compilador:    CCS vs3.227
//   Entorno IDE: MPLAB IDE v7.20      Simulador:    Proteus 6.7sp3
//
//   Notas: Contador del 00 al 99 cada 1s y vuelta a empezar. Tener en cuenta
//         que hay que poner la directiva NOLVP para que el pin B4 sea de salida.
//         Se utiliza variables locales:
//            * i -> indice tabla 7seg para mostrar digito por 1º 7seg
//            * j -> indice tabla 7seg para mostrar digito por 2º 7seg
//            * flag -> variable que cuenta 1s
//            * var -> ajuste fino para que desborde cada segundo
//            * cuenta -> cuenta=0 -> Contador ascendente ; cuenta=1 -> Contador descendente
//         Utilizamos la funcion de interrupcion para actualizar indices de la
//         tabla de 7seg para mostrar el digito correspondiente en el respectivo
//         7seg, para ello el TMR0 se desborda cada 1s, para ello debe ser cargado
//         con 61(equivale a un desbordamiento cada 50ms mas o menos), para obtener
//         un desbordamiento de 1s utilizamos una variable(flag) que no entra en
//         la actualizacion de indices hasta transcurrido 1s. Configuramos una
//         variable tipo short,bit, llamada 'cuenta' que si vale 1 significa que
//         el contador es descendente y si vale 0 significa que el contador es ascendente.
//   Conexiones:
//         · RA0 -> Display 1º 7seg
//         · RA1 -> Display 2º 7seg
//         · RB0 -> a 7seg
//         · RB1 -> b 7seg
//         · RB2 -> c 7seg
//         · RB3 -> d 7seg
//         · RB4 -> e 7seg
//         · RB5 -> f 7seg
//         · RB6 -> g 7seg
//////////////////////////////////////////////////////////////////////////////////

#include <16f648a.h>            //pic a utilizar
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP      //ordenes para el programador
#use delay (clock=4000000)         //Fosc=4Mhz
#use standard_io(B)
#use fixed_io(a_outputs=PIN_A0,PIN_A1)   //A0,A1 como salidas en porta

//VARIABLES GLOBALES
signed char i=0,j=0;   //indices(se tiene en cuenta signo para comprobaciones de fin tab7seg)
char flag=0,var=20;
short cuenta=0;         //cuenta=0 -> Contador ascendente ; cuenta=1 -> Contador descendente

///LLAMADA FUNCION INTERRUPCION
#INT_TIMER0
void interrupcion()
{
   if(flag>var){      //¿ya es 1 segundo?rutina:actualizar indices y contador ascendente/descendente
      var--;         //SI -> decremento var...
      if(var<18)
         var=20;      //...ajuste fino de 1s
      flag=0;         //reset flag para contar 1s
      if(cuenta==0){   //¿Contador ascendente?
      if(i>8){      //SI -> ¿se ha mostrado por 1º 7seg digito 9?
         i=0;      //SI -> i=0 (muestra digito 0) (*)
         j++;      //incremento indice j
         if(j>9){      //¿se ha mostrado digito 99?
            cuenta=1;   //SI -> contador descendente...
            j=9;      //restauro...
            i=8;      //...indices
            }
         }
      else{         //(*) NO -> incrementa i
         i++;}
      }
      else{               //Contador descendente
         i--;            //decremento indice i
         if(i<0){         //¿fin tab7seg en indice i?
            i=9;         //SI -> restauro i
            j--;         //decremento indice j
            if(j<0){      //¿fin tab7seg en indice j 00?
               cuenta=0;   //SI -> Contador descendente
               i=1;      //restauro...
               j=0;      //...indices
               }
            }
         }
      } //fin actualizar indices y contador ascendente/descendente
   set_timer0(61);      //reset TMR0
   flag++;            //incremento variable flag
}

///PROGRAMA
void main(void)
{
   int tab7seg[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x67};   //7seg hex 0-9

   set_tris_b(0x00);                     //portb como salida
   enable_interrupts(INT_TIMER0);            //interrupcion TIMER0 activada
   setup_counters(RTCC_INTERNAL,RTCC_DIV_256);   //configuracion interrupcion TMR0
   set_timer0(61);                        //carga TMR0
   enable_interrupts(GLOBAL);               //activadas interrupciones

   do{                        //bucle...
      output_high(PIN_A1);      //2º 7seg off
      output_low(PIN_A0);         //1º 7seg on
      delay_ms(150);
      output_b(tab7seg);      //muestra por portb digito 7 segmentos
      output_low(PIN_A1);         //2º 7seg on
      output_high(PIN_A0);      //1º 7seg off
      delay_ms(150);
      output_b(tab7seg[j]);      //muestra por portb digito 7 segmentos
      }while(TRUE);            //...infi nito
}


de nuevo os doy las gracias a todos por vuestra colaboración

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Como están anidadas las funciones "if"
« Respuesta #1 en: 27 de Mayo de 2009, 21:49:31 »
Con respecto a los If anidados creo que un diagrama de flujo va a ayudar:
Espero no haberme equivocado  :mrgreen: Como ves realizando un diagrama de flujo es más fácil descifrar el código.

El temporizador TMR0:
El Timer 0 es un contador / temporizador de 8 bits. El registro principal de este módulo es TMR0. Este registro se incrementa continuamente a una frecuencia seleccionable manejada por un preescalador y el reloj interno Fosc/4 (modo temporizador) o bien, por un preescalador y una señal externa (modo contador).
Modo Temporizador: En este modo, el contenido del registro TMR0 se incrementará a la frecuencia Fcy (Fosc/4) dividida de acuerdo al preescalador. Al ocurrir un desbordamiento (TMR0 pasa de 255 a 0) se setea la bandera T0IF, y se ejecutará la interrupción si esta habilitada.
« Última modificación: 28 de Mayo de 2009, 13:04:18 por Suky »
No contesto mensajes privados, las consultas en el foro

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re: Como están anidadas las funciones "if"
« Respuesta #2 en: 28 de Mayo de 2009, 11:58:34 »
GUAU  :shock: No he comprobado si esta bien, pero de cualquier manera haz hecho un gran trabajo descifrandole los IF anidados a ramirez!

Yo le recomiendo que cuando este un poco liado con los "nidos" que copie todo el codigo a CCS y le de "forma" al codigo, ya que el GeSHi del foro a veces hace lios.
Para que sea comprensible, a cada linea de codigo le corresponde una cantidad de espacios o tabs desde el margen, segun la profundidad en la que se encuentre.
Algo asi:
Código: C
  1. void main (void){
  2.     //codigo....
  3.     //....
  4.     if(tal==cual){
  5.         //mas codigo
  6.  
  7.         if(igual != distinto){
  8.             //hacer X
  9.             //hacer Y
  10.         }
  11.         //hacer Z
  12.     }
  13. }

Fijate que cada vez que entramos en una condicion/bucle/funcion estamos profundizando un nivel, y todo lo que este dentro de el, lo pondremos un "TAB" mas adentro. Fijate tambien que el corchete de cierre esta siempre a la misma altura que donde empieza la linea del corchete que abre.
Asi te sera mucho mas simple entender el codigo, y esta bien tomarlo como practica habitual, ya que te facilitara MUCHISIMO la existencia... creeme
Seguro esto esta escrito en algun lado... son standards de programacion, pero no tengo idea de donde estaran...

*Nota: Por lo general la tecla TAB equivale a 4 espacios en blanco, pero puedes configurar en tu compilador como quieres que sea.

Salu2
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado ramirez

  • PIC16
  • ***
  • Mensajes: 195
Re: Como están anidadas las funciones "if"
« Respuesta #3 en: 28 de Mayo de 2009, 13:49:37 »
Gracias a todos por las respuestas, ahora estoy examinadndo el flujograma de Suky (ya os contaré), pero sigo sin entender el tema de las interrupciones, sigo buscando por el foro pero aún no lo tengo claro, por favor me podeis explicar cada una de las líneas que tiene relación con la interrupción del timer0.

De nuevo graciaspor vuestra colaboración.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Como están anidadas las funciones "if"
« Respuesta #4 en: 28 de Mayo de 2009, 14:15:31 »
Lee la parte teórica a partir de aquí, es para el 16F84 pero se puede entender como funcionan las interrupciones y la parte del Timer0 no varia en nada.
Entendiendo eso, entenderás lo siguiente:
setup_counters(RTCC_INTERNAL,RTCC_DIV_256);: Configura TMR0 (OPTION_REG) como temporizador y preescaler 1:256.
set_timer0(61); : Carga TMR0 con 61.           
enable_interrupts(INT_TIMER0); Habilita interrupción de TMR0, T0IE =1.
enable_interrupts(GLOBAL); Habilta interrupciones globales, GIE=1
No contesto mensajes privados, las consultas en el foro

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Como están anidadas las funciones "if"
« Respuesta #5 en: 28 de Mayo de 2009, 17:13:46 »
con un editor de codigos especializado se simplifica el análisis, por ejemplo el Notedpad++ reconoce el C, y te "jerarquiza" cualquier cosa que se encuentre dentro de una llave.

puedes por ejemplo clicar en el "-" que se encuentra al lado izquierdo de la ventana y cerrarás el bloque que encierra las llaves, asi vas descartando en tu caso los if e ir analizando el anidamiento.


pd: Gran trabajo que hiciste suky, yo soy de los que nunca hacen diagramas de flujo jeje, empiezo a echar código y después: como vayamos viniendo, vamos viendo

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado Twistek

  • PIC10
  • *
  • Mensajes: 13
Contador 00-99 ascendente y descendete CCS con LCD
« Respuesta #6 en: 27 de Junio de 2009, 19:35:26 »
hola, soy nuevo en esto de los pics , y he estado viendo los ejemplos que hay para CCS, podria alguien ayudar poniendo un ejemplo de un contador como el anterio pero con un LCD, que muestre el conteo 00-99 ascendente y descendente. Porfavor

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re: Como están anidadas las funciones "if"
« Respuesta #7 en: 28 de Junio de 2009, 01:12:06 »
En este subforo de C, tienes un post con chincheta: "Indice de hilos destacados", y alli accedes a los ejemplitos de Vszener. Seguro que encuentras algo parecido a lo que tu estas buscando.

http://www.todopic.com.ar/foros/index.php?topic=4530.0

Salu2
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.


 

anything