TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado 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
-
Si no me equivoco el 16f84 no posee la posibilidad de programacion en bajo nivel de voltaje, asi que te daria problemas por eso
-
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.
-
Buenas!!!de todas formas, una forma ordenada d eprogramacion seria la siguiente
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:
-
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??
-
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:
#BYTE PORT_A=0X05
#BYTE PORT_B=0X06
Para despues limpiar dichos puertos con estas instrucciones que tu usas:
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:
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:
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:
-
Bueno e indicarte que la instruccion #use_fast_io tal como la pones esta mal declarada, tu programa puede quedar asi:
#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:
-
gracias hermano ahora si me quedo claro un saludo a los foristas de todopic