Autor Tema: Mi primer programa en CCS para dsPIC  (Leído 9393 veces)

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

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Mi primer programa en CCS para dsPIC
« en: 08 de Febrero de 2008, 20:48:22 »
Pues con todas las precauciones ante bugs inesperados, y con la novedad de un niño con zapatos nuevos me dispongo a realizar mi primera aplicación en CCS para dsPIC.
Y como lo mejor es empezar por lo que uno ya conoce, me he propuesto arrancar con una comunicación RS232 sencillita, con gestión de entradas y salidas.
Y como no hay que inventar la rueda, que ya fue inventada por mi amigo Diego, me he propuesto utilizar su ejemplo de gestión de comandos por RS232 con buffer.
El programa como podéis ver a continuación es casi el mismo, sólo con la diferencia de los FUSES, la configuración del clock, de la USART y de la interrupción.

Código: C
  1. #include <30F6014A.h>
  2. #device *=16
  3.  
  4. #FUSES NOWDT                    //No Watch Dog Timer
  5. #FUSES XT_PLL8                  //Cristal XT con PLL8
  6. #FUSES WPSB16                   //Watch Dog Timer PreScalar B 1:16
  7. #FUSES WPSA512                  //Watch Dog Timer PreScalar A 1:512
  8. #FUSES PUT64                    //Power On Reset Timer value 64ms
  9. #FUSES BROWNOUT                 //Reset when brownout detected
  10. #FUSES BORV47                
  11. #FUSES LPOL_HIGH                //Low-Side Transistors Polarity is Active-High (PWM 0,2,4 and 6)
  12.    //PWM module low side output pins have active high output polar
  13. #FUSES HPOL_HIGH                //High-Side Transistors Polarity is Active-High (PWM 1,3,5 and 7)
  14.    //PWM module high side output pins have active high output polarity
  15. #FUSES NOPWMPIN                 //PWM outputs drive active state upon Reset
  16. #FUSES NOMCLR                   //Master Clear pin used for I/O
  17. #FUSES NOPROTECT                //Code not protected from reading
  18. #FUSES NOWRT                    //Program memory not write protected
  19. #FUSES NODEBUG                  //No Debug mode for ICD
  20. #FUSES NOCOE                    //Device will reset into operational mode
  21. #FUSES ICS0                     //ICD communication channel 0
  22. #FUSES RESERVED                 //Used to set the reserved FUSE bits
  23.  
  24. #use delay(clock=32000000) // 16MIPS
  25.  
  26.  
  27. #use rs232(UART2,baud=9600,parity=N,bits=8)
  28.  
  29. #byte PORTB=0x2C8
  30.  
  31. // CONSTANTES /////////////////////////////////////////////////////////////////
  32.  
  33. int const lenbuff=32;                  // Longitud de buffer, Ajustar
  34.                                        // a lo que desees (o te sea posible)
  35.  
  36. // VARIABLES EN RAM ///////////////////////////////////////////////////////////
  37.  
  38. int  xbuff=0x00;                       // Índice: siguiente char en cbuff
  39. char cbuff[lenbuff];                   // Buffer
  40. char rcvchar=0x00;                     // último caracter recibido
  41. int1 flagcommand=0;                    // Flag para indicar comando disponible
  42.  
  43. // Declaración de Funciones ///////////////////////////////////////////////////
  44.  
  45. void inicbuff(void);                   // Borra buffer
  46. int  addcbuff(char c);                 // añade caracter recibido al buffer
  47. void echos(char c);                    // Eco selectivo sobre RS232
  48. void procesa_comando(void);            // Procesa comando
  49.  
  50. // INTERRUPCIONES /////////////////////////////////////////////////////////////
  51.  
  52. #int_rda2
  53. void serial_isr() {                    // Interrupción recepción serie USART
  54.  
  55.    rcvchar=0x00;                       // Inicializo caracter recibido                    
  56.    if(kbhit()){                        // Si hay algo pendiente de recibir ...
  57.       rcvchar=getc();                  // lo descargo y ...
  58.       addcbuff(rcvchar);               // lo añado al buffer y ...
  59.       echos(rcvchar);                  // hago eco (si procede).
  60.    }
  61. }
  62.  
  63. // Desarrollo de Funciones ////////////////////////////////////////////////////
  64.  
  65. void echos(char c){                    // Echo selectivo ----------------------
  66.  
  67.       switch(c){
  68.          case 0x0D: printf(" [Ent] "); // Si he pulsado la tecla [Intro]
  69.                     break;
  70.          case 0x08: printf(" [Del] "); // Si he pulsado la tecla [Retroceso]
  71.                     break;
  72.          case 0x1B: printf(" [Esc] "); // Si he pulsado la tecla [Escape]
  73.                     break;
  74.          default:   putc(rcvchar);     // Echo de cualquier otro caracter
  75.       }
  76. }
  77.  
  78. void inicbuff(void){                   // Inicia a \0 cbuff -------------------
  79.    int i;
  80.  
  81.    for(i=0;i<lenbuff;i++){             // Bucle que pone a 0 todos los
  82.       cbuff[i]=0x00;                   // caracteres en el buffer
  83.    }
  84.    xbuff=0x00;                         // Inicializo el indice de siguiente
  85.                                        // caracter
  86. }
  87.  
  88. int addcbuff(char c){                  // Añade a cbuff -----------------------
  89.  
  90.       switch(c){
  91.          case 0x0D:                    // Enter -> Habilita Flag para procesar
  92.             flagcommand=1;             // Comando en Main
  93.             break;
  94.          case 0x08:                    // Del   -> Borra último caracter del Buffer
  95.             if(xbuff>0) cbuff[--xbuff]=0x00;
  96.             break;
  97.          case 0x01B:                   // Esc   -> Borra el Buffer completamente
  98.             inicbuff();
  99.             break;
  100.          default:
  101.             cbuff[xbuff++]=c;          // Añade caracter recibido al Buffer
  102.       }
  103. }
  104.  
  105.  
  106. // Programa Principal /////////////////////////////////////////////////////////
  107.  
  108. void main() {
  109.  
  110.    inicbuff();                                   // Borra buffer al inicio
  111.  
  112.    printf("\r\nTu dsPIC 30F6014 te saluda\r\n");  // Presenta menú
  113.    printf("[Enter] Procesa comando\r");
  114.    printf("[Escape] Borra todo el buffer\r");
  115.    printf("[Delete] Borra último carácter del buffer\r");
  116.    printf("[\\w] Comando Escribe\r");
  117.    printf("[\\r] Comando Lee\r");
  118.    printf("\r");
  119.    enable_interrupts(int_rda2);                   // Habilita Interrupción RDA
  120.    set_tris_b(0);
  121.    do {
  122.        
  123.       if(flagcommand) procesa_comando();         // Si hay comando pendiente
  124.                                                  // de procesar ... lo procesa.
  125.  
  126.    } while (TRUE);
  127.  
  128. }
  129.  
  130. // Procesador de Comandos /////////////////////////////////////////////////////
  131.  
  132. void procesa_comando(void){
  133.  
  134.    int i;
  135.    char arg[lenbuff];                   // Argumento de comando (si lo tiene)
  136.  
  137.    flagcommand=0;                       // Desactivo flag de comando pendiente.
  138.    printf("\r\nProcesando ... ");       // Monitorizo procesando ...
  139.  
  140.    for(i=0;i<lenbuff;i++){             // Bucle que pone a 0 todos los
  141.       arg[i]=0x00;                     // caracteres en el argumento
  142.    }
  143.  
  144.    if(cbuff[0]=='\\'&&cbuff[1]=='r'){   // Comparo inicio del buffer con comando "\r"
  145.    
  146.       printf("Leyendo ... ");           // Aqui lo que deseemos hacer con comando "\r"
  147.      
  148.    }
  149.  
  150.    if(cbuff[0]=='\\'&&cbuff[1]=='w'){   // Comparo inicio del buffer con comando "\w"
  151.       i=2;
  152.       do{                               // Extraemos argumento del buffer
  153.          arg[i-2]=cbuff[i];             // a partir del 3er byte y hasta \0.
  154.       }while(cbuff[++i]!=0x00);
  155.      
  156.       printf("Escribiendo %s ... ",arg);// Aqui lo que deseemos hacer con comando "\w"
  157.                                         // Monitorizamos el argunmento.
  158.    }
  159.  
  160.    inicbuff();                          // Borro buffer.
  161.  
  162.    printf("Procesado.\r\n\r\n");        // Monitorizo procesado.
  163. }

Me ha hecho mucha ilusión verlo funcionando; ahí va la foto:

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Mi primer programa en CCS para dsPIC
« Respuesta #1 en: 08 de Febrero de 2008, 21:01:42 »
Felicitaciones, Manolo!!
Que version utilizaste?? :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.


Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5552
    • Picmania by Redraven
Re: Mi primer programa en CCS para dsPIC
« Respuesta #3 en: 08 de Febrero de 2008, 22:07:37 »
Me encanta que te acuerdes de mí y de mis ruedas. Enhorabuena Maestro, tú ve abriendo puertas que yo te sigo de cerca, haciéndote un marcaje pegajoso y severo.  :mrgreen: :mrgreen: :mrgreen:
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Mi primer programa en CCS para dsPIC
« Respuesta #4 en: 08 de Febrero de 2008, 23:01:19 »
 :shock: wow te ha quedado muy bien Nocturno, felicidades, y espero pronto liberarme para darle de lleno a los proyectos que llevo en la mente, dentro esta mi inicio con dsPic :mrgreen:

que buena version de CCS tienes :-/
.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Mi primer programa en CCS para dsPIC
« Respuesta #5 en: 09 de Febrero de 2008, 02:16:09 »
Diego, acércate lo justito, que no me gustan los roces  :D

Cryn, aún no sé si es buena o no. De momento compila el código para dsPIC, que no es poco, pero no le tengo mucha confianza aún.

Desconectado Sispic

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 1700
    • winpic800
Re: Mi primer programa en CCS para dsPIC
« Respuesta #6 en: 09 de Febrero de 2008, 08:42:37 »
muy bien hecho manolo , tu ve haciendo y nos cuentas :lol:

C32 le sigue los pasos de cerca tambien al C30


Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Mi primer programa en CCS para dsPIC
« Respuesta #7 en: 11 de Febrero de 2008, 03:42:44 »
Tengo que deciros que he continuado desarrollando mi aplicación, que aún no está terminada, pero que ya utiliza un Timer, dos interrupciones externas, la USART con salida y entrada por interrupción, y un montón de funciones de tratamiento de strings y de arrays en memoria.
De momento va como la seda, tan sólo con algún pequeño fallo en la configuración de los fuses.
No os pego el programa aquí porque está en pleno desarrollo y no es nada ilustrativo, pero sí que me está convenciendo esta versión para dsPIC. Desde luego, si no me falla, le voy a dar un buen par de patadas en los huevos al C30.

Por cierto, para los curiosos, el programa consiste en "escuchar" el bus de datos y direcciones de una máquina tragaperras y actuar sobre el mismo cuando se detectan las condiciones necesarias para hacerlo, tomando el control de distintas funciones de la máquina. Estoy encantado porque es la primera vez que hago algo parecido: la máquina está gobernada pon un Z80 y, sin embargo, baila al son que le marca mi dsPIC  :-/

Meta

  • Visitante
Re: Mi primer programa en CCS para dsPIC
« Respuesta #8 en: 11 de Febrero de 2008, 12:23:29 »
Soy curioso en uC. Hablando de curiosidad siento, curiosidad de si eres capaz de hacer lo mismo con asm. Los 18F tienen 77 instrucciones, vete a saber cuanto tendrán los dsPIC y si son iguales.

Suerte con tu proyecto y felicidades por hacerlo funcionar. Veo en tu web que cada vez maneja muchos pic diferentes, si he dicho pic, prueba con AT90S1220 ejejjeeejejejej. Vi los comando y no entiendo ni papa.
« Última modificación: 11 de Febrero de 2008, 12:26:14 por Meta »

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5552
    • Picmania by Redraven
Re: Mi primer programa en CCS para dsPIC
« Respuesta #9 en: 11 de Febrero de 2008, 12:48:10 »
Puf. No solo es capaz sino que además es capaz de programar con una sola mano, e incluso con un solo ojo pongamos por caso si la ocasión, las circunstancias o el guión lo exigen. Faltaría plus.  :D
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Mi primer programa en CCS para dsPIC
« Respuesta #10 en: 11 de Febrero de 2008, 20:55:47 »
que bien quiero leer muy buenas noticias del compilador, para que despues pueda usarlo con confianza :-/ :-/

vamos nocturno! gracias por compartir tus experiencias :mrgreen:
.

Desconectado manex_1987

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1127
Re: Mi primer programa en CCS para dsPIC
« Respuesta #11 en: 13 de Marzo de 2008, 17:28:36 »
Yo desdeluego no pienso deshacerme de C30 en mucho tiempo... demasiados agravios pendientes con CCS...

 :lol:

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Mi primer programa en CCS para dsPIC
« Respuesta #12 en: 13 de Marzo de 2008, 20:20:35 »
Aún no os lo he contado porque quiero documentarme bien, pero he tenido que abandonar CCS en favor de C30. Menudo chasco  :(

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Mi primer programa en CCS para dsPIC
« Respuesta #13 en: 14 de Marzo de 2008, 13:03:06 »
 :( que lastima :(

entonces el CCS todavia tiene fallas en cuanto a los dspic??? qeu macana :(

cuantanos los detalles cuando puedas Nocturno, para despues verlo tb
.

Desconectado manex_1987

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1127
Re: Mi primer programa en CCS para dsPIC
« Respuesta #14 en: 14 de Marzo de 2008, 13:04:59 »
Soy (somos) todo oidos nocturno. Estoy deseando de que pongas a parir a CCS. De veras.  :x :x

La verdad es que no se que veis a CCS. Bien, todo muy bonito, comodo y a mano, y no tengo nada encontra de eso... pero nose, yo al menos con el tiempo me he dado cuenta de que es mil veces mejor trabajar mas "codo con codo" con el micro, manipulando registros y viendo lo que realmente hace el cacharro, que andar enplan "OpenXXX(.....) , set_timer_X(...)  , enable_interrupts(...)" y asi.

He estado en ccs... y terminé harto de sus bugs. No digo que C30 no los tenga... pero nose, le he cogido el gusto a este. Para proyectillos de una tarde puede que use ccs pero para algo mas serio nunca.

A lo mejor es mi mania pero es que no soporto que el compilador haga nada a mis espaldas. ((Aunque aun asi no puedo prescindir de printf)).



 

anything