Autor Tema: dsPIC Curso Basico con C30  (Leído 349940 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado niuton

  • PIC10
  • *
  • Mensajes: 21
Re: dsPIC Curso Basico con C30
« Respuesta #150 en: 01 de Marzo de 2010, 09:30:20 »
Bueno siguiendo el enlace he podido configurar mi dsPIC a 16 PLL y he realizado el programita del led para mi dsPIC, y como me dijo Renatox colocando en el simulador 117.92MHz se realiza bien la simulación.

Código: [Seleccionar]
# include "p30f3013.h"
#include "libpic30.h"

_FOSC(CSW_FSCM_OFF & XT_PLL16); // CONFIGURACIÓN DEL OSCILADOR A 7.37MHz con PLL 16
_FWDT(WDT_OFF);
_FGS(CODE_PROT_OFF & GWRP_OFF); // NO PROTECCIÓN DEL CODIGO

#define FCY 29000000UL            // Si no me equivoco se debe definir los MIPS a los que trabaja el PIC

void main(){

TRISB=0x0000; // Configuramos RB9-RB0 como salidas.
        while(1){
LATBbits.LATB9=0x0;
__delay_ms(500);
LATBbits.LATB9=0x0;
__delay_ms(500);
}
}

Pero tengo un problema al montarlo en la realidad. Yo programo el dsPIC con un GTP-USB y mi placa es muy simple, el terminal RB9 a un led y MLCR está conectado a 5v por una R=10K y un diodo (mi reset es el del circuito que propone el GTP-USB para programamar por ISCP ) y el cristal de 7.37MHz con los condensadores de 22pF.

Cuando aplico corriente el micro hace unos parpadeos irregulares (me da la sensación como si se estuviese reseteando) cuando acciono el pulsador de reset el led se apaga y al soltarlo vuelve a parpadear de forma irregular, he realizado la prueba de que el led se quede encendido y sigue parpadeando; y por ultimo he realizado una prueba haciendo que MCLR sea una entrada y el micro parpadea bien.

¿de que puede ser?,¿me falta algo por definir?.



Bye y gracias
« Última modificación: 01 de Marzo de 2010, 10:12:42 por niuton »

Desconectado niuton

  • PIC10
  • *
  • Mensajes: 21
Re: dsPIC Curso Basico con C30
« Respuesta #151 en: 02 de Marzo de 2010, 15:35:31 »
Hola de nuevo,

ya he solucionado el tema del reseteo del PIC, es la situación más rara que se me ha presentado en electrónica, el problema era que el led que tengo para hacer parpadear pues estaba malo y al aplicarle los 5v él solito se ponía a parpadear y como yo estaba haciendo un parpadeo pues he ahí el dolor de cabeza :?, bueno ya se solucionó.

Ahora estoy siguiendo los pasos del enlace que me dio Suky y preparo el puero RS232, el problema es que no entiendo qué se pone en los atributos y donde los encuentro en C30

Código: [Seleccionar]
void __attribute__((__interrupt__, __shadow__)) _U1RXInterrupt(void){

¿Todas las interrupciones y funciones tienen que empezar por __attribute__? y ¿qué es __shadow__?.

Gracias y Saludos.

Desconectado niuton

  • PIC10
  • *
  • Mensajes: 21
Ejemplo LED y RS232 30F3013
« Respuesta #152 en: 04 de Marzo de 2010, 15:01:53 »
Hola a todos,

Después de varios intentos y pelearme mucho con el datasheet parece que voy entendiendo como funciona esto del MPLAB más o menos  :o, por lo menos ya se encender un led  :).

Bueno quiero compartir con ustedes he ir colgando en este hilo los ejemplos básicos que vaya haciendo con el MPLAB por si a alguien le sirve:

EJEMPLO 1: PARPADEO DE LED
Código: [Seleccionar]
/*****************************************************************
NIUTON
Fecha: 4-3-2010
Descripción: Parpadeo de led en PIN RB9
Oscilador: cristal XT a 7.37MHZ con PLL16
/*****************************************************************/

#include "p30f3013.h"
#include "stdlib.h"
#include "libpic30.h" // LIBRERIA PARA DELAYS


// FUSES DE CONFIGURACIÓN
_FOSC(CSW_FSCM_OFF & XT_PLL16); // CONFIGURACIÓN DEL OSCILADOR A 7.37MHz con PLL 16
_FWDT(WDT_OFF);
_FBORPOR(MCLR_EN & PBOR_OFF & PWRT_OFF);
_FGS(CODE_PROT_OFF & GWRP_OFF); // NO PROTECCIÓN DE CODIGO


// DEFINICIONES DE CONSTANTES
#define FCY 29480000UL // VALOR DE LOS MIPS PARA LA FUNICON DELAY Y BAUDIOS

/* MAIN ********************************************************************************************* ** */

int main(void){
int i=0;

TRISB=0x0000; // Configuramos RB9-RB0 como salidas.

while(i==0){
LATBbits.LATB9=0x1;
__delay_ms(500);
LATBbits.LATB9=0x0;
__delay_ms(500);
}

}

EJEMPLO 2: COMUNICACIÓN RS232
Código: [Seleccionar]
/*****************************************************************
NIUTON
Fecha: 4-3-2010
Descripción: Comunicación de recepción mediante RS232 a 19200baudios
Oscilador: cristal XT a 7.37MHZ con PLL16
/*****************************************************************/

#include "p30f3013.h"
#include "stdlib.h"
#include "libpic30.h"         // LIBRERIA PARA DELAYS
#include "uart.h" // LIBRERIAS PARA RS232

// FUSES DE CONFIGURACIÓN
_FOSC(CSW_FSCM_OFF & XT_PLL16); // CONFIGURACIÓN DEL OSCILADOR A 7.37MHz con PLL 16
_FWDT(WDT_OFF);
_FBORPOR(MCLR_EN & PBOR_OFF & PWRT_OFF);
_FGS(CODE_PROT_OFF & GWRP_OFF); // NO PROTECCIÓN DE CODIGO

// VARIABLES
unsigned char bufferRX[4]; //buffer donde voy almacenar los elementos de la pila
unsigned char *Ptro_bufferRX=NULL; //inicializacion del buffer
unsigned char index_byte=0; //contador que me indica las veces que se ha leido un dato

// DEFINICIONES DE CONSTANTES
#define FCY 29480000UL // VALOR DE OS MIPS PARA LA FUNICON DELAY Y BAUDIOS
#define BAUDRATE 19200 // VALOR DE BAUDE RATE DE COMUNICACIÓN
#define BRGVAL ((FCY/BAUDRATE)/16)-1
#define ALTIOVAL 1 //=1 INDICA U1ATX/RX, =0 INDICA U1TX/RX,

/* INTERRUPCIONES *********************************************************************************** ** */
void __attribute__((__interrupt__, no_auto_psv)) _U1RXInterrupt(void){

IFS0bits.U1RXIF = 0; //borramos flag de interrupcion
   
    if((U1STAbits.PERR==0) && (U1STAbits.FERR==0)) //compruebo errores
    {
    while(U1STAbits.URXDA==1) //lee mientras haya datos en la pila este bit indica que hay datos y pueden ser leidos
    {  
    *(Ptro_bufferRX) = U1RXREG;
    Ptro_bufferRX++;
    index_byte++; //se incrementa
}    
}   

if(U1STAbits.OERR) U1STAbits.OERR=0; //si hay error de overflow es borrado

}

/* FUNCIONES **************************************************************************************** ** */
// Inicialización del modulo RS232
void inicializar_RS232(void){

unsigned int U1MODEvalue;
unsigned int U1STAvalue;

CloseUART1(); //Turn off UART1module

//Configuramos interrupciones de UART1, recepcion
ConfigIntUART1(UART_TX_INT_DIS & UART_RX_INT_EN & UART_RX_INT_PR7);

//configuramos los registros UMODE y USTA
U1MODEbits.ALTIO= ALTIOVAL; //Se define los pines alternativos o normales
U1MODEvalue= UART_EN & UART_IDLE_CON  & UART_DIS_WAKE & UART_DIS_LOOPBACK &
UART_DIS_ABAUD & UART_ODD_PAR_8BIT & UART_1STOPBIT;

    U1STAvalue= UART_INT_TX & UART_INT_TX_BUF_EMPTY & UART_TX_PIN_NORMAL & UART_TX_DISABLE &
UART_INT_RX_CHAR & UART_ADR_DETECT_DIS & UART_RX_OVERRUN_CLEAR;   
               
OpenUART1(U1MODEvalue, U1STAvalue, BRGVAL); //activamnos el uart con la configuracion seleccionada

Ptro_bufferRX= &bufferRX[0];  //el puntero apunta al primer elemento del buffer
}
/* MAIN ********************************************************************************************* ** */

int main(void){
int i=0;

Ptro_bufferRX= &bufferRX[0]; //apuntar al primer elemento del buffer


TRISB=0x0000; // Configuramos RB9-RB0 como salidas.
TRISC=0x0000; // Configuramos RB9-RB0 como salidas.

PORTCbits.RC13= 0;
PORTCbits.RC14= 1;
inicializar_RS232();

while(i==0){
if(index_byte==4) //se acede cuando se han leido cuatro bytes
{
Ptro_bufferRX= &bufferRX[0]; //vuelvo apuntar al primer elemento del buffer
index_byte=0;                       //inicializo contador
}

LATBbits.LATB9=0x1;
__delay_ms(20);
LATBbits.LATB9=0x0;
__delay_ms(20);
}

}

Estos codigos son gracias a Suky y a un codigo RS232 de Jafema donde explicaba el RS232, espero que estos códigos os sirvan como amí me están sirviendo para empezar, en cuanto tenga más ejemplos hechos os los adjuntos.
Si observais algo que no esté bien o que se puede hacer mejor si me lo podeis decir perfecto, estos códigos me funcionan pero como ya se sabe que funcione no quiere decir que haga lo que uno quiere jejejeje.

Un saludo.

Desconectado niuton

  • PIC10
  • *
  • Mensajes: 21
Ejemplo I2C 30F3013
« Respuesta #153 en: 07 de Marzo de 2010, 09:28:50 »
Hola de nuevo, después de un finde bastante productivo, he conseguido configurar el modulo I2C y hacerlo funcionar, eso despues de leer en este foro algunos ejemplos. Este código esta basado en el ejemplo que puso Microcarsil sobre I2C en este foro.

EJEMPLO 3: Comunicación I2C
Código: [Seleccionar]
/*****************************************************************
NIUTON
Fecha: 7-3-2010
Descripción: Comunicación mediante I2C a 400KHz
Oscilador: cristal XT a 7.37MHZ con PLL16
/*****************************************************************/

#include "p30f3013.h"
#include "stdlib.h"
#include "stdio.h"
#include "libpic30.h" // LIBRERIA PARA DELAYS
#include "uart.h" // LIBRERIAS PARA RS232
#include "i2c.h" // LIBRERIAS PARA I2C

// FUSES DE CONFIGURACIÓN
_FOSC(CSW_FSCM_OFF & XT_PLL16); // CONFIGURACIÓN DEL OSCILADOR A 7.37MHz con PLL 16
_FWDT(WDT_OFF);
_FBORPOR(MCLR_EN & PBOR_OFF & PWRT_OFF);
_FGS(CODE_PROT_OFF & GWRP_OFF); // NO PROTECCIÓN DE CODIGO

unsigned char ack = 0, no_ack=1;
unsigned char datos_int_reg = 0;


// DEFINICIONES DE CONSTANTES
#define FCY 29480000UL // VALOR DE OS MIPS PARA LA FUNICON DELAY Y BAUDIOS
#define FSCL_I2C 400000 // VALOR DE BAUDE RATE DE COMUNICACIÓN I2C
#define I2CBRGVAL ((FCY/FSCL_I2C)-(FCY/1111111))-1

void inicializar_I2C(void){
unsigned int config2, config1;

CloseI2C(); // Cierra el modulo I2C

ConfigIntI2C(MI2C_INT_OFF & SI2C_INT_OFF); //COnfiguracion de interrupciones

config2 = I2CBRGVAL; //Configuración de la velocidad en el bus I2C 400KHz

// Configure I2C for 7 bit address mode     
config1 = (I2C_ON & I2C_IDLE_CON & I2C_CLK_HLD
& I2C_IPMI_DIS & I2C_7BIT_ADD
& I2C_SLW_EN & I2C_SM_DIS
& I2C_GCALL_DIS & I2C_STR_DIS
& I2C_NACK & I2C_ACK_DIS & I2C_RCV_DIS
& I2C_STOP_DIS & I2C_RESTART_DIS
& I2C_START_DIS);

OpenI2C(config1, config2);

IdleI2C(); //Antes de hacer una escritura en el I2C debe estar en modo IDLE
}

int main(void){
int i=0;
char address_W;

// VARIABLES
       address_W      = 0x64;    // Dirección para escritura                     


TRISB=0x0011; // Configuramos RB9-RB0 como salidas.
TRISC=0x0000; // Configuramos RB9-RB0 como salidas.

inicializar_I2C();

LATBbits.LATB9 = 0x1; // ACTIVAR LED

while(i==0){

        __delay_ms(500);

     IdleI2C(); // Realiza una espera hasta que el I2C esté listo para usarse
        StartI2C();
         while(I2CCONbits.SEN); //ESPERO QUE SE COMPLETE START
        MasterWriteI2C(address_W);
         while(I2CSTATbits.ACKSTAT == no_ack);
        MasterWriteI2C(0x01);               // valor = 0x01 para empezar a medir
         while(I2CSTATbits.ACKSTAT == no_ack);
        StopI2C();
             while(I2CCONbits.PEN); //Espero a que termine la secuencia de stop

             IdleI2C(); // Realiza una espera hasta que el I2C esté listo para usarse
        StartI2C();
             datos_int_reg = MasterReadI2C(); IdleI2C(); NotAckI2C();
        StopI2C();
             while(I2CCONbits.PEN); //Espero a que termine la secuencia de stop
           
      printf("\r\n Registro interno: %d\n", datos_int_reg);
}

return(0);
}

Bueno este es el ejemplo, digo lo de siempre, si hay algo que se pueda mejorar en la eficiencia pues soy todo oidos. Si me ha sucedido algo extraño y es que he necesitado colocar la instrucción IdleI2C para que funcione, ¿se supone que esta función espera a que este disponible el bus?, yo he programado para 400KHZ pero al medir con el analizador se obtiene una frecuencia de 500KHZ ¿ sabéis que puede pasar?.

Esta es una imagen de mi analizador con el ejemplo funcionando:
« Última modificación: 07 de Marzo de 2010, 19:09:07 por niuton »

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: dsPIC Curso Basico con C30
« Respuesta #154 en: 02 de Abril de 2010, 19:40:08 »
He estado buscando en los manuales alguna función o instrucción para resetear al dspic por software, he encontrado abort(); pero no lo resetea. Conocerán como puedo hacer esto con un dspic30f.

gracias
control de movimiento

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: dsPIC Curso Basico con C30
« Respuesta #155 en: 02 de Abril de 2010, 20:17:51 »
Podes hacer:

Código: C
  1. _asm
  2.      Reset
  3. _endasm

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: dsPIC Curso Basico con C30
« Respuesta #156 en: 02 de Abril de 2010, 21:19:22 »
Suky lo probé pero me sale este error:

main.c:368: error: '_asm' undeclared (first use in this function)

Probé con esto definiendolo arriba:

#define Reset()    {__asm__ volatile ("Reset");}
y en el código pongo:   Reset();   y lo resetea pero se demora como 1400 ciclos, es esto normal?
Gracias
control de movimiento

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: dsPIC Curso Basico con C30
« Respuesta #157 en: 02 de Abril de 2010, 21:30:53 »
Uy! Es cierto, en C30 la sintaxis es de esa manera, tengo un quilobo en la cabeza  :D No encontré nada en el datasheet sobre esos ciclos que cometas al ejecutar el reset  :?
No contesto mensajes privados, las consultas en el foro

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: dsPIC Curso Basico con C30
« Respuesta #158 en: 03 de Abril de 2010, 00:06:51 »
Hola Foro, una consulta.

He dado mis primeros pasos en C18, todavía no vi nada de C30, pero quisiera saber si existen algunas, muchas o pocas diferencias en las estructuras, sintaxis de ambos C's.

Es decir si se sigue usando los #pragma config, si el manejo de las interupciones es igual, y los otros modulos adc, timer, uart, etc.

Solo para entrar en calentamiento para el C30

muchas gracias, un saludo.
.

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: dsPIC Curso Basico con C30
« Respuesta #159 en: 03 de Abril de 2010, 00:48:49 »
Para configurar los fuses C30 tiene "funciones" para cargar cada palabra de configuración, por ejemplo para un PIC24HJ tenemos:

  • Bits de configuración para protección de Flash y RAM:
  • _FBS(x)
  • _FGS(x)
  • Bits de configuración para selección de oscilador.
  • _FOSCSEL(x)
  • _FOSC(x)
  • Bits de configuración para selección de Watchdog.
  • _FWDT(x)
  • Configuraciones generales como Power-on Reset, pin I2C, JTAG, ect.
  • _FPOR(x)
  • _FICD(x)


Y cada familia  (dspic30f, dspic33f, pic24f, pic24h) tiene distintas funciones, y para saber la sintaxis  hay que darle una miradita al *.h del dispositivo, al final están los define de los mismos.

En los PIC24 existe un vector de interrupción para cada evento (118 fuentes) y 8 niveles de prioridad, además de existir 8 traps que son eventos de alta prioridad por falla del sistema.

Ahora para asignar una función como servicio de interrupción de la misma, se le asigna atributos mediante:

Código: C
  1. __attribute__((__interrupt)) _T1Interrupt(void){
  2.   ....
  3. }

Luego para trabajar con los periféricos es muy parecido a C18. Eso fue un pantallazo!  :mrgreen:

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: dsPIC Curso Basico con C30
« Respuesta #160 en: 03 de Abril de 2010, 14:10:12 »
uuy entonces si hay algunas diferencias...

gracias por los datos suky, tenes algún manual por ahí donde pueda ojear algo para después aprender todos los detalles? o de donde aprendiste algo del C30?

saludos.
.

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: dsPIC Curso Basico con C30
« Respuesta #161 en: 03 de Abril de 2010, 14:52:01 »
C30 aprendí tomando el PIC24HJ, datasheet, los manuales de referencia de Microchip,C30_Users_Guide y los documentos de ayuda que tiene al instalar el compilador. O sea leyendo mucho y aplicando en ejemplos sencillos.

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: dsPIC Curso Basico con C30
« Respuesta #162 en: 03 de Abril de 2010, 17:53:46 »
OK suky, a leer se dijo entonces.

saludos y gracias.
.

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: dsPIC Curso Basico con C30
« Respuesta #163 en: 04 de Abril de 2010, 04:29:03 »
Ya lo he simulado demora como 1400 ciclos pero la instrucción Rsset() toma solo un ciclo el resto es para llegar a la primera instrucción de programa reseteando todo.

Cryn en uno de los manuales hay un ejemplo de configuracion del C30 que lo explican paso a paso, luego los periféricos e interrupciones  los encuentras en el dsPIC30f Family Reference Manual para el caso de los 30f.

saludos.
control de movimiento

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: dsPIC Curso Basico con C30
« Respuesta #164 en: 04 de Abril de 2010, 11:55:04 »
Tengo estos 2 pdf's descargados

dsPIC30F-33F Programmer's Reference Manual.pdf
dsPIC30F Family Reference Manual.pdf

Existe algún otro manual más que provea microchip?

muchas gracias por responder Renatox_ lo checaré, saludos.
.