TODOPIC

Microcontroladores PIC => dsPIC => Mensaje iniciado por: pikman en 01 de Agosto de 2004, 22:42:00

Título: dsPIC Curso Basico con C30
Publicado por: pikman en 01 de Agosto de 2004, 22:42:00
Hola, estoy interesado en experimentar y aprender a usar DSP he recibido algunas muestras de dsPIC30F2010 y aunque no tengo como programarlos todavia nunca he tenido la experiencia con ellos, por lo que si alguien los conoce me gustaria saber me puede ayudar, tambien creo que se deberia abrir un subforo, con este topico.

saludos

Ariel
Título: RE: dsPIC Curso Basico con C30
Publicado por: gauchosuizo en 02 de Agosto de 2004, 01:58:00
hola

yo estoy de acuerdo con pikman, se deberia abrir un subforo para los dsPic"s.
Pikman: yo no tengo idea, pero la demoboard ya la compre. El problema es que hasta ahora no tuve tiempo de hacer algo con ella.

Saludos desde Suiza, Pablo
Título: RE: dsPIC Curso Basico con C30
Publicado por: Sispic en 02 de Agosto de 2004, 05:25:00
La unica experiencia que tengo es hacer parpadear un led .

descagé el MPLAB v6.40  y  MPLAB C30  para poder hacer el programa en C .

Para programar el hex con winpic800 , aunque tambien se podria con de debuger ó algo así .

Codigo:

 #define __dsPIC30F2010__
 #include <p30fxxxx.h>
_FOSC(CSW_FSCM_OFF & HS);


 int main ()
  {unsigned char a,x,y;

  TRISB=0;

  uno:

   
   PORTB=0x1;  
   retardo(x);  
   PORTB=0x0;
   retardo(x); x++;
   goto uno;
 
 }

   int retardo (int x)
  {unsigned char a,b,c;

         for(a=0; a< x; a++){
         
                          for (b=0 ; b <  255 ; b++){  for (c=0 ; c <  10 ; c++){}   }
          }

  }



No es tan dificil como parece y trae rutinas para I2C,Usart,Lcd etc .

Título: RE: dsPIC Curso Basico con C30
Publicado por: Modulay en 02 de Agosto de 2004, 07:25:00
Esta interesante esto.
En cuanto al tema de hardware ¿que se necesita para poder empezar a trabajar con estos micros?
Título: RE: dsPIC Curso Basico con C30
Publicado por: oshow en 02 de Agosto de 2004, 07:59:00
Hola, amigos, yo me apunto también al tema. Me parece de lo más interesante. Teneis otro apoyo para abrir ese hilo para los dspic y colaborar  en lo que se pueda.

Título: RE: dsPIC Curso Basico con C30
Publicado por: pikman en 02 de Agosto de 2004, 11:12:00
Bueno, Sispic , me puedes pasar el enlace del WINPIC800?, ese programa es el de tu creacion?, pues por lo que se comenta debo decirte que es muy bueno antes de usarlo, yo tengo armado un tait serial programmer, que lo he usado con IC.PROG, podre usarlo winpic800?, bueno espero poder realizar alguna experiencia, el led que parpadea o "hello word"" je je

un saludo.

ARIEL
Título: RE: dsPIC Curso Basico con C30
Publicado por: Sispic en 02 de Agosto de 2004, 11:33:00
Se cuece por aquí .

http://miarroba.com/foros/ver.php?pag=1&temaid=1381119&foroid=59905

Ahora busco el tait y te lo digo , pero seguramente sí .
Pero los dspic con TE20 y parecidos no chuta ya que es muy exigente con las tensiones y el clok para programarlo es muy rapido ya que seria eterno programarlo . El mejor es uno de puerto paralelo y añadir un zocalo ó programarlo  en circuito para estos DsPics.

Y no te creas , hacer parpadear este led me ha llevado unas horas , a partir de aqui ya es mas facil todo .  ...Holeeeeeee variables de hasta 64 bits



Título: RE: dsPIC Curso Basico con C30
Publicado por: Sispic en 02 de Agosto de 2004, 13:31:00
Encuentro varios esquemas del tait . cual es , ó donde lo puedo ver . Es de puerto paralelo ?.
Título: RE: dsPIC Curso Basico con C30
Publicado por: pikman en 02 de Agosto de 2004, 22:28:00
Bueno, SISCO, funciona de maravillas, con el WINPIC800 no probe el dsp, pero si con pics de 18 pines como el 628 y 84 y tambien con meorias 24 y va, solo tuve que invertir el clock y el mclr, el hardware es el del tait serial programmer, pero le llama serial porque hay uno para los pic 16c5x que es paralelo, ambos se conectan al LPT1, felicitaciones por el WINPIC800 es maravilloso, con que lenguaje esta escrito?, C++ o DELPHI?, si no te molesta la consulta claro.

Bueno gracias por tu ayuda invalorable, seguro sera mas facil ya con con los DSPIC, espero que hayan mas interesados en el asunto, un saludo y a tus ordenes en lo que te pueda servir.

Ariel  / PIKMAN
Título: RE: dsPIC Curso Basico con C30
Publicado por: MGLSOFT en 03 de Agosto de 2004, 06:27:00
Me anoto.
Hola Ariel, hola Sisco !!

Yo tengo el Picstart Plus y tambien un clon del Epic Plus de Melabs.
Alguno es capaz de programarlo ??

El GTP es capaz de hacerlo ??
Me interesa el tema a mi tambien, please participenme !!
Título: RE: dsPIC Curso Basico con C30
Publicado por: Sispic en 04 de Agosto de 2004, 03:48:00
Picstart Plus , ni idea no se si habra actualizaciones .
Pero con cualquier programador puerto paralelo seguro .
Conectar todas las Vdd , Vss , AVdd , AVss . de 4,5 a 5,5 v
MCLR  de 9 a 13,25 v   -> 300 microAmp.
PGC -> Clock
PGD -> Data

Habrá que ponerse a estudiar el c  , no lo domino pero parece potente el C30 .

Tambien ya existen samples del 30F6014 , menudo pepino
Título: RE: dsPIC Curso Basico con C30
Publicado por: oshow en 04 de Agosto de 2004, 07:38:00
Supongo que será un error tipografico,no? pero VSS y AVss iran a masa no?.

Espero poder probarlo con la epic, aunque en la lista de pics soportados no salen los dspic.

El winpic800 funciona con la epic?. Como hay que configurarlo?.
Título: RE: dsPIC Curso Basico con C30
Publicado por: Sispic en 05 de Agosto de 2004, 04:38:00
si oshow tienes razon

Tendria que ver el esquema del Epic , aunque seguramente si es soportado.
Título: RE: dsPIC Curso Basico con C30
Publicado por: Micom en 07 de Agosto de 2004, 23:07:00
Parese que ya me vienen unas muestras de los DSpic"s y quisiera saber si se pueden programar con el  programador pablin, ya que ese es el que tengo.  y hay que darle duro al "C" ni modo.  Para probar estos superinteresantes "juguetitos". Saludos.... Abel        
Título: RE: dsPIC Curso Basico con C30
Publicado por: kruskal en 08 de Agosto de 2004, 02:09:00
Puden corregirme por favor pero tengo entendido que un PIC 18Fxxx reune todos los requisitos para ser considerado un dsp.

Salud2
Título: RE: dsPIC Curso Basico con C30
Publicado por: pikman en 08 de Agosto de 2004, 03:15:00
No, no es lo mismo un microcontrolador que un dsp, si son parecidos, puedes mirar las hojas de dato DS y veras las grandes disferencias.

saludos

Ariel
Título: RE: dsPIC Curso Basico con C30
Publicado por: pocher en 08 de Agosto de 2004, 04:59:00
No me he apuntado a este tema porque de momento no me apetece estudiar las funciones de un nuevo compilador, el C30 de Microchip, CCS no los programa, pero os seguiré de cerca ...

Podeís poner el enlace al manual del compilador?
Título: RE: dsPIC Curso Basico con C30
Publicado por: Sispic en 08 de Agosto de 2004, 06:29:00
Aquí está todo lo necesario

http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en010065

Haver si hacemos algo para practicar con 30F2010 .
Mi idea es un frecuencimetro hasta 300 Mhz con un lcd 2x20 .

Boy a cacharrear .


Título: RE: dsPIC Curso Basico con C30
Publicado por: kruskal en 09 de Agosto de 2004, 00:43:00
Alguien tiene un numero de serie para el MPLAB C30 V1.20 no me deja instalarlo sin este numero.

Por curiosidad me gustaria revisar el dichoso compilador.

kruskal

Título: RE: dsPIC Curso Basico con C30
Publicado por: Nocturno en 09 de Agosto de 2004, 05:43:00
Sisco, según he visto en los datasheets, la velocidad máxima de estos bichitos es de 16 x 10 MHz, o sea, 160 MHz.

Si es así, ¿cómo puedes hacer un frecuecímetro de 300 MHz?
Título: RE: dsPIC Curso Basico con C30
Publicado por: MGLSOFT en 09 de Agosto de 2004, 07:11:00
Sisco:
Estuve probando el Winpic800 en conjunto con el programador simil EPIC que tengo.
Anduvo de maravillas !!
Use la configuracion del GTP07, guardandola como EPIC.

Realmente es un monstruo de software lo que has hecho !!

Felicitaciones !!!
Título: RE: dsPIC Curso Basico con C30
Publicado por: Sispic en 09 de Agosto de 2004, 14:46:00
Gracias mosquetero Marcos .

nocturno66 , velocidad máxima es de 30 MIPs .
Esto se consigue por ejemplo con un cristal de 7,5 Mhz con PLLx16 activado .
( 7,5*16 ) / 4 = 30

Se trata de usar el timer1 como base de tiempos y el MODULO TIMER2/3 configurados como 32 bits para contar los pulsos que entrarian por T2CK.

Lo que manda es el ancho de banda de este pin y seria cuestion de dividir su entrada por 10,100,1000 si es necesario para llegar a 200mhz ó mas .
Estoy mirando en Maxim haver que hay.

Se podria llegar a 150 Mhz con una resolución de 8 digitos seguro .
pero hay que ver las posivilidades de esta entrada .
Título: RE: dsPIC Curso Basico con C30
Publicado por: pikman en 09 de Agosto de 2004, 17:38:00
Hola, Bueno pero es standart un cirtal de 7.5 MHZ pues seria interesante que todos lo podamos conseguir, no se si hay de 15 MHz de 16 si hay, bueno digo no para poder experimentar....., lo que voe es que el C30 es tan ANSI como el de HI-tech acostumbrado a CCS se complica, habra que ponerse a escribir librerias, hasta que CCS ponga algo, es raro que no haya salido, consegui el de IAR para dsPIc, pero aun no lo instale, creo que dispone de IDE, aunque el C30 anda bien con el MPALB 6.60.

 
saludos

Ariel
Título: RE: dsPIC Curso Basico con C30
Publicado por: Sispic en 10 de Agosto de 2004, 00:06:00
Ha que te refieres con "ANSI"

Para poder experimentar se puede usar un cristal 4mhz por ejemplo .

Título: RE: dsPIC Curso Basico con C30
Publicado por: pikman en 10 de Agosto de 2004, 20:20:00
Hola, SISCO, me refiero a que CCS tiene muchas funiones ya incluidas que no se necesitan definir, como por ejemplo los delau_ms () o delay_us, tanto en mplab C30 y hi-techo  no existen, el manejo I2C tampoco es tan sencillo como en CCS.

Con respecto a experimentar claro que con un crital de 4 mhz se puede, inclusive con menos o tambien con uno de 10 Mhz,  pero yo hacia referencia al frecuencimetro, pues es un interesante proyecto y bueno me referia a utilizar un xtal similar si el proyecto evoluciona en el foro, por eso preguntaba si el cristal de 7.5 Mhz es standart.

Te pido disculpas uno de mis graves problemas es que a veces no me expreso con claridad,

saludos


Ariel
Título: RE: dsPIC Curso Basico con C30
Publicado por: Sispic en 11 de Agosto de 2004, 00:11:00
Ok pikman , si en esto tienes razón , le faltarian algunas funciones , tambien  para el LCD , ya que con el 30F2020 no lo soporta .

Aunque con lo que trae se puede hacer de todo , y a veces en mi opinión es mejor usar funciones con el codigo fuente disponible ya que tienes mas control .
Por Ejemplo imagina que pcw usa el timer1 para generar los delayUs();  si tu no lo saves , puedes tener conflictos co el . (solo es un ejemplo).

Sobre el frecuencimetro mejor será abrirlo en "proyectos" para no mezclar .

7,5 Mhz no es estandard , pero no es necesario usar este , habria que calcular el correspondiente para que con el timer1 genere el "segundo" exacto y multiplos de el para las lecturas mas rapidas .





Título: RE: dsPIC Curso Basico con C30
Publicado por: MGLSOFT en 11 de Agosto de 2004, 06:23:00
Sisco:
Como es eso de que PCW utiliza el Timer1 para generar los delay_us()  ??
Y en los micros que no tengan Timer1 como lo hacen ??


Donde se conocen estos secretos de cocina ??
estoy interesado en aprenderlos, hace un tiempo estoy luchando para utilizar RB6 y RB7 del 16F628 para interrupcion por pulsacion de teclas y ademas como salidas de datos para el LCD y me estoy volviendo homosexual !!!

Bueno es una forma de decir, no me manden cartas de amor, chicos !!!
Título: RE: dsPIC Curso Basico con C30
Publicado por: Sispic en 11 de Agosto de 2004, 08:15:00
Solo era un ejemplo "no real" , yo no tengo ni idea de como PCW  genera los delay_us() .

Se por ejemplo el pbp 2.xx se le puede hechar mano de sus macros  . yo las utilizo particularmente escriviendo el codigo en pascal y se ensambla con pbp .
De esta forma no me lio tanto .

No podrias usar otros , en vez de RABO6 y RABO7  para el lcd
Título: RE: dsPIC Curso Basico con C30
Publicado por: T0ni0 en 11 de Agosto de 2004, 08:57:00
Haber no es por necesitar si no por aprender, por cual empezamos? pido muestras del 2010 del 2020 o da =?

 habewr si me orientais sobre el c30
Título: RE: dsPIC Curso Basico con C30
Publicado por: pikman en 11 de Agosto de 2004, 09:05:00
Hola, SISCO, Hola MARCOS.

Bueno, si es cierto pues es mas comodo pero cuando un problema se presenta dependes de en este caso CCS que no atiende suplicas sin no estas suscripto, de cualquier modo no es impedimento para nuestro equipo, escribimos librerias y listo, je je, bueno yo ya arme una palca experimental para el 30F2010 asi que creo que este fin de semana empiezo, es mas voy a ver si puedo crear ya la funcion delay_ms (); creo que en el de hi-tech hay algo, veremos.

MARCOS, eso que quieres usar lo uso en casi todas mis aplicaciones con teclados o botones de marcha y paro, no se cual es el problema, de igual modo te envio algunas rutinas  para que las veas, algo muy importante a tener en cuenta es que la ineterrupcion se genera por cambio entonces hay una cuando pulsas y cuando sueltas otra, yo lo que hago es usar un swicth y este bifurca de acuerdo al valor que leo, entoces cuando suelta sale sin hacer nada, bueno no te enerredo mas te mando las rutinas en un rato.

saludos

Ariel
Título: RE: dsPIC Curso Basico con C30
Publicado por: Modulay en 11 de Agosto de 2004, 09:40:00
Pikman ¿podría echarle un vistazo al esquema de esa placa para el 30F2010?
Gracias
Saludos
Título: RE: dsPIC Curso Basico con C30
Publicado por: gauchosuizo en 12 de Agosto de 2004, 06:07:00
hola gente

ya recibi la dsPIC Demoboard de Microchip y trae en el Compact adjunto mucha informacion interesante. El fin de semana voy a postearla en el foro2.
Título: RE: dsPIC Curso Basico con C30
Publicado por: pikman en 12 de Agosto de 2004, 09:09:00
Hola,
         Modulay, no tengo circuito escaneado, pero no es nada del otro mundo simplemente es un circuito impreso que tiene un conector idc con todos los pines disponibles y el ICP que lo hago con un rj-45 tal cual al del ICD para poder programarlo sin sacarlo, una panalla LCD y la fuente de alimenatacion XTAL etc.

saludos

Ariel
Título: RE: dsPIC Curso Basico con C30
Publicado por: Sispic en 12 de Agosto de 2004, 11:59:00
Ya estoy terminando con las rutinas  LCD para el 2010 , pero habria que mejorar esto ya que no es muy exaco y es para FOSC de 20Mhz.  fija .
Codigo:


 /****************************************/
 /*    DelayUs Microsegundos             */
 /****************************************/   
  void DelayUs(int v)
 {
   while(v != 0){ asm("nop";asm("nop"; v--;}
 }

 /****************************************/
 /*    DelayMs MiliSegundos              */
 /****************************************/   
   void DelayMs(int v)
 {
   while (v != 0 ){ DelayUs(1000); v--;}
 }



Haver si hay sitio ó si no lo pego aquí cuando termine .
Título: RE: dsPIC Curso Basico con C30
Publicado por: Sispic en 12 de Agosto de 2004, 12:21:00
gauchosuizo  , seria interesante ver esta info , pero donde está el foro2 ?.

Título: RE: dsPIC Curso Basico con C30
Publicado por: Modulay en 12 de Agosto de 2004, 13:43:00
Bueno,esperaré un poquito que mis dsp tiene que estar a punto de llegar y a ver como se les mete mano a estos aparatitos.
Un saludo
Título: RE: dsPIC Curso Basico con C30
Publicado por: Sispic en 17 de Agosto de 2004, 09:38:00
Chutan muy bien estos cacharritos , por lo poco que he hecho .

Tengo un 30F2010 corriendo a 40MIPS el pobre ya que es la unica manera que la entrada T2CK que utilizo para contar los pulsos de entrada con el precaler 1:1 llegue a casi 20Mhz  , con prescaler 1:8 llega hasta 50Mhz seguro .
Esto y un dividor x10 se llegaria a 500Mhz .

La precisión del frecuencimetro es en muy buena . ya abriré algo en proyectos .
Título: RE: dsPIC Curso Basico con C30
Publicado por: T0ni0 en 20 de Agosto de 2004, 04:42:00
Holas, tengo unos DSP 30F2010, el compilador c30 y he probado código, pero ...  dispongo de la PICDEM2 PLUS ( con el ICD2) y al intentar grabar me dice  invalid target DEvice,  necesitaré de una placa de evaluación específica para los DSP o algún grabador diferente?  
Título: RE: dsPIC Curso Basico con C30
Publicado por: cucaracha en 20 de Agosto de 2004, 12:07:00
Sispic, te refieres al esquema del ICD2??
Título: RE: dsPIC Curso Basico con C30
Publicado por: Modulay en 20 de Agosto de 2004, 13:21:00
Cuca,no me digas que te has fabricado el icd2 con tus propias manos...¡¡es inmenso!!
http://www.mcu.cz/atm//index.php?&direction=0&order=&directory=ICD2Project
Título: RE: dsPIC Curso Basico con C30
Publicado por: T0ni0 en 20 de Agosto de 2004, 13:30:00
Dejad de fumar!!

Supongo que se refiere al esquema del PICDEM 2 PLUS  XDD

Alguien a conseguido grabar un DSp 30F2010 con esta EVboard ?? no se como grabarlos

Título: RE: dsPIC Curso Basico con C30
Publicado por: MGLSOFT en 20 de Agosto de 2004, 13:35:00
Seguramente TOniO nos lo relevara para todos !!
No es asi TOniO ???
Título: RE: dsPIC Curso Basico con C30
Publicado por: Sispic en 20 de Agosto de 2004, 13:46:00
Tonio:
Si no los compraste con la placa seran virgenes (borrados)

puedes programarlos con WinPic800 y un programador puerto paralelo .
Le ingresas el .hex de ICD y listo (CREO)
Título: RE: dsPIC Curso Basico con C30
Publicado por: gauchosuizo en 22 de Agosto de 2004, 13:09:00
hola gente

un link interesante para los dsPIC"s.
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en020461

Título: RE: dsPIC Curso Basico con C30
Publicado por: T0ni0 en 23 de Agosto de 2004, 05:25:00
Pues con esto he podido ver que no se corresponden los PINs de un PIC 28 con los de un DSpic  Tendré que hacerme una placa para desarrollar, por cierto alguien tiene el Data sheet del DSP30F2010 solo he podido encontrar el general de los DSPIC
Título: RE: dsPIC Curso Basico con C30
Publicado por: MGLSOFT en 23 de Agosto de 2004, 06:53:00
SISCO:
Me arme el viejo programador por puerto paralelo y un zocalo ZIF para los de 28 y 40 pines.
El mio no tiene VPP2.
Probe tu WINPIC 800 y me funciona de maravillas con todos los PICs que tengo.
Puse el DSPIC 2010 y lo lee pero no lo reconoce, cuando lo seleccione de la lista ahi lo leyo bien (eso creo).
Luego le hice algunas modificaciones en el listado de EEPROM y envie a programarlo, y empezaron los errores, cuando lo lei me encuentro todo como al principio.

pregunta:
Con que se puede programar el DSPIC ??
Anda en un programador de estos ??
Cual es mi problema si es asi, es decir que me falta ??
Título: RE: dsPIC Curso Basico con C30
Publicado por: Sispic en 23 de Agosto de 2004, 08:02:00
Tendras que ponerle un zocalo aparte ó un adaptador Marcos .
Como dice tonio no se corresponden los pines con cualquier otra serie .

Por cierto , de que programador se trata ?.

Asegurate que vcc es superior a 4v5 .
Tambien lo puedes programar en circuito .


Título: RE: dsPIC Curso Basico con C30
Publicado por: Modulay en 23 de Agosto de 2004, 08:11:00
Esa sería una buena opción.El esquemático que puso gauchosuizo vale para la programación en serie?.
Hay algunos detalles del esquema que no se ven con claridad
Título: RE: dsPIC Curso Basico con C30
Publicado por: MGLSOFT en 23 de Agosto de 2004, 09:11:00
Sisco:
Por favor dime en que patas va cada tension, asi me pongo a hacer las modificaciones necesarias.

Gracias
Título: RE: dsPIC Curso Basico con C30
Publicado por: Sispic en 23 de Agosto de 2004, 09:41:00
M¡ra que sois un poco vagoncetes

Pero va para el 30F2010:

Pin 18 -> PGC -> Clock
Pin 17 -> PGD -> Data

Pin 1 -> MCLR -> Vpp -> 13,25 v aproximado

Pin 8,19,27  -> Vss

Pin 13,20 -> Vdd

pin 28 AVdd -> a Vdd a traves de una resistencia de 100 aproximado.

Una Vdd min 4v5 bien filtrada , mejor un condensador electrolitico (10-100 micros) cerca del pic .

Cuentanos como te va .


Título: RE: dsPIC Curso Basico con C30
Publicado por: MGLSOFT en 23 de Agosto de 2004, 10:15:00
Gracias.
A peroposito, en la guia del usuario del PICDEM 2 PLUS esta el circuito, si no puedes bajarla te lo envio....
Título: RE: dsPIC Curso Basico con C30
Publicado por: Modulay en 24 de Agosto de 2004, 12:32:00
He estado echando un vistazo al c30 y corrijanme si me equivoco,pero esta herramienta cuenta con todo tipo de librerías,periféricos,temporizaciones,protocolos...,al menos eso he podido ver navegando por las subcarpetas de pic30_tools.
No he podido catar todavía el compilador pq primero hay que tener instalado MPLAB 6.40 o superior y én estos momentos me lo estoy bajando.
En cuanto a las librerías,echen un vistazo donde dije.También pueden echar un ojo por aquí a ver que les parece:
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=2035
Un saludo
Título: RE: dsPIC Curso Basico con C30
Publicado por: MGLSOFT en 25 de Agosto de 2004, 07:12:00
Escrito originalmente por Sispic
M¡ra que sois un poco vagoncetes

Pero va para el 30F2010:

Pin 18 -> PGC -> Clock
Pin 17 -> PGD -> Data

Pin 1 -> MCLR -> Vpp -> 13,25 v aproximado

Pin 8,19,27  -> Vss

Pin 13,20 -> Vdd

pin 28 AVdd -> a Vdd a traves de una resistencia de 100 aproximado.

Una Vdd min 4v5 bien filtrada , mejor un condensador electrolitico (10-100 micros) cerca del pic .

Cuentanos como te va .





Sisco:
Si pongo estas lineas en mi zocalo ZIF de 40 pines, cuando grabe un micro de otra linea puedo dañarlo ??
Pregunto esto porque en ese mismo zocalo grabo los de 28 pines ya, y me seria muy comodo....
Título: RE: dsPIC Curso Basico con C30
Publicado por: Sispic en 25 de Agosto de 2004, 08:22:00
Lo unico que puede dañar a otros pic es Vpp (13,25v) en otra patilla que no sea MCLR , tambien poner Vdd y Vss invertido .

No estoi seguro de que sea compatible con los de otra serie , solo mirando que los pines 27 y 28 RB7/PGD -- RB6/PGC de la serie 18 de 28  pines coincide precisamente con AVdd y AVss de los dsPIc , esto ya no lo haria compatible (Mejor provarlo fisicamente).
Aunque lo mejor seria un adaptador para los DsPic ó un zocalo independiente .

Título: RE: dsPIC Curso Basico con C30
Publicado por: MGLSOFT en 25 de Agosto de 2004, 09:44:00
Tenes razon, salvo que implementara un switch bipolar que seguramente me olvidare de cambiar cuando sea necesario hacerlo.
Prefiero la programacion In Circuit, mi viejo programador lo permite...

Gracias, Sisco, como siempre....
Título: RE: dsPIC Curso Basico con C30
Publicado por: Modulay en 25 de Agosto de 2004, 14:49:00
He seguido todos los pasos que dió Sispic,pero no puedo compilar,parece que me da un error de linker:
C:pic30_toolsinpic30-ld.exe Error: A heap is required, but has not been specified
BUILD FAILED: Wed Aug 25 21:45:10 2004
¿Qué puedo estar haciendo mal?
Título: RE: dsPIC Curso Basico con C30
Publicado por: T0ni0 en 26 de Agosto de 2004, 02:23:00
Supongo que te falta añadir el Linker Script al proyecto, sigue buscando por el directorio hasta encontrar uno que se llame GLD allí tan los linkers de los DSPic  
Título: RE: dsPIC Curso Basico con C30
Publicado por: Sispic en 26 de Agosto de 2004, 05:18:00
Prueba a quitar " printf() " si lo usas .
Título: RE: dsPIC Curso Basico con C30
Publicado por: Modulay en 26 de Agosto de 2004, 05:23:00
Si !!!!
Gracias,Sisco.
Ya compila
Título: RE: dsPIC Curso Basico con C30
Publicado por: pikman en 24 de Enero de 2005, 15:20:00
Hola, a todos, bueno pues abandone lo de los dsPIC por razones de tiempo, pero sigo interesado en aprender a usarlos, pues se ven cosas interesantes, como reconocimiento de voz, fecuencimetros, etc, asi que pienso probar el ejemplo de SISCO, no se si alguien ha probado de manejar un LCD por ejemplo que es a lo que voy atratar de hacer.


un saludoGiño

ARIEL
Título: RE: dsPIC Curso Basico con C30
Publicado por: Sispic en 25 de Enero de 2005, 05:46:00
Es un codigo apañado que encontre para los 16Fxxx
Codigo:

 

  // LCD HD44780U 4 bit mode.
  // LCD tipos:   1x8, 2x8, 1x16, 2x16, 2x20, 4x16, 4x20   
  // Modificado para DsPic 30Fxxxx

 /*                           
         //  USER"S ROUTINES DESCRIPTION:         
                           
  LCD_INIT()                ---> initilalize the LCD.             
  LCD_CLEAR()               ---> Clears and Home LCD.         
                           
  LCD_CMD("char")           ---> Send a command to the LCD.   See LCD datasheet for the complete list of commands.         
  LCD_GOTO(line,pos)        ---> Set the Cursor to a specified Line and position. Lines available are from 1 to 4. Pos available starts from 1 to max available on your LCD.         
  LCD_PUTCH("char")         ---> Write a character on LCD (ASCII representation).

  LCD_PUTS("string" )        ---> Write a string on LCD.
  LCD_PUTC("constant" )      ---> Write a const string on LCD.
  LCD_PUTUN(unsigned long)  ---> Write an Unsigned Number on LCD. It works both with INT (16bit) and CHAR (8bit). y (32bit) maximo 9 digitos
         
  Set_CGRAM_address(char addr) --->

    Ejemplo . escribe 2 caracteres predefinidos en direccion 0 y 1
    LCD_INIT();  
    Set_CGRAM_address(0);
    LCD_PUTCH(1);LCD_PUTCH(2);LCD_PUTCH(4);LCD_PUTCH(8);LCD_PUTCH(16);LCD_PUTCH(32);LCD_PUTCH(1);LCD_PUTCH(1);
    LCD_PUTCH(9);LCD_PUTCH(10);LCD_PUTCH(1);LCD_PUTCH(1);LCD_PUTCH(1);LCD_PUTCH(1);LCD_PUTCH(1);LCD_PUTCH(1);
   
    LCD_CLEAR();  
    LCD_PUTCH(0); LCD_PUTCH(1);
 */


/************************************************************************/
/* Use the following defines to set the lines as your hardware requires   */
/* ...you can use ANY output line of the MCU, even on several ports Sonrisa   */
/************************************************************************/

  #define LCD_ROWS   2   // valid numbers are: 1,2          
  #define LCD_COLS   20   // valid numbers are: 8,16,20   // (set to 2 for 2 or more rows)

  /*  PUERTOS */
  #define   LCD_RS        PORTEbits.RE4          // Register select
  #define   LCD_EN        PORTEbits.RE5          // Enable
  #define   LCD_D4        PORTEbits.RE0          // LCD data 4
  #define   LCD_D5        PORTEbits.RE1          // LCD data 5
  #define   LCD_D6        PORTEbits.RE2          // LCD data 6
  #define   LCD_D7        PORTEbits.RE3          // LCD data 7
  /*  TRIS */
  #define   LCD_RS_TRIS   TRISEbits.TRISE4      // Register select
  #define   LCD_EN_TRIS   TRISEbits.TRISE5      // Enable          
  #define   LCD_D4_TRIS   TRISEbits.TRISE0      // LCD data 4
  #define   LCD_D5_TRIS   TRISEbits.TRISE1      // LCD data 5
  #define   LCD_D6_TRIS   TRISEbits.TRISE2      // LCD data 6
  #define   LCD_D7_TRIS   TRISEbits.TRISE3      // LCD data 7

/************************************************************************/

  #define LCD_CLR      0x01                // Clear Display
  #define LCD_HOME      0x02                // Cursor to Home position
                                           
                                            // Entry mode set
                                            // ejemplo: LCD_CMD( CURSOR_DIRECCTION_Decrement | NO_Accompanies_display_shift );
  #define  CURSOR_DIRECCTION_Increment 0x6
  #define  CURSOR_DIRECCTION_Decrement 0x4
  #define  Accompanies_display_shift  0x5
  #define  No_Accompanies_display_shift 0x4
                                           // Display on/off control
                                           // ejemplo: LCD_CMD( DISPLAY_ON | CURSOR_ON | CURSOR_BLINKING_OFF );
  #define DISPLAY_ON 0x0C
  #define DISPLAY_OFF 0x08
  #define CURSOR_ON 0x0A
  #define CURSOR_OFF 0x08
  #define CURSOR_BLINKING_ON 0x09
  #define CURSOR_BLINKING_OFF 0x08
                                           // Cursor or display shift
                                           // ejemplo: LCD_CMD( Cursor_move |  Shift_to_the_left );  
  #define Display_shift 0x18
  #define Cursor_move 0x10
  #define Shift_to_the_right 0x14
  #define Shift_to_the_left 0x10


 /************************************************************************/
  #if (LCD_COLS==20)
   #define LCD_line1   0x80 // Line 1 position 1
   #define LCD_line2   0xC0 // Line 2 position 1
   #define LCD_line3   0x94 // Line 3 position 1 (20 char LCD)
   #define LCD_line4   0xD4 // Line 4 position 1 (20 char LCD)
  #else
   #define LCD_line1   0x80 // Line 1 position 1
   #define LCD_line2   0xC0 // Line 2 position 1
   #define LCD_line3   0x90 // Line 3 position 1 (16 char LCD)
   #define LCD_line4   0xD0 // Line 4 position 1 (16 char LCD)
  #endif
 /************************************************************************/

  // const Font_3x6_0[8] = { 0,0,0,0,0x38,0x44,0x38,0}; /* 0   0x30 */


 /****************************************/
 /*    DelayUs Microsegundos             */
 /****************************************/   
  void DelayUs(int v)   // 40 MIPS
 {
   while(v != 0){
   asm("nop" );asm("nop" );
   asm("nop" );asm("nop" );
   asm("nop" );asm("nop" );
   asm("nop" );asm("nop" );

   asm("nop" );asm("nop" );
   asm("nop" );asm("nop" );
   asm("nop" );asm("nop" );
   asm("nop" );asm("nop" );

   asm("nop" );asm("nop" );
   asm("nop" );asm("nop" );
   asm("nop" );asm("nop" );
   asm("nop" );asm("nop" );

   asm("nop" );asm("nop" );
   asm("nop" );asm("nop" );
   asm("nop" );asm("nop" );
   asm("nop" );asm("nop" );


     /**/


    v--;}
 }

 /****************************************/
 /*    DelayMs MiliSegundos              */
 /****************************************/   
   void DelayMs(int v)
 {
   while (v != 0 ){ DelayUs(1000); v--;}
 }

  /****************************************/
  /*     Enable LCD to read data   */
  /****************************************/
  void LCD_STROBE (void)
  {
  LCD_EN = 1;
  DelayUs(1);
  LCD_EN = 0;
 }   

     
/****************************************/
/*    Write a nibble to the LCD           */
/****************************************/
  void LCD_NIBBLE_OUT (unsigned char c )  {
 
   LCD_D4=c ; c >>= 1;
   LCD_D5=c;  c >>= 1;
   LCD_D6=c;  c >>= 1;
   LCD_D7=c;  
   LCD_STROBE();
  }
 

/****************************************/
/* Write a byte to the LCD (4 bit mode) */
/****************************************/
 void LCD_WRITE (unsigned char c)
  {
  LCD_NIBBLE_OUT(c >> 4);
  LCD_NIBBLE_OUT(c);
  DelayUs(50);
  }


 /****************************************/
 /*       send a command to the LCD      */
 /****************************************/
  void LCD_CMD (char c)  {

  LCD_RS = 0;   // write command
  LCD_WRITE(c);

  }

/****************************************/
/*  GoTO specified line and position    */
/****************************************/
  void LCD_GOTO (char line,char pos)   // Set DDRAM address  
  {
  switch(line)
   {
   case 1: LCD_CMD((LCD_line1-1)+pos);
          break;
   case 2: LCD_CMD((LCD_line2-1)+pos);
        break;
   case 3: LCD_CMD((LCD_line3-1)+pos);
          break;
   case 4: LCD_CMD((LCD_line4-1)+pos);
   }
  }


  /****************************************/
  /*           Clear and Home LCD         */
  /****************************************/
  void LCD_CLEAR (void)
  {
  LCD_CMD(LCD_CLR);
  DelayMs(3);
  }


  /****************************************/
  /*     Write one character to the LCD   */
  /****************************************/
  void LCD_PUTCH (unsigned char c)
  {
  LCD_RS = 1;   // write characters
  LCD_WRITE(c);
  }

 /****************************************/
 /*       Write a string to the LCD      */
 /****************************************/
 void LCD_PUTS ( char  * s)
 {
 LCD_RS = 1;   // write characters
  while(*s)
    LCD_WRITE(*s++);
 }

 /****************************************/
 /*       Write a const to the LCD      */
 /****************************************/
 void LCD_PUTC ( const  * s)
  {  
 LCD_RS = 1;   // write characters
  while(*s)
    LCD_WRITE(*s++);
 }

/****************************************/
/*  Set CGRAM address                   */
/****************************************/
  void Set_CGRAM_address(unsigned char addr){
     addr = addr & 0x3F;
     LCD_CMD(0x40 | addr );
  }

 /************************************************/
 /*       Write a const to the LCD               */
 /*  escribe un caracter predefinido en cgram    */
 /************************************************/
 void LCD_SetCaracter (unsigned  char posicion , const  * s)
 { unsigned char a; a=8;

 Set_CGRAM_address(posicion);

 LCD_RS = 1;   // write characters
  while(a != 0){
    LCD_WRITE(*s++); a--;}
  }

/****************************************/
/*  Escribe Valor numerico al LCD       */
/*  Max 1 a 9 digitos                   */
/*  ceros a la izquierda blancos        */
/*  puno de miles y millones            */
/****************************************/  
/*  ejemplo :  341.000.780   1.886  23  */

  void LCD_PUTUN (unsigned char Digitos , unsigned long valor)
  {
   unsigned char t1,i,wrote;
   unsigned long k;
 
  wrote=0;
  for (i=Digitos-1; i>=1; i--)
     {
     switch(i){

     case 8: k=100000000;
        break;
    case 7: k=10000000;
        break;
     case 6: k=1000000;
        break;
   case 5: k=100000;  if (Digitos > 6){ if (wrote==1){ LCD_PUTCH(".");} else { LCD_PUTCH(" ");}} // millones
        break;
    case 4: k=10000;        
        break;
     case 3: k=1000;  
        break;
   case 2: k=100;     if (Digitos > 3){ if (wrote==1){ LCD_PUTCH(".");} else { LCD_PUTCH(" ");}} // miles
       break;
   case 1: k=10;
   }
    t1=valor/k;
 
   if((wrote)||(t1!=0)){LCD_PUTCH(t1+"0"); wrote=1;}
    else LCD_PUTCH(" ");                               // Ceros izquierda blanco

    valor-=(t1*k);
   
   }
   LCD_PUTCH( valor +"0");

}


/****************************************/
/*             Initialize LCD           */
/****************************************/   
  void LCD_INIT (void)
{
  /* Configura los TRIS como salidas */
   LCD_RS_TRIS  = 0;      // Register select
   LCD_EN_TRIS  = 0;       // Enable          
   LCD_D4_TRIS  = 0;       // LCD data 4
   LCD_D5_TRIS  = 0;       // LCD data 5
   LCD_D6_TRIS  = 0;        // LCD data 6
   LCD_D7_TRIS  = 0;       // LCD data 7


   LCD_RS = 0;              // write control bytes
   DelayMs(20);              // power on delay
   LCD_NIBBLE_OUT(0x04);    // set 4 bit mode
   DelayUs(100);

   #if (LCD_ROWS==1)
    LCD_CMD(0x20);   // 4 bit mode, 1 line, 5x8 font          (0b00100000);
   #else
    LCD_CMD(0x28);   // 4 bit mode, 2 or more lines, 5x8 font (0b00101000);
   #endif

   LCD_CMD(DISPLAY_OFF);
   LCD_CMD(DISPLAY_ON | CURSOR_OFF | CURSOR_BLINKING_OFF);
   LCD_CMD( CURSOR_DIRECCTION_Increment | No_Accompanies_display_shift );
   LCD_CLEAR();
  }





menudos cacharretes Rebotado
Título: RE: dsPIC Curso Basico con C30
Publicado por: lobopiC en 11 de Noviembre de 2005, 15:34:00

Hola, alguien me pude dar referencia del MIKROBASIC o MIKROPASCAL si ya han realizado proyectos, ke tal es cuando trabaja con oeraciones de coma flotante.
http://www.mikroelektronika.co.yu/english/product/compilers/

Gracias por sus respuestas.

Juan CarlosNavidad
Título: Re: dsPIC Curso Basico con C30
Publicado por: jfh900 en 21 de Mayo de 2006, 16:47:14
Siguiendo con el hilo, quiero probar los dspic y pedir algunos samples a microchip. cuales me aconsejais que pida?

Saludos.
Título: Re: dsPIC Curso Basico con C30
Publicado por: patolinec en 21 de Junio de 2006, 17:18:12
Pues no conozco mucho de DsPics y me da enviada que en otrs paises puedas pedir muestras, aca nada pero lo que es nada.

Bueno para empezar creo que el mejor es el 30F2010, y me avisas para poer ir haciendo alguna plicacion entre los dos porque yo ya lo tengo pero no he hecho aun nada con el
Título: Re: dsPIC Curso Basico con C30
Publicado por: LordLafebre en 21 de Junio de 2006, 17:42:04
Hola:

Yo tengo un 30F2010 y 30F4011 cortesia de Nocturno..  :mrgreen:, esos tipos de Dspic te podrian servir para experimentar.
Título: Re: dsPIC Curso Basico con C30
Publicado por: jfh900 en 21 de Junio de 2006, 20:26:16
Bueno, al final he pedido unos samples de DSPIC30F3010. Cuando los reciba empezare a probarlos.

Un saludo.
Título: Re: dsPIC Curso Basico con C30
Publicado por: patolinec en 23 de Junio de 2006, 21:50:46
Hola:

Yo tengo un 30F2010 y 30F4011 cortesia de Nocturno..  :mrgreen:, esos tipos de Dspic te podrian servir para experimentar.

Hola Lord me lo podrias prestar me refiero al dsPic30f2010?
Título: Re: dsPIC Curso Basico con C30
Publicado por: Arbolito en 23 de Junio de 2006, 23:00:59
Hola yo tengo un  de dspic que compre  8),pero de momento no lo voy a utilizar
bueno si alguien los nesecita porque les va a dar uso pues se los puedo prestar  :mrgreen:
un saludo
juan.
Título: Re: dsPIC Curso Basico con C30
Publicado por: FJPPitta en 30 de Junio de 2006, 22:41:35
Saludos a todos, apenas comenzare en la programacion del dsPIC30F2010 para la implementación de un control difuso. El programador que ya me funciona es el JDM por serie ya esta implementado y funcionando (en protoboard en 3 días hare el circuito impreso) es bastante rápido  con el programa winpic800. Si tengo alguna información la pondre por aqui por si a alguien le sirve, poco a poco claro esta ya que apenas estoy aprendiendo a programar tanto pics como dspic (yo usaba el atmel AT89C2051)

Hasta pronto
Título: Re: dsPIC Curso Basico con C30
Publicado por: Nocturno en 01 de Julio de 2006, 02:40:13
Enhorabuena FJPPita y ánimo con tu proyecto.

¿Qué será exactamente lo que haga tu control difuso?
Título: Re: dsPIC Curso Basico con C30
Publicado por: FJPPitta en 04 de Julio de 2006, 15:56:08
Lo que planeo hacer es una lampara de luz blanca mediante la combinacion de los colores primarios usando LEDs (rojo, azul y verde) y el control difuso se va a encargar de manipular la cantidad de color que proporciona de cada uno de los LEDs. Las variables que obtendre para introducir en el control difuso sera una la cantidad de luz de color de cada led mediante un sensor TCS230 y la salida sera un voltaje de control para cada LED.
Título: Re: dsPIC Curso Basico con C30
Publicado por: Renatox_ en 17 de Diciembre de 2006, 00:40:01
 Hola muchachos quería hacerles unas consultas sobre el dspic 30f4011

 Yo tengo mi grabador y graba el dspic 30f4011 20I/P sin problemas, pero cuando coloco el 30f4011 20E/P lo lee`pero no lo puede borrar ni grabar, el Vpp=13.3v. porque ocurre esto, serà que la versión E/P necesita màs voltaje por ejm 14v para grabar.

 Y otra inquietud los dspics son robustos, por ejm puede estar funcionando realizando algoritmos complejos durante 36 horas sin parar, (claro que bien protegidos contra el ruido externo e interno). Puede ponerse a la altura de la robuztes de un motorola o un texas, gracias por responder.

Título: Re: dsPIC Curso Basico con C30
Publicado por: Renatox_ en 02 de Enero de 2007, 21:50:58
 hola muchachos, voy a ponerme al día hasta donde han avanzado en este curso de C30, luego empezaré a aportar, nos vemos
Título: como utilizar el timer.h que trae el C30
Publicado por: Renatox_ en 11 de Enero de 2007, 21:33:59
  Hola muchachos, me he comprado el libro de Angulo "Microcontroladores Avanzados dsPIC" y es un buen libro, explican en una forma clara los módulos y como funciona un dsPIC pero tiene un problema los ejemplos están en asembler, pero igual se los recomiendo.

 He estado revisando los timer, y he cojido un ejemplo pequeño de microchip, que utiliza el timer1, como temporizador síncrono y prescaler de 1:1 para hacer bascular la patita RD1. Sin embargo cuando lo compilo me salen varios errores todos relacionados a la librería Timer.h, no reconoce WriteTimer1(), ReadTimer1(), etc.

 Alguien porfavor puede cargar este archivo y hacerlo compilar con el C30, porque no puedo usar el timer.h..?, como se lo usa, o se la llama..?.

 El programita es este


#include "p30f4011.h"
#include <timer.h>

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

void __attribute__((__interrupt__)) _T1Interrupt(void)
{
 PORTDbits.RD1 = 1; /* RD1 en alto  */
 WriteTimer1(0);    /*   */
 IFS0bits.T1IF = 0; /* Clear Timer interrupt flag */
}

int main(void)
{
 unsigned int match_value;   /* valor entero sin signo  */
 TRISDbits.TRISD1 = 0;       /* RD1 como salida */
 PORTDbits.RD1 = 1;          /* RD1 en alto */
 /* Habilitando interrupción del timer 1, prioridad 1 */
 ConfigIntTimer1(T1_INT_PRIOR_1 & T1_INT_ON);
 WriteTimer1(0);             /* lo cargamos con cero */
 match_value = 0xFFF; 
 /* configuración del timer1 temporizador síncrono, y prescaler 11  */
 /*  PR1=match_value, timer1 no funciona en modo espera */
 OpenTimer1(T1_ON & T1_GATE_OFF & T1_IDLE_STOP &
 T1_PS_1_1 & T1_SYNC_EXT_OFF &
 T1_SOURCE_INT, match_value);
 /* Wait till the timer matches with the period value */
 /* esto hace bascular al RD1 en tiempos síncronos  */
 while(1)
 {
   timer_value = ReadTimer1();
   if(timer_value >= 0x7FF)
     {
      PORTDbits.RD1 = 0; /* RD1 en bajo */
     }
 }
 CloseTimer1();
}

  /* gracias  */
Título: Re: dsPIC Curso Basico con C30
Publicado por: Nocturno en 12 de Enero de 2007, 02:34:41
Compiló bien a la primera:
BUILD SUCCEEDED: Fri Jan 12 06:30:44 2007

Quizás lo que te ha ocurrido es que no has completado el proyecto con todos los ficheros que son necesarios, o sea:
- en Source files tu fichero .C: prueba.c
- en Header files: timer.h
- en Library Files los ficheros: libp30F4011-coff.a y libp30F4011-elf.a
- en Linker Scripts: p30f4011.gld

Te dejo a continuación el fichero de proyecto que yo he usado por si te sirve, aunque no tendrás la misma estructura de carpetas que yo, siempre puedes modificarla editando el fichero de proyecto con cualquier editor de texto.
Título: Re: dsPIC Curso Basico con C30
Publicado por: Renatox_ 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. 
Título: Re: dsPIC Curso Basico con C30
Publicado por: Renatox_ 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 */

Título: Re: dsPIC Curso Basico con C30
Publicado por: Renatox_ 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.
Título: Re: dsPIC Curso Basico con C30
Publicado por: Nocturno 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 */
Título: Re: dsPIC Curso Basico con C30
Publicado por: Renatox_ 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.
Título: Re: dsPIC Curso Basico con C30
Publicado por: Renatox_ 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
Título: Re: dsPIC Curso Basico con C30
Publicado por: Nocturno 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.
Título: Re: dsPIC Curso Basico con C30
Publicado por: Renatox_ 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 (http://ssl.rapidshare.com/cgi-bin/collectorszone.cgi)
Título: Re: dsPIC Curso Basico con C30
Publicado por: Renatox_ 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.
Título: Re: dsPIC Curso Basico con C30
Publicado por: Milo 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,
Título: Re: dsPIC Curso Basico con C30
Publicado por: Renatox_ 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.
Título: Re: dsPIC Curso Basico con C30
Publicado por: Milo 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,

Título: Re: dsPIC Curso Basico con C30
Publicado por: Renatox_ 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.
Título: Re: dsPIC Curso Basico con C30
Publicado por: Nocturno 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
Título: Re: dsPIC Curso Basico con C30
Publicado por: jfmateos2 en 02 de Febrero de 2007, 04:32:37
Renatox, no soy capaz de acceder al enlace que pusiste de RapidShare.
Título: Re: dsPIC Curso Basico con C30
Publicado por: Renatox_ 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.
Título: Re: dsPIC Curso Basico con C30
Publicado por: Renatox_ 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:
(http://optimización.JPG)

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.

 
Título: Re: dsPIC Curso Basico con C30
Publicado por: Nocturno 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í.
Título: Re: dsPIC Curso Basico con C30
Publicado por: Milo 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

Título: Re: dsPIC Curso Basico con C30
Publicado por: Milo 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 (http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en010065&part=SW006012)
Título: Re: dsPIC Curso Basico con C30
Publicado por: Renatox_ 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.
Título: Re: dsPIC Curso Basico con C30
Publicado por: Renatox_ 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.
Título: Re: dsPIC Curso Basico con C30
Publicado por: Renatox_ 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.

 
Título: Re: dsPIC Curso Basico con C30
Publicado por: Nocturno en 17 de Febrero de 2007, 04:28:38
La importancia de estar actualizado. Me alegro que lo consiguieras.
Título: Re: dsPIC Curso Basico con C30
Publicado por: Milo en 19 de Febrero de 2007, 05:56:54


Muy bien renatox enhorabuena y a seguir avanzando

saludos,
Título: Re: dsPIC Curso Basico con C30
Publicado por: Renatox_ 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.

Título: Re: dsPIC Curso Basico con C30
Publicado por: Nocturno 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.
Título: Re: dsPIC Curso Basico con C30
Publicado por: Renatox_ 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.
Título: Re: dsPIC Curso Basico con C30
Publicado por: Renatox_ 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.
Título: Re: dsPIC Curso Basico con C30
Publicado por: Nocturno 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.
Título: Re: dsPIC Curso Basico con C30
Publicado por: Renatox_ en 19 de Marzo de 2007, 23:37:05
 Hola Chekebo, si no me dabas la idea inicial no hubiera podido hacer esto. No utilizé el formato 5.23 debido a que esa multiplicación toma varios ciclos, utilizé las operaciones AND y corrimiento ">>" a la derecha pero tampoco me funcionó, asi que utilizé macros, las pongo aquí:

Código: [Seleccionar]
//mis macros
//consigue direcciones del float
#define Lmbyteptr(var32) ((unsigned char*)(&var32)) //returns address of Lm byte
#define LMbyteptr(var32) ((unsigned char*)(&var32)+1) //returns address of LM byte
#define Hmbyteptr(var32) ((unsigned char*)(&var32)+2) //returns address of Hm byte
#define HMbyteptr(var32) ((unsigned char*)(&var32)+3) //returns address of HM byte
//descompone el float
#define getLmbyte(var32) ((unsigned char)(*Lmbyteptr(var32))) //
#define getLMbyte(var32) ((unsigned char)(*LMbyteptr(var32))) //
#define getHmbyte(var32) ((unsigned char)(*Hmbyteptr(var32))) //
#define getHMbyte(var32) ((unsigned char)(*HMbyteptr(var32))) //
//arma float
#define setLmbyte(var32,var8) {(unsigned char)(*Lmbyteptr(var32)=var8);} //
#define setLMbyte(var32,var8) {(unsigned char)(*LMbyteptr(var32)=var8);} //
#define setHmbyte(var32,var8) {(unsigned char)(*Hmbyteptr(var32)=var8);} //
#define setHMbyte(var32,var8) {(unsigned char)(*HMbyteptr(var32)=var8);} //

Los pasos que seguí son:

* Comprendí que la idea era primero encontrar la dirección de memoria en donde empieza el float, guardando estas 4 direcciones.

* Luego sacar la información de estas 4 direcciones utilizando punteros y almacenarlos en 4 bytes.

* LLevar los valores de esos 4 bytes al nuevo float guardando cada byte en su puntero correspondiente, es decir en las direcciones apuntadas Lm, LM, Hm, HM que son las 4 direcciones del nuevo float.

Este es el procedimiento;

Código: [Seleccionar]
   float x=-12.85, y;
   char dummy1, dummy2, dummy3, dummy4;

   //desarmar float
   dummy1=getLmbyte(x);
   dummy2=getLMbyte(x);
   dummy3=getHmbyte(x);
   dummy4=getHMbyte(x);

   //armar float
   setLmbyte(y,dummy1);
   setLMbyte(y,dummy2);
   setHmbyte(y,dummy3);
   setHMbyte(y,dummy4);

Comprobé mediante la herramienta "Watch" que el float se descompone en 4 bytes y se vuelven armar almacenandolos en el nuevo float.

Lo mejor de todo es que desarmar un float demora tan solo 8 ciclos, que bueno, comparados a los 10 000 ciclos de la instrucción sprintf es un gran avance.

Armar el float también demora tan solo 8 ciclos.

 Pego la foto de los registros.
Título: Re: dsPIC Curso Basico con C30
Publicado por: Renatox_ en 20 de Marzo de 2007, 03:07:59
así se ve mejor, es mi primera vez que pego una foto en el medio :)

(http://img87.imageshack.us/img87/9250/watchks5.jpg)

Algo más sobre las macros que puse arriba. Para armar el float utilizé este formato:

Código: [Seleccionar]
#define setLmbyte(var32,var8) {(unsigned char)(*Lmbyteptr(var32)=var8);} //

Lmbyte(var32) = direc.baja del nuevo float

pero;

*Lmbyte(var32) = var8 = dummy1 = valor localizado o apuntado en la direc.baja del nuevo float

 
Título: Re: dsPIC Curso Basico con C30
Publicado por: Renatox_ en 23 de Marzo de 2007, 21:24:54
 Hola otra ves. Con el procedimiento anterior se puede mandar los 4bytes de un Float o los 2bytes de un Entero por los módulos de comunicación de forma rápida, la función printf y sprintf demoran muchos ciclos, por ejm el sprintf demora 10 000 ciclos en obtener los valores ASCII de un número Flotante, en cambio con ayuda de las macros puestas arriba toma tan solo 8 ciclos.

 Ahora he ordenado la parte de recepción, es decir como el otro dspic recibe estos 4 bytes o 2, y los vuelve a transformar a Float o Entero.

 Pego el procedimiento, para la recepción SPI, para la UART es similar:

Código: [Seleccionar]
void GetCom(unsigned int k, float *z)

   float f;
   char *p=(char *)&f;   // puntero "p" apunta a la dirección de "f", "p" tiene 4 bytes
   unsigned int m;
 
   for(m=0;m<k;m++)
    {
        while (DataRdySPI1()==0); // el registro SPIRB (SPIBUF) está vacio
        *p=getcSPI1(); // Valor que será guardado en la dirección localizada o apuntada por "p" 
        p++;            // Incrementa la dirección localizada en "p" en uno.
    }
   *z=f;    // "f" será guardado en la dirección localizada o apuntada por "z", o sea en "y"
}

int main (void)
{
   configSPI();
   float y;
    ...
   GetCom(sizeof(y),&y);    //sizeof(y)=4 "bytes" porque es flotante
    ...                                //&y dirección del dato y
}

 Funciona correctamente, apunten esto les puede servir cuando tengan que transmitir los datos flotantes rapidamente.

Saludos
Renatox.
Título: Re: dsPIC Curso Basico con C30
Publicado por: micro_cadaver en 15 de Mayo de 2007, 11:43:34
muy interesantes los aportes de tu investigación compatriota, te he agregado a mi msn si no fuera mucha molestia claro esta  :mrgreen:, me han pasado un 30f1020 y en estos dias pienso darme un tiempo para revisar su datasheet, ya me lei todo el post y esta muy intersante jijij  :-)
Título: Re: dsPIC Curso Basico con C30
Publicado por: Renatox_ en 14 de Junio de 2007, 11:14:29
Hola, ya tengo listas y probadas mi nuevas rutinas para transmitir y recibir datos a gran velocidad por los puertos SPI y UART, enviando los tipos de datos en bytes, primero el de menos peso.

Estas rutinas son SendCom y GetCom, pongo el código por si desean usarlas.

Código: [Seleccionar]
SendCom(sizeof(data),(char *)&data);

void SendCom(unsigned int k, char *p)

 for(;k;--k)
  {
     while(BusyUART1()==1);
     //while(SPI1STATbits.SPITBF==1); 
     putcUART1(*p);
     //putcSPI1(*p);
     p++;
  }
}


GetCom(sizeof(data),(char *)&data);

void GetCom(unsigned int k, char *p)
{
 for(;k;--k)
 {
    while(DataRdyUART1()==0);
    //while(DataRdySPI1==0);
   *p=getcUART1();
   //*p=getcSPI1();
   p++;
 }
}


si data es entero, sizeof(data)=2
si data es flotante, sizeof(data)=4
El puntero p apunta a la dirección más baja de data

Hize la prueba enviando datos enteros a la pc, el programa que las recibe es Labview y lo arma correctamente.

saludos
Título: Re: dsPIC Curso Basico con C30
Publicado por: Renatox_ en 23 de Agosto de 2007, 15:15:06
Hola, he encontrado este enlace donde reciben quejas en errores de compilación o bug, si alguién ha encontrado uno en C30 lo puedo mandar aquí,

reporte de errores (http://forum.microchip.com/tm.aspx?m=222357)

saludos
Título: Re: dsPIC Curso Basico con C30
Publicado por: Renatox_ en 02 de Diciembre de 2007, 22:51:58
Hola como están, tengo un problema estoy enviando esta cadena al hiperterminal mediante el printf, lo mando así:

float f1=-13.25;

printf("%05.2f",f1);

En el hiperterminal lo recibo y muestra -13.25. Pero yo quiero que me salga 00-13.25, como debería configurarlo para que me salga bien el envio.

gracias.
Título: Re: dsPIC Curso Basico con C30
Publicado por: Milo en 12 de Diciembre de 2007, 07:55:34

Buennass:

Se me ocurre esta chorrada, no se si te valdrá prueba a ver,

printf("00%05.2f",f1);

saludos,
Título: Re: dsPIC Curso Basico con C30
Publicado por: Renatox_ en 12 de Diciembre de 2007, 17:09:37
Hola Milo, claro con eso obtengo 00-13.25 en hiperterminal, pero si mi f1=-134.25 entonces obtendré 00-134.25 con 6 decimales a la izquierda, solo necesito 5 y que aparescan siempre aun cuando cambie el f1.

Con el formato entero si funciona, si envio -13 aparece 00-13 en hiperterminal. Necesito enviar una cantidad constante de caracteres por cada numero flotante y el Labview los recibe por la USART. Por ejm en cada bucle while del Labview envio 24 caracteres que representan 3 numeros flotantes, entonces cada flotante debe tener 8 caracteres siempre, sino se me desfasa la secuencia y aparecen otros números en el graficador.

un saludo;
Título: Re: RE: dsPIC Curso Basico con C30
Publicado por: juandymu en 10 de Marzo de 2008, 22:49:48
hola
Título: Re: dsPIC Curso Basico con C30
Publicado por: juandymu en 10 de Marzo de 2008, 22:51:53
hola soy nuevo en el tema de c30
he programado en codigo asm pero en c30 no y aun no logro empesar alguno me puede colaborar ya habri el proyecto pero no se donde ouedo ubicar codigos o comandos ??
Título: Re: dsPIC Curso Basico con C30
Publicado por: superprp en 31 de Marzo de 2008, 12:38:23
Yo también estoy empezando con el C30, veo que es muy diferente a lo que había hecho hasta ahora (programar pics 16F y 18F en asm), me estoy leyendo los documentos de MPLAB C30 USER GUIDE, 16BITS LANGUAGE TOOL LIBRARY, y LIBRARY C30 GETTING STARTED, hay muchisimo para leer, pero la verdad que no me aclaro mucho con tanta instrucción, si alguien tiene algun tutorial breve en español que con el ingles tantos folios... y muchas cosas no llego a entenderlas, no se ingles 100%, o si podeis explicar lo básico como hacer un TRISB, hacer un PORTB, como configurar los bits de los diferentes registros ADCON, INTCON, ...., como crear variables en una zona de memoria...
Título: Re: dsPIC Curso Basico con C30
Publicado por: Renatox_ en 01 de Abril de 2008, 03:08:46
Hola que tal, para empezar te recomiendo el Getting Started la parte referida al C30 sigue paso a paso el desarrollo para crear el proyecto, luego que sepas como usar la estructura general vete al Family Reference Manual, y empieza con lo básico que es puertos, timer, uart, etc.

Por último cuando ya estes familiarizado con el C30 y sus extensiones de lenguaje básicas puedes profundizar leyendo el C30 Compiler User Guide, donde esta todo detallada, exensiones de lenguaje, atributos, etc.

saludos
Título: Re: dsPIC Curso Basico con C30
Publicado por: superprp en 01 de Abril de 2008, 04:33:09
El Family Reference Manual del dsPIC30F la verdad que no me soluciona nada, ¿es éste documento o te refieres a otro?

http://ww1.microchip.com/downloads/cn/DeviceDoc/cn021484.pdf

El Getting Started me dice como crear u proyecto, pero eso no te dice nada a la hora de empezar a programar que es donde tengo el dilema, y el C30 Compiler Guide no te explica las cosas básicas, ¿no hay documentos intermedios?

Quizas migrar del ensamblador directamente al C30 no sea lo mas adecuado, pero es necesario, quizas hay algún documento de introducción al C de microchip en general que es válido para el C18, C30, ...
Título: Re: dsPIC Curso Basico con C30
Publicado por: blackcat en 01 de Abril de 2008, 11:57:24
Hola ... cuando se descarga el C30 del sitio web de microchip dice claramente:

The MPLAB® C C30 compiler is a full-featured ANSI compliant C compiler

Por lo que todo respecto al lenguaje C lo podes encontrar en cualquier libro de C, yo aprendi C con el libro:

Kernighan Brian W; Ritchie Dennis M. El Lenguaje de Programación C. Segunda Edición. Prentice Hall, 1991.

El libro es muy claro para alguien que nunca ha programado y muy buena referencia para alguien que ya tenga experiencia ...

Ahora, Microchip tiene los manuales de C30 que refieren los compañeros... estos no son muy claros de como empezar a programar C, sin embargo, relatan detalles muy importantes y únicos del compilador C30 ... detalles que no te dice un libro de C cualquiera .. de hecho ninguno de los que he leido  ... supongo que Microchip puso esos manuales para personas con un poco experiencia o con algún conocimiento en C.

Respecto a los periféricos del micro el manual mas efectivo es el manual de referencia de la familia que estes usando 24, 30 o 33 ... aunque existe una librería con funciones para utilizar los perifericos esta no se compara ni en 1% al del compilador de CCS ... lo que quiero decir que si no tienes conocimiento del periférico a fuerza tenés que leer (y entender  :D ) el manual de referencia para ver como funciona ... yo fui asistente de un laboratorio de la universidad en donde se usaban  PICs, mucha gente usaba la serie 16F con el compilador CCS, algunos ASM con MPLAB, unos pocos usaban 18F con C18 ... no quiero criticar a nadie pues hay muchas excepciones ...  todos eran principiantes, mi tarea era ayudarlos con la selección del PIC, cuales interfaces usar según el proyecto, etc, etc ... de los que usaban CCS muy pocos sabian como funcionaba el PWM, pues muchas veces les tuve que explicar!  ... los que usaban ASM y C18 conocían a la perfección como funcionaba el PWM, quiza alguna duda con el timer pero nada complicado ... Con esto NO quiero decir que ASM y C18 es mejor que CCS, me refiero a que ASM y C18 te obligan a leer la hoja de datos y el manual de referencia para ver como demonios :5] se pone a funcionar el PWM.

Mi recomendación siempre es empezar con ASM para tener una noción de como funciona el micro, luego pasar a C. El libro:

Programming 16-Bit PIC Microcontrollers in C: Learning to Fly the PIC 24

Es muy bueno para tener ideas de proyectos.... pero también en la seccion de code examples o app notes en el sitio de microchip hay buenos ejemplos en C y ASM




Título: Re: dsPIC Curso Basico con C30
Publicado por: superprp en 01 de Abril de 2008, 13:13:59
Pero el como programar el TRISB que en ensamblador es muy facil por ejemplo aquí no te dice ni los manuales de C ni los de C30 como hacerlo, y de la misma forma el resto de registros del dsPIC, las cosas mas elementales entre el asm y el C30 las omite, ya no de C que si que entiendo bastante
Título: Re: dsPIC Curso Basico con C30
Publicado por: blackcat en 01 de Abril de 2008, 20:15:39
En ese caso ... bajar un ejemplo de los muchos que hay en microchip y aplicarle ingenieria inversa!

Saludos!
Título: Re: dsPIC Curso Basico con C30
Publicado por: Renatox_ en 02 de Abril de 2008, 02:48:42
Hola, El Family Reference Manual te da la función de los registros de cada módulo, por ejm te da la función de cada bit del registro T1CON, para escribirlo en el C30 lo puedes hacer asi:

T1CON=0x1234;
o si quieres modificar un solo bit sería:
T1CONbits.TON=1;

De donde viene este formato, abre el archivo p30F4011.h si usas el 4011, y veras que hay un monton de estructuras, cada una representa un módulo y cada una tiene un nombre, también están los "defines", chequea eso.

saludos
Título: Re: dsPIC Curso Basico con C30
Publicado por: superprp en 04 de Abril de 2008, 06:10:26
Se puede definir una array de 3 bis en lugar de 3 bytes???, he creado una variable de 8bits y de ahí quiero meter los bits 0, 1 y 2 en un registro de 16bits en las posiciones 7, 6 y 5 y no se como hacerlo, ¿hay alguna forma?
Título: Re: dsPIC Curso Basico con C30
Publicado por: Sispic en 04 de Abril de 2008, 13:47:57
Puedes plantearlo asi por ejemplo :

Código: C
  1. __extension__ typedef struct {
  2.   union {
  3.     struct {
  4.       unsigned char   bit0:1;
  5.       unsigned char   bit1:1;
  6.       unsigned char   bit2:1;
  7.       unsigned char   bit3:1;
  8.       unsigned char   bit4:1;
  9.       unsigned char   bit5:1;
  10.       unsigned char   bit6:1;
  11.       unsigned char   bit7:1;
  12.     };
  13.     struct {
  14.       unsigned char  byte;
  15.     };
  16.   };
  17. } Mi_Byte;
  18.  
  19.  
  20. __extension__ typedef struct {
  21.   union {
  22.     struct {
  23.       unsigned char   bit0:1;
  24.       unsigned char   bit1:1;
  25.       unsigned char   bit2:1;
  26.       unsigned char   bit3:1;
  27.       unsigned char   bit4:1;
  28.       unsigned char   bit5:1;
  29.       unsigned char   bit6:1;
  30.       unsigned char   bit7:1;
  31.       unsigned char   bit8:1;
  32.       unsigned char   bit9:1;
  33.       unsigned char   bit10:1;
  34.       unsigned char   bit11:1;
  35.       unsigned char   bit12:1;
  36.       unsigned char   bit13:1;
  37.       unsigned char   bit14:1;
  38.       unsigned char   bit15:1;
  39.  
  40.     };
  41.     struct {
  42.       unsigned char  byte0;
  43.       unsigned char  byte1;
  44.     };
  45.     struct {
  46.       unsigned int  word;
  47.     };
  48.   };
  49. } Mi_Word;

Y ya haces lo que quieres .

Código: C
  1. int main(void){
  2.  
  3.    Mi_Byte a;     Mi_Word b;
  4.  
  5.      b.bit0 = a.bit3;
  6.      b.bit13 = a.bit4;
  7.     a.byte = b.byte0;  
  8.  
  9. }

Creo NO se pueden crear arrays de 1 bit con c30 , yo jugaria con las estructuras o sacrificarlo con bytes

Título: Re: dsPIC Curso Basico con C30
Publicado por: superprp en 08 de Abril de 2008, 06:56:03
y cuando defines una variable, por ejempo, ¿no se puede hacer esto?:

unsigned char aux;
aux.bit3 = 1;
TRISB.bit8= aux.bit0;


Título: Re: dsPIC Curso Basico con C30
Publicado por: Nocturno en 08 de Abril de 2008, 07:29:50
No, con un char no se puede, salvo que asignes su contenido a una estructura como la que te propone el maestro.
Título: Re: dsPIC Curso Basico con C30
Publicado por: superprp en 08 de Abril de 2008, 07:52:14
He incluido en el "p30f4013.h" estas lineas:

/*Registro auxiliar REG_AUX*/
typedef struct {
      unsigned char   bit0:1;
                unsigned char   bit1:1;
      unsigned char   bit2:1;
      unsigned char   bit3:1;
      unsigned char   bit4:1;
                unsigned char   bit5:1;
      unsigned char   bit6:1;
                unsigned char   bit7:1;
      unsigned char   bit8:1;
      unsigned char   bit9:1;
                unsigned char   bit10:1;
                unsigned char   bit11:1;
                unsigned char   bit12:1;
                unsigned char   bit13:1;
                unsigned char   bit14:1;
                unsigned char   bit15:1;
      } Mi_Word;
      
extern volatile Mi_Word REG_AUX __attribute__((__sfr__));



y luego en el main.c, mi programa, pongo esta linea:
REG_AUX.bit0 = 1;

y al hacer build all me dice:
undefined reference to `REG_AUX'
Link step failed.
Título: Re: dsPIC Curso Basico con C30
Publicado por: migsantiago en 18 de Julio de 2008, 15:15:50
Hola

Estoy empezando con el dspic30f4011. Uso mplab 8.0 y el compilador c30. Estoy compilando un ejemplo levemente modificado del libro Diseño práctico de aplicaciones de Angulo. Para configurar las entradas y salidas uso el Visual Initializer.

Configuro...

Port B - RB0, RB1 y RB2 como salidas
Oscillator - Fosc 4MHz, primary oscillator xt mode
16 bit timer 1 - Enable on startup, prescale 1:256, desired time period 1000ms, actual time period 0.001000ms (creo que aquí está el problema)
Interrupts and flags configuration - Enabled ints T1, priority 4

El programa principal es...

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

/*
RB0 verde
RB1 ámbar
RB2 amarillo
*/

void __attribute__((__interrupt__)) _T1Interrupt(void)
{
IFS0bits.T1IF=0; //borra flag de interrupción
if(PORTBbits.RB0==1) //rojo
PORTB=2; //prende ámbar
if(PORTBbits.RB1==1) //ámbar
PORTB=4; //prende verde
if(PORTBbits.RB2==1) //verde
PORTB=1; //prende rojo
}


int main()
{
VisualInitialization(); //usa lo configurado en el VI

PORTB=1; //valor inicial

while(1)
asm("clrwdt"); //borra watchdog

return 0;
}

Compilo y todo sale bien, a excepción de una advertencia  :x

Código: [Seleccionar]
Clean: Deleting intermediary and output files.
Clean: Deleted file "D:\santiago\PICs\programas\dspic semaforo\init_dsPIC30F4011.o".
Clean: Deleted file "D:\santiago\PICs\programas\dspic semaforo\semaforo.o".
Clean: Deleted file "D:\santiago\PICs\programas\dspic semaforo\dspic adc.cof".
Clean: Deleted file "D:\santiago\PICs\programas\dspic semaforo\dspic adc.hex".
Clean: Done.
Executing: "C:\Archivos de programa\Microchip\MPLAB C30\bin\pic30-gcc.exe" -mcpu=30F4011 -c "Generated Files\VDIInit\init_dsPIC30F4011.s" -o"init_dsPIC30F4011.o" -Wa,-g
Executing: "C:\Archivos de programa\Microchip\MPLAB C30\bin\pic30-gcc.exe" -mcpu=30F4011 -x c -c   "semaforo.c" -o"semaforo.o" -g -Wall
semaforo.c: In function '_T1Interrupt':
semaforo.c:10: warning:  PSV model not specified for '_T1Interrupt';
   assuming 'auto_psv' this may affect latency
semaforo.c: In function 'main':
semaforo.c:23: warning: implicit declaration of function 'VisualInitialization'
Executing: "C:\Archivos de programa\Microchip\MPLAB C30\bin\pic30-gcc.exe" -mcpu=30F4011 "init_dsPIC30F4011.o" "semaforo.o" -o"dspic adc.cof" -Wl,-L"C:\Archivos de programa\Microchip\MPLAB C30\lib",-Tp30F4011.gld,-Map="dspic adc.map",--report-mem


Program Memory Usage

section                    address   length (PC units)   length (bytes) (dec)
-------                    -------   -----------------   --------------------
.reset                           0                 0x4             0x6  (6)
.ivt                           0x4                0x7c            0xba  (186)
.aivt                         0x84                0x7c            0xba  (186)
.text                        0x100               0x13a           0x1d7  (471)
.dinit                       0x23a                 0x2             0x3  (3)
.isr                         0x23c                 0x2             0x3  (3)
__FOSC                    0xf80000                 0x2             0x3  (3)
__FWDT                    0xf80002                 0x2             0x3  (3)
__FBORPOR                 0xf80004                 0x2             0x3  (3)

                     Total program memory used (bytes):          0x360  (864) 1%


Data Memory Usage

section                    address      alignment gaps    total length  (dec)
-------                    -------      --------------    -------------------

                        Total data memory used (bytes):              0  (0)


Dynamic Memory Usage

region                     address                      maximum length  (dec)
------                     -------                      ---------------------
heap                             0                                   0  (0)
stack                        0x800                               0x800  (2048)

                        Maximum dynamic memory (bytes):          0x800  (2048)

Executing: "C:\Archivos de programa\Microchip\MPLAB C30\bin\pic30-bin2hex.exe" "D:\santiago\PICs\programas\dspic semaforo\dspic adc.cof"
Loaded D:\santiago\PICs\programas\dspic semaforo\dspic adc.cof.
BUILD SUCCEEDED: Fri Jul 18 13:12:03 2008


Conecto el dspic con su cristal de 4MHz, sus capacitores; los leds con sus resistencias; mclr a 5V; y todos los vdd, vss, avdd y avss con sus voltajes respectivos.

¿Qué hace el dspic? Solo se queda en la parte del while(1) y aparentemente no entra a la interrupción del timer 1, es decir no cambian las salidas RB1 ni RB2, solo se queda encendido RB0.

¿Qué me sugieren? Está raro el problema, pero como soy nuevo ya se me acabaron las ideas  :D

Gracias  :)
Título: Re: dsPIC Curso Basico con C30
Publicado por: Nocturno en 18 de Julio de 2008, 15:26:58
¿Puedes colgar el programa y el proyecto para echarle una ojeada?
Título: Re: dsPIC Curso Basico con C30
Publicado por: migsantiago en 18 de Julio de 2008, 15:33:13
Claro, aquí está.

http://www.4shared.com/file/55705708/6a6dfd8b/dspic_semaforo.html

Gracias  :mrgreen:
Título: Re: dsPIC Curso Basico con C30
Publicado por: Renatox_ en 19 de Julio de 2008, 01:03:06
Hola migsantiago, prueba reemplazando tu línea de interrupción por esta:

void __attribute__((interrupt, no_auto_psv))  _T1Interrupt(void)

le dices al compilador que no vas a crear variables en la memoria flash vistas desde la ram (32Kbytes), el warning debe desaparecer.

saludos
Título: Re: dsPIC Curso Basico con C30
Publicado por: Nocturno en 19 de Julio de 2008, 02:52:55
Sospecho que hay algún problema con el Visual Initializer, Migsantiago.

Si activas el bit de Interrupción manualmente en tu main, después de la llamada al Visual Initializer funciona perfectamente:
_T1IE=1;

He seguido probando cosas, eliminando esa línea de nuevo y también he conseguido que funcione cambiando la prioridad de la interrupción T1 de 4 a 1.

Como no tiene mucho sentido, supongo que hay algún problema con la activación del bit T1IE de manera automática y por eso al cambiar de prioridad lo hace bien.
Título: Re: dsPIC Curso Basico con C30
Publicado por: migsantiago en 19 de Julio de 2008, 21:49:06
Hola

Renatox, agragué la línea y el warning desapareció, gracias.

Nocturno, probé lo siguiente...

- Prioridad a 0
- Desired time a 1ms y actual time cambió a 0.976562ms, agregué un contador de 1000 para simular 1 segundo.
- Agregué la línea de activación de la interrupción timer1

Pero no funcionó, se quedó en el led encendido sin hacer nada.

Voy a hacer desde cero el proyecto para ver si me equivoqué en algo, pero por mientras voy a leer el Family Reference Manual de los dspic30, porque no tengo ni idea de cómo se calcula el tiempo con estos timers, sólo sé que usan tres modos, A, B y C.
Título: Re: dsPIC Curso Basico con C30
Publicado por: Nocturno en 20 de Julio de 2008, 02:28:25
Es raro, a mí me funciona  :?
Título: Re: dsPIC Curso Basico con C30
Publicado por: Renatox_ en 20 de Julio de 2008, 03:19:28
Recuerda que debes actualizar el prescaler del Timer en la misma rutina de interrupción, por ejm:

void __attribute__((interrupt, no_auto_psv))  _T1Interrupt(void)

   ...
   IFS0bits.T1IF = 0;          /* borra el flag del timer1 */
   T1CONbits.TCKPS=1;    /* Prescaler = 8 */
   TMR1=0;                     /* lo resetea a 0 */
   ...
}

Si no lo actualizas el prescaler puede cambiar, no es un bug, esto está en el manual.

saludos.
Título: Re: dsPIC Curso Basico con C30
Publicado por: migsantiago en 20 de Julio de 2008, 13:53:04
Ayer revisé el manual pero solo le di una hojeada, no leí todo.

Renatox, ¿cuál es la fórmula para calcular los tiempos con el timer1? ¿o en dónde la puedo encontrar?
Título: Re: dsPIC Curso Basico con C30
Publicado por: Renatox_ en 20 de Julio de 2008, 20:51:48
Hola, para calcular el tiempo de interrupción aplicas la fórmula:

                PR1*Prescaler
Tiempo =  ------------------    (seg)
                        Fcy
 
donde Fcy=MIPS.
PR1=valor del periodo

saludos,
Título: Re: dsPIC Curso Basico con C30
Publicado por: jjcblanco en 18 de Mayo de 2009, 13:52:37
y la frec en mips como la calculas? Usando la frec de reloj?
Título: Re: dsPIC Curso Basico con C30
Publicado por: jjcblanco en 18 de Mayo de 2009, 13:54:24
En las pruebas que estas haciendo que reloj usas?
Título: Re: dsPIC Curso Basico con C30
Publicado por: Renatox_ en 19 de Mayo de 2009, 01:03:47
hola, yo uso crital de 10Mhz, entonces calculas

MIPS=Frec.cristal*PLL/4

en  mi caso MIPS=10M*8/4=20MIPS

saludos.
Título: Re: dsPIC Curso Basico con C30
Publicado por: jjcblanco en 05 de Agosto de 2009, 23:31:31
Estoy tratando de manejar un lcd, que ya lo hice para pic18 pero en ccs, ahora lo estoy tratando de hacer para c30 con un dspic30f4011, pero no le estoy dando en la tecla alguien tiene una libreria porque xlcd que es la que trae el c30 no me funciona.

Título: dsPIC Curso Basico con C30
Publicado por: irma en 06 de Agosto de 2009, 11:34:12
hola estoy haciendo un proyecto final :"procesamiento de señales de voz mediante dspic  " quisiera saber que algoritmos puedo utilizar , como realizo la programacion  agradeceria la ayuda
Título: Re: dsPIC Curso Basico con C30
Publicado por: beatAurex1 en 25 de Noviembre de 2009, 23:35:42
Tengo una duda, en ASM llevamos el control preciso de cuanto tarda nuestro programa, pero en C30 para dspics alguien me podria decir como puedo saber el tiempo total que tarda una determinada rutina.

Gracias
Título: Re: dsPIC Curso Basico con C30
Publicado por: guillermoacdc en 13 de Febrero de 2010, 19:06:55
Yo creo que se trata de un tiempo limite, es decir, si no se ha recibido toda una cadena en el tiempo especificado, entonces, la funcion retorna (para no quedarse estancada)
Título: Re: dsPIC Curso Basico con C30
Publicado por: guillermoacdc en 13 de Febrero de 2010, 19:10:36


Acerca de getsSPI, spi_data_wait
Yo creo que se trata de un tiempo limite, es decir, si no se han recibido las n cadenas en el tiempo especificado, entonces, la funcion retorna (para no quedarse estancada)


Título: Re: dsPIC Curso Basico con C30
Publicado por: niuton en 28 de Febrero de 2010, 20:49:40
Hola a todos, llevo mucho tiempo siguiendo este foro que me ha servido para iniciarme en los 18F que programaba con el CCS C y funcionaba más o menos bien.
Pero ahora quiero empezar con los dsPIC30 y me lleve una decepción con el CCS C ya que todo era mál funcionamiento y muchos bug, así que me he tenido que meter con el C30, que me está costando bastante ya que lo veo diferente, por que en el CCs C te olvidabas de todo y aqui tienes más control del micro (eso es lo que creo  :mrgreen: ).

Bueno pues a ver si me podeis aclara algunas dudas. Yo tengo una plaquita con un 30F3013 con un cristal 7.37MHz y quiero hacerlo funcionar con PLL16 para conseguir los 30MIPS, como no domino mucho  la inicialización de los registros he usado el Visual Initializer, pero creo que no lo hace bien ya que aparece 29MHz y debería aparecer 119MHz (pongo una imagen).
Este es el codigo que me crea:
Código: [Seleccionar]
; Feature=fuses - fuses (DCR) configuration
config __FOSC, 0xC707
; Feature=Oscillator - Oscillator configuration
MOV.B #0x03, W0
MOV.B #0x78, W1
MOV.B #0x9A, W2
MOV.W #OSCCON, W3
MOV.B W1, [W3+1]
MOV.B W2, [W3+1]
MOV.B W0, [W3+1]
CLR.B W0
MOV.B #0x46, W1
MOV.B #0x57, W2
MOV.B W1, [W3+0]
MOV.B W2, [W3+0]
MOV.B W0, [W3+0]

¿Como se puede calcular estos valores del oscilador?

y una ultima cosa, yo quiero utilizar el simulador para comprobar que todo esté bien, pero si uso un PLL16 en la configuración del oscilador en el simualdor que deberia poner ¿119MHz o 7.37MHz?

muchas gracias. BYE
Título: Re: dsPIC Curso Basico con C30
Publicado por: Suky en 01 de Marzo de 2010, 00:26:40
Lo mas sencillo es leer el datasheet del dsPIC en la sección de oscillator configurations, y determinar con que valores cargar los registros, luego de eso a esperar que el PLL de "enganche" y a seguir trabajando  :mrgreen:

Revisa el siguiente enlace (http://www.ucontrol.com.ar/forosmf/programacion-en-c/pic24-y-c30-un-mundo-de-diversiones!-d/msg21867/#msg21867), donde configuro el PLL de un PIC24H.


Saludos!
Título: Re: dsPIC Curso Basico con C30
Publicado por: Renatox_ en 01 de Marzo de 2010, 02:16:45
Tienes que poner 117.92 en Debugger-Settings porque tu cristal es de 7.37Mhz y tu PLL de 16.
Y en tu declaracion arriba debe ir _FOSC(XT_PLL16);

saludos.
Título: Re: dsPIC Curso Basico con C30
Publicado por: niuton en 01 de Marzo de 2010, 06:30:28
gracias por responder, no conocía ese enlace y viene muy bien explicado las configuraciones lo voy a revisar y comento. respecto a colocar "_FOSC(XT_PLL16);" si yo he utilizado el Visual Initializer y no lo a colocado solo "__FOSC, 0xC707" quiere decir que no lo ha hecho bien ¿no?, a demás de eso debería colocar el¿ XT_PLL16?.

Un cosa más, si lo que yo quiero utilizar el dsPIC es para realizar operaciones matemáticas y controladores, ¿sería buena opción los PIC24H o está bien los dsPIC?.

BYE y gracias
Título: Re: dsPIC Curso Basico con C30
Publicado por: niuton 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
Título: Re: dsPIC Curso Basico con C30
Publicado por: niuton 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.
Título: Ejemplo LED y RS232 30F3013
Publicado por: niuton 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.
Título: Ejemplo I2C 30F3013
Publicado por: niuton 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:
Título: Re: dsPIC Curso Basico con C30
Publicado por: Renatox_ 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
Título: Re: dsPIC Curso Basico con C30
Publicado por: Suky en 02 de Abril de 2010, 20:17:51
Podes hacer:

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

Saludos!
Título: Re: dsPIC Curso Basico con C30
Publicado por: Renatox_ 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
Título: Re: dsPIC Curso Basico con C30
Publicado por: Suky 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  :?
Título: Re: dsPIC Curso Basico con C30
Publicado por: Cryn 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.
Título: Re: dsPIC Curso Basico con C30
Publicado por: Suky 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:



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!
Título: Re: dsPIC Curso Basico con C30
Publicado por: Cryn 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.
Título: Re: dsPIC Curso Basico con C30
Publicado por: Suky en 03 de Abril de 2010, 14:52:01
C30 aprendí tomando el PIC24HJ, datasheet, los manuales de referencia de Microchip (http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=2572),C30_Users_Guide y los documentos de ayuda que tiene al instalar el compilador. O sea leyendo mucho y aplicando en ejemplos sencillos.

Saludos!
Título: Re: dsPIC Curso Basico con C30
Publicado por: Cryn en 03 de Abril de 2010, 17:53:46
OK suky, a leer se dijo entonces.

saludos y gracias.
Título: Re: dsPIC Curso Basico con C30
Publicado por: Renatox_ 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.
Título: Re: dsPIC Curso Basico con C30
Publicado por: Cryn 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.
Título: Re: dsPIC Curso Basico con C30
Publicado por: migsantiago en 04 de Abril de 2010, 12:16:43
En http://www.microchip.com/dspic encontrarás una infinidad de documentos y códigos descargables.
Título: Re: dsPIC Curso Basico con C30
Publicado por: Cryn en 04 de Abril de 2010, 12:18:58
listo mig, le doy una mirada

gracias por el link.
Título: Re: dsPIC Curso Basico con C30
Publicado por: Suky en 04 de Abril de 2010, 13:29:07
Aquí (http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=2556) están todos los manuales de referencia de los dispositivos de 16-bits.

Explican en general el funcionamiento de cada modulo y por lo general tienen algo de código en assembler y C30.


Saludos!
Título: Re: Curso Basico C30 - PIC24FJ128GA010
Publicado por: Suky en 05 de Abril de 2010, 15:31:07
Dejo algunos ejemplos simples para el PIC24FJ128GA010  ;-)


Titilar leds, modificación y utilización de delays en libpic30.h
Código: C
  1. #include <p24fj128ga010.h>
  2.  
  3. _CONFIG1( JTAGEN_OFF & GCP_OFF & GWRP_OFF & BKBUG_OFF & COE_OFF & ICS_PGx2 & FWDTEN_OFF & WINDIS_OFF & FWPSA_PR128 & WDTPS_PS32768);
  4. _CONFIG2( FNOSC_PRI & FCKSM_CSDCMD & POSCMOD_HS );
  5.  
  6. #define FCY 10000000UL
  7. #include <libpic30.h>
  8.  
  9. /* ** Modificando en libpic30.h ** */
  10. /*
  11. #if !defined(FCY)
  12.         extern void __delay_ms(unsigned long);
  13.         extern void __delay_us(unsigned long);
  14. #else
  15.         #define __delay_ms(d) __delay32( (unsigned long long) (d)*(FCY)/1000)
  16.         #define __delay_us(d) __delay32( (unsigned long long) (d)*(FCY)/1000000)
  17.         #define __delay_s(d) __delay32( (unsigned long) (d)*(FCY))
  18. #endif
  19. */
  20.  
  21.  
  22. int main (int argc, char * argv[]){
  23.        
  24.        
  25.         TRISF=0xFFF3;
  26.        
  27.         LATFbits.LATF2=0;
  28.         LATFbits.LATF3=0;
  29.        
  30.         while(1){
  31.                 LATFbits.LATF2=0;
  32.                 __delay_ms(500);
  33.                 LATFbits.LATF2=1;
  34.                 __delay_ms(500);
  35.         }
  36.  
  37. }

Configuración de timer 2y3 para formar timer de 32-bits, más interrupción:

Código: C
  1. #include <p24fj128ga010.h>
  2.  
  3. _CONFIG1( JTAGEN_OFF & GCP_OFF & GWRP_OFF & BKBUG_OFF & COE_OFF & ICS_PGx2 & FWDTEN_OFF & WINDIS_OFF & FWPSA_PR128 & WDTPS_PS32768);
  4. _CONFIG2( FNOSC_PRI & FCKSM_CSDCMD & POSCMOD_HS );
  5.  
  6. /*#define FCY 20000000UL
  7. #include <libpic30.h>*/
  8.  
  9. #include <timer.h>
  10. /* ***************************************************************** */
  11. void __attribute__((__interrupt__, __shadow__)) _T3Interrupt(void){
  12.                
  13.         LATDbits.LATD8=~LATDbits.LATD8; // Cambiamos de estado pin F2.-
  14.         _T3IF = 0; //Borramos flag.
  15. }
  16.  
  17.  
  18. int main (int argc, char * argv[]){
  19.        
  20.        
  21.         TRISD=0xF0FF;
  22.        
  23.         OpenTimer23(T23_ON & T2_IDLE_STOP & T2_GATE_OFF & T2_PS_1_1 & T2_SOURCE_INT,0x004C4B40);
  24.  
  25.         ConfigIntTimer23(T3_INT_PRIOR_1 &  T3_INT_ON);
  26.  
  27.         WriteTimer23(0x00);
  28.        
  29.         while(1){
  30.         }
  31.  
  32. }


Configuración UART más interrupción:

Código: C
  1. #include <p24fj128ga010.h>
  2.  
  3. _CONFIG1( JTAGEN_OFF & GCP_OFF & GWRP_OFF & BKBUG_OFF & COE_OFF & ICS_PGx2 & FWDTEN_OFF & WINDIS_OFF & FWPSA_PR128 & WDTPS_PS32768);
  4. _CONFIG2( FNOSC_PRI & FCKSM_CSDCMD & POSCMOD_HS );
  5.  
  6. #include <uart.h>
  7.  
  8. char DataUART;
  9. char KbhitUART;
  10.  
  11.  
  12. /* ** *********************************************************************************** ** */
  13. // Definciones para calculo de Baud Rate.-
  14. #define FCY 10000000  // MHz
  15. #define BAUDRATE 9600
  16. #define BRGHigh 1
  17. #if BRGHigh
  18.         #define BRGVAL ((FCY/BAUDRATE)/4)-1
  19.          
  20. #else
  21.         #define BRGVAL ((FCY/BAUDRATE)/16)-1
  22. #endif
  23.  
  24. //__attribute__ ((__section__ (".text"), __space__(prog)))
  25. const char Texto[]= "Probando comunicación serial...\r\nPIC24FJ128GA010  xD ...\r\n"; 
  26. /* ** *********************************************************************************** ** */
  27. void __attribute__((__interrupt__, __shadow__)) _U2RXInterrupt(void){
  28.                
  29.         DataUART=getcUART2();
  30.         KbhitUART=1;
  31.         _U2RXIF=0; // Borramos flag.
  32. }
  33. /* ** *********************************************************************************** ** */
  34. int main (int argc, char * argv[]){
  35.  
  36.         /* ** Utilizando las funciones definidas en C30 ** */
  37.         OpenUART2(UART_EN & UART_IDLE_STOP & UART_IrDA_DISABLE & UART_MODE_SIMPLEX &
  38.                         UART_UEN_00 & UART_DIS_WAKE & UART_DIS_LOOPBACK & UART_UXRX_IDLE_ONE &
  39.                 UART_DIS_ABAUD & UART_NO_PAR_8BIT & UART_BRGH_FOUR & UART_1STOPBIT,
  40.                         0xFFFF & UART_IrDA_POL_INV_ZERO & UART_SYNC_BREAK_DISABLED &
  41.                         UART_TX_ENABLE & UART_INT_RX_CHAR & UART_ADR_DETECT_DIS & UART_RX_OVERRUN_CLEAR,
  42.                         BRGVAL);
  43.                        
  44.         ConfigIntUART2(UART_RX_INT_EN & UART_RX_INT_PR1 & UART_TX_INT_DIS & UART_TX_INT_PR0 );
  45.        
  46.        
  47.         /*U2MODEbits.USIDL=1; // Al pasar al modo Sleep, apagar modulo.
  48.         U2MODEbits.IREN=0; // Codificacion/decodificacion IrDA deshabilitado.
  49.         U2MODEbits.RTSMD=1; // RTS en modo simple.
  50.         U2MODEbits.UEN=0b00; // Tx/Rx habilitado, CTS/RTS deshabilitados.
  51.         U2MODEbits.WAKE=0; // Wake-up deshabilitado.
  52.         U2MODEbits.LPBACK=0; // Modo LoopBack deshabilitado.
  53.         U2MODEbits.ABAUD=0; // Auto-Baud rate deshabilitado.
  54.         U2MODEbits.RXINV=0; // Modo normal de pin RX, en reposo = 1.
  55.         U2MODEbits.BRGH=BRGHigh; // Mode seleccionado en define.-
  56.         U2MODEbits.PDSEL=0b00; // 8 bits- sin paridad.
  57.         U2MODEbits.STSEL=0; // 1 bit de Stop.
  58.  
  59.         U2STAbits.UTXISEL1=1; // Interrupcion por transimision no usada.
  60.         U2STAbits.UTXISEL0=1; // Interrupcion por transimision no usada.
  61.         U2STAbits.UTXINV=0; // Pin Tx en reposo igual a 1.
  62.         U2STAbits.UTXBRK=0; // Break deshabilitado.
  63.         U2STAbits.URXISEL=0b00; // Interrumpir cuando se recibe un caracter.
  64.         U2STAbits.ADDEN=0; // Auto-Address deshabilitado.
  65.         U2STAbits.OERR=0; // Borramos bits de error por overflow.
  66.        
  67.         U2BRG =BRGVAL;  // Baud Rate determinado en defines.
  68.  
  69.         IPC7bits.U2RXIP=0b01; // Fijamos nivel de prioridad.
  70.         IFS1bits.U2RXIF=0; // Borramos flag.
  71.         IEC1bits.U2RXIE=1; // habilitamos interrupcion por recepción.
  72.  
  73.         U2MODEbits.UARTEN=1;// Encendemos modulo.
  74.         U2STAbits.UTXEN=1; // Transmision habilitada.*/
  75.  
  76.        
  77.  
  78.  
  79.         KbhitUART=0;
  80.         putsUART2(Texto);
  81.        
  82.         while(1){
  83.                 if(KbhitUART==1){
  84.                         KbhitUART=0;
  85.                         putcUART2(DataUART);
  86.                 }
  87.         }
  88. }

Para probarlos arme una PICCard para la MultiBoardPicTrainer de Felixls  :-)

(http://img594.imageshack.us/img594/3576/imagen020.jpg)

Si alguien necesita el PCB me avisa  ;-)

Saludos!

Título: Re: dsPIC Curso Basico con C30
Publicado por: Nocturno en 05 de Abril de 2010, 15:33:25
Excelente aportación Suky, muchas gracias.

Deberías proteger esa PCB tan chula contra el óxido.
Título: Re: Curso Basico C30 - PIC24FJ128GA010
Publicado por: MGLSOFT en 05 de Abril de 2010, 16:12:45
Dejo algunos ejemplos simples para el PIC24FJ128GA010  ;-)


Titilar leds, modificación y utilización de delays en libpic30.h
Código: C
  1. #include <p24fj128ga010.h>
  2.  
  3. _CONFIG1( JTAGEN_OFF & GCP_OFF & GWRP_OFF & BKBUG_OFF & COE_OFF & ICS_PGx2 & FWDTEN_OFF & WINDIS_OFF & FWPSA_PR128 & WDTPS_PS32768);
  4. _CONFIG2( FNOSC_PRI & FCKSM_CSDCMD & POSCMOD_HS );
  5.  
  6. #define FCY 10000000UL
  7. #include <libpic30.h>
  8.  
  9. /* ** Modificando en libpic30.h ** */
  10. /*
  11. #if !defined(FCY)
  12.         extern void __delay_ms(unsigned long);
  13.         extern void __delay_us(unsigned long);
  14. #else
  15.         #define __delay_ms(d) __delay32( (unsigned long long) (d)*(FCY)/1000)
  16.         #define __delay_us(d) __delay32( (unsigned long long) (d)*(FCY)/1000000)
  17.         #define __delay_s(d) __delay32( (unsigned long) (d)*(FCY))
  18. #endif
  19. */
  20.  
  21.  
  22. int main (int argc, char * argv[]){
  23.        
  24.        
  25.         TRISF=0xFFF3;
  26.        
  27.         LATFbits.LATF2=0;
  28.         LATFbits.LATF3=0;
  29.        
  30.         while(1){
  31.                 LATFbits.LATF2=0;
  32.                 __delay_ms(500);
  33.                 LATFbits.LATF2=1;
  34.                 __delay_ms(500);
  35.         }
  36.  
  37. }

Configuración de timer 2y3 para formar timer de 32-bits, más interrupción:

Código: C
  1. #include <p24fj128ga010.h>
  2.  
  3. _CONFIG1( JTAGEN_OFF & GCP_OFF & GWRP_OFF & BKBUG_OFF & COE_OFF & ICS_PGx2 & FWDTEN_OFF & WINDIS_OFF & FWPSA_PR128 & WDTPS_PS32768);
  4. _CONFIG2( FNOSC_PRI & FCKSM_CSDCMD & POSCMOD_HS );
  5.  
  6. /*#define FCY 20000000UL
  7. #include <libpic30.h>*/
  8.  
  9. #include <timer.h>
  10. /* ***************************************************************** */
  11. void __attribute__((__interrupt__, __shadow__)) _T3Interrupt(void){
  12.                
  13.         LATDbits.LATD8=~LATDbits.LATD8; // Cambiamos de estado pin F2.-
  14.         _T3IF = 0; //Borramos flag.
  15. }
  16.  
  17.  
  18. int main (int argc, char * argv[]){
  19.        
  20.        
  21.         TRISD=0xF0FF;
  22.        
  23.         OpenTimer23(T23_ON & T2_IDLE_STOP & T2_GATE_OFF & T2_PS_1_1 & T2_SOURCE_INT,0x004C4B40);
  24.  
  25.         ConfigIntTimer23(T3_INT_PRIOR_1 &  T3_INT_ON);
  26.  
  27.         WriteTimer23(0x00);
  28.        
  29.         while(1){
  30.         }
  31.  
  32. }


Configuración UART más interrupción:

Código: C
  1. #include <p24fj128ga010.h>
  2.  
  3. _CONFIG1( JTAGEN_OFF & GCP_OFF & GWRP_OFF & BKBUG_OFF & COE_OFF & ICS_PGx2 & FWDTEN_OFF & WINDIS_OFF & FWPSA_PR128 & WDTPS_PS32768);
  4. _CONFIG2( FNOSC_PRI & FCKSM_CSDCMD & POSCMOD_HS );
  5.  
  6. #include <uart.h>
  7.  
  8. char DataUART;
  9. char KbhitUART;
  10.  
  11.  
  12. /* ** *********************************************************************************** ** */
  13. // Definciones para calculo de Baud Rate.-
  14. #define FCY 10000000  // MHz
  15. #define BAUDRATE 9600
  16. #define BRGHigh 1
  17. #if BRGHigh
  18.         #define BRGVAL ((FCY/BAUDRATE)/4)-1
  19.          
  20. #else
  21.         #define BRGVAL ((FCY/BAUDRATE)/16)-1
  22. #endif
  23.  
  24. //__attribute__ ((__section__ (".text"), __space__(prog)))
  25. const char Texto[]= "Probando comunicación serial...\r\nPIC24FJ128GA010  xD ...\r\n"; 
  26. /* ** *********************************************************************************** ** */
  27. void __attribute__((__interrupt__, __shadow__)) _U2RXInterrupt(void){
  28.                
  29.         DataUART=getcUART2();
  30.         KbhitUART=1;
  31.         _U2RXIF=0; // Borramos flag.
  32. }
  33. /* ** *********************************************************************************** ** */
  34. int main (int argc, char * argv[]){
  35.  
  36.         /* ** Utilizando las funciones definidas en C30 ** */
  37.         OpenUART2(UART_EN & UART_IDLE_STOP & UART_IrDA_DISABLE & UART_MODE_SIMPLEX &
  38.                         UART_UEN_00 & UART_DIS_WAKE & UART_DIS_LOOPBACK & UART_UXRX_IDLE_ONE &
  39.                 UART_DIS_ABAUD & UART_NO_PAR_8BIT & UART_BRGH_FOUR & UART_1STOPBIT,
  40.                         0xFFFF & UART_IrDA_POL_INV_ZERO & UART_SYNC_BREAK_DISABLED &
  41.                         UART_TX_ENABLE & UART_INT_RX_CHAR & UART_ADR_DETECT_DIS & UART_RX_OVERRUN_CLEAR,
  42.                         BRGVAL);
  43.                        
  44.         ConfigIntUART2(UART_RX_INT_EN & UART_RX_INT_PR1 & UART_TX_INT_DIS & UART_TX_INT_PR0 );
  45.        
  46.        
  47.         /*U2MODEbits.USIDL=1; // Al pasar al modo Sleep, apagar modulo.
  48.         U2MODEbits.IREN=0; // Codificacion/decodificacion IrDA deshabilitado.
  49.         U2MODEbits.RTSMD=1; // RTS en modo simple.
  50.         U2MODEbits.UEN=0b00; // Tx/Rx habilitado, CTS/RTS deshabilitados.
  51.         U2MODEbits.WAKE=0; // Wake-up deshabilitado.
  52.         U2MODEbits.LPBACK=0; // Modo LoopBack deshabilitado.
  53.         U2MODEbits.ABAUD=0; // Auto-Baud rate deshabilitado.
  54.         U2MODEbits.RXINV=0; // Modo normal de pin RX, en reposo = 1.
  55.         U2MODEbits.BRGH=BRGHigh; // Mode seleccionado en define.-
  56.         U2MODEbits.PDSEL=0b00; // 8 bits- sin paridad.
  57.         U2MODEbits.STSEL=0; // 1 bit de Stop.
  58.  
  59.         U2STAbits.UTXISEL1=1; // Interrupcion por transimision no usada.
  60.         U2STAbits.UTXISEL0=1; // Interrupcion por transimision no usada.
  61.         U2STAbits.UTXINV=0; // Pin Tx en reposo igual a 1.
  62.         U2STAbits.UTXBRK=0; // Break deshabilitado.
  63.         U2STAbits.URXISEL=0b00; // Interrumpir cuando se recibe un caracter.
  64.         U2STAbits.ADDEN=0; // Auto-Address deshabilitado.
  65.         U2STAbits.OERR=0; // Borramos bits de error por overflow.
  66.        
  67.         U2BRG =BRGVAL;  // Baud Rate determinado en defines.
  68.  
  69.         IPC7bits.U2RXIP=0b01; // Fijamos nivel de prioridad.
  70.         IFS1bits.U2RXIF=0; // Borramos flag.
  71.         IEC1bits.U2RXIE=1; // habilitamos interrupcion por recepción.
  72.  
  73.         U2MODEbits.UARTEN=1;// Encendemos modulo.
  74.         U2STAbits.UTXEN=1; // Transmision habilitada.*/
  75.  
  76.        
  77.  
  78.  
  79.         KbhitUART=0;
  80.         putsUART2(Texto);
  81.        
  82.         while(1){
  83.                 if(KbhitUART==1){
  84.                         KbhitUART=0;
  85.                         putcUART2(DataUART);
  86.                 }
  87.         }
  88. }

Para probarlos arme una PICCard para la MultiBoardPicTrainer de Felixls  :-)

(http://img594.imageshack.us/img594/3576/imagen020.jpg)

Si alguien necesita el PCB me avisa  ;-)

Saludos!



Sobre esa PCB y con adaptadores no podremos trabajar con los PIC32?? :shock: :shock:
Título: Re: Curso Basico C30 - PIC24FJ128GA010
Publicado por: Suky en 05 de Abril de 2010, 18:04:57
Excelente aportación Suky, muchas gracias.

Deberías proteger esa PCB tan chula contra el óxido.

Si, ya le he puesto protección....  ;-)

Sobre esa PCB y con adaptadores no podremos trabajar con los PIC32?? :shock: :shock:

Falta lugar como para colocarle los conectores ethernet/chip PHY, USB host, ect... Si solo se quisiera colocar un conector USB Host creo que sobraría espacio en un PIC32 64 pines.


Saludos!
Título: Re: dsPIC Curso Basico con C30
Publicado por: Cryn en 05 de Abril de 2010, 18:05:20
justo la librería de retardos que andaba buscando, la podes dejar por acá por favor, querido amigo suky?

ese micro es de 100pines :shock: que bien manejas la plancha, a ver si algún día pillo la maña para sacar esos tqfp.

esa misma librería de retardos servirá para C18, porque contar ciclos a veces enreda :D

saludos
Título: Re: dsPIC Curso Basico con C30
Publicado por: Suky en 05 de Abril de 2010, 18:36:05
justo la librería de retardos que andaba buscando, la podes dejar por acá por favor, querido amigo suky?

ese micro es de 100pines :shock: que bien manejas la plancha, a ver si algún día pillo la maña para sacar esos tqfp.

esa misma librería de retardos servirá para C18, porque contar ciclos a veces enreda :D

saludos

La librería esta en C:\Archivos de programa\Microchip\MPLAB C30\support\generic\h, pero adjunto la que modifique para que funcione bien a 40 MIPS (PIC24H)

Pero solo funciona en C30, busque la que indico Santiago en otro post, pero en el Microchip Solutions que tengo dice que es solo para C32  :?

No se olviden que por aquí (http://www.todopic.com.ar/foros/index.php?topic=29138.0) deje una librería para LCD en C30 más ejemplos  ;-)


Saludos!


Título: Re: dsPIC Curso Basico con C30
Publicado por: migsantiago en 05 de Abril de 2010, 18:43:56
Supuestamente la librería TimeDelay.c funciona para cualquier PIC según su contenido...

C:\Microchip Solutions\Microchip\Common

Código: [Seleccionar]
File Name:       TimeDelay.c
Dependencies:    None
Processor:       PIC18/PIC24/dsPIC30/dsPIC33/PIC32
Compiler:        C30 v3.12
Company:         Microchip Technology, Inc.

Tiene un par de includes...

Código: [Seleccionar]
#if defined(__PIC32MX__)
#include <plib.h>
#endif
#include "HardwareProfile.h"
#include "TimeDelay.h"

... los cuáles se encuentran dentro de la Microchip Applications Library.
Título: Re: dsPIC Curso Basico con C30
Publicado por: Suky en 05 de Abril de 2010, 18:45:47
Supuestamente la librería TimeDelay.c funciona para cualquier PIC según su contenido...

C:\Microchip Solutions\Microchip\Common

Código: [Seleccionar]
File Name:       TimeDelay.c
Dependencies:    None
Processor:       PIC18/PIC24/dsPIC30/dsPIC33/PIC32
Compiler:        C30 v3.12
Company:         Microchip Technology, Inc.

Tiene un par de includes...

Código: [Seleccionar]
#if defined(__PIC32MX__)
#include <plib.h>
#endif
#include "HardwareProfile.h"
#include "TimeDelay.h"

... los cuáles se encuentran dentro de la Microchip Applications Library.

Voy a bajar la última versión, pues como digo, la que tengo no la tiene  :roll:

Edit: Bajando....78 MB....
Título: Re: dsPIC Curso Basico con C30
Publicado por: migsantiago en 05 de Abril de 2010, 18:46:57
OK, nos avisas si funciona. No la he probado por ahora.  :mrgreen:
Título: Re: dsPIC Curso Basico con C30
Publicado por: Suky en 05 de Abril de 2010, 20:29:50
Si funciona, aunque no la utilizaría para hacer nada que necesite un error menor al 10% !  :mrgreen:

Para usarla de forma sencilla hay que copiar los archivos TimeDelay.c, TimeDelay.h y HardwareProfile.h a la carpeta del proyecto o colocarlos en una carpeta especifica y agregarlos al proyecto:

(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=1626.0;attach=11688)


Y listo:

Código: C
  1. #include "TimeDelay.h"
  2.  
  3. int main (int argc, char * argv[]){
  4.  
  5.         Delay10us(5);  // 50us
  6.         DelayMs(10);


Saludos!
Título: comparadores para PWM
Publicado por: niuton en 16 de Junio de 2010, 05:44:52
Hola a todos, ahora que tengo otro poco de tiempo he seguido con el dspic30F3013 y estoy intentando de generar una señal PWM de 50Hz con la ayuda de los comparadores. El comparador activa una interrupción cuando se cumple la condición con el TIMER y la patilla OCx la coloca a 5v o 0v de forma automática. pero quería saber si es posible utilizar la patilla OCx para el ADC y sólo usar la interrupción del comparador sin que se utilice la patilla OCx como salida.

bueno espero que me hayan entendido.

Otra duda, yo uso C30 y quería cambiar el estado de pin RB2-RB4 de alto a bajo de forma secuencial, pero no quería utilizar los if ni nada por el estilo, vamos que quería usar una función parecida a bit_set en CCS, que le indique el puerto y se valla incrementando el bit a cambiar. lo que se me a ocurrido es utilizar BSET en ASM

i=0;
ASM("BSET LATB, i")
i++;

pero no me deja me da error, solo se puede poner numeros, ¿se os ocurre alguna forma?.

Un saludo
Título: Re: dsPIC Curso Basico con C30
Publicado por: ElEspañolito en 09 de Junio de 2011, 20:33:25
Buenas,

estoy utilizando las funciones que elaboró en su día Renatox para el envio de datos por la UART getcom y sendcom. La cuestión es que las simulo (utilizo MPLAB) y mirando los tiempos con el Stopwatch me tarda 3ms en enviar un simple float. Teoricamente tengo la UART configurada a 9600 (micro a 30MIPS) y utilizo los pines alternativos para la UART1. Cuelgo codigo de inicializacion de la UART y de la función (que en principio, lo único que he hecho es cambiar el nombre).

Código: [Seleccionar]
void config_UART(void) {
U1MODE=0x2420;
U1STA=0x8000;
BAUD=9600;
U1BRG=(1875000/BAUD)-1;
}

void SendUART(unsigned int k, char *p) { 
for(;k;--k) {
while(BusyUART1());
putcUART1(*p);
p++;
  }

Hay algo mal o es que no simula bien los envios por este canal??

gracias, saludos
Título: Re: dsPIC Curso Basico con C30
Publicado por: Suky en 09 de Junio de 2011, 21:09:12
Buenas,

estoy utilizando las funciones que elaboró en su día Renatox para el envio de datos por la UART getcom y sendcom. La cuestión es que las simulo (utilizo MPLAB) y mirando los tiempos con el Stopwatch me tarda 3ms en enviar un simple float. Teoricamente tengo la UART configurada a 9600 (micro a 30MIPS) y utilizo los pines alternativos para la UART1. Cuelgo codigo de inicializacion de la UART y de la función (que en principio, lo único que he hecho es cambiar el nombre).

Código: [Seleccionar]
void config_UART(void) {
U1MODE=0x2420;
U1STA=0x8000;
BAUD=9600;
U1BRG=(1875000/BAUD)-1;
}

void SendUART(unsigned int k, char *p) { 
for(;k;--k) {
while(BusyUART1());
putcUART1(*p);
p++;
  }

Hay algo mal o es que no simula bien los envios por este canal??

gracias, saludos


Y es coherente... 1/9600= 104us por bits. 1 Start, 8 de datos y 1 de Stop, todo eso por 4  :? Aqui nada tiene que ver los MIPS
Título: Re: dsPIC Curso Basico con C30
Publicado por: ElEspañolito en 09 de Junio de 2011, 23:36:11
 :oops: ... mientras cenaba, pensandolo con calma,... empezaba a ver que no era tan incoherente,... aunque con la explicacion me queda todo mas claro! Gracias  ;-)
Título: Re: dsPIC Curso Basico con C30
Publicado por: juantaipe en 29 de Junio de 2011, 13:09:49
DESEANOLE EXITOS; POR FAVOR COMO SUBO IMAGENES AL FORO ; CUANDO INTENTO SUBIR LA IMAGEN; PULSO SOBRE EL BOTON IMAGEN Y ME SALE ; QUE HAGO PARA SUBIRLO                       (http://)
Título: Re: dsPIC Curso Basico con C30
Publicado por: jencaozh en 08 de Julio de 2011, 12:09:11
Aqui les dejo un enlace mui interesante_la verdad si es mui bueno_nos enseña a programar los dspic con mplap tanto en asm como en c.
Consta de un libro i un cd aparte dond hai una serie d aplicaciones q c an explicando en la segunda parte del libro.
M gustaria saber tambien si alguien sabe como reproducir archivos wav desde una memoria sd con un dspic_si alguien sabe mandeme informacion les estare muy agradecidos.


Censurado
Título: Re: dsPIC Curso Basico con C30
Publicado por: Suky en 08 de Julio de 2011, 13:26:42
Aqui les dejo un enlace mui interesante_la verdad si es mui bueno_nos enseña a programar los dspic con mplap tanto en asm como en c.
Consta de un libro i un cd aparte dond hai una serie d aplicaciones q c an explicando en la segunda parte del libro.
M gustaria saber tambien si alguien sabe como reproducir archivos wav desde una memoria sd con un dspic_si alguien sabe mandeme informacion les estare muy agradecidos.

Lee las normas del foro, ese libro tiene Copyright. El link será eliminado...


Saludos!
Título: Re: dsPIC Curso Basico con C30
Publicado por: dragondgold en 31 de Julio de 2011, 17:09:42
Hola gente estuve leyendo el post y muy interesante aprendí muchas cosas pero no encontré demasiado relacionado a la configuración del Oscilador de los dsPIC.
Estoy tratando de configurarlo ya que es bastante complejo o por lo menos para mi, encontré este link que es muy famoso:
http://www.micropic.es/index.php?option=com_content&task=view&id=32&Itemid=58
Pero no me funciona no genera nada lo probé en Google Chrome, Mozilla Firefox e Internet Explorer y no genera nada en ninguno.
Por lo que al código respecta este es:

Código: [Seleccionar]
//#include <p33FJ128GP804.h>
#define __dsPIC33FJ32MC202__
#include <p33fj32mc202.h>
#include <libpic30.h>
#include <uart.h>
#include <stdio.h>

//#include "utilities.c"
#include "mylibs.h"

char string[] = "Wiii un string xD";

int main (){

OSCCONbits.NOSC = 0b011;
//FOSCbits.POSCMD =0b01;
CLKDIVbits.PLLPRE = 0b00000; //Clock/2
CLKDIVbits.PLLPOST = 0b10;     //Clock/2
PLLFBDbits.PLLDIV = 32; //Clock*32

  RPINR18bits.U1RXR = 9; //Asignamos pin recepción UART1 a RP9.-
  RPOR4bits.RP8R = 0b00011; // Asignamos RP8 al pin de transmisión UART1.

//Configuración del USART 1 (Usado para debug y bootloader)
OpenUART1(UART_EN & UART_IDLE_CON & UART_IrDA_DISABLE & UART_MODE_SIMPLEX & UART_UEN_00 & UART_EN_WAKE &
  UART_DIS_LOOPBACK & UART_DIS_ABAUD & UART_NO_PAR_8BIT & SPEED_MODE & UART_1STOPBIT,
  UART_TX_ENABLE & UART_ADR_DETECT_DIS & UART_RX_OVERRUN_CLEAR, BAUDIOS);

printf("Hello Torno!! Con C30 y dsPIC!! Adentro AVR!! -> %s",string);

while(1){}

}

La idea es con un cristal de 10MHz llegar a 40MIPS en teoría si entro con 10MHz lo divido /2 me quedan 5MHz por 32 me da 160MHz dividido nuevamente por 2 me dan 80MHz que serían 40MIPS. Lo estoy simulando en PROTEUS no si ese será el problema es un dsPIC33FJ32MC202 les adjunto el archivo del Proteus por si quieren probarlo es la versión 7.7.
El código en sí funciona y al parecer está trabajando a una frecuencia real de 3.685.005 Hz o 3.685 MIPS, esto lo pude ver en el proteus ademas de que los baudios que genera al enviar por el USART son los correctos no tengo idea de por que trabaja a esa frecuencia y por más que cambie la frecuencia en el PIC del Proteus sigo generando bien los baudios asi que me parece que puede ser eso también pero no se de que otra manera se cambia la frecuencia...

Espero puedan ayudarme saludos !!
Título: Re: dsPIC Curso Basico con C30
Publicado por: dragondgold en 31 de Julio de 2011, 21:40:45
Bueno al final pude solucionar el problema el código me quedó asi:

Código: [Seleccionar]
PLLFBDbits.PLLDIV = 30; // M=32
CLKDIVbits.PLLPOST = 0;    // N1=2
CLKDIVbits.PLLPRE  = 0;    // N2=2
OSCTUN             = 0;    // Tune FRC oscillator, if FRC is used
RCONbits.SWDTEN=0;      // Disable Watch Dog Timer
while(OSCCONbits.LOCK!=1) {}; // Wait for PLL to lock

El problema estaba en el PLLPOST que lo configuraba como 10 que segun la hoja de datos es Reserved y tenia que estar en 00 que es /2 la verdad ni idea de por que puse eso mil disculpas un error por falta de atención mío... Continuo con estas maravillas de PIC  :mrgreen:
Título: Re: dsPIC Curso Basico con C30
Publicado por: dragondgold en 06 de Agosto de 2011, 15:03:40
Nuevamente les vengo con una pregunta  :D Estuve viendo el post y muestran como configurar el timer 2/3 para que funcione como 32bits pero con clock interno e interrupción.
Estoy haciendo un frecuencímetro y necesito el timer 2/3 en 32bits pero con clock externo, lo he configurado pero no capta los pulsos de afuera, el pin está como entrada pero lee siempre 0, si le cargo cualquier valor al timer luego leo ese valor es decir no incrementa en nada y he metido señal por todos los pines porque en el datasheet dice que el TxCK es el pin de entrada osea T2CK o T3CK pero esos pines no figuran en la hoja de datos son muy raros los pines en los dsPIC ya que no figuran bien por ejemplo el UART es UxTX y no figura sin embargo está como se nombran ??

Asi configuro el timer:

Código: [Seleccionar]
TRISA = 0xFF; TRISB = 0xFFFF;
T2CONbits.TON = 0; //Apago Timer2
T3CONbits.TON = 0; //Apago Timer3
T2CONbits.T32 = 1; //T2 y T3 forman un timer de 32 bits
T2CONbits.TSIDL = 0; //Se apaga en moo IDLE
T2CONbits.TGATE = 0; //Tgate apagado (sirve para medir período)
T2CONbits.TCKPS = 0b00; //Preescaler 1:1
T2CONbits.TCS   = 1; //Clock externo

while(1){

WriteTimer23(0); //Reinicio timer
T2CONbits.TON = 1; //Enciendo el timer

__delay32(40000000); //Delay de 1 segundo exacto a 40MIPS

T2CONbits.TON = 0; //Apago el timer
FRECC = ReadTimer23(); //Leo el valor del timer (que al estar muestreando durante un segundos son los Hz)
PERIODO = 1.0 / (float)FRECC; //Tomo el período de la frecuencia

Y les adjunto la simulación en PROTEUS. Este es el PIC que utilizo

http://ww1.microchip.com/downloads/en/DeviceDoc/70283J.pdf

Es el dsPIC33FJ32MC202 no se si esta mal configurado o no le estoy dando al pin porque ya meti señal por todos como veran en la simulacion y no hay caso.
Espero puedan ayudarme...

Saludos y muchas gracias por su tiempo y ayuda !!
Título: Re: dsPIC Curso Basico con C30
Publicado por: KILLERJC en 06 de Agosto de 2011, 17:39:03
Es por que microchip hizo algo grande xD, y no nos dejo sujeto a pines especificos xD. Existe lo que son los pines remappeables..  o sea vos elegis de los 25 creo pines RPn , en cual queres la entrada T2CK

RPINR3: PERIPHERAL PIN SELECT INPUT REGISTER 3

En ese registro aputnas a que pin lo queres. y a tener en cuenta:

Código: [Seleccionar]
For input mapping only, the Peripheral Pin Select (PPS) functionality does not have priority over the TRISx settings. Therefore, when configuring the RPn pin for input, the corresponding bit in the TRISx register must also be configured for input (i.e., set to ‘1’).
Entonces por ejemplo vos hiciste mal un caminito en la placa y cambias directamente un registro en el PIC, o si te quedan cruzados los caminos y complejos lo arreglas por software.

No llegue a probar con entradas externas, lo hice en ASM pero solo para ver funcionar a los TIMER1 y TMR2/TMR3 con el oscilador interno y interrupciones de overflow.
Título: Re: dsPIC Curso Basico con C30
Publicado por: dragondgold en 07 de Agosto de 2011, 15:49:19
Haaaaa que dato tan interesante ahora todo concuerda  :D Sisi ahora funciona perfectamente simplemente era decirle donde estaba la dichosa entrada muchas gracias !!
Título: Re: dsPIC Curso Basico con C30
Publicado por: KILLERJC en 07 de Agosto de 2011, 19:08:05
Me alegro haberte sido util, algun dia yo tambien me pondre con C30 y C para PIC32, lo espero con ganas :D por ahora ASM! xD
Título: Re: dsPIC Curso Basico con C30
Publicado por: dragondgold en 07 de Agosto de 2011, 19:29:41
Jajaja si yo programe por poco menos de 2 meses asm luego durante 3 años usé CCS y ahora q necesito dsPic uso C30 porq s imposible en CCS sin embargo debo decir que Microchip debería repensar su función printf son 2K de memoria y 1K más si usas float y en CCS son unos pocos bytes no se por q tanta diferencia y además el printf de CCS lo mandas a donde quieras no sólo el usart es la única crítica que le hago por lo demás  es excelente...
Título: Re: dsPIC Curso Basico con C30
Publicado por: Suky en 07 de Agosto de 2011, 19:47:51
....y además el printf de CCS lo mandas a donde quieras no sólo el usart es la única crítica que le hago por lo demás  es excelente...

Hay que hacer un par de modificaciones y se puede usar para mandar cadenas formateadas a cualquier dispositivo, por aquí (http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/pic24-y-c30-un-mundo-de-diversiones!-d/msg22000/#msg22000) un ejemplo.


Saludos!

Título: Re: dsPIC Curso Basico con C30
Publicado por: dragondgold en 07 de Agosto de 2011, 20:01:19
Si es verdad lo que comentas Suky lo que aún no me explico es por que semejante cantidad de memoria...
Título: Re:dsPIC Curso Basico con C30
Publicado por: cicloide2 en 03 de Marzo de 2019, 19:25:31
Les dejo un video por si les interesa
8)
Título: Re:dsPIC Curso Basico con C30
Publicado por: rfjhh en 17 de Septiembre de 2019, 11:43:02
Es una pena que los importantes enlaces compartidos aquí ya no estén activos  :5]
Título: Re:dsPIC Curso Basico con C30
Publicado por: KILLERJC en 17 de Septiembre de 2019, 14:57:04
Es que C30 por asi decirlo no deberia existir mas... A pesar que es uno de los compiladores que no tienen limitaciones ( gratuitos ) son obsoletos y deberia ir por algun compilador vigente como XC16, CCS, mikroC (no se si tiene para 16bits de PIC )