Sunteți pe pagina 1din 37

Aluno: Luis Otvio Professor: Joo Baptista

dsPIC = PIC + DSP

Dados de 16 bits

Instrues de 24 bits.
Registradores 16 x 16 de uso geral Arquitetura Harvard Modificada

40 MIPS de operao a 40 MHz de operao.


Hardware de Multiplicao de 16x16 bits Hardware de diviso de 32 bits x 16 bits.

PC de 23 bits que enderea 4Mx24 bits na memria de

programa

MEMRIA

Memria de programas separada da memria de

dados. Permite acesso direto no programa da memria. O espao endereado por um valor de 24 bits oriundos do Contador de Programa (PC) de 16 bits, ou tabela de operao no espao de dados.

FRC Oscilador

FRC Oscilador com PLL


Oscilador Primario (XT, HS, EC) Osciladot primario com PLL

Oscilador Secundrio (LP)


Oscilador LPRC Oscilador FRC com postscaler. Fcy = Fosc/2

PERIFRICOS

#include <p33FJ64GP706.h> //Standard header file #include <math.h>

#include <dsp.h>

//Standard header file //Standard header file

_FBS( RBS_NO_RAM & BSS_NO_FLASH &

BWRP_WRPROTECT_OFF ) _FSS( RSS_NO_RAM & SSS_NO_FLASH & SWRP_WRPROTECT_OFF ) _FGS( GSS_OFF & GWRP_OFF ) _FOSCSEL(IESO_OFF & FNOSC_PRIPLL) _FOSC( FCKSM_CSDCMD & POSCMD_XT ) _FWDT( FWDTEN_OFF ) _FPOR( FPWRT_PWR128 )

#define

#define
#define #define fractional

PLL 6.25 // Mximo PLL Fos 8000000 // 8MHz oscillator Fcy (Fos*PLL)/2 // Ciclo de Mquina F_SAMPLE 20000 buffer_adc; contador; saida; entrada;

unsigned int

unsigned int
unsigned int

struct{ unsigned BIT0:1; unsigned BIT1:1; unsigned BIT2:1; unsigned BIT3:1; unsigned BIT4:1; unsigned BIT5:1; unsigned BIT6:1; unsigned BIT7:1; }FLAGS_bits;

void Init_Tmr3(void);

void Init_ADC12(void);
void DAC_init(void); void MCP4922_DAC(unsigned int dado_dac, unsigned

char canal_dac);

#define SDI_DAC

#define TRIS_SDI_DAC
#define BT1 #define TRIS_BT1

LATGbits.LATG7 TRISGbits.TRISG7 PORTDbits.RD10

TRISDbits.TRISD10

#define OUT1

#define TRIS_OUT1
#define DATA_PIN_7 #define DATA_PIN_6

LATDbits.LATD0 TRISDbits.TRISD0 LATGbits.LATG15 LATGbits.LATG14

#define DATA_PIN_5 #define DATA_PIN_4 #define TRIS_DATA_PIN_7 #define TRIS_DATA_PIN_6 #define TRIS_DATA_PIN_5 #define TRIS_DATA_PIN_4 #define E_PIN #define RS_PIN #define TRIS_E #define TRIS_RS

LATGbits.LATG13 LATGbits.LATG12 TRISGbits.TRISG15 TRISGbits.TRISG14 TRISGbits.TRISG13 TRISGbits.TRISG12 LATBbits.LATB11 LATBbits.LATB10 TRISBbits.TRISB11 TRISBbits.TRISB10

#define CS_DAC

#define LDAC
#define SHDN #define SCK_DAC #define SDO_DAC #define TRIS_SCK_DAC #define TRIS_SDO_DAC #define TRIS_CS_DAC

#define TRIS_LDAC
#define TRIS_SHDN

LATGbits.LATG9 LATCbits.LATC2 LATCbits.LATC1 LATGbits.LATG6 LATGbits.LATG8 TRISGbits.TRISG6 TRISGbits.TRISG8 TRISGbits.TRISG9 TRISCbits.TRISC2 TRISCbits.TRISC1

void Init_ADC12(void) { //AD1CON1 Register AD1CON1bits.FORM = 0; // AD1CON1bits.FORM = 1; // (-2048..2047) // // AD1CON1bits.FORM = 2; AD1CON1bits.FORM = 3;

// Data Output Format: (0..4095) // Data Output Format: Signed Integer

// Data Output Format: Fractional // Data Output Format: Signed Fractional

AD1CON1bits.SSRC = 2; AD1CON1bits.ASAM = 1; AD1CON1bits.AD12B = 1; AD1CON1bits.SIMSAM = 0;

// Amostragem controlada pelo Timer // Controle de incio de amostragem: ao fim de // cada converso // Modo de operao 12-bit // No se aplica no modo 12-bit (amostragem // simultnea)

//AD1CON2 Register AD1CON2bits.BUFM=0; AD1CON2bits.CSCNA=1;

(Scan) AD1CON2bits.CHPS=0; - Somente


// Incio do Buffer sempre no endereo // Relativo Zero // Controle de Varredura ligado // No se aplica no modo 12-bit

AD1CON2bits.SMPI=0; converso AD1CON2bits.ALTS=0;


AD1CON2bits.VCFG=0;

// Canal Zero (CH0) // Interrupo ao fim de cada


// No alterna as amostragem atravs // do MUX A/B // Referncia de tenso do A/D // (VDD/VSS)

Internas

//AD1CON3 Register AD1CON3bits.ADRC=0; // ADC Clock derivado do Clock do sistema AD1CON3bits.ADCS =7; // ADC Conversion Clock // Tad=(Tcy/2)*(ADCS+1)= (1/8M)*8 = 1us (1MHz) // ADC Conversion Time for 12-bit Tc=14*Tad = 14us // ADC Conversion Time for 10-bit Tc=12*Tad = 12us

//AD1CHS0: A/D Input Select Register AD1CHS0bits.CH0SA=0; AD1CHS0bits.CH0NA=0; // MUXA +ve input selection (AIN0) for CH0 // MUXA -ve input selection (Vref-) for CH0

//AD1CHS123: A/D Input Select Register AD1CHS123bits.CH123SA=0; // MUXA +ve input selection (AIN0) for CH1 AD1CHS123bits.CH123NA=0; // MUXA -ve input selection (Vref-) for CH1

//AD1CSSH/AD1CSSL: A/D Input Scan Selection Register AD1CSSH = 0x0000; AD1CSSL = 0x0002;// Seleo de Bits de Varredura (Scan) AIN0-AIN5: somente // AN1

//AD1PCFGH/AD1PCFGL: Port Configuration Register AD1PCFGL=0xFFFF; AD1PCFGH=0xFFFF; AD1PCFGLbits.PCFG1 = 0; // AN1 como entrada analgica

IFS0bits.AD1IF = 0; IEC0bits.AD1IE = 1; interrupoAD1CON1bits.ADON = 1; }

// Limpa Flag de Interrupo de A/D // Habilita // Liga o ADC

void Init_Tmr3(void) { T3CONbits.TON = 0; TMR3 = 0x0000; //PRx = (Fcy/Pre Scale) * Tempo //Pre Scaler = 1:1 //Tempo = 1/taxa de amostragem PR3 = Fcy / F_SAMPLE; // Acerta prescaler para freq. de amostragem IFS0bits.T3IF = 0; IEC0bits.T3IE = 0; //Start Timer 3 T3CONbits.TON = 1; }

void DAC_init(void)

TRIS_LDAC = 0; TRIS_SHDN = 0; TRIS_CS_DAC = 0; TRIS_SDO_DAC = 0; TRIS_SDI_DAC = 1; TRIS_SCK_DAC = 0;

SPI2STATbits.SPIEN = 0; SPI2CON1bits.PPRE = 3; SPI2CON1bits.SPRE = 6; SPI2CON1bits.MSTEN = 1; SPI2CON1bits.CKP = 0; SPI2CON1bits.CKE = 0; SPI2CON1bits.SMP = 1; SPI2CON1bits.MODE16 = 1; SPI2CON1bits.DISSDO = 0; SPI2CON1bits.DISSCK = 0; SPI2STATbits.SPIEN = 1; LDAC = 0; Zero) SHDN = 1; Zero) }

// Desabilita controlador SPI // Primary Pre-scale Clock 4:1 // Secondary Pre-scale Clock 1:1 // SPI em modo Master (Gera Clock) // Modo 0,0 - Clock em Idle = 0 // Modo 0,0 - Data em Idle = 0 // Data In amostrado no fim do bit // Modo 16 bit // Pino com Data do controlador SPI // Pino com Clock do controlador SPI // Habilita controlador SPI // Mantem Load DAC em Um (ativo em // Mantem Shutdown em Um (ativo em

void MCP4922_DAC(unsigned int dado_dac, unsigned char canal_dac) { if(canal_dac == 0) dado_dac |= 0x7000; else dado_dac |= 0xF000; CS_DAC = 0; // Inicializa comunicao SPI SPI2BUF = dado_dac; // Dado dado_dac = SPI2BUF; // Leitura do buffer necessria para a limpeza do // bit SPIRBF while(!SPI2STATbits.SPIRBF); CS_DAC = 1; // Finaliza comunicao SPI }

void __attribute__((__interrupt__)) _ADC1Interrupt(void) {

OUT1=1; FLAGS_bits.BIT0=1; entrada=ADC1BUF0; MCP4922_DAC(saida,0); IFS0bits.AD1IF = 0;

// Limpa o flag de

interrupo OUT1=0; }

int main (void) {


TRIS_BT1=1; TRIS_OUT1=0;

Init_Tmr3(); Init_ADC12(); DAC_init();

DAC MCP4922

// Inicializao do Controlador SPI que utilizado // Para se comunicar com o

contador=0; FLAGS_bits.BIT0=0; MCP4922_DAC(0x800,0);

for(;;) {

if(FLAGS_bits.BIT0) { if (!BT1)
{ saida=entrada*5; } else { saida=entrada; FLAGS_bits.BIT0=0; } // Ganho 5.

}
} }

S-ar putea să vă placă și