Parpadeando un LED en función de la frecuencia de la señal

1

Escribí una función para interactuar con mi 'PIC16F1788'. El código envía pulsos fuera del puerto 'RC4' a una frecuencia específica, para hacer que un LED parpadee de acuerdo con esa frecuencia. Por lo tanto, el LED parpadeará más rápido o más lento dependiendo de la magnitud de la frecuencia. Decidí tomar un código parpadeante y variar el tiempo de retardo de acuerdo con mi frecuencia de entrada de la siguiente manera.

void blink(int frequency){
/* starts the LED blinking at a particular frequency */

     PORTCbits.RC4=0XFF;  // RC4 on
     __delay_ms(1000/frequency);   // time in ms dealing with frequency values in kHz
     PORTcbits.RC4=0X00;   // RC4 off
     __delay_ms(1000/frequency);   // time in ms dealing with frequency values in kHz

}

¿Funcionaría este código? ¿Es una buena idea? ¿Hay algún modo de que pueda mejorarlo?

Actualización # 1

Cambié mi código en función de algunas de tus entradas Pero aún así no tengo suerte ejecutándolo. se compila bien, pero el LED no parpadea = (

#include <htc.h>
#include <pic.h>
#include <pic16f1788.h>
#include <xc.h>
// Config word
#define frequ  100000
#define _XTAL_FREQ   20000000


void main()

{

   // output

TRISB5 = 0;

// configure CCP3

CCP3CONbits.CCP3M = 0x0C;   // set it to PWM mode; and active high

// configure Timer 2
PR2 = ((_XTAL_FREQ)/(4*16*frequ))-1;  // Timer 2 max value is (20MHz / 4*16*f)-1 = max duty, fosc=20MHz, prescaler of 16
CCPR3 = 0.5*(PR2+1);        // CCP3 compare value is 50% duty cycle
T2CONbits.T2OUTPS = 0x02;   // Timer 2 prescaler 16
T2CONbits.TMR2ON = 1;       // Timer 2 on

}
    
pregunta sam brosteain

2 respuestas

1

Supongo que su problema es que su problema es con el tipo de datos que se usa para los atributos de la función de demora. Cuando utiliza 'entero' como el tipo de datos de atributo, no puede expresar valores menores a 1 sino mayores a 0. Si su frecuencia es mayor que 1000, el código no funcionará. necesita manipular la variable de frecuencia de tal manera que la división no vaya a estar por debajo de 1, pero seguirá relacionada con la frecuencia. Intenta dividir la frecuencia con una constante.

    
respondido por el Rohit Biradar
0

En lugar de retrasos deliberados, usaría un contador para dividir la frecuencia de entrada para hacer la frecuencia de salida.

    
respondido por el Olin Lathrop

Lea otras preguntas en las etiquetas