TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: PICYO en 30 de Marzo de 2010, 09:35:05

Título: movimiento linea LDC mediante pulsadores
Publicado por: PICYO en 30 de Marzo de 2010, 09:35:05
Hola!
estoy tratando de hacer el movimiento de una linea corta,  a través  de unos pulsadores. La idea es, de momento, que si pulso "x" pulsador la linea se desplaza.
De momento no soy nada meticuloso, simplemente quiero hacer que se desplaze como sea, si pulso el boton.
Pero..no me hace caso! Entonces he pensado...será que no está bien configurado el LCD? No es asi..todo depende de un if:

if (pin_A0==0){ suma posicion }
sin ese if, o sea, puesto " a saco" si veo ( por simuladro proteus) el movimiento. Pero a pesar que A0 si detecte ( muchas veces lo hago..asi que ..) que esta a nivel 0... por que no entra en ese IF y no me hace caso?? Pongo un esquema de lo que hago y el código:

esquema :

(http://img12.imageshack.us/img12/2408/dibujovgnz.jpg)

codigo :
Código: C
  1. #include <16f877.h>
  2. #use delay(clock=20000000)
  3. #fuses HS,NOWDT
  4. #include <HDM64GS12.C>
  5. #include <graphics.c>
  6.  
  7.  
  8. #byte  porta = 0x85
  9.  
  10.  
  11.  
  12. #USE STANDARD_IO (A)
  13.  
  14.  
  15. int16 valor;
  16. float tension;
  17.  
  18. void cuadro(void);
  19. void pixel_inicial(int a1,int b1,int a2,int b2);
  20.  
  21. void main() {
  22.     glcd_init(ON);
  23.   set_tris_A(0xFF);
  24.   set_tris_c(0x00);
  25.   cuadro();  // dibuja el cuadro
  26.  
  27. while(1){
  28. set_tris_A(0xFF);
  29. set_tris_c(0x00);
  30. pixel_inicial(28,28,40,28);
  31. delay_ms(500);
  32.  
  33. if (pin_A1==0){      // solo quiero usar el switch de arriba, que va a pin A1
  34.    delay_ms(500);
  35.    pixel_inicial(28++,28+6,40+5,28+6);   // si no pusiera esto dentro del IF, me funciona. El problema es qu eno detecta el if!??
  36.    output_high(pin_C7);
  37.    delay_ms(500);
  38.     }
  39.  
  40.   }
  41. }
  42.  
  43.  
  44. void cuadro(void){
  45. //glcd_fillscreen(0);                    //Borrado de pantalla
  46. glcd_line(1,1,1,64,1);              //líneas de x e y vertical izquierda
  47. glcd_line(190,1,190,64,1);              //líneas de x e y vertical derecha
  48.  
  49. glcd_line(1,1,128,1,1);       //horizontal sup
  50. glcd_line(1,63,128,63,1);       //horizontal inf
  51. }
  52.  
  53. void pixel_inicial(int a1,int b1,int a2,int b2){
  54. delay_ms(100);
  55. glcd_line(a1,b1,a2,b2,1);
  56. }
Título: Re: movimiento linea LDC mediante pulsadores
Publicado por: AngelGris en 30 de Marzo de 2010, 10:45:38
Quizá se deba a que tengas que deshabilitar el conversor AD. O a lo sumo hacer que el pin que quieras usar no esté configurado como entrada analógica. Por defecto (el encenderse el PIC) el registro ADCON1 está todo en 0 y eso hace que los puertos que se pueden usar como entradas analógicas queden configurados justamente como entradas analógicas.
Probá a hacer que el registro ADCON1 tenga el valor 7. Eso hace que las entradas sean entradas digitales.

Creo que con CCS se puede usar setup_adc_ports(NO_ANALOG);
Título: Re: movimiento linea LDC mediante pulsadores
Publicado por: jfh900 en 30 de Marzo de 2010, 10:59:35
En CCS no puedes leer directamente el Pin de entrada, tienes que sustituir:

if (pin_A1==0)


Por:

if (input(pin_A1)==0)

Un saludo
Título: Re: movimiento linea LDC mediante pulsadores
Publicado por: PICYO en 30 de Marzo de 2010, 15:32:06
jf!!

exacto!! ohhh!! lo que pasa es que no me dejaba exactamente como decias, he puesto esto otro:
Código: C
  1. if  (!input(pin_A1)){
Pero vamos, es lo mismo que tu has dicho....gracias!!

(pareceria una tonteria..pero no caía en eso!!)