# Leer dato de un pin pic



## poseidon2511 (Feb 17, 2011)

Hola a todos, tengo un problema y agradeceria que me ayudaran a solucionarlo, resulta que estoy realizando un proyecto basandome en los ejemplos planteados acontinuacion





Tengo todos los codigos y funcionan muy bien, puedo controlar leds, motores y cosas por el estilo desde mi aplicacion en netbeans:

En los anteriores ejemplo se plantea lo siguien

Desde Netbans:

public byte prender=125;
comando(prender);


public void comando(byte envio){
     byte[] out={envio};
    iface.QWrite(out, 1, 1000);
}

En el archivo:
PrenderYApagar.c
Antes de compilar y pasar el codigo al pic(Hex) Tengo algo como lo siguiente

void main(void) {
  delay_ms(500);
  usb_init();
  usb_task();
  usb_wait_for_enumeration();
  enable_interrupts(global);
  while (TRUE){
    if(usb_enumerated()){
      if (usb_kbhit(1)){
        usb_get_packet(1, recbuf, Lenbuf);

        if(recbuf[0]==127){
           output_high(PIN_B0);
        }
            }

Osea que cuando yo preciono un boton en netbeans y se ejecuta este envia datos al pic en este caso seria el dato 127 hecho esto yo puedo colocar condiciones y controlar las salidas de diferentes pines del pic en este caso pongo a trabajar el pin_Bo y por consiguiente me prende un motor.

Ahora biene la pregunta, me gustaria hacer lo contrario, osea detectar si un pin fue desconectado o esta funcionando, digamos que tengo el pin A1 conectado a un Switch y quiero saber cuando esta en on o en off desde netbeans.


algo como lo siguiente

En el archivo:
PrenderYApagar.c

Aqui es donde no se como leer el dato del pin
Ej: leer
si pin_a1==0 //es porque esta desconectado o en off
si pin_a2==1 //es porque esta conectado y funcionando

En netbeans:

public byte[] read_response(int maxbytes) {
        return iface.QRead(maxbytes, 500);
    }
aqui se supone que recibo el dato


Como ven me resulta dificil leer los pines: De ante mano muchas gracias....


----------



## GAAS1974 (Feb 22, 2011)

Espero haber entendido, necesitas leer un dato de un pin especifico del PIC como un switch, sensor o voltaje!
Tienes que hacer dentro del programa una rutina de estado del PIN, por ejemplo cada cierto tiempo el programa lea el ultimo estado del PIN si fue cero o uno, tambien puedes hacer una rutina de cuando se presente un cambio de estado ese PIN genere una interrupcion el PIC y envie el mensaje que tu quieras o solamente activar un LED, Etc...
Solo tiene debes tomar en cuenta los tiempos de activacion del PIN, varia para cada dispositivo que conectes!

Saludos!



poseidon2511 dijo:


> Hola a todos, tengo un problema y agradeceria que me ayudaran a solucionarlo, resulta que estoy realizando un proyecto basandome en los ejemplos planteados acontinuacion
> http://www.youtube.com/watch?v=icFvEidPOmk
> http://www.youtube.com/watch?v=juDve7zOX0s&feature=related
> 
> ...


----------



## poseidon2511 (Feb 22, 2011)

Mil gracias por responder a mi pregunta, sin embargo me gustaria que me colaboraras con un ejemplo: digamos que estoy utilizando un pic18f4550, y digamos que quiero saber el estado del pin a1 cuyo pin se ha modificado por un switch y teniendo en cuenta que dentro de este pic se verificara el estaod de otros pines y se haran operaciones diversas con ellos..

Entiendo que lo anterior se podria hacer con un "while" pero resulta que despues de ese while hay otras funciones que se deben realizar.. 

me imagin que seria de la siguiente manera:

while(!0){
   verificar pin a1
..}
//
//aqui otras funciones

que pasa si el pin a1 no cambia de estado, el while seria eterno. mi pregunta es como controlo eso o acaso el pic puede trabajar al mismo tiempo que verifica el estado de a1




GAAS1974 dijo:


> Espero haber entendido, necesitas leer un dato de un pin especifico del PIC como un switch, sensor o voltaje!
> Tienes que hacer dentro del programa una rutina de estado del PIN, por ejemplo cada cierto tiempo el programa lea el ultimo estado del PIN si fue cero o uno, tambien puedes hacer una rutina de cuando se presente un cambio de estado ese PIN genere una interrupcion el PIC y envie el mensaje que tu quieras o solamente activar un LED, Etc...
> Solo tiene debes tomar en cuenta los tiempos de activacion del PIN, varia para cada dispositivo que conectes!
> 
> Saludos!


----------



## GAAS1974 (Feb 22, 2011)

Poseidon2511:

     Envio este link:http://www.mikroe.com/eng/home/index/





poseidon2511 dijo:


> Mil gracias por responder a mi pregunta, sin embargo me gustaria que me colaboraras con un ejemplo: digamos que estoy utilizando un pic18f4550, y digamos que quiero saber el estado del pin a1 cuyo pin se ha modificado por un switch y teniendo en cuenta que dentro de este pic se verificara el estaod de otros pines y se haran operaciones diversas con ellos..
> 
> Entiendo que lo anterior se podria hacer con un "while" pero resulta que despues de ese while hay otras funciones que se deben realizar..
> 
> ...



Poseidon2511:

     Envio ejemplo:


bit oldstate;                                    // Old state flag

void main() {

  ANSEL  = 0;                                    // Configure AN pins as digital I/O
  ANSELH = 0;
  C1ON_bit = 0;                                  // Disable comparators
  C2ON_bit = 0;

  TRISB0_bit = 1;                                // set RB0 pin as input

  TRISC = 0x00;                                  // Configure PORTC as output
  PORTC = 0xAA;                                  // Initial PORTC value
  oldstate = 0;

  do {
    if (Button(&PORTB, 0, 1, 1)) {               // Detect logical one
      oldstate = 1;                                  // Update flag
    }
    if (oldstate && Button(&PORTB, 0, 1, 0)) {   // Detect one-to-zero transition
      PORTC = ~PORTC;                            // Invert PORTC
      oldstate = 0;                                  // Update flag
    } 
  } while(1);                                    // Endless loop
}

Como observas en la rutina  es la configuracion del pin y de los puertos del PIC, en la rutina del ( do )  este verifica el estado del PIN 0 del puerto B, cuando cambia de estado inverte todas las salidas del puerto C del PIC, esta rutina la puedes usar para un swtich la configuracion inicial de la rutina cambia dependiendo el PIC.

Esta rutina la puedes hacer un procedimiento y puedes agregar mas pins o todo un puerto que salte de la rutina y regrese a esta. Tambien si no quieres meterlo dentro de una rutina todos los PIC tiene un registro de INT ( interrupciones ) este registro lo puedes configurar para se active externamente o internamete, esta interrupcion corta el programa y puedes realizar otra tarea y restablecer la interrupcion. Esto esta limitado a ciertos PIN no todos los puedes usar. 

Por ejemplo los teclados son procedimientos ( void ( keypad ) ) en tu rutina principal de programa puedes enviar verificar este procedimiento cada cierto tiempo, verifica que cambio hubo dentro y realiza no se ( enceder un motor, un led, etc.. ) o ese procedimiento esta ligado a una interrupcion al accionar un switch del teclado, corta la secuencia y realiza la operacion de otro procedimiento y lo regresa al programa! Asi de esta manera se evita poner el PIC ciclos nop.

Te envio este link del IDE que yo uso: http://www.mikroe.com/eng/home/index/

En este puede encontrar ejemplos y demos!

Espero te sirva la informacion!



poseidon2511 dijo:


> Mil gracias por responder a mi pregunta, sin embargo me gustaria que me colaboraras con un ejemplo: digamos que estoy utilizando un pic18f4550, y digamos que quiero saber el estado del pin a1 cuyo pin se ha modificado por un switch y teniendo en cuenta que dentro de este pic se verificara el estaod de otros pines y se haran operaciones diversas con ellos..
> 
> Entiendo que lo anterior se podria hacer con un "while" pero resulta que despues de ese while hay otras funciones que se deben realizar..
> 
> ...


----------

