Professional Documents
Culture Documents
FACULTAD DE INGENIERA
ESCUELA PROFESIONAL DE INGENIERA
ELECTRNICA
ANALIZADOR DE ESPECTROS
Docente:
Integrantes:
Trujillo 2015
#include <xc.h>
#include <htc.h>
#include <stdio.h>
#include <stdlib.h>
#include "fft.h"
ADCON1 = 0b00001110;
ADCON2 = 0b10110110;
TRISA = 0b00000001;
TRISB = 0b00000000;
TRISC = 0b00000000;
TRISD = 0b00000000;
PORTA = 0b00001110;
PORTB = 0b11111111;
PORTC = 0b11111111;
PORTD = 0b11111111;
PORTE = 0b00000000;
while(1)
{
short i = 0;
unsigned short result;
for (i = 0; i < 64; i++)
{
ADCON0 = 0b00000011;
while(GODONE);
realNumbers[i] = ((short)(ADRESH << 8) +
(short)ADRESL) - 512;
imaginaryNumbers[i] = 0;
__delay_us(7);
}
imaginaryNumbers[k] * imaginaryNumbers[k]);
place = 0x40000000;
root = 0;
if (realNumbers[k] >= 0)
{
while (place > realNumbers[k]) place = place >> 2;
while (place)
{
if (realNumbers[k] >= root + place)
{
realNumbers[k] -= root + place;
root += place * 2;
}
root = root >> 1;
place = place >> 2;
}
}
realNumbers[k] = root;
}
short maximo=0;
PORTAbits.RA5 = 1;
PORTAbits.RA4 = 0;
if(PORTEbits.RE0 == 1 && PORTEbits.RE1 == 0 && PORTEbits.RE2
==0)
{
PORTD = 0b11111111;
PORTC = 0b11111111;
PORTAbits.RA1 = 1;
PORTAbits.RA2 = 1;
PORTAbits.RA3 = 1;
for (int i=1 ;i<32; i++)
{
PORTAbits.RA4 = 1;
if (realNumbers[i] >= 170)
PORTB = 0b00000000;
else if(realNumbers[i] >= 156)
PORTB = 0b10000000;
else if(realNumbers[i] >= 133)
PORTB = 0b11000000;
else if(realNumbers[i] >= 113)
PORTB = 0b11100000;
else if(realNumbers[i] >= 90)
PORTB = 0b11110000;
else if(realNumbers[i] >= 68)
PORTB = 0b11111000;
else if(realNumbers[i] >= 40)
PORTB = 0b11111100;
else if(realNumbers[i] >= 10)
PORTB = 0b11111110;
else
PORTB = 0b11111111;
__delay_us(500);
PORTAbits.RA5=0;
PORTAbits.RA4=0;
}
}
else if(PORTEbits.RE0 == 0 && PORTEbits.RE1 == 1 &&
PORTEbits.RE2 == 0)
{
PORTB = 0b11111111;
PORTC = 0b11111111;
PORTAbits.RA1 = 1;
PORTAbits.RA2 = 1;
PORTAbits.RA3 = 1;
for (int i=1 ;i<32; i++)
{
PORTAbits.RA4 = 1;
if (realNumbers[i] >= 170)
PORTD = 0b00000000;
else if(realNumbers[i] >= 156)
PORTD = 0b10000000;
else if(realNumbers[i] >= 133)
PORTD = 0b11000000;
else if(realNumbers[i] >= 113)
PORTD = 0b11100000;
else if(realNumbers[i] >= 90)
PORTD = 0b11110000;
else if(realNumbers[i] >= 68)
PORTD = 0b11111000;
else if(realNumbers[i] >= 40)
PORTD = 0b11111100;
else if(realNumbers[i] >= 10)
PORTD = 0b11111110;
else
PORTD = 0b11111111;
__delay_us(500);
PORTAbits.RA5=0;
PORTAbits.RA4=0;
}
}
else if(PORTEbits.RE0 == 0 && PORTEbits.RE1 == 0 &&
PORTEbits.RE2 == 1)
{
for (int i=1 ;i<32; i++)
{
PORTAbits.RA4 = 1;
if (realNumbers[i] >= 170)
{
PORTD = 0b11111111;
PORTAbits.RA1 = 1;
PORTAbits.RA2 = 1;
PORTAbits.RA3 = 1;
PORTBbits.RB7 = 0;
PORTBbits.RB6 = 0;
PORTBbits.RB5 = 0;
PORTBbits.RB4 = 0;
PORTBbits.RB3 = 0;
PORTBbits.RB2 = 0;
PORTBbits.RB1 = 0;
PORTBbits.RB0 = 0;
}
else if(realNumbers[i] >= 156)
{
PORTD = 0b11111111;
PORTAbits.RA1 = 1;
PORTAbits.RA2 = 1;
PORTAbits.RA3 = 1;
PORTBbits.RB7 = 1;
PORTBbits.RB6 = 0;
PORTBbits.RB5 = 0;
PORTBbits.RB4 = 0;
PORTBbits.RB3 = 0;
PORTBbits.RB2 = 0;
PORTBbits.RB1 = 0;
PORTBbits.RB0 = 0;
}
else if(realNumbers[i] >= 133)
{
PORTD = 0b11111111;
PORTAbits.RA1 = 1;
PORTAbits.RA2 = 1;
PORTAbits.RA3 = 1;
PORTBbits.RB7 = 1;
PORTBbits.RB6 = 1;
PORTBbits.RB5 = 0;
PORTBbits.RB4 = 0;
PORTBbits.RB3 = 0;
PORTBbits.RB2 = 0;
PORTBbits.RB1 = 0;
PORTBbits.RB0 = 0;
}
else if(realNumbers[i] >= 113)
{
PORTD = 0b11111111;
PORTAbits.RA1 = 1;
PORTAbits.RA2 = 1;
PORTAbits.RA3 = 1;
PORTBbits.RB7 = 1;
PORTBbits.RB6 = 1;
PORTBbits.RB5 = 1;
PORTBbits.RB4 = 0;
PORTBbits.RB3 = 0;
PORTBbits.RB2 = 0;
PORTBbits.RB1 = 0;
PORTBbits.RB0 = 0;
}
else if(realNumbers[i] >= 90)
{
PORTD = 0b11111111;
PORTAbits.RA1 = 1;
PORTAbits.RA2 = 1;
PORTAbits.RA3 = 1;
PORTBbits.RB7 = 1;
PORTBbits.RB6 = 1;
PORTBbits.RB5 = 1;
PORTBbits.RB4 = 1;
PORTBbits.RB3 = 0;
PORTBbits.RB2 = 0;
PORTBbits.RB1 = 0;
PORTBbits.RB0 = 0;
}
else if(realNumbers[i] >= 68)
{
PORTD = 0b11111111;
PORTAbits.RA1 = 1;
PORTAbits.RA2 = 1;
PORTAbits.RA3 = 1;
PORTBbits.RB7 = 1;
PORTBbits.RB6 = 1;
PORTBbits.RB5 = 1;
PORTBbits.RB4 = 1;
PORTBbits.RB3 = 1;
PORTBbits.RB2 = 0;
PORTBbits.RB1 = 0;
PORTBbits.RB0 = 0;
}
else if(realNumbers[i] >= 40)
{
PORTB = 0b11111111;
PORTAbits.RA1 = 1;
PORTAbits.RA2 = 1;
PORTAbits.RA3 = 1;
PORTDbits.RD7 = 1;
PORTDbits.RD6 = 1;
PORTDbits.RD5 = 1;
PORTDbits.RD4 = 1;
PORTDbits.RD3 = 1;
PORTDbits.RD2 = 1;
PORTDbits.RD1 = 0;
PORTDbits.RD0 = 0;
}
else if(realNumbers[i] >= 10)
{
PORTB = 0b11111111;
PORTD = 0b11111111;
PORTAbits.RA1 = 1;
PORTAbits.RA2 = 1;
PORTAbits.RA3 = 0;
}
else
{
PORTB = 0b11111111;
PORTD = 0b11111111;
PORTAbits.RA1 = 1;
PORTAbits.RA2 = 1;
PORTAbits.RA3 = 1;
}
__delay_us(500);
PORTAbits.RA5=0;
PORTAbits.RA4=0;
}
}
else {}
}
}
Librera fft.h
#ifndef FFT_C
#define FFT_C
#include <htc.h>
#include "fft.h"
wi >>= 1;
for (i=m; i<n; i+=istep)
{
j = i + l;
// Here I unrolled the multiplications to prevent overhead
// for procedural calls (we don't need to be clever about
// the actual multiplications since the pic has an onboard
// 8x8 multiplier in the ALU):
// tr = FIX_MPY(wr,fr[j]) - FIX_MPY(wi,fi[j]);
c = ((long int)wr * (long int)fr[j]);
c = c >> 14;
b = c & 0x01;
tr = (c >> 1) + b;
c = ((long int)wi * (long int)fi[j]);
c = c >> 14;
b = c & 0x01;
tr = tr - ((c >> 1) + b);
// ti = FIX_MPY(wr,fi[j]) + FIX_MPY(wi,fr[j]);
c = ((long int)wr * (long int)fi[j]);
c = c >> 14;
b = c & 0x01;
ti = (c >> 1) + b;
c = ((long int)wi * (long int)fr[j]);
c = c >> 14;
b = c & 0x01;
ti = ti + ((c >> 1) + b);
qr = fr[i];
qi = fi[i];
qr >>= 1;
qi >>= 1;
fr[j] = qr - tr;
fi[j] = qi - ti;
fr[i] = qr + tr;
fi[i] = qi + ti;
}
}
--k;
l = istep;
}
}
#endif
DIAGRAMA ESQUEMTICO