desktop

Velocidad rara PIC 16F877A para hacer audiómetro.

Buenos Dias a todos... estoy empezando con el maravilloso mundo de los pics.

Mi objetivo actual es crear un generador de señales de 100Hz a 8Khz aproximadamente, ya que deseo realizar un audiómetro casero, por lo que, primeramente me he dedicado a la generación de la señal sinusoidal de cierta frecuencia.

Estoy programando en PCW CCS por la facilidad que me presenta ya que ya se programar en C, pascal, etc...

Para la generacion de la señal he colocado una red R-2R a la salida del puerto B del pic 16f877A, la cual me sirve para convertir la señal Digital a analógica, para lo cual tengo una lista de 50 valores precargados que generan una onda senoidal, estos valores los varío cada cierto tiempo (dependiendo de la interrupcion del Timer0 configurada) y así genero la señal senoidal, cosa que hace de maravilla

El problema radica en que necesito hacer, como máximo una señal de 8Khz, por lo que, tendría que cambiar de valor de la lista cada 8KHz*50=400Khz, que me daría 2.5uS. Estoy trabajando con un Oscilador de 20Mhz, por lo que la máxima frecuencia por cada interrupcion debería ser de 20Mhz/4=5Mhz , por lo que debería poder entrar en cada interrupcion cada 0.2uS, por lo que en teoría debería tener tiempo de sobra para dibujar mi señal sinusoidal.

El problema que tengo es que no logro que la entrada a la interrupcion del Timer0 sea cada 0.2uS, puse aqui un ejemplo sencillo en el que prendo y apago todo el puertoB lo mas rapido que se puede, que en teoría es 0.2uS, claro, se que por cada instruccion dentro del Timer0 se tardaría eso, pero igual no creo que este ejemplo debería producir una frecuencia de 40Khz, sino mucho mayor, ya que, me está dando más lento de lo que según yo, debería dar: 0.2uS*2*cantidad de intrucciones= 0.2uS*2*(pongamosle 10 exagerando)=250Khz ... 6 veces mas lento¡¡¡

este es el codigo mas somple que hice para probar la rapidez

#include <16f877A.h>
#fuses HS, NOPROTECT, NOWDT, NOPUT, NOBROWNOUT, NOLVP, NOCPD
#use delay(clock=20000000)
#byte PuertoB = 06
byte i;

#int_rtcc
void Timer0(void) {
if (i==1){
PuertoB=0;
i=0; }
else {
PuertoB=255;
i=1; }
set_timer0(255);
}

void main(void) {
set_tris_b(0x00);
enable_interrupts(GLOBAL);
enable_interrupts(INT_RTCC);
setup_counters(RTCC_INTERNAL,RTCC_DIV_1);
set_rtcc(0);
while(TRUE);
}

Si alguno tiene alguna idea de porque son esos los tiempos por favor iluminenme¡¡¡ jejeje

Gracias de antemano
 
Atrás
Arriba