Autor Tema: Microcursillo en C  (Leído 178968 veces)

0 Usuarios y 4 Visitantes están viendo este tema.

Desconectado johnnybravo

  • PIC12
  • **
  • Mensajes: 76
Re: Microcursillo en C
« Respuesta #450 en: 21 de Enero de 2007, 19:18:01 »
Saludos amigos del microcursillo
bueno la verdad es que no soy un capo en este lenguaje ... recien lo estoy aprendiendo y esque la verdad esta muy bueno este microcursillo y e aprendido un monto aqui...

revisando un poco el programa CCS encontre algo muy chido que me gusto mucho.... un ejemplo de como subirrle musiquita al pic el ejemplo se llama EX_tones... y tiene por supuesto un driver para esto que tambien viene con le programa.. bueno lo quise probar pero grande fue mi sorpresa cuando me arrojo un error :shock: .... que paso ??? :( el mensaje decia "A #DEVICE required before this line" alguien tubo el mismo problema? .. ¿ a que se debe.... que significa ?
como lo puedo solucionar... para poder compilarlo....
Atte.
Johnny Bravo

Desconectado johnnybravo

  • PIC12
  • **
  • Mensajes: 76
Re: Microcursillo en C
« Respuesta #451 en: 21 de Enero de 2007, 19:52:09 »
hola amigos otra ves
Alguien se anima a ayudarme a decifrar un poco el ejemplito EX_Tones.c  :-/  del copilador CCS.
bueno la verdad es que soy un novato en este lenguaje
pero aqui va el primer intento.


/////////////////////////////////////////////////////////////////////////
////                          EX_TONES.C                             ////
////                                                                 ////
////  This example plays the song "Happy Birthday."                  ////
////                                                                 ////
////  Configure the CCS prototype card as follows:                   ////
////     Connect the positive wire of the speaker to pin 47 (B0)     ////
////     Connect the negative wire of the speaker to pin 27 (Gnd)    ////
////                                                                 ////
////  This example will work with the PCM and PCH compilers.  The    ////
////  following conditional compilation lines are used to include a  ////
////  valid device for each compiler.  Change the device and clock   ////
////  pins for your hardware if needed.                              ////
/////////////////////////////////////////////////////////////////////////

#if defined(__PCM__)  // ????
#include <16F877.h>  // esta liena indica el pic que usaremos
#fuses HS,NOWDT,NOPROTECT,NOLVP    // esto es la configuracion de los fusibles del pic
#use delay(clock=20000000)  // esto indica el pic corre con un cristal de 20MHz

#elif defined(__PCH__)  // ?????
#include <18F452.h>  // ????? porque  se define otro pic ???? aclaren me esto ????
#fuses HS,NOWDT,NOPROTECT,NOLVP  /?????
#use delay(clock=20000000)
#endif

#include <tones.c>  //incluimos el driver Tones.c, este produce las frec y duracion de las notas musicales

#define SIZE 25  // define de cuantas notas tiene nuestra estructura musical

const struct note  // esto es la subrutina estructura de notas
{
   long tone;  // la frecuencia de la nota, la frecuenci esta incluida en la tabla del driver tones.c
   long length;  // la duracion de la nota, tambien incluida en la misma tabla del driver tones.c
} happy_bday[SIZE] = { // aquiesta si cuentas mas abajo tiene 25 notas musicales con su frecuencia y duracion
C_note[0],350, C_note[0],100, D_note[0],500, C_note[0],500, F_note[0],500, E_note[0],900,
C_note[0],350, C_note[0],100, D_note[0],500, C_note[0],500, G_note[0],500, F_note[0],900,
C_note[0],350, C_note[0],100, C_note[1],500, A_note[0],500, F_note[0],500, E_note[0],500, D_note[0],900,
Bb_note[0],350, Bb_note[0],100, A_note[0],500, F_note[0],500, G_note[0],500, F_note[0],1200};


void main(void)  {  // esto es el programa principal
   int i;  // declaramos la variable i

   while(TRUE)  // esto es un bucle infinito
   {
      for(i=0; i<SIZE; ++i)  // esta condicion nos dice que ejecutara la siguiente instruccion mientras la variable i<25
      {
         generate_tone(happy_bday.tone,happy_bday.length);  // esto llama al driver Tones.c
         delay_ms(75);  // un delay de 75ms
      }
   }
}

bueno todo lo explicado es a mi modesto entender, como ven hay cosas que no llego a entender. y las he remarcado como:   //????????  aqui les quiero pedir que me ayuden a decifrar el resto del ejemplo

a por cierto para los que no tienen el CCS el driver tones.c  lo pongo por aqui abajo tal y como biene.

////////////////// Driver to generate musical tones /////////////////////
////                                                                 ////
////  generate_tone(frequency, duration)     Generates wave at set   ////
////                                         frequency (Hz) for set  ////
////                                         duration (ms)           ////
////                                                                 ////
/////////////////////////////////////////////////////////////////////////

#ifndef  MUSIC_NOTES
#define  MUSIC_NOTES

//            NOTE                 FREQUENCY
//                     Octave0  Octave1  Octave2  Octave3
const long C_NOTE[4]  ={ 262,     523,    1047,    2093};
const long Db_NOTE[4] ={ 277,     554,    1109,    2217};
const long D_NOTE[4]  ={ 294,     587,    1175,    2349};
const long Eb_NOTE[4] ={ 311,     622,    1245,    2489};
const long E_NOTE[4]  ={ 330,     659,    1329,    2637};
const long F_NOTE[4]  ={ 349,     698,    1397,    2794};
const long Gb_NOTE[4] ={ 370,     740,    1480,    2960};
const long G_NOTE[4]  ={ 392,     784,    1568,    3136};
const long Ab_NOTE[4] ={ 415,     831,    1661,    3322};
const long A_NOTE[4]  ={ 440,     880,    1760,    3520};
const long Bb_NOTE[4] ={ 466,     923,    1865,    3729};
const long B_NOTE[4]  ={ 494,     988,    1976,    3951};
#endif

#define TONE_PIN  PIN_B0


void do_delay(int ms_delay, int num_ms, int us_delay, int num_us)  {
 int i;

 for(i=0;i<num_ms;i++)
  delay_ms(250);
 delay_ms(ms_delay);
 for(i=0;i<num_us;i++)
  delay_us(250);
 delay_us(us_delay);
}


void generate_tone(long frequency, long duration)
{
   int32 total_delay_time;                      // in microseconds
   long total_ms_delay_time, total_us_delay_time;
   int num_us_delays, num_ms_delays, ms_delay_time, us_delay_time;
   long num_periods;

   total_delay_time = (1000000/frequency)/2-10; // calculate total delay time (10 for error)

   total_ms_delay_time = total_delay_time/1000; // total delay time of ms
   num_ms_delays = total_ms_delay_time/250;     // number of 250ms delays needed
   ms_delay_time = total_ms_delay_time%250;     // left over ms delay time needed

   total_us_delay_time = total_delay_time%1000; // total delay time of us (ms already acounted for)
   num_us_delays = total_us_delay_time/250;     // number of 250us delays needed
   us_delay_time = total_us_delay_time%250;     // left over us delay time needed

   num_periods = ((int32)duration*1000)/(1000000/frequency);

   while((num_periods--) != 0)
   {
      do_delay(ms_delay_time, num_ms_delays, us_delay_time, num_us_delays);
      output_high(TONE_PIN);
      do_delay(ms_delay_time, num_ms_delays, us_delay_time, num_us_delays);
      output_low(TONE_PIN);
   }

   return;
}
Atte.
Johnny Bravo

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: Microcursillo en C
« Respuesta #452 en: 23 de Enero de 2007, 08:35:05 »
Pues esta parte del código:
Código: C
  1. #if defined(__PCM__)  // ????
  2. #include <16F877.h>  // esta liena indica el pic que usaremos
  3. #fuses HS,NOWDT,NOPROTECT,NOLVP    // esto es la configuracion de los fusibles del pic
  4. #use delay(clock=20000000)  // esto indica el pic corre con un cristal de 20MHz
  5.  
  6. #elif defined(__PCH__)  // ?????
  7. #include <18F452.h>  // ????? porque  se define otro pic ???? aclaren me esto ????

Son órdenes para el compilador, para definir el pic a usar y su correspondinte libreria de definiciones, y quiere decir algo como esto: Si se define el pic 16F877 pues utiliza la configuración que está a continuación, en caso contrario, pues la definición es paa el pic 18F452.


Suerte!!! ;)
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado johnnybravo

  • PIC12
  • **
  • Mensajes: 76
Re: Microcursillo en C
« Respuesta #453 en: 25 de Enero de 2007, 15:27:24 »
ha yaaaaaaa.. muchas gracias por eso amigo  :-/
Atte.
Johnny Bravo

Desconectado perry

  • PIC10
  • *
  • Mensajes: 12
Re: Microcursillo en C
« Respuesta #454 en: 06 de Febrero de 2007, 07:41:11 »
Hola!!!!

La verdad es que este micro cursillo está muy bien para empezar a familiarizarte con la programacion de pics, este es mi caso que estoy empezando a manejar el ccs pero tengo un problema. A la hora de compilar me da el error de que no encuentra el dispositivo utilizado(18f4550) y la verdad es que en la carpeta devices no tengo más que la configuración de 4 pics. ¿alguien sabe como puedo conseguir el fichero .h del 18f4550?

muchas gracias por vuestra ayuda y seguid así. :P :P :P

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Microcursillo en C
« Respuesta #455 en: 06 de Febrero de 2007, 09:52:05 »
Sí, se puede cambiar por la que tú dices. Creo que es cuestión de gustos.

Mira cómo compila CCS las cuatro opciones siguientes:

Código: [Seleccionar]
.................... if (input(PIN_B0)==1);
0048:  BSF    F93.0
004A:  BTFSS  F81.0
004C:  BRA    004E
.................... 
.................... if (input(PIN_B0));
004E:  BSF    F93.0
0050:  BTFSS  F81.0
0052:  BRA    0054
.................... 
.................... if (input(PIN_B0)==1);
0054:  BSF    F93.0
0056:  BTFSS  F81.0
0058:  BRA    005A
.................... 
.................... if (!input(PIN_B0));
005A:  BSF    F93.0
005C:  BTFSC  F81.0
005E:  BRA    0060

En definitiva, aunque lo pongamos como nos de la gana, siempre se compila en tres ciclos, así que no hay más simplificación posible.

Manolo, he visto este código y creo que una pequeña simplificación más, sería la de activar los seteos rápidos de los puertos para evitar ésta linea (bsf F93.0) que lo que haces es poner el TRISB<0> como entrada

De esa forma, solo ocuparía 2 líneas.



- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado Sispic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1685
    • winpic800
Re: Microcursillo en C
« Respuesta #456 en: 06 de Febrero de 2007, 13:19:18 »
Si maumix , hace cosa rara esto  -> if (input(PIN_B0)==1);


Código: [Seleccionar]
.................... if (  bit_test( PORTB ,  0 )){a=0;}
002C:  BTFSC  F81.0
002E:  CLRF   05
« Última modificación: 06 de Febrero de 2007, 13:23:22 por Sispic »

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Microcursillo en C
« Respuesta #457 en: 06 de Febrero de 2007, 13:27:39 »
Si maumix , hace cosa rara esto  -> if (input(PIN_B0)==1);


Código: [Seleccionar]
.................... if (  bit_test( PORTB ,  0 )){a=0;}
002C:  BTFSC  F81.0
002E:  CLRF   05

Si, una vez ví leyendo velozmente el manual del CCS (el cual no uso) que usa un modo automático que acomoda el tris de un pin como entrada si es que se lee el registro o como salida si es que se lo escribe.

Y que si uno usa algo así como FAST_IO o similar, se evitaba eso.

tal vez justo en el ejemplo de manolo estaban activados.  :)
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: Microcursillo en C
« Respuesta #458 en: 07 de Febrero de 2007, 06:53:39 »
perry tú lo que tienes es la versión demo , parece ser, y por eso tienes un número limitado de pic's


Suerte!!! ;)
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado perry

  • PIC10
  • *
  • Mensajes: 12
Re: Microcursillo en C
« Respuesta #459 en: 09 de Febrero de 2007, 08:26:13 »

Muchas gracias vszener. Tenias razón, ya me he hecho con una version completa. :wink:

He tenido un problema con un ejemplo de modulay (en la pagina tres de este tema) que sumaba 2 numeros y los sacaba por la lcd. A la hora de compilar me da un error que dice: can not change device type this far into the code. ¿por que pasa esto? no he hecho más que copiar el código en ccs.

Cuesta bastante empezar con esto, vaya lío. :-/
muchas gracias

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Microcursillo en C
« Respuesta #460 en: 09 de Febrero de 2007, 11:59:57 »
Si maumix , hace cosa rara esto  -> if (input(PIN_B0)==1);


Código: [Seleccionar]
.................... if (  bit_test( PORTB ,  0 )){a=0;}
002C:  BTFSC  F81.0
002E:  CLRF   05

Si, una vez ví leyendo velozmente el manual del CCS (el cual no uso) que usa un modo automático que acomoda el tris de un pin como entrada si es que se lee el registro o como salida si es que se lo escribe.

Y que si uno usa algo así como FAST_IO o similar, se evitaba eso.

tal vez justo en el ejemplo de manolo estaban activados.  :)


Aclarenme una duda que tengo, la idea de simplificar un código en C ¿se trata de optimizar el ensamblador que genera ó de reducir las lineas de programacion?


Salu2
Pedro
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Microcursillo en C
« Respuesta #461 en: 09 de Febrero de 2007, 13:22:18 »
Según cuál sea tu objetivo. Puede que se trate de optimizar la velocidad o de optimizar el tamaño.
Te pongo un ejemplo: vamos a generar una onda cuadrada muy rápida por un pin llamado "led".

En caso de optimizar en tamaño podríamos optimizarlo así:

Código: C
  1. ....................    for (i=0;i<10;i++) {
  2. 0104:  CLRF   15
  3. 0106:  MOVF   15,W
  4. 0108:  SUBLW  09
  5. 010A:  BNC   0114
  6. ....................       led=0;
  7. 010C:  BCF    F81.2
  8. ....................       led=1;
  9. 010E:  BSF    F81.2
  10. ....................
  11. 0110:  INCF   15,F
  12. 0112:  BRA    0106   }

y si queremos optimizar el programa en velocidad, sin importarnos lo que ocupe, nada mejor que esto:
Código: C
  1. ....................       led=0;
  2. 0114:  BCF    F81.2
  3. ....................       led=1;
  4. 0116:  BSF    F81.2
  5. ....................       led=0;
  6. 0118:  BCF    F81.2
  7. ....................       led=1;
  8. 011A:  BSF    F81.2
  9. ....................       led=0;
  10. 011C:  BCF    F81.2
  11. ....................       led=1;
  12. 011E:  BSF    F81.2
  13. ....................       led=0;
  14. 0120:  BCF    F81.2
  15. ....................       led=1;      
  16. 0122:  BSF    F81.2
  17. ....................       led=0;
  18. 0124:  BCF    F81.2
  19. ....................       led=1;
  20. 0126:  BSF    F81.2
  21. ....................       led=0;
  22. 0128:  BCF    F81.2
  23. ....................       led=1;
  24. 012A:  BSF    F81.2
  25. ....................       led=0;
  26. 012C:  BCF    F81.2
  27. ....................       led=1;
  28. 012E:  BSF    F81.2
  29. ....................       led=0;
  30. 0130:  BCF    F81.2
  31. ....................       led=1;
  32. 0132:  BSF    F81.2
  33. ....................       led=0;
  34. 0134:  BCF    F81.2
  35. ....................       led=1;
  36. 0136:  BSF    F81.2
  37. ....................       led=0;
  38. 0138:  BCF    F81.2
  39. ....................       led=1;
  40. 013A:  BSF    F81.2
Código: ASM
  1.  

Desconectado mistergato

  • PIC10
  • *
  • Mensajes: 2
Re: Microcursillo en C
« Respuesta #462 en: 12 de Julio de 2007, 04:04:41 »
eyy yo me apunto.!!! necesito eso si o siiiii

Desconectado handpic

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 72
Re: Microcursillo en C
« Respuesta #463 en: 28 de Agosto de 2007, 16:04:13 »
Hola a todos,

Llevo algún tiempo intentando aprender esto del "C", pero resulta que me encuentro con algunos escaloncillos...

He intentado simular estos primeros ejercicios que indicais, pero no puedo compilarlos, el MPLAB, con el compilador de microchip, me dice que no es posible para el 16F84.

Es posible que sea por que no encuentra el archivo 16f84.h.

Aunque los programas los voy entendiendo, creo que se me quedan cosas en el tintero.

Por cierto, está claro que llevo algo de retraso..... vuestros mensajes son del 2004.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Microcursillo en C
« Respuesta #464 en: 28 de Agosto de 2007, 19:12:43 »
La mayoría de los ejemplos que encontrarás aquí (por no decir todos) están hechos con el compilador CCS, y por eso seguramente te fallarán en el compilador de Microchip.
Te recomiendo te hagas con un CCS y lo pruebes.