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

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

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Microcursillo en C
« en: 04 de Agosto de 2004, 10:42:00 »
Escrito originalmente por pocher
El que lo desee que habrá un Microcursillo en C.


Bueno, pues yo lo deseo. ¿Por dónde empezamos Oh Gran Pocher?

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: Microcursillo en C
« Respuesta #1 en: 04 de Agosto de 2004, 10:44:00 »
Yo me apunto!!!

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: Microcursillo en C
« Respuesta #2 en: 04 de Agosto de 2004, 11:01:00 »
Eh, eh que si no lo abrí yo fué precisamente por esto, para no hacerme responsable je, je.

Yo iré ayudando en lo que pueda pero la dirección y escritura de los programas tendran que ser otros.

¿Quién escribe un programa que haga parpadear un LED?

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
RE: Microcursillo en C
« Respuesta #3 en: 04 de Agosto de 2004, 11:04:00 »
Claro, no te vamos a pedir que también escribas tú los programas. Venga, me pongo con lo del LED y a ver qué sale. Hasta pronto.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
RE: Microcursillo en C
« Respuesta #4 en: 04 de Agosto de 2004, 16:12:00 »
Bueno, hoy estoy trabajador. Aquí está mi ejemplo de parpadeo de leds en C.

Curiosamente es mi primer programa en C y no dice aquello de "Hello world", pero bueno, espero que sirva.

Lo he probado en Proteus y funciona, aunque supongo que se podrá depurar tanto el algoritmo como la apariencia; no sé qué estilo de sangrados se utiliza más cómodamente en C. La verdad es que es un lío tanto corchete y puntos y comas.

Codigo:
/////////////////////////////////////////////////////////////////////////
////                           PARPADEO                              ////
////                                                                 ////
////  Ejemplo de parpadeo de todos los leds colocados en el PORTB    ////
////                                                                 ////
////  Realizado por Manuel Jiménez (nocturno) para el foro TODOPIC   ////
////                                                                 ////
////                                                        4/8/2004 ////
////                                                                 ////
/////////////////////////////////////////////////////////////////////////

#include <16F84.h>
#fuses HS,NOWDT,NOPROTECT
#use delay(clock=4000000)

#byte port_b=6


void main() {

  int contador;
 
  set_tris_b(0);           //// declaramos el puerto B como salidas
  port_b=0;

         
  while (true) {           //// bucle infinito
     contador=200;         //// retraso, 200 ciclos de 1000 microsegundos, o sea, 2 milisengundos
     while(--contador!=0)
       delay_us(1000);
     port_b=0xff;          //// activa todos los pins del puerto B
     contador=200;
     while(--contador!=0)  //// retraso, 200 ciclos de 1000 microsegundos, o sea, 2 milisengundos
       delay_us(1000);
     port_b=0x00;};        //// apaga todos los pins del puerto B

}

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: Microcursillo en C
« Respuesta #5 en: 04 de Agosto de 2004, 16:38:00 »
Empezamos algo bueno!!
Otro ejemplillo con leds,esta vez las lucecitas del coche fantástico en el puerto b
Codigo:

////////////////////////////////////// PREPROCESADO ///////////////////////////////////

#include <16F84.h>
#use delay(clock=4000000)
#fuses XT,NOWDT,NOPUT,NOPROTECT

#use fast_io(B)
#byte PORTB = 0x06

/////////////////////////////////////// PRINCIPAL /////////////////////////////////////

void main()
   {
   set_tris_b(0b00000000);    // Puerto B al completo configurado como salida
   PORTB = 1; // Encendemos el primer led  
   for(;;)    // Bucle infinito
     {
     while(PORTB != 128)  // Avanzamos en una dirección
       {
       PORTB = PORTB * 2; // Apagamos el led que esté encendido y encendemos el siguiente
       delay_ms(200);     // Retardo de 200 ms
       }
     while(PORTB != 1)    // Avanzamos en la otra dirección
       {
       PORTB = PORTB / 2; // Apagamos el led encendido y encendemos el anterior
       delay_ms(200);
       }
     }
   }



Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: Microcursillo en C
« Respuesta #6 en: 05 de Agosto de 2004, 00:33:00 »
Lo del parpadeo un poco más corto:

Codigo:
#include <16F84.h>
#fuses XT,NOWDT,NOPROTECT
#use delay(clock=4000000)
#use fast_io(B)

void main()
{
        set_tris_b(0x00);
   while (1)
   {          
        output_b(0xff);
          delay_ms(200);
        output_b(0x00);
          delay_ms(200);
   }
}


NOTA:

El programa se puede hacer también así:

- Sin el fast_io(B) y sin el  set_tris_b(0x00) y todo lo demás como está.

- O se deja el fast_io(B) y se añade en el main el set_tris_b(0x00)

Personalmente soy partidario de la segunda opción. En todos los programas se definan entradas y salidas con los correspondientes set_tris, así vamos a lo seguro. Además usando el fast_io se consiguen al compilar, menos instrucciones de programación en asembler ya que cada vez que en el programa se encuentre con un input o un output no se reprograma el puerto, solo se programa una vez con el primer input o output, cosa que no ocurre sin el fast.

Un saludo

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
RE: Microcursillo en C
« Respuesta #7 en: 05 de Agosto de 2004, 00:38:00 »
Eres un fenómeno, Pocher. Bueno ahora que he aprendido a usar los delay_ms os envío otro ejemplo de parpadeo, en esta ocasión con encendido y apagado suave de los leds. Lo he probado en la placa entrenadora y queda un efecto muy simpático:

Codigo:
/////////////////////////////////////////////////////////////////////////
////                           PARPADEO v.2                          ////
////                                                                 ////
////  Ejemplo de parpadeo de todos los leds colocados en el PORTB    ////
////                                                                 ////
////  Realizado por Manuel Jiménez (nocturno) para el foro TODOPIC   ////
////                                                                 ////
////                                                        4/8/2004 ////
////                                                                 ////
/////////////////////////////////////////////////////////////////////////

#include <16F84.h>
#fuses XT,NOWDT,NOPROTECT
#use delay(clock=4000000)
#use fast_io(B)

void main() {

  int i;

  while (true) {           //// bucle infinito
 
            //// en esta primera parte va encendiendo la mitad alta del puerto B y apagando la mitad baja
      for (i=1;i<=24;++i) {      //// va cambiando el retraso, de 1 a 24 ms
            output_b(0xF0);         //// encendemos la mitad del puerto B
            delay_ms (i);        //// hacemos una parte de la espera
            output_b(0x0F);         //// encendemos la otra mitad del puerto B
            delay_ms ((25-i));   //// realizamos la espera complementaria
      };
     
            //// en esta segunda parte va encendiendo la mitad baja del puerto B y apagando la mitad alta
      for (i=1;i<=24;++i) {      //// va cambiando el retraso, de 1 a 24 ms
            output_b(0x0F);         //// encendemos la mitad del puerto B
            delay_ms (i);        //// hacemos una parte de la espera
            output_b(0xF0);         //// encendemos la otra mitad del puerto B
            delay_ms ((25-i));   //// realizamos la espera complementaria
      };
   };
}


Pocher, alguna pregunta. Veo que no has declarado el Puerto B como salidas ni como entradas, ¿el compilador lo declara automáticamente cuando pones output_b?

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: Microcursillo en C
« Respuesta #8 en: 05 de Agosto de 2004, 00:46:00 »
Así es nocturno, además usando la directiva #use fast_io(B) el código generado en ensamblador cada vez que se encuentra con un input o un output es más corto.

Conviene que uses en fuses XT (4MHz) aunque con HS también debe funcionar.

Desconectado Sispic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1700
    • winpic800
RE: Microcursillo en C
« Respuesta #9 en: 05 de Agosto de 2004, 00:48:00 »
Una pregunta .
Codigo:

while (1)
   {          
        
          delay_ms(200);
         PORTB= ~ PORTB;

   }



Así quedaria mas corto ?


Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: Microcursillo en C
« Respuesta #10 en: 05 de Agosto de 2004, 00:51:00 »
Pués va a ser que sí ... sin embargo lo acabo de probar en PROTEUS y no funciona bien ... habrá que probarlo físicamente.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
RE: Microcursillo en C
« Respuesta #11 en: 05 de Agosto de 2004, 00:54:00 »
Esto me recuerda a las competiciones de demos en 4 Kb

Otra pregunta, aprovechando que os pillo a los dos. ¿Cómo puedo enlazar el PCW con el Winpic para no tener que ir cambiando de programa cuando quiera grabar el pic?

Graciaaaaaaaaaaas

Desconectado oshow

  • PIC18
  • ****
  • Mensajes: 321
RE: Microcursillo en C
« Respuesta #12 en: 05 de Agosto de 2004, 03:47:00 »
Me meto yo si no os importa. Yo tengo la epicwin y la lanzo desde el IDE del compilador, supongo que con cualquier otra programadora se puede hacer lo mismo. Para esto en el menú Options-->Debugger/programmer cambio el campo name de WARP13 a la programadora que tengo (EPIC) y en el campo de la ruta, le doy la direccion del epicwin.exe. Recuerda que tienes que darle la direccion como si fuese msdos, los nombres largos los omite, por ejemplo si lo tienes en C:mis documentosepicwin.exe la direccion sería C:misdoc~1epicwin.exe.

Luego en el menú TOOLS, te sale el nombre que has puesto en el campo name y desde ahí lanzas el software para programar.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
RE: Microcursillo en C
« Respuesta #13 en: 05 de Agosto de 2004, 04:10:00 »
Gracias, oShow, lo probaré en cuanto llegue a casa.

(No me he dado cuenta de que había otro post en que alguien lo preguntaba ya y por eso lo he vuelto a preguntar aquí

Desconectado Sispic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1700
    • winpic800
RE: Microcursillo en C
« Respuesta #14 en: 05 de Agosto de 2004, 04:34:00 »
Aquí lo encontraras para varios compiladores :

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

recuerda ponerle la ruta como explica oshow.


 

anything