TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: El_Coach en 17 de Mayo de 2005, 11:44:00
-
Hola, me ocurre algo que no debería...
En mi proyecto necesito sacar una señal de reloj de unos 200KHz por el pin C0.
He visto varias opciones para implementarlo con una interrupción, pero tan solo me funciona:
output_bit(PIN_C0,!input(PIN_C0));
Esta no me es válida porque inmediatamente despues de cambiar el estado de C0 necesito saber que hay en C0 y utilizo:
if (input(PIN_C0))
{ ........
Entonces al hacer "input" nose porqué, pone a cero el pin C0, y en vez de generar una señal de reloj genera pulsos de apenas unos nanosegundos.
He probado a utilizar la directiva #bit pero no consigo hacer funcionar mi reloj así, no saca absolutamente nada por el pin C0.
Si alguien sabe que puede pasar...
Este es el código:
#include<18F2550.h>
#fuses HS,NOPROTECT,NOBROWNOUT,NOWDT,NOPUT
#use delay(clock=20000000) //Oscilador a 20MHz
#use fast_io(C)
#bit RC0 = 0x07.0
#INT_RTCC //Funciones de la interrupcion del Timer 0
interrupcionTMR0()
{
output_bit(PIN_C0,!input(PIN_C0)); // Así SI funciona
// output_bit(PIN_C0,!RC0); // Así NO funciona
// RC0 = !RC0; // Así NO funciona
set_rtcc(64285);
}
main()
{
set_tris_c(0x00);
output_c(0x00);
setup_counters (RTCC_INTERNAL, RTCC_DIV_1);
enable_interrupts(GLOBAL);
enable_interrupts(INT_RTCC);
set_rtcc(64285);
while(1);
}
Gracias de antemano, un saludo
-
No veo porqué al preguntar por el estado de RC0 con input te lo pone a 0, pero en cualquier caso podrías usar una variable global que fuera cambiando entre 0 y 1 alternativamente, y sacar por el puerto el valor de esa variable cada vez que entre en la interrupción.
En este caso, en vez de usar un "if input" podrás usar un "if variable" con lo que no te ocurrirá eso.
-
Gracias nocturno, tienes razón, podría utilizar una variable.
Aunque sigo sin entender porqué no me funciona la directiva #bit
Un saludo
-
Hola, la directiva #bit no te funciona porque le asignas a RC0 el valor 0x0.7 y no es asi en CCS, si te fijas en el archivo .h de tu micro encontras que el bit que corrsponde al PIN_C0 no esa direccion;
#define PIN_C0 31760
es esta de mas arriba, me parece que confundes los PIC18 con los PIC16, mira el DS y notaras que no es lo mismo.
Ademas para generar esa frecuencia, puedes usar el CCP en modo PWM ajustando el duty cycle al 50% o lo que necesites liberando a tu programa a perder tiempo con esto, claro que no se en que pines esta, pero inclusive creo que la salida el CCP1 es conmutable entre dos pines.
De igual modo aqui tienes un ejemplo de algo parecido que yo hice, digo parecido por el uso de la variable bit que es una int1 y no un pin.
bit = !input(PIN_C0);
set_timer0 (12);
if (--conta==0) {
output_bit (PIN_C0,bit);
conta = 8 ;
}
espero te sirva.
saludos
ARIEL
-
Gracias Pikman

Tienes razón con lo de la dirección del pin C0, aunque me he decidido por utilizar una variable, así será suficiente.
Un saludo