Autor Tema: dsPIC Curso Basico con C30  (Leído 349818 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 #90 en: 10 de Febrero de 2007, 17:42:33 »
 hola, si a mi tambièn me pide clave voy a poner mis archivos en otro lugar, de ahi te paso el link.

 Si, lo acabo de leer el link que pusiste Nocturno sobre el printf, lo voy a probar de inmediato.

 Saludos.
control de movimiento

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: dsPIC Curso Basico con C30
« Respuesta #91 en: 14 de Febrero de 2007, 23:22:45 »
 Hize las pruebas con el printf para el último código que pegué, poniendo en la pestaña "Heap Size = 256", y me compiló muy bien el programa, lo corroboré con el hiperterminal y efectivamente me manda la cadena correcta.

 Pero noté ciertos detalles:

1) Compila tanto para el USART1 como el USART2, pero cuando lo pruebo con USART2 en el hiperterminal no aparece nada.

2) El programa ocupa el 30% de la memoria de programa total (0.3*16k), pero cuando quito la línea del printf el programa solo ocupa el 2% de la memoria de programa total.

3) Cuando corro el programa paso a paso y viendolo con el Stop Watch, demora 2000 ciclos de instrucción para posicionarse en la primera línea del programa.

 Intenté solucionar esto con la siguiente opción:


poniéndolo en la opción 5, pero el tamaño de programa no se redujo en nada.

 - Es posible usar el printf con el USART2 a alguién le ha salido..?
 - Al poner "Heap Size = 256", que es lo que estoy haciendo realmente.

lo voy a probar también con el SPI.

 Saludos.

 
control de movimiento

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: dsPIC Curso Basico con C30
« Respuesta #92 en: 15 de Febrero de 2007, 02:45:02 »
He utilizado poco el printf en C30 pero es cierto que los programas engordan muchíiiiiiiiiiiiisimo.

Si consigues mejorar los resultados sería interesante que lo contaras por aquí.

Desconectado Milo

  • PIC16
  • ***
  • Mensajes: 101
Re: dsPIC Curso Basico con C30
« Respuesta #93 en: 15 de Febrero de 2007, 05:48:54 »


Buennass:

Citar
- Es posible usar el printf con el USART2 a alguién le ha salido..?

A mi, a mi,  :-/  me volvi loco repasando todo el código, mirando en el foro, preguntando al gran Nocturno, hasta escribiendo al soporte técnico de microchip. Pero al final se soluciono, al parecer las primeras versiones del C30 no lo habían contemplado, pero ya se ha solucionado, yo tengo la versión v2.05, 31 October 2006 y me funciona, tienes que hacer lo siguiente.

Primero declarate esto:

extern int __C30_UART;

y luego dentro del main o cualquier otra funcion esto:

__C30_UART=2;  //Para utilizar la USART2.

De todas maneras si tienes algún problema comentalo, también puedes verlo las mejoras de las versiones en el archivo readme.html dentro de la carpeta MPLAB C30.

saludos y suerte con la programación

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

Desconectado Milo

  • PIC16
  • ***
  • Mensajes: 101
Re: dsPIC Curso Basico con C30
« Respuesta #94 en: 15 de Febrero de 2007, 07:53:45 »

He estado mirando el la página de microchip y la versión ultima que hay disponible para bajar es la 2.05 la de octubre de 2006,

Aquí esta el enlace

Mplab C30 v2.05
"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 #95 en: 17 de Febrero de 2007, 00:08:12 »
 Milo, a mi no me sale  :(, està bién así como lo he puesto..?

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

extern int __C30_UART;

void configUSART2()
{
 unsigned int baudios, U1MODEvalue, U1STAvalue;
 ConfigIntUART2(UART_RX_INT_DIS & UART_RX_INT_PR2 &
                UART_TX_INT_DIS & UART_TX_INT_PR6);
 baudios = 103;  //9600 baudios a 16MIPS
 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);
}

int main(void)
{
 float x,z;
 _TRISD1=0;
 configUSART2();
 x=3.85;
 z=-12.85;
 
__C30_UART=2;  //Para utilizar la USART2.

 printf("Valor variable x: %.2f \n",x);
 printf("Valor variable z: %.2f \n",z);

 while (1)
  {
   _RD1=1;
  }
}

los includes son:
 - usart.h
 - libp30f4011-coff.a
 - libp30f4011-elf.a
 - libpic30-coff.a
 - p30f4011.gld

 Me faltará algo más, puedes darle una compilada a mi programita a ver si corre en tu MPLAB v2.05, yo tengo la V2.03 Student Edition.
control de movimiento

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: dsPIC Curso Basico con C30
« Respuesta #96 en: 17 de Febrero de 2007, 00:17:12 »
 toda la informaciòn que tiene Microchip sobre el C30 la pueden encontrar en el enlace que puso Milo más arriba.

 El archivo "16-Bit Language Tools Libraries.pdf" es el tutorial de C30, la parte de periféricos está bien explicada y con ejemplos semcillos.
control de movimiento

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: dsPIC Curso Basico con C30
« Respuesta #97 en: 17 de Febrero de 2007, 04:23:33 »
 Ya me salió :-/, el problema era la versión del compilador, yo uso el C30 v2.03 pero la desinstalé e instalé el C30 v2.05 y compiló, además tuve que declarar en el programa:

#include <libpic30.h>

 Comprobé en el hiperterminal la cadena y funciona correctamente.

 
control de movimiento

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: dsPIC Curso Basico con C30
« Respuesta #98 en: 17 de Febrero de 2007, 04:28:38 »
La importancia de estar actualizado. Me alegro que lo consiguieras.

Desconectado Milo

  • PIC16
  • ***
  • Mensajes: 101
Re: dsPIC Curso Basico con C30
« Respuesta #99 en: 19 de Febrero de 2007, 05:56:54 »


Muy bien renatox enhorabuena y a seguir avanzando

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 #100 en: 02 de Marzo de 2007, 17:24:29 »
 Hola otra ves, he visto una función en CCS que permite copiar un valor de punto flotante a cadena, esta función la apliqué en el C30 y me funciona muy bién, este es lo que compilé;

 char mystring[10];
 float myfloat;
 myfloat=-12.34;
 sprintf(mystring,"<%f>",myfloat);

// mystring ={'<', '-', '1', '2', '.', '3', '4', '0', '0', '0'}

 Pero increiblemente esto toma más de 10 000 ciclos, que horror. Habría alguna otra forma más efectiva de pasar valores de tipo flotante y tipo entero a cadena..? o como se haría en CCS.

 Con esto, la cadena mystrig ya la puedo transmitir por SPI.

control de movimiento

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: dsPIC Curso Basico con C30
« Respuesta #101 en: 02 de Marzo de 2007, 17:41:57 »
Es que los printf del C30 son al dsPIC como el Windows al PC; se comen todos los recursos del micro y nadie sabe qué es lo que hace por dentro.

Yo pienso que lo ideal en tu caso sería una solución artesanal. Te describo mi idea, que no he probado:
1.- Determinas el nº máximo de decimales que vas a procesar, en adelante n
2.- Multiplicas tu float por 10^n y te quedas con un nº entero.
3.- Ahora Divides tu entero por 10 y te quedas con la parte entera. Lo multiplicas por 10 con lo que el último dígito ha desaparecido y queda como 0.
4.- Restas tu entero original con el nuevo y te dará como resultado el último dígito, llamémosle m
5.- Envías por SPI el código ascii (0x30 + m)
6.- Si tu entero es 0 finalizas. Si no lo es, divides por 10 y vuelves al paso 3.

Seguro que el proceso se puede optimizar, pero incluso sin hacerlo dudo que consuma 10000 ciclos.

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: dsPIC Curso Basico con C30
« Respuesta #102 en: 02 de Marzo de 2007, 17:56:11 »
 Interesante método Nocturno, voy a aplicarlo y tratar de optimizarlo, de ahi te cuento.

 Hay que hacerle llegar nuestras quejas a los programadores de Microchip y un jalón de orejas.
control de movimiento

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: dsPIC Curso Basico con C30
« Respuesta #103 en: 03 de Marzo de 2007, 18:58:21 »
 Para recibir cadenas en el SPI hay una función que es;

unsigned int getsSPI1(
                                  unsigned int length,
                                  unsigned int *rdptr,
                                  unsigned int spi_data_wait);

 De los parámetros el que no entiendo es el tercero, no me queda claro para que sirve el spi_data_wait, en la definición dice;

Citar
spi_data_wait : This is the time-out count for which the module
                       has to wait before return.
                       If the time-out count is ‘N’, the actual time out
                       would be about (19 * N – 1) instruction cycles.

 Entonces espera hasta (19*N-1) ciclos después de cada byte enviado de la cadena, si no recibe ningún byte en ese tiempo entonces sale de la función, estoy en lo correcto..?.

 O primero, se recibe toda la cadena de n caracteres y después se cuenta (19*N-1) ciclos para salir de la función.
control de movimiento

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: dsPIC Curso Basico con C30
« Respuesta #104 en: 04 de Marzo de 2007, 03:37:33 »
Me suena a que el comportamiento de la función sea tal y como has descrito, pero es un método que desperdicia el tiempo de procesador.
Yo particularmente considero mucho más interesante recoger los bytes del SPI por interrupción.


 

anything