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

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

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: dsPIC Curso Basico con C30
« Respuesta #75 en: 13 de Enero de 2007, 21:15:50 »
 Gracias Nocturno ya me pudo compilar mi programa, no estaba poniendo los archivos libp30F4011-coff.a y libp30F4011-elf.a. 
control de movimiento

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: dsPIC Curso Basico con C30
« Respuesta #76 en: 13 de Enero de 2007, 21:36:38 »
  En el programa que puse arriba para hacer bascular el pin D1 utilizando el timer1 he utilizado la librería Timer.h.

 También es posible configurar el T1CON con la librería p30f4011.h utilizando las estructuras que trae con el siguiente formato:

 (nombre de la estructura).(nombre del bit)=(valor 1 o 0)

 El programa anterior lo he reducido aun más para que puedan ver el detalle de configurarlo de las dos maneras.

 En la rutina de interrupción escribí la función WriteTimer1(); por tanto he borrado también la configuración del prescaler que está a 1-256, eto me obliga a reconfigurarlo en la siguiente línea, pero utilizando la librería timer.h tengo que poner toda la configuración del timer1 otra vez, que es:

OpenTimer1(T1_ON & T1_GATE_OFF & T1_IDLE_STOP & T1_PS_1_256 &                               T1_SYNC_EXT_OFF   &   T1_SOURCE_INT, valor);

 Esta rutina me consume 10 ciclos de instrucción, viéndolo con el stop watch, lo cual es mucho si solo quiero reconfigurar dos bits.

 Otra forma de hacerlo, pero que no me sale, es configurando los bits de la estructura relacionada al timer1, que está en la librería p30f4011.h, que es esta:

 /* --------------------------- */
/* Timer1 register definitions */
/* --------------------------- */

/* Generic structure for Timer 1 Control Register */
typedef struct tagTCON_16BIT {
        unsigned             :1;
        unsigned TCS      :1;
        unsigned TSYNC  :1;
        unsigned             :1;
        unsigned TCKPS  :2;
        unsigned TGATE  :1;
        unsigned             :6;
        unsigned TSIDL  :1;
        unsigned            :1;
        unsigned TON     :1;
} TCON_16BIT;

 Entonces escribí:

 TCON_16BIT.TCKPS0=1; TCON_16BIT.TCKPS1=1;   /* prescaler 1-256 */


 pero me sale error al compilar, en estas dos líneas.

 Como podría hacer para actualizar los bits TCKPS<0:1> utilizando el p30f4011.h....?

 Pongo el código aquí:

  /* ejemplo de configuración del Timer1 con la librería Timer.h */
 /* y con las estructuras del p30f4011.h */
 #include <p30f4011.h>
 #include "utilities.c"
 #include <timer.h>

 unsigned int valor;     /*valor entero sin signo  */

 void __attribute__((__interrupt__)) _T1Interrupt(void)
 {
  toggle(_RD1);          /* hace bascular el pin RD1 (utilities.c)*/
  WriteTimer1(0);        /* lo resetea a 0 */
  /* actualiza el valor del prescaler a 1-256 debido a que fue borrado por */
  /* la instrucción WriteTimer1(), esta función consume 10 ciclos. */
  OpenTimer1(T1_ON & T1_GATE_OFF & T1_IDLE_STOP & T1_PS_1_256 &    T1_SYNC_EXT_OFF & T1_SOURCE_INT, valor);
  /* Otra forma de hacerlo, directamente con los bits, pero no me funciona */
  /* está bien puesto así,,? o como debería ser */
  /* TCON_16BIT.TCKPS0=1; TCON_16BIT.TCKPS1=1; */
  IFS0bits.T1IF = 0;     /* borra el flag del timer1 */
 }

 int main(void)
 {
  TRISD = 0;             /* PORTD como salida */
  _RD1 = 0;              /* RD1 en bajo */
  /* Habilitando interrupción del timer 1, prioridad 1 */
  ConfigIntTimer1(T1_INT_PRIOR_1 & T1_INT_ON);
  valor = 32768;         /* 2^15 */
  WriteTimer1(0);        /* lo cargamos con cero */ 
  /* configuración del timer1 temporizador síncrono, y prescaler 1-256  */
  /*  PR1=valor (periodo), timer1 no funciona en modo espera */
  OpenTimer1(T1_ON & T1_GATE_OFF & T1_IDLE_STOP & T1_PS_1_256 &  T1_SYNC_EXT_OFF & T1_SOURCE_INT, valor);
  /* bucle infinito en espera de la interrupción */
  while(1)
  {
       nop4();           /*  4 instrucciones vacìas (utilities.c)*/
  }
 }
 
 /* gracias */

« Última modificación: 13 de Enero de 2007, 21:47:21 por renatox_ »
control de movimiento

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: dsPIC Curso Basico con C30
« Respuesta #77 en: 13 de Enero de 2007, 21:43:06 »
 Me olvidaba hay dos instrucciones que son:

 nop4();               /* 4 ciclos de instrucción vacíos */
 toggle(_RD1);     /* hace bascular a cualquier bit o pin */

 Están en la librería utilities.c en esta hay funciones macros muy interesantes que sirven para muchas aplicaciones generales, les recomiendo que la revisen y la utilizen.

 la pongo abajo.

 Saludos.
control de movimiento

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: dsPIC Curso Basico con C30
« Respuesta #78 en: 14 de Enero de 2007, 04:19:09 »
Con la definición de la estructura sólamente no vale. Luego tienes que definir una variable con esa estructura para poder utilizarla. Si te fijas en el p30F6014.h aparece también esta línea:

extern volatile TCON_16BIT T1CONbits __attribute__((__sfr__));

lo que te permite hacer:

T1CONbits.TCKPS0=1; T1CONbits.TCKPS1=1;   /* prescaler 1-256 */

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: dsPIC Curso Basico con C30
« Respuesta #79 en: 17 de Enero de 2007, 18:38:56 »
 Asi es, no me había dado cuenta en el p30f4011.h también está esa declaración.

/* T1CON: Timer 1 Control Register */
extern volatile unsigned int T1CON __attribute__((__sfr__));
extern volatile TCON_16BIT T1CONbits __attribute__((__sfr__));

lo probaré, gracias.
control de movimiento

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: dsPIC Curso Basico con C30
« Respuesta #80 en: 19 de Enero de 2007, 21:50:50 »
 Hola otra vez, alguno de ustedes ha trabajado con la librería STDIO.H, por lo que he leido en el manual de C30 dado por Microchip esta librería permite crear achivos de texto en los dspic30f, puede crear archivos, cerrarlos, escribirlos, leerlos, y verificar que esto esté bien hecho, Como muestra les pongo una rutina pequeña sobre estas sentencias.

 
Código: [Seleccionar]
#include <stdio.h> /* for fopen, fclose, */
/* printf,FILE, NULL, EOF */
int main(void)
{
 FILE *myfile1;
 int y;
 // el archivo se llama afile1, w+ es escribir en el archivo, myfile1 es el valor retornado
 if ((myfile1 = fopen("afile1", "w+")) == NULL)
    printf("Cannot open afile1\n");       // con stdio.h si permite utilizar el printf
 else
 {
    printf("afile1 was opened\n");
    y = fclose(myfile1);                   // cierra el archivo afile1, el valor de retorno es puesto en y
    if (y == EOF)                            // si retorna EOF ha ocurrido un error en el cierre
       printf("afile1 was not closed\n"); // \n significa final de la línea
    else
       printf("afile1 was closed\n");
 }
}


 Como ven el stdio.h si permite utilizar el printf(); pero lo he probado para enviarlo por el usart1 y no compila.
 
 Pero hasta que tamaño de archivo de texto se puede crear con esta librería, por ejemplo podría almacenar 100 bloques de código G osea aproximandamente 100*30bytes(c/bloque)=3kbytes

 Tampoco no se como sacar cualquier línea del archivo y almacenarla en un buffer, alguien me puede aclarar esto, gracias.

 Quisiera poner el tutorial del C30 de Microchip por si alguien aun no lo tiene pero pesa 3Mbytes, como hago para ponerlo en el foro.

 Saludos
control de movimiento

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: dsPIC Curso Basico con C30
« Respuesta #81 en: 20 de Enero de 2007, 02:25:33 »
¿Qué error te da al no compilar?

Para colgar un fichero de 3Mb lo mejor es que lo publiques en box.net o en rapidshare y nos pases el link.

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: dsPIC Curso Basico con C30
« Respuesta #82 en: 20 de Enero de 2007, 21:12:35 »
 hola Nocturno, ya lo he puesto en rapidshare, el archivo se llama tutorial C30 y herramientas de 16bits.

 Con respecto a los errores que me da volveré a compilarlo y anotar los errores aun no me queda claro que se puede hacer con la librería stdio.h.

 El vínculo es :

http://ssl.rapidshare.com/cgi-bin/collectorszone.cgi
control de movimiento

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: dsPIC Curso Basico con C30
« Respuesta #83 en: 20 de Enero de 2007, 22:09:26 »
Quiero poner las pruebas que hize con unas rutinas matemáticas de la librería MATH.H. Lo he simulado y me compila muy bien, después calculé los tiempos que estas demoran con ayuda del StopWatch y me llevé una gran sorpresa, para mal.

Código: [Seleccionar]
#include <p30f4011.h>
#include <uart.h>
#include <math.h> /* for acos */
#include <stdlib.h>
#include "utilities.c"

/* Received data is stored in array Buf */
char Buf[80];

void configUSART2()
{
 // Holds the value of baud register. Holds the value of uart config reg
 // Holds the information regarding uart TX & RX interrupt modes
 unsigned int baudios, U1MODEvalue, U1STAvalue;
 /* Configure uart1 receive and transmit interrupt */
 ConfigIntUART2(UART_RX_INT_EN & UART_RX_INT_PR2 &
                UART_TX_INT_DIS & UART_TX_INT_PR6);
 // Configure UART1 module to transmit 8 bit data with one stopbit, 9600 baudios
 baudios = 103;
 //U1BRG=103; U1MODE=0x8000; U1STAbits.UTXEN=1;
 U1MODEvalue = UART_EN & UART_IDLE_STOP & UART_RX_TX & UART_DIS_WAKE &
               UART_DIS_LOOPBACK & UART_DIS_ABAUD & UART_NO_PAR_8BIT &
               UART_1STOPBIT;
 U1STAvalue = UART_INT_TX_BUF_EMPTY & UART_TX_PIN_NORMAL & UART_TX_ENABLE &
              UART_INT_RX_CHAR & UART_ADR_DETECT_DIS & UART_RX_OVERRUN_CLEAR;
 OpenUART2(U1MODEvalue, U1STAvalue, baudios);
}

void __attribute__((__interrupt__)) _U2RXInterrupt(void)
{
 unsigned int j;              //local variable
 for (j=0;j<=12;j++)
  {
   while (DataRdyUART2()==0)
    {
     nop2();
    }
   Buf[j]=getcUART2();
  }
 putsUART2((unsigned int *)Buf);
 IFS1bits.U2RXIF = 0;
}

int main(void)
{
 char a[]="128";
 char b[]="-12.85";
 double x,y,z;

 Buf[13]='\0';
 _TRISF2=1; _TRISF3=0; _TRISD1=0;             
 char Txdata[] = {'M','i','c','r','o','c','h','i','p',' ','I','C','D','2',
                  ' ','\13','\10','\0'};
 configUSART2();
 putsUART2((unsigned int *)Txdata);
 
 // rutina matemática
 x=2.0; y=3.0;
 z=atoi(a);        // demora 556 ciclos
 z=atof(b);        // demora 1782 ciclos
 y=pow (x, y);     // demora 4992 ciclos
 y=2*2*2;          // demora 4 ciclos
 //


 while (1)
  {
   toggle(_RD1);
   delay20(); delay20(); delay20(); delay20(); delay20();
  }
}

Y este es su código en asembler.

Código: [Seleccionar]
67:                 z=atoi(a);        // demora 556 ciclos
  13DA  200380     mov.w #0x38,0x0000
  13DC  40000E     add.w 0x0000,0x001c,0x0000
  13DE  2000A2     mov.w #0xa,0x0004
  13E0  EB0080     clr.w 0x0002
  13E2  07F6D7     rcall 0x000192
  13E4  DE80CF     asr 0x0000,#15,0x0002
  13E6  07FB91     rcall 0x000b0a
  13E8  982760     mov.w 0x0000,[0x001c+76]
  13EA  982771     mov.w 0x0002,[0x001c+78]
68:                 z=atof(b);        // demora 1782 ciclos
  13EC  2003C0     mov.w #0x3c,0x0000
  13EE  40000E     add.w 0x0000,0x001c,0x0000
  13F0  B81160     mul.uu 0x0004,#0,0x0004
  13F2  EB0080     clr.w 0x0002
  13F4  07F761     rcall 0x0002b8
  13F6  982760     mov.w 0x0000,[0x001c+76]
  13F8  982771     mov.w 0x0002,[0x001c+78]
69:                 z=pow (x, y);     // demora 5000 ciclos
  13FA  90214E     mov.w [0x001c+72],0x0004
  13FC  9021DE     mov.w [0x001c+74],0x0006
  13FE  90202E     mov.w [0x001c+68],0x0000
  1400  9020BE     mov.w [0x001c+70],0x0002
  1402  07FBAE     rcall 0x000b60
  1404  982760     mov.w 0x0000,[0x001c+76]
  1406  982771     mov.w 0x0002,[0x001c+78]
70:                 y=2*2*2;          // demora 6 ciclos
  1408  200000     mov.w #0x0,0x0000
  140A  241001     mov.w #0x4100,0x0002
  140C  982740     mov.w 0x0000,[0x001c+72]
  140E  982751     mov.w 0x0002,[0x001c+74]
71:                 //y=asinf(x);


 Lo probé varias veces para estar seguro, pero me salían la misma cantidad de instrucciones en cada operación. Como es posible que y=pow(2,3); se demore casi 5000 instrucciones e y=2*2*2; lo haga en solo 4, además los convertidores de datos se toman mucho tiempo en pasar una cadena a un número real.

 Y una pregunta como puedo enviar la variable z=-12.85; por el puerto serial.

 Saludos.
« Última modificación: 23 de Enero de 2007, 17:06:48 por renatox_ »
control de movimiento

Desconectado Milo

  • PIC16
  • ***
  • Mensajes: 101
Re: dsPIC Curso Basico con C30
« Respuesta #84 en: 22 de Enero de 2007, 05:53:36 »

Buennass:

Por ejemplo con esto:

z = - 12.85

printf("\n\r Valor variable z: %.3f ?",z)

%f  para imprimir float

%.(nºdigitos que quieres que se muestren)f

saludos,
"En tanto que haya alguien que crea en una idea, la idea vive" Ortega y Gasset

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: dsPIC Curso Basico con C30
« Respuesta #85 en: 23 de Enero de 2007, 17:03:25 »
 Hola Milo voy a probar

printf("\n\r Valor variable z: %.3f ?",z)

pero porque pones esto \n\r .

 Nocturno la configuración del prescales 1-256 para el timer1, lo puse en la forma  como dijiste pero no compiló.

T1CONbits.TCKPS0=1; T1CONbits.TCKPS1=1;   /* prescaler 1-256 */

Probé con esta forma y si compila.

T1CONbits.TCKPS=3;

Revisando el registro T1CON si cambian los bitsTCKPS<0:1> a 1-1.
control de movimiento

Desconectado Milo

  • PIC16
  • ***
  • Mensajes: 101
Re: dsPIC Curso Basico con C30
« Respuesta #86 en: 25 de Enero de 2007, 08:00:09 »

Buenass:

/r /n es para retorno de carro y bajar una línea,

lo puedes poner así perfectamente.

float z=3.123;

printf("Valor variable z: %.3f ",z);

prueba y ya nos cuentas,

saludos,

"En tanto que haya alguien que crea en una idea, la idea vive" Ortega y Gasset

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: dsPIC Curso Basico con C30
« Respuesta #87 en: 01 de Febrero de 2007, 20:09:16 »
 Milo corregí el problema el código es este,

Código: [Seleccionar]
#include <p30f4011.h>
#include <uart.h>

void configUSART1()
{
 unsigned int baudios, U1MODEvalue, U1STAvalue;
 ConfigIntUART1(UART_RX_INT_DIS & UART_RX_INT_PR2 &
                UART_TX_INT_DIS & UART_TX_INT_PR6);
 baudios = 103;
 U1MODEvalue = UART_EN & UART_IDLE_STOP & UART_RX_TX & UART_DIS_WAKE &
               UART_DIS_LOOPBACK & UART_DIS_ABAUD & UART_NO_PAR_8BIT &
               UART_1STOPBIT;
 U1STAvalue = UART_INT_TX_BUF_EMPTY & UART_TX_PIN_NORMAL & UART_TX_ENABLE &
              UART_INT_RX_CHAR & UART_ADR_DETECT_DIS & UART_RX_OVERRUN_CLEAR;
 OpenUART1(U1MODEvalue, U1STAvalue, baudios);
}

int main(void)
{
 float z;
 _TRISD1=0;
 configUSART1();
 z=-12.85;
 
 printf("Valor variable z: %.3f ",z);

 while (1)
  {
   _RD1=1;
  }
}

 Cuando compilo no me salen errores pero aparece esto:

Código: [Seleccionar]
C:\Archivos de programa\Microchip\MPLAB C30\bin\pic30-coff-ld.exe
Error: A heap is required, but has not been specified

BUILD FAILED: Thu Feb 01 11:57:43 2007

Los archivos adheridos a mi proyecto son estos:

Código: [Seleccionar]
Source Files.-    pruebas.c
Header Files.-    uart.h
Library Files.-     libpic30-coff.a   libp30f4011-coff.a   libpic30f4011-elf.a
linker Scripts.-    p30f40011.gld

 Me faltará algo más..? Milo lo puedes compilar a ver si te sale correctamente este programa de prueba.
control de movimiento

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: dsPIC Curso Basico con C30
« Respuesta #88 en: 02 de Febrero de 2007, 01:57:37 »
Tu problema ya se resolvió en el foro. Mira aquí:
http://www.todopic.com.ar/foros/index.php?topic=13152.0

Desconectado jfmateos2

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3145
Re: dsPIC Curso Basico con C30
« Respuesta #89 en: 02 de Febrero de 2007, 04:32:37 »
Renatox, no soy capaz de acceder al enlace que pusiste de RapidShare.


 

anything