TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: safiro_pic en 20 de Abril de 2006, 20:05:36

Título: nolvp
Publicado por: safiro_pic en 20 de Abril de 2006, 20:05:36
Este programa lo he llamado arranque simple, el pin_b0 seria como el boton  de inicio
y el pin b1 como el boton de parada que ilumina el led en el pin a3.

              #INCLUDE <16F84A.H>
              #FUSES XT,NOWDT,PUT,NOPROTECT
              #USE DELAY(CLOCK=4000000 ,restart_WDT)
              #BYTE PORT_A=0X05
              #BYTE PORT_B=0X06

              void main()
                 {
                        port_a=0x00;
                        port_b=0x00;
                        set_tris_a(0x00);
                        set_tris_b(0xFF);

                     while (1)
                        {
                            IF(input(pin_B0))

                              {
                                output_high(pin_a3);  //ecendido de led  PINA3 se mantiene encendido mientras
                                                      // no se pulsa el "pin b1"
                              }

                            if(input(pin_B1))         
                              {
                                output_low(pin_a3);   //apagado de led PINA3 se mantiene apagado mientras
                                                      //no se pulsa el "pin b0" viceversa
                              }
                        }
                  }


tengo unas preguntas respecto al programa leyendo el minicursillo que esta muy bueno
pero hay algunas cosas que no los entiendo.

1.- en fuses el NOLVP lei que significa  "Impide que el micro pueda grabarse en modo de bajo voltage."
    yo coloque este instruccion despues de noprotect pero al compilarlo me da un error"unknown keyword in #fuses"
    que significa eso,o en que casos se debe colocar esta instrucciòn pero a pesar los ejemplos que vi en la  mayoria va con eso  ???

2.- en la parte de port_a=0x00;port_b=0x00 esto significa limpiar los puertos no es cierto si estoy equivocado   por favor diganmelo, cuando los quito o los elimino el programa me corre igual simulando en proteus, no veo   aqui la diferencia de colocar o no  alguien me podrian explicar donde notar esta diferencia???
saludos a todos
Título: Re: nolvp
Publicado por: kain589 en 20 de Abril de 2006, 20:28:32
Si no me equivoco el 16f84 no posee la posibilidad de programacion en bajo nivel de voltaje, asi que te daria problemas por eso
Título: Re: nolvp
Publicado por: jfh900 en 20 de Abril de 2006, 20:37:13
Las instrucciones:

port_a=0x00;
port_b=0x00;

lo que hacen es poner como salidas los dos puertos y poner esas salidas a cero. Como despues manejas los pines de forma individual y dado que no has declarado la directiva de compilación: #USE FAST_IO cada vez que pones un pin como salida el compilador le configura como salida (añade instrucciones redundantes) y cuando realizas una entrada lo pone como entrada. Por eso si eliminas las dos primeras instrucciones sigue funcionando el programa.
Título: Re: nolvp
Publicado por: vszener en 21 de Abril de 2006, 05:04:43
Buenas!!!de todas formas, una forma ordenada d eprogramacion seria la siguiente
Código: [Seleccionar]
                        set_tris_a(0x00);
                        set_tris_b(0xFF);
                        port_a=0x00;
                        port_b=0x00;
Primero defines los pines de entrada y salida de los puertos del pic y despues lo usas.....aunque no te hace falta definir los puertos del pic, en ccs hay funciones que manejan el pueto completo correspondiente.


Suerte!!! :wink:
Título: Re: nolvp
Publicado por: safiro_pic en 22 de Abril de 2006, 11:47:36
hola la forma compacta segun JFH900  seria el siguiente?
 añadir la directiva use_fast_io y eliminar port_a,port_b
 

              #INCLUDE <16F84A.H>
              #FUSES XT,NOWDT,PUT,NOPROTECT
              #USE DELAY(CLOCK=4000000 ,restart_WDT)
              #BYTE PORT_A=0X05
              #BYTE PORT_B=0X06

             "#USE_FAST_IO"

              void main()
                 {
                        set_tris_a(0x00);
                        set_tris_b(0xFF);
              LO MISMO ABAJO

vszener no entendi la ultima parte donde mencionas que hay funciones
que manejan el puerto completo,es decir set_tris_a  y set_tris_b que configuran
el puerto como entrada o salida se lo puede reemplazar por otra funcion??
Título: Re: nolvp
Publicado por: vszener en 22 de Abril de 2006, 11:59:27
Buenas!!! no no, haber para declarar que pines del puerto deben ser de entrada/salida esta las funciones set_tris_x, donde x indica la letra del puerto a,b, c,...

Ahora bien, para utilizar los pines del puerto no te hace falta declarar el puerto como tu realizas:
Código: [Seleccionar]
              #BYTE PORT_A=0X05
              #BYTE PORT_B=0X06
Para despues limpiar dichos puertos con estas instrucciones que tu usas:
Código: [Seleccionar]
                        port_a=0x00;
                        port_b=0x00;
Las cuales sirven para poner todos los pines a 0....CCS trae incorporado funciones de manejo de puertos, si te miras el manual, veras que esta esta funcion:
Código: [Seleccionar]
                        output_x(value);          value debe ser un entero de 8 bits y x indica la letra del puerto a, b, c ....
La cual permite no declarar ningun puerto como te he comentado anteriormente y a efectos practicos realiza la misma funcion, para poner todos los pines a 0 como tienes tu declarado:
Código: [Seleccionar]
                        output_a(0x00);          //port a 0
                        output_b(0x00);          //port b 0

Aqui te dejo el enlace para la descarga del manual:
http://www.ccsinfo.com/downloads.php


Suerte!!! :wink:
Título: Re: nolvp
Publicado por: vszener en 22 de Abril de 2006, 12:02:16
Bueno e indicarte que la instruccion #use_fast_io tal como la pones esta mal declarada, tu programa puede quedar asi:
Código: [Seleccionar]
              #INCLUDE <16F84A.H>
              #FUSES XT,NOWDT,PUT,NOPROTECT
              #USE DELAY(CLOCK=4000000 ,restart_WDT)
              #use_fast_io(a)
              #use_fast_io(b)

              void main()
                 {
                        set_tris_a(0x00);
                        set_tris_b(0xFF);

                        output_a(0x00);          //port a 0
                        output_b(0x00);          //port b 0

                     while (1)
                        {
                            IF(input(pin_B0))

                              {
                                output_high(pin_a3);  //ecendido de led  PINA3 se mantiene encendido mientras
                                                      // no se pulsa el "pin b1"
                              }

                            if(input(pin_B1))         
                              {
                                output_low(pin_a3);   //apagado de led PINA3 se mantiene apagado mientras
                                                      //no se pulsa el "pin b0" viceversa
                              }
                        }
                  }


Suerte!!! :wink:
Título: Re: nolvp
Publicado por: safiro_pic en 22 de Abril de 2006, 19:10:10
 gracias  hermano ahora si me quedo claro un saludo a  los foristas de  todopic