Blog Archive

Con la tecnología de Blogger.

Programando al DSCs

Lenguaje de Programación

Un lenguaje de programación es una técnica estándar de comunicación basada en un conjunto de sintaxis y reglas semánticas que definen los programas del computador y así entregar instrucciones a este ultimo. Vale decir tambien que dicho  lenguaje le da la capacidad al programador de especificarle al computador, qué tipo de datos actúan y que acciones tomar bajo una variada gama de circunstancias, utilizando un lenguaje relativamente próximo al lenguaje humano.

Lenguaje Maquina:
Operación expresada mediante la codificación binaria de cadenas de 1's y 0's.

Lenguaje Ensamblador: 
Un lenguaje ensamblador puro es un lenguaje es un lenguaje en el que cada enunciado produce exactamente una instrucción de maquina. En otra palabras existe una correspondencia uno a uno entre las instrucciones de maquina y los enunciados del programa en ensamblador.

Lenguaje C:
es un lenguaje estructurado, es decir donde los programas son creados a partir de estructuras de control básicas, en base un numero limitado de palabras y construcciones, lo que le da mas precisión y claridad, evitando ambigüedades. (el lenguaje natural humano carece de precisión y es muy ambiguo).

II.-  PROGRAMACION EN LENGUAJE  ENSAMBLADOR  ------------------------


Ejemplo  de Testeo de Programación en Codigo Ensamblador

Ejemplo1: dsPIC30f2010_led.s

/****************************************************************/
// Realizar un programa que enceder algunos pines del puerto E, del controlador 
// Utilizando el cristal Interno
/****************************************************************/

 .equ __30F2010, 1
.include "p30f2010.inc"

config __FOSC, FRC                 ;Trabajar con el Osc Interno
config __FWDT, WDT_OFF         ;Deshabilitar el Perro guardian
config __FBORPOR, MCLR_EN

.equ       Fcy,       #7370000      ;Frecuencia del Osc.Interno
.equiv     LEDS,    0x0033          ;Pines del puerto por prender
.global     __reset                    ;Etiqueta para la primera linea de codigo

.text                         ;Inicio del codigo .asm
__reset:                    ;Etiqueta que indica Comienso de codigo

        ;Conficuarcion de Pines
        mov      #0x00,w0         ;Port E all
        mov        w0,TRISE       ;como salida Digital
        mov        #LEDS,w0      ;Initialize LED pin data to off state
        mov        w0,LATE

buclePrincipal:  
        nop
        bra   buclePrincipal    ;Retorno al Bucle              
.end 


III.- PROGRAMACION EN LENGUAJE  C -------------------------------------------------


Estructura de Programacion de un Codigo C para Microcontroladores




Ejemplos de Programacion de un dsPIC33FJ32MC204


Ejemplo1: flashingALLpins.c

/****************************************************************/
// Realizar un programa que haga parpadear a absolutamente todos los pines 
// I/O del  DSCs cada 2 segundos. 
/****************************************************************/

#include "D:\Archivos de programa\PICC\Devices\33fj32mc204.h"
//#include "dspic_lib\33fj32mc204.h"
#use delay(clock=7370000)
#fuses FRC,OSCIO
/* Direcciones */
////////////////////////
#BYTE porta=0X02c2
#BYTE portb=0X02ca
#BYTE portc=0X02d2
#BYTE trisa=0X02c0
#BYTE trisb=0X02c8
#BYTE trisc=0X02d0
////////////////////////
void main(void)
{
    SETUP_ADC_PORTS(NO_ANALOGS);
    trisa=0x0000;
    trisb=0x0000;
    trisc=0x0000;  
       while (TRUE)
      {
        porta=0xffff;
        portb=0xffff;
        portc=0xffff;
        delay_ms(1000);
        porta=0x0000;
        portb=0x0000;
        portc=0x0000;
        delay_ms(1000);
       }
}

OBS:
Como pueden observar en la imagen no todos los pines del controlador se activan,  esto es debido a una mal direccionamiento del compilador PICC. Para solucionar el presente incombeniente se procede al desarrollo de unas funciones de direcionamiento  en lenguaje de bajo nivel, es decir un lenguanje  asm yaque estos estan directamente ligado con los registros de direccionamiento. El compilador PICC tiene una directiva  #asm#endasm que permiten incluir codigo .asm dentro del .c. Acontinuacion se definiran las siguientes funciones de direcionamiento de los registros que definen los I/O del controlador.

FUNCIONES DE DIRECCIONAMIENTO :

////  1.-FUNCIONES PARA CONFIGURACION DE PUERTOS                ////
////       A)    w_trisx( int16 ) escribe  un valor en el registro trisX             ////
////       B)    w_portx( int16 ) escribe  un valor en el registro portX          //// 


Finalmente la solucion del ejemplo Seria:

#include "D:\Archivos de programa\PICC\Devices\33fj32mc204.h"
//#include "dspic_lib\33fj32mc204.h"
//#include "dspic_lib\libreria_cas_dspic.c"
#use delay(clock=7370000)
#fuses FRC,OSCIO

#BYTE porta=0X02c2
#BYTE portb=0X02ca
#BYTE portc=0X02d2
#BYTE trisa=0X02c0
#BYTE trisb=0X02c8
#BYTE trisc=0X02d0


void w_trisa(int16 data);void w_porta(int16 data);
void w_trisb(int16 data);void w_portb(int16 data);
void w_trisc(int16 data);void w_portc(int16 data);

void main(void)
{
    SETUP_ADC_PORTS(NO_ANALOGS);
    w_trisa(0x0000);w_trisb(0x0000);w_trisc(0x0000);    
       while (TRUE)
      {
        w_porta(0xffff);
        w_portb(0xffff);
        w_portc(0xffff);
        delay_ms(1000);
        w_porta(0x0000);
        w_portb(0x0000);
        w_portc(0x0000);
        delay_ms(1000);
       }
}

//1.-FUNCIONES PARA CONFIGURACION DE PUERTOS
//////////////////////////////////////////////

void w_trisa(int16 data)
{
    #asm
    mov  data,W0
    ior  TRISA    //or entre f y wreg,guarda el resultado en wreg
    mov  TRISA     //mov  0x02c8
    #endasm
}
void w_porta(int16 data)
{
    #asm
    mov  data,W0
    ior  PORTA    //or entre f y wreg,guarda el resultado en wreg
    mov  PORTA     //mov  0x02ca
    #endasm
}
void w_trisb(int16 data)
{
    #asm
    mov  data,W0
    ior  TRISB    //or entre f y wreg,guarda el resultado en wreg
    mov  TRISB     //mov  0x02c8
    #endasm
}
void w_portb(int16 data)
{
    #asm
    mov  data,W0
    ior  PORTB    //or entre f y wreg,guarda el resultado en wreg
    mov  PORTB     //mov  0x02ca
    #endasm
}
void w_trisc(int16 data)
{
    #asm
    mov  data,W0
    ior  TRISC    //or entre f y wreg,guarda el resultado en wreg
    mov  TRISC     //mov  0x02c8
    #endasm
}
void w_portc(int16 data)
{
    #asm
    mov  data,W0
    ior  PORTC    //or entre f y wreg,guarda el resultado en wreg
    mov  PORTC     //mov  0x02ca
    #endasm
}


 
Ejemplo2: Contador.c

/****************************************************************/
// Desarrollar un porgrama que atraves de dos pulsadores se incremente
// y decremente una cuenta mostarada en el display de siete segmentos
/****************************************************************/
Antes de empesar a programar, se entiende que en el presente  ejemplo  no solo involucra activar al pin del controlador como salida digital sino tambien como entrada digital....