jueves, 25 de agosto de 2016

PROGRAMACIÓN DE DsPIC

Saludos a todos los que están leyendo mi blog,en esta oportunidad compartiré con uds un tema fundamental,lo que es programación en microcontroladores de gama alta como son los de 16 bits.
vamos a trabajar con el modelo dspic33fj32mc204 ¿por que?
por que es el único modelo que se puede simular en proteus ,por esa razón lo estoy utilizando.
*En primer lugar vamos a leer un poco de teoría.


Los Un dsPIC es un [pequeño DSP + un PIC-MCU], entendiendo que su arquitectura es basada en la de un PIC®MCUs y que integra a la perfección las funciones del microcontrolador y las funciones DSP con un único conjunto de instrucciones y archivo de registros.


 "Cuenta con  (desde 30)  MIPS  que ofrece el rendimiento de un DSP con la simplicidad de un MCU"
Los Controladores Digitales de Señales (DSCs) de Microchip se comercializan en más de medio centenar de modelos diferentes de las familias dsPIC30F y dsPIC33F y consisten en la combinación de los microcontroladores de 16 bits con los recursos necesarios para soportar las funciones clásicas de los DSP.

dato: Los dsPIC nacen después de que los DSP hayan sido desarrollados durante años por otras empresas aprovechando la experiencia acumulada por otros fabricantes.



*En segundo lugar vamos a empezar con la estructura de programación que se utiliza. 

Toda  programación se va hacer en el IDE oficial  de Microchip  que esMPLABX3.0 y el compilar XC16(para microntroladores de 16 bits) http://www.microchip.com/mplab/mplab-x-ide , una vez abierto la pagina  darle click en la pestaña download (para descargar el mplabx3.0) y download archive(para descargar el compilador xc16),una vez descargado e instalado estamos listos para empezar a codear.

              Estructura de un programa para DsPic

/*
 * File:   main_PLed.c
 * Author: jhon ore
 * Created on 30 de junio de 2016, 16:56
 */

(*).....
#pragma config PWMPIN = ON               
#pragma config HPOL = ON      
#pragma config LPOL = ON               
#pragma config ALTI2C = OFF
#pragma config FPWRT = PWR128   

int main(void) {

   (**).....

    while (1) {

    (***).....

    }
    return 0;
}

Notas:
1.-Configuración de fuses.
(*).-Antes del programa principal,es fundamental saber configurar estos fuses para poder garantizar el buen funcionamiento del  dspic.

2.-Aquí solamente va a ocurrir una sola vez.
(**).-Aquí va todo las configuraciones y llamados de funciones configuración de I/O,módulos del dspic (UART,ADc,QEI,TIMER,INT etc.) llamado de funciones creados por nuestros propios medios para que se nos facilite la programación.

3.-Aquí va a ocurrir todo el tiempo.
(***).-Aquí va todo lo que siempre se va a querer repetir,por ejemplo un prende led o eventos que quieren que ocurran repetidamente.

Siempre se va a empezar con un comentario que es opcional-->luego se configura los fuses del dspic a usar-->luego se empieza con un funciónmain,ahí dentro se ejecutara todo el programa,después de pasar por el while,la función retorna a cero.

.-la plantilla anterior siempre se usa en los programa de microcontroladores de microchip.

*En tercer lugar empezaremos con los ejemplos.

          Ejemplos de programación en DsPic.

E-1:Prende led.
1.1.-Meta: hacer parpadear cada 500 ms.
1.2.-Herramientas:
      1.2.1.-Software:
               -Proteus.
               -MplabX
      1.2.2.-Hardware:
               -Resistencia 220 ohm.
               -Dspic33fj32mc204.
               -Led green.
1.3.-Resultado:

       código:

//1.-
/*******librerias******************/
#include "xc.h"
#include <libpic30.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
//2.-
/********Configuration Fuses************ */
//FPOR
#pragma config PWMPIN = ON               
#pragma config HPOL = ON      
#pragma config LPOL = ON               
#pragma config ALTI2C = OFF
#pragma config FPWRT = PWR128               
// FWDT
#pragma config WDTPOST = PS32768        // Watchdog Timer Postscaler bits (1:32,768)
#pragma config WDTPRE = PR128              // Watchdog Timer Prescaler bit (1:128)
#pragma config WINDIS = OFF                    // Watchdog Timer Window Enable bit 
#pragma config FWDTEN = OFF                 // Watchdog Timer Enable bit
// FOSC
#pragma config POSCMD = HS              // Primary Oscillator Mode Select bits (HS )
#pragma config OSCIOFNC = OFF        // OSC2 Pin Function bit (OSC2 is clock output)
#pragma config IOL1WAY = ON            // Peripheral pin select configuration 
#pragma config FCKSM = CSDCMD     // Clock Switching Mode bits
// FOSCSEL
#pragma config FNOSC = PRIPLL           // Oscillator Source Selection                                         
#pragma config IESO = OFF                // Two-speed Oscillator Start-up Enable bit
//3.-
/***********************************************************************************/
#define MIPS 40      //MIPS deseados (máximo 40 para el dspic33fj32mc204)
#define crystal 16      //valor del cristal en MHZ       
#define FCY MIPS*1000000 //frecuencia de instrucción 40Mips
#define delay_ms(x) __delay32((FCY/1000)*x) //delay en milisegundos
#define delay_us(x) __delay32(MIPS*x) //delay en microsegundos
//4.-
void config_clk_HSPLL(void);//funcion para elevar a 40 mips
//5.-
int main(void) {

    AD1PCFGL = 0xFFFF;//configuración de todas las salidas digitales
    config_clk_HSPLL();//llamando a la función configuración
    _TRISA0 = 0; //Configurando A0 como salida 
    _LATA0 = 0; //se inicia en apagado

    while (1) {
        _LATA0 = ~_LATA0;//para  hacer el prendido y apagado del led.
        delay_ms(500);//tiempo de encendido y apagado.
    }
    return 0;
}

//6.-
void config_clk_HSPLL(void) {//funciona de configuración de velocidad del dspic
    int M = MIPS * 8 / crystal;                 //tranformacion ppara optener el valor M
    PLLFBD = M - 2;                                  // M = 28
    CLKDIVbits.PLLPRE = 0;                 // N1 = 2
    CLKDIVbits.PLLPOST = 0;              // N2 = 2
    while (_LOCK == 0);
}

   Diagrama esquemático-Proteus:


Explicación del código:
1.-incluimos librerías únicos del xc16 y de C.
2.-configuramos los fuses de acuerdo con el datasheet del dspic a usar.
3.-hacemos unos define para nuestra fácil programación:
  #define MIPS 40      //velocidad del dspic es de 40Mhz o 40MIPS
  #define crystal 16      //valor del cristal en MHz externo       
  #define FCY MIPS*1000000 //frecuencia de instrucción 40Mips
  #define delay_ms(x) __delay32((FCY/1000)*x) //delay en milisegundos
  #define delay_us(x) __delay32(MIPS*x) //delay en microsegundos
4.- se hace el nombramiento dela función (void config_clk_HSPLL(void)).
5.- entramos a la función main.
6.-creación de nuestra función.Esta función es la encargada de elevar la velocidad del dspic a 40Mips,es decir, si estamos usando como en este caso un cristal de 16Mhz,no dara una velocidad de 16/2=8Mhz,para nuestro uso es muy poco,por ese motivo lo elevamos,en vez de tener una velocidad de 8MHz ,elevando vamos a tener una velocidad de 40MHz.

Ahora la pregunta es ¿De donde salio los valores de M , N1 y N2?
Para nuestro caso salieron del datasheet del dspic en la sección OSCILLATOR CONFIGURATION.

Nota:si gustan siempre usen la funcion void config_clk_HSPLL(void),si quieren menos velocidad,solo tienes que cambiar el valor del #define MIPS 40 y el #define crystal 16  al  valor que quieran utilizar,por ejemplo.
Quiero una velocidad de 20 Mips y estoy utilizando un crystal de 8 MHz externo.
seria:
#define MIPS 20  //velocidad del dspic
#define crystal 8 //valor del cristal externo

EJEMPLOS DE PROGRAMACIÓN DE DsPIC.

Como hemos visto anteriormente un poco de teoría y un ejemplo básico,ahora vamos a los ejemplos básicos e importantes del manejo de los módulos que tiene el DsPIC33FJ32MC204.

Guía de clases.

(***):Para los que quieren el código ,solo me tienen que escribir.

1.-Prende Led.


(***)

2.-Prende Led de 8.


(***)


3.-Uso de Button.


(***)

4.-Uso de Varios Button.


(***)

5.-Uso del TIMER.


(***)

6.-Interrupción por TIMER.



(***)

7.-Prende Led Sentido Ascendente/Descendente por TIMER.



(***)

8.-Interrupción Externa.



(***)

9.-ADC Simple.



(***)

10.-Variador de Velocidad de Led con ADC.



(***)

11.-Comunicación SERIAL RS232 Simple.



(***)

12.-Recepción por SERIAL RS232.



(***)

13.-ADC y comunicación SERIAL.



(***)

14.-PWM Simple-Control de giro de un motor.



(***)