Autor Tema: Ejemplitos en C: Mis Funciones favoritas en CCS C  (Leído 52111 veces)

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

Desconectado Arbolito

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 893
Re: Ejemplitos en C: Mis Funciones favoritas en CCS C
« Respuesta #30 en: 26 de Mayo de 2006, 13:31:46 »
si en la carpeta drivers se llama pic18_usb y pic_usb
Existo, aunque pienses que no pienso

Desconectado LabPIC

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 143
Re: Ejemplitos en C: Mis Funciones favoritas en CCS C
« Respuesta #31 en: 26 de Mayo de 2006, 20:26:04 »
Ups creo que se pq no tengo :z) estos drivers para la usb , lo que pasa es que es la version demo la que tengo  :D, de cualquier manera gracias juan ya lo conseguire por aca.

Saludos LabPIC  :mrgreen:
« Última modificación: 26 de Mayo de 2006, 20:28:59 por LabPIC »
¡¡¡Viva México cabrones!!!

Desconectado oedipus

  • PIC10
  • *
  • Mensajes: 2
Re: Ejemplitos en C -- Error en AgnoBisiesto
« Respuesta #32 en: 01 de Junio de 2006, 05:16:25 »
...
#inline
short esAgnoBisiesto(int y)
{
return (y % 4 == 0);
}
...

Un año es bisiesto si es divisible por 4, excepto aquellos divisibles por 100 pero no por 400. Luego la función es erronea. Algo correcto sería lo siguiente:


#define TRUE 1
#define FALSE 0

int GLeapYearQ(int y)
{
   if( (y % 4) != 0 ) return FALSE;
   if( ( y % 100 ) != 0 ) return TRUE;
   if( ( y % 400) != 0 ) return FALSE;
   return TRUE;
}

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Ejemplitos en C: Mis Funciones favoritas en CCS C
« Respuesta #33 en: 01 de Junio de 2006, 15:38:37 »
ja, ja, ja  :D  :D  :D

Tienes toda la razón.  :P

Ya tuvimos tuvimos el mismo intercambio de mensajes con este tema el maestro nocturno y yo ... pero no logro encontrar donde están esos mensajes asi que ... copio aquí lo esencial de los mismos:

Primitivamente el calendario romano constaba de 10 meses; se atribuye a la influencia de los sabinos la introducción del calendario de 12 meses con tres fechas mensuales fijas: Calendas, Nonas e Idus.

Julio César estableció el calendario de 365 días con años bisiestos y Gregorio XIII lo reformó tal y como es hoy.

Las Calendas eran el "día 1" de cada mes. Los días anteriores al día 1 hacian referencia a las Calendas de ese mes. v.g. en un año normal de 365 días: el 1 de marzo, era las Calendas de Marzo; el 28 de febrero era el día anterior de Calendas de Marzo; el 27 de febrero eran 3 días antes de Calendas de Marzo; el 26 de febrero eran 4 días antes de Calendas de Marzo; el 25 de febrero eran 5 días antes de Calendas de Marzo; el 24 de febrero eran 6 días antes de Calendas de Marzo; el 23 de febrero eran 7 días antes de Calendas de Marzo.

Desde el año 45 AC, Febrero cada 4 años tuvo dos días llamados "el sexto antes de Calendas de Marzo". El día extra era originalmente el segundo de ellos, pero desde el siglo III fue el primero. De ahí el término bisexto (luego "bisiesto") para el 24 de febrero en un año bisiesto.

Este día se añade para corregir el desfase que existe entre la duración real de los años: 365 días y 6 horas aproximadamente. Esto hace que se corrija cada cuatro años (los años múltiplos de cuatro) que se acumulan 24 horas.

El calendario juliano consideraba bisiesto los años divisibles por cuatro. Así el año juliano dura 365 días +1/4=365,25 días (más que el año trópico que dura 365,2422 días).

La regla completa para los años bisiestos según el calendario Gregoriano es:

Un año es bisiesto si es divisible por 4, excepto aquellos divisibles por 100 pero no por 400.
Es decir los años que sean divisibles por 4 serán bisiestos; aunque no serán bisiestos si son divisibles entre 100 (como los años 1500, 1700, 1800, 1900 y 2100) a no ser que sean divisibles por 400 (como los años 1600, 2000 ó 2400). En 400 años debe haber 97 años bisiestos, de esa manera el año del calendario gregoriano se mantiene muy parecido al año solar. Así el año gregoriano dura 365 días +1/4-3/400=365,2425 días (más que el año trópico que dura 365,2422 días).

Como el error es de 0,0003 días por año, podría parecer que al cabo de tres mil años se habrá acumulado un día de error. Pero en realidad no sabemos exactamente cuándo llegará el error a un día. La cifra de 365,2422 dias por año trópico no es del todo exacta, porque tanto la duración del año trópico, como la velocidad de rotación de la tierra, van cambiando con los siglos, y de una manera que no es completamente predecible


Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: Ejemplitos en C: Mis Funciones favoritas en CCS C
« Respuesta #34 en: 01 de Junio de 2006, 15:55:24 »
Si pero la función sigue estando mal:

Citar
#define TRUE 1
#define FALSE 0

int GLeapYearQ(int y)
{
   if( (y % 4) != 0 ) return FALSE;
   if( ( y % 100 ) != 0 ) return TRUE;
   if( ( y % 400) != 0 ) return FALSE;
   return TRUE;
}

Yo pondria esta versión:

#define TRUE 1
#define FALSE 0

int GLeapYearQ(int y)
{
   if ( (y % 4) = 0 ) &       // Sea Divisible por 4 "Y"
        ((y % 100) != 0) |   // ( No divisible por 100 "O"
         (y % 400) = 0)))    //   Divisible por 400 )
      return TRUE;
   else
      return FALSE;
}
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado oedipus

  • PIC10
  • *
  • Mensajes: 2
Re: Ejemplitos en C: Mis Funciones favoritas en CCS C
« Respuesta #35 en: 02 de Junio de 2006, 06:48:11 »
Si pero la función sigue estando mal.

Yo pondria esta versión:

#define TRUE 1
#define FALSE 0

int GLeapYearQ(int y)
{
   if ( (y % 4) = 0 ) &       // Sea Divisible por 4 "Y"
        ((y % 100) != 0) |   // ( No divisible por 100 "O"
         (y % 400) = 0)))    //   Divisible por 400 )
      return TRUE;
   else
      return FALSE;
}

No, a ver, la función que he puesto, puede ser más o menos elegante, pero es correcta. En cambio cuidado que con las prisas, creo que has puesto el AND && y el OR mal :).

Copiando (y modificando) del maravilloso "The C Programming Language" De Kernighan y Ritchie:

#define TRUE 1
#define FALSE 0

int is_year_leap (int year) {
    if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
         return TRUE;
   else
        return FALSE;
}

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: Ejemplitos en C: Mis Funciones favoritas en CCS C
« Respuesta #36 en: 03 de Junio de 2006, 13:26:12 »
Efectivamente tienes razón.

Un saludo.
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Ejemplitos en C: Mis Funciones favoritas en CCS C
« Respuesta #37 en: 29 de Junio de 2006, 17:55:45 »
Una introducción al uso de printf fprintf y sprintf

Hay tres funciones parecidas en cuyo nombre aparece el printf, y que son la printf propiamente dicha, fprintf y sprintf.

La mas usual es printf("Hola mundo"); que escribe un string en el puerto serie del PIC. A esta misma funcion se le pueden "empotrar" el contenido de una o varias variables dentro del string a enviar. Para ello disponemos de la posibilidad de colocarle dentro unos carácteres especiales que van a indicar que allí deseamos mostrar el contenido de cierta variable.

Por ejemplo si deseamos mostrar este mismo texto de "Hola mundo" pero desde una variable y no desde dentro del printf podemos hacerlo así:

char mistring[]="Hola mundo";
printf("Mi frase favorita es %s",mistring);


Esto dará como resultado que se envíe por el puerto serie la cadena "Mi frase favorita es Hola mundo".

Para cada tipo de variable, entera, flotante, con o sin signo, etc. tenemos su propia forma de indicarle la representación en printf anteponiéndole el consabido %:

C Character
S String or character
U Unsigned int
x Hex int (lower case output)
X Hex int (upper case output)
D Signed int
e Float in exp format
f Float
Lx Hex long int (lower case)
LX Hex long int (upper case)
Iu unsigned decimal long
Id signed decimal long
% Just a %

printf asume que la salida del string es la STDOUT o sea el puerto serie.

Pero fprintf es igual salvo que podemos indicarle cuál va a ser la salida donde deseamos que nos vuelque el resultado. Al declarar #use_rs232 podemos indicarle un "canal" o nombre de esa salida serie, fprintf puede decirle qué canal en concreto es el que vamos a utilizar.

#use rs232(baud=9600, xmit=PIN_B1,rcv=PIN_B2, stream=CANAL1)
#use rs232(baud=9600, xmit=PIN_A2,rcv=PIN_A3, stream=CANAL2)
#use rs232(baud=9600, xmit=PIN_C6,rcv=PIN_C7, stream=CANAL3)

fprintf(CANAL2,"Hola mundo");


enviaría nuestro texto al canal CANAL2 definido en la segunda de nuestras declaraciones.

Y por último:

Vemos que con el uso de los "%" podemos "representar las mismas variables de distinta forma.

char mivar='K';    

es una variable de tipo char de un solo byte cuyo contenido lo hemos inicializado con el caracter ASCII K, si ahora jugamos con él dentro de printf podemos obtener resultados muy curiosos:

printf("%c %U %H %h",mivar,mivar,mivar,mivar);

enviará al puerto serie el string "K 75 4B 4b"

Como podeís ver printf muestra distintas representaciones de un mismo contenido "formateado".

Esto nos lleva a la última de las funciones que es sprintf.

sprintf es identica a printf salvo que el resultado en vez de lanzarlo por el puerto serie lo guarda en una variable de tipo string que le indiquemos.

char miascii = 'K';
char mistring[3];
mistring = sprintf("%H",miascii);


¿Cuanto vale mistring? Pues "4B\0" (Un asccii '4', un ascii 'B' y un ascii 0) o sea que hemos hecho una conversión de ASCII a integer y de éste a un string hexadecimal de un solo salto.  :mrgreen:  :mrgreen:  :mrgreen:

(Como siempre. Me ha salido otra novela  :D  :D  :D)
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado pictolero

  • PIC10
  • *
  • Mensajes: 4
Re: Ejemplitos en C: Mis Funciones favoritas en CCS C
« Respuesta #38 en: 30 de Junio de 2006, 21:18:05 »
yo soy nuevo en este foro y solo hace muy poco supe que los pic se podian programar en c
con esto doy a entender que no tengo idea como hacerlo si alguien tubiera un tutorial de c para pic que lo pudiera compartir gracias

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Ejemplitos en C: Mis Funciones favoritas en CCS C
« Respuesta #39 en: 01 de Julio de 2006, 02:46:22 »
Un tutorial como tal no sé si encontrarás, pero te recomiendo que examines estos hilos del foro, en orden cronológico y haciendo los ejemplos que hay en ellos.
Te puedo garantizar que aprederás C, y no serás el primero en comprobarlo.

Microcursillo en C
Ejemplitos en C para 16F648A
Ejemplitos en C para 16F876A

Y siempre teniendo como referencia para dudas este mismo hilo, el de las funciones favoritas del amigo Diego.

Desconectado piriots

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
Re: Ejemplitos en C: Mis Funciones favoritas en CCS C
« Respuesta #40 en: 12 de Julio de 2006, 18:59:00 »
Hola!! estan muy buenas y elegantes estas funciones. Ahora estaba por probar la de ascii hex a int pero el ccs me da error en  el  r=d-"0";  Yo no veo ningun problema en la funcion pero el compilador me dice bad expression syntax. Estoy usando la version 3.236 del CCS. Alguien sabe que puede estar pasando??

Salu2

Desconectado djpalas

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 595
    • Microtronic
Re: Ejemplitos en C: Mis Funciones favoritas en CCS C
« Respuesta #41 en: 12 de Julio de 2006, 19:14:02 »
Buenas a tod@s

Piriots el problema es que estas utilizando comillas dobles "0". Puesto que tenemos un variable r del tipo int (8Bits) y d es del tipo char (también 8Bits), el problema es que al tipo char le estas quitanto una caneda de caracteres.
Al poner "0" estas declarando un array del tipo char de 2 elementos, el primero es el caracter 0, y el 2º es el caracter NULL para finalizar la cadena.

Por lo que creo que te irá si pones:
r=d-'0';

Utilizando solo comillas simples ;)

Espero que te sirva de ayuda.

Saludos desde Cádiz, España
Web personal: http://www.microtronic.es

Desconectado piriots

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
Re: Ejemplitos en C: Mis Funciones favoritas en CCS C
« Respuesta #42 en: 12 de Julio de 2006, 19:47:56 »
Muchas gracias Djpalas, se me habia pasado por alto, con esto arreglado funciona muy bien. Redpic podrias corregir este pequeño detalle para que no suceda otra vez?

Salu2 y muchas gracias!!

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Ejemplitos en C: Mis Funciones favoritas en CCS C
« Respuesta #43 en: 12 de Julio de 2006, 21:31:07 »
Corregido  :oops:
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Ejemplitos en C: Mis Funciones favoritas en CCS C
« Respuesta #44 en: 13 de Julio de 2006, 09:42:10 »
Leer y Escribir en la EEPROM interna del PIC variables int 16 bits (2 bytes)

Empezemos por el principio: read_eeprom(address) y write_eeprom(address, byte) trabajan con int8, un byte de 8 bits. Para leer y escribir int16, dos bytes de 8 bits cada uno, hay que fabricarse unas funciones "puente" de este estilo:

Código: C
  1. void write_eeprom_16bits(int address, long* val){
  2.    int pLow, pHigh;
  3.    pLow  = val;
  4.    pHigh = val>>8;
  5.    write_eeprom(address,pHigh);
  6.    delay_ms(12);
  7.    ++address;
  8.    write_eeprom(address,plow);
  9.    delay_ms(12);
  10. }
  11.  
  12. long read_eeprom_16bits(int address){
  13.    int  pLow, pHigh;
  14.    long result;
  15.    pHigh  = read_eeprom(address);
  16.    ++address;
  17.    pLow  = read_eeprom(address);
  18.    result=(pHigh<<8);
  19.    result+=pLow;
  20.    return result;  
  21. }

Con ellas he escrito un programa de Test que en el reset guarda un valor de 16 bits en la variable x, llama a la función write_eeprom_16bits y se queda a la espera "escuchando" la RS232 ...

al recibír la tecla 'r' realiza la funciona inversa, lee sobre la variable y, también de 16 bits, desde la misma dirección en la que antes escribimos con read_eeprom_16bits y monitoriza el resultado.

Todo este recorrido esta salpicado de printf's para poder ver todo el proceso paso a paso:



El programa completo tal como quedó para poder monitorizar todos los pasos es:

Código: C
  1. // eeprom_16bits plus rs232
  2. #include <18f4550.h>
  3. #fuses HS,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOPBADEN, NOLVP
  4. #use delay(clock=20000000)
  5. #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
  6.  
  7. char Keypress = 0x00;
  8. char Command  = 0x00;
  9.  
  10. long x,y;
  11.  
  12. #int_rda
  13. void serial_isr() {
  14.  
  15.    Keypress=0x00;
  16.    if(kbhit()){
  17.       Keypress=getc();
  18.       if(Keypress!=0x00){
  19.          if(Keypress=='r'){
  20.             Command=Keypress;            
  21.          }    
  22.          putchar(keypress);
  23.          keypress=0x00;
  24.       }
  25.    }
  26. }
  27.  
  28. void write_eeprom_16bits(int address, long* val){
  29.  
  30.    int pLow, pHigh;
  31.    printf("write_eeprom_16bits( address=%u, val=%lx)\r\n",address,val);
  32.    pLow  = val;
  33.    pHigh = val>>8;
  34.    printf("write_eeprom( address=%u, val=%x)\r\n",address,pHigh);
  35.    write_eeprom(address,pHigh);
  36.    delay_ms(12);
  37.    ++address;
  38.    printf("write_eeprom( address=%u, val=%x)\r\n",address,pLow);
  39.    write_eeprom(address,plow);
  40.    delay_ms(12);
  41. }
  42.  
  43. long read_eeprom_16bits(int address){
  44.  
  45.    int  pLow, pHigh;
  46.    long result;
  47.    printf("read_eeprom_16bits( address=%u)\r\n",address);
  48.    pHigh  = read_eeprom(address);
  49.    printf("read_eeprom( address=%u) = %x\r\n",address,pHigh);
  50.    ++address;
  51.    pLow  = read_eeprom(address);
  52.    printf("read_eeprom( address=%u) = %x\r\n",address,pLow);
  53.    result=(pHigh<<8);
  54.    result+=pLow;
  55.    return result;  
  56. }
  57.  
  58.  
  59. void main(){
  60.  
  61.    disable_interrupts(global);
  62.  
  63.    setup_adc_ports(NO_ANALOGS);
  64.    setup_adc(ADC_OFF);
  65.    setup_spi(FALSE);
  66.    setup_psp(PSP_DISABLED);
  67.    setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
  68.    setup_timer_0(RTCC_OFF);
  69.    setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
  70.    setup_timer_2(T2_DISABLED,0,1);
  71.    setup_timer_3(T3_DISABLED);
  72.    setup_comparator(NC_NC_NC_NC);
  73.    setup_vref(FALSE);
  74.    port_b_pullups(FALSE);
  75.    set_tris_e(0b00010000);
  76.    set_tris_c(0b10000000);
  77.    
  78.    delay_ms(1000);
  79.  
  80.    output_High(PIN_E0);
  81.    output_High(PIN_E1);
  82.    output_High(PIN_E2);
  83.    printf("\r\n");
  84.    printf("18F4550 in RRBOARAD2\r\n");
  85.    printf("Test EEPROM with 18 bits\r\n\n");
  86.    delay_ms(500);
  87.    output_Low(PIN_E0);
  88.    output_Low(PIN_E1);
  89.    output_Low(PIN_E2);
  90.  
  91.    Command=0x00;
  92.    enable_interrupts(int_rda);
  93.    enable_interrupts(global);
  94.  
  95.    x=0x1f2f;
  96.    y=0;
  97.    
  98.    printf("initial 16 bits x = %lx (%lu), y = %lx (%lu)\r\n",x,x,y,y);
  99.    write_eeprom_16bits(0,x);
  100.    printf("\r\n");
  101.  
  102.    while(TRUE) {
  103.       if(Command=='r'){
  104.          Command=0x00;
  105.          printf("\r\n\n");
  106.          y=read_eeprom_16bits(0);
  107.          printf("final 16 bits x = %lx (%lu), y = %lx (%lu)\r\n",x,x,y,y);
  108.       }
  109.    }
  110. }

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania


 

anything