TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: daltonico82 en 15 de Septiembre de 2011, 11:18:47
-
Hola amigos;
Es la primera vez que intento trabajar con el pequeño 12f629, ya qe hasta ahora sólo había trabajado dentro de la serie 12f con el 12f508. Para empezar y para ver que todo va bien (antes de usar timers, conversores y demás) hago un pequeño programa para ver que las entradas y salidas funcionan como quiero.
Mi problema. GP3 no hace ni caso. Creo que la configuro bien como entrada, desactivo el "master clear" pero nada. Por cierto he visto por aquí y no me ha quedado muy claro: que es lo correcto trabajar sobre que registro :
Del datasheet se desprende: GPIO-GPIO (05h) y TRISIO-GPIO (85h).
Dejo el programa que intento implementar:
#include <12F629.h>
#fuses NOWDT,NOPROTECT,NOCPD,NOMCLR,NOPUT,INTRC_IO,NOBROWNOUT
#use delay(internal=4M)
//#use fast_io(a)
//#use standard_io(a)
void main()
{
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_comparator(NC_NC);
setup_vref(FALSE);
set_tris_a(0x08);
while(1)
{
OUTPUT_A(0X00);
do{
OUTPUT_A(0XFF);
delay_ms(400);
OUTPUT_A(0X00);
delay_ms(400);
}while(input(pin_A3)==1);
}
}
-
Pero que es lo que no hace??
Según entiendo tu ptograma , siempre va a encender y apagar el LED.
Como usaste un "Do-While" siempre entra a la función por lo menos 1 vez pero afuera de esa función no hay nada que impida el retorno y no te das cuenta si salio o no.
Deberias ponerlo dentro de un " While ". o al final del " Do-While" agregar un While(1);
Recuerda poner la resistencia Pull-down o Pull-up según te convenga.
-
hola de nuevo: creo que metí la pata pero bien....
el problema no está en el PIC ni el compilador.... el problema era mío:
Con este programa sí va, al pulsar un pulsador asociado a GP3 entonces parpadean los led asociados al resto del puerto. Ahora seguiré con el proyecto... pero no me queda muy claro lo de los registros GPIO y TRISIO...
#include <12F629.h>
#fuses NOWDT,NOPROTECT,NOCPD,NOMCLR,NOPUT,INTRC_IO,NOBROWNOUT
#use delay(internal=4M)
//#use fast_io(a)
//#use standard_io(a)
void main()
{
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
set_tris_a(0x08);
while(1)
{
OUTPUT_a(0X00);
if(input(pin_A3)==0)
{
OUTPUT_a(0XFF);
delay_ms(400);
OUTPUT_a(0X00);
delay_ms(400);
}
else
{
OUTPUT_a(0X00);
}
}
}
-
GPIO y TRISIO con nombres de los registros.
TRISIO es para configurar los pines , si escribes un 1 en alguno de sus bits,configuras su pin correspondiente como entrada.
Si escribes un 0 , lo configuras como salida.
Solo es para configurar los pines.
GPIO es el registro que escribe o lee el puerto.
Si tu pones un 1 en alguno de sus bits y el pin esta configurado como salida, tendras un 1 lógico en el pin correspondiente.
Si pones un 0 , pues tendras un 0 lógico en ese pin. Osea VCC y GND
En CCS C escribes ouput_high(EL PIN ); para poner a 1 o estado alto.
output_low(EL PIN); para poner a 0 o estado bajo.
Si el pin lo configuraste como entrada en TRISIO , es decir, colocaste un 1 en alguno de sus bits.
Pues a travez de GPIO leerás el estado de ese pin.
para leer todo el puerto
variable=Input_A();
Para leer solo un pin
variable=Input(El PIN);
Solo por nombrar algunas.
-
OK!!!
Queda clarísimo tal y cómo lo explicas. Corrigeme si no estoy en lo cierto. Si además de incluir la directiva #byte TRIS pongo #byte PORT entonces puedo controlar el puerto entero por ejemplo:
PORTB=0X0A;
variable=PORTB;
También existe diferencias entre utilizar #USE FAST_IO (PUERTO): cada vez que se emplea la funcion output...() se saca el valor directamente al puerto y cada vez que se utiliza input...() se lee el puerto, pero no se modifican previamente el registro TRIS correspondiente.
Con #USE STANDARD_IO(PUERTO) a la vez que se lee o se escribe en el puerto se fuerza el bit particular del registro TRIS para que sea efectivamente entrada o salida.
Un saludo, es maravilloso este foro
-
Correcto!! 8)
Saludos!
-
Gracias a los 2 por este hilo, me aclaro dudas. Yo tuve el mismo problema, pero con los pines GP1 y GP2 curiosamente el GP3 si funcionaba como entrada a pesar de que tenia activado el MCLR, :D al desactivarlo con #fuses NOMCLR todo funciono, saludos!!
-
A por ellos; que son pocos y cobardes!!!!
Saludos!!!