Autor Tema: Directiva #bit  (Leído 2645 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado El_Coach

  • PIC12
  • **
  • Mensajes: 79
Directiva #bit
« 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 Sonrisa
"Hazlo o no lo hagas, pero nunca lo intentes"

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
RE: Directiva #bit
« Respuesta #1 en: 17 de Mayo de 2005, 11:48:00 »
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.

Desconectado El_Coach

  • PIC12
  • **
  • Mensajes: 79
RE: Directiva #bit
« Respuesta #2 en: 17 de Mayo de 2005, 11:54:00 »
Gracias nocturno, tienes razón, podría utilizar una variable.
Aunque sigo sin entender porqué no me funciona la directiva #bit

Un saludo RollEyes
"Hazlo o no lo hagas, pero nunca lo intentes"

Desconectado pikman

  • Moderador Local
  • PIC24F
  • *****
  • Mensajes: 682
RE: Directiva #bit
« Respuesta #3 en: 17 de Mayo de 2005, 21:48:00 »
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
saludos
PikMan

Desconectado El_Coach

  • PIC12
  • **
  • Mensajes: 79
RE: Directiva #bit
« Respuesta #4 en: 20 de Mayo de 2005, 10:28:00 »
Gracias Pikman Giño

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

Un saludoVacilando
"Hazlo o no lo hagas, pero nunca lo intentes"


 

anything