Autor Tema: Duda con Funciones del Lenguaje  (Leído 1367 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado ARmando1955

  • PIC10
  • *
  • Mensajes: 4
Duda con Funciones del Lenguaje
« en: 05 de Julio de 2015, 00:20:29 »
Buenas Noches, soy nuevo aqui en el foro y desearia saber que problema tengo en esta programacion. Cabe destacar que soy nuevo programando :?, apenas he desarrollado 1 solo programa sin problemas. El programa consta de un pulsador y un 7 segmentos, que cada vez lo presione me muestre la cantidad de veces que se presione hasta llegar a 9, despues de 9 veces se repita el ciclo, osea se reinicie a 0 y asi sucesivamente. Aqui la programacion :oops:

#include <18f4550.h>

#fuses XT
#fuses NOWDT
#fuses MCLR   
#fuses NOBROWNOUT   
#fuses NOLVP   
#fuses NOCPD   
#fuses NOPROTECT

#use delay (clock=4000000)
#use standard_io(b)
             
int   conteo[10]= {0b01000000, 0b11111001, 0b10100100, 0b10110000, 0b10011001,
                   0b10010010, 0b10000010, 0b11111000, 0b10000000, 0b10011000};
int   i = 0;                     
             
void main(){     
   output_b(0b00000000); 
   if(!input(PIN_A0) == 1 );{ // <-------- Line 20(25,26): Code has no effect
   delay_ms(500);
   (i++);
   output_b(conteo);
      if(i>9){
      i=0;
      }
      delay_ms(500); 
  }
}

El compilador me da error en la linea especificada. Si hay alguna recomendacion, libro o tutorial que me recomiendo se los agradezco!
Saludos desde Venezuela,Barinas. 

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Duda con Funciones del Lenguaje
« Respuesta #1 en: 05 de Julio de 2015, 04:57:34 »
yo creo que te estas olvidando de quitarlos como analogicos y ademas de quitar el comparador.
Cuando arranca el PIC las entradas estan como analogas, tenes que cambiarlas a digitales, y en algunos PIC el puerto b u otro suele tener los comparadores analogicos, estos suelen estar activos en el reset y tambien hay que configurarlos.
Si esta como analogo siempre te va a dar 0 por eso imagino que dice : Codigo sin efecto

Exactamente como no se... no uso CCS, pero creo que lo que te dije te puede iluminar un poco

Creo que para lo analogico es:

setup_adc_ports(ALL_DIGITAL);

y para el comparador es:

setup_comparator(NC_NC_NC_NC);


Hay ademas mas cosas para arreglar en el programa:

Propongo esto:

Código: C
  1. void main(){
  2.         int i=0;
  3.         output_b(0b00000000);
  4.         setup_adc_ports(ALL_DIGITAL);
  5.         setup_comparator(NC_NC_NC_NC);
  6.         while(1)
  7.         {
  8.                 if(!input(PIN_A0));                    // Aca es simple si te da un 0 no entra, si tenes cualquier valor 1, una letra 'a', lo que sea entra al if, por eso si A0 = 0 el negado es 1 y va a entrar, por eso quite la comparacion
  9.                 {
  10.                         delay_ms(10);                 // Espero un tiempito para que el rebote del boton no afecte, el rebote hace que varie en 1 y 0 el valor del pin, entonces espero ese tiempito para que quede en 0
  11.                         while(!input(PIN_A0));      // Ya establecido el valor, lo encierro aca para que no proceda hasta que suelte el boton, esto es para hacerlo sin delays, solo cuando suelto el boton sale de aca y aumenta
  12.                         output_b(conteo[i++]);    // Esto es lo mismo que hacer output_b[i] y luego hacer i++
  13.                         if(i>9)
  14.                         {
  15.                                 i=0;
  16.                         }
  17.                 }
  18.         }
  19. }

Ademas voy a decirte que hiciste mal en el tuyo.

- No tenes un bucle infinito, observas que en el mio hay un while(1)
- optput_b(conteo) no va a hacer lo que vos queres

Cuando tenes un array, conteo
  • si haces usas conteo solo estas apuntando a la direccion de memoria donde se guarda conteo[0]...

Imaginate esto:

Creo un array que de 4 variables de 8 bits, el compilador lo pone en la direccion 0x50 y ocupa hasta 0x53, ademas le asigno valores {11,22,33,44}

Si yo hago esto:

int i,a,j;
i = conteo;
a = conteo[0];
j = *(conteo+1)

"i" va a ser igual a 0x50, y "a" va a ser igual a 11 , y j va a valer 33, Este ultimo es lo que se llama puntero y es bastante util en C pero creo que es lo mas complejo de tratar del mismo.
Basicamente para que lo entiendas al puntero es, el contenido que hay en la direccion "conteo+1" como conteo apuntaba a conteo[0] si le sumo 1 al tratarse de variables de 8 bits es lo mismo conteo[1], pero no nos vayamos por las ramas, mejor dejarlo donde qudamos, y podes ver la diferencia entre "i" y "a". Esto ocurre en los arrays.

Si es una variable comun y corriente, la direccion se logra con el operador &, es decir

int i,a,j;          // Supone que se guardaron en las posiciones 0x40 a 0x42 respectivamente, es decir i en 0x40, a en 0x41 y j en 0x42
i = 30;
a = &i;
j = i;

Entonces ahora tenes "a" va a ser igual a 0x40 y "j" va a ser igual a 30.
« Última modificación: 05 de Julio de 2015, 14:33:33 por KILLERJC »


 

anything