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

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

Desconectado Bigdogo

  • PIC10
  • *
  • Mensajes: 17
Re: Microcursillo en C
« Respuesta #360 en: 23 de Abril de 2006, 15:34:51 »
Perfecto, muchas gracias
Saludos,

Jose

Desconectado Bigdogo

  • PIC10
  • *
  • Mensajes: 17
Re: Microcursillo en C
« Respuesta #361 en: 23 de Abril de 2006, 16:46:50 »
Hola a todos,

Ya estoy outra vez con mas dudas...pero quiero aprender el C para los PICs.

Hecho el siguiente programa, y lo que deberia hacer seria encender y apagar un led con el mismo pulsador, nada de mas...
Hecho la simulacion en PROTEUS y el led solamente se enciende, no se apaga, por que?

Es posible hacer que el proteus te muestre una pantalla con el codigo C en ejecucion? He puesto en ON a todas las ventanas del Debug en proteus, pero no veo la ejecucion del codigo en C.

Gracias de antemano por el cable...

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

//globales
int ap=1;

//Rutinas

void enciende()
{
   while(PIN_B7)  // Hasta que pulsemos RB7
   {
      if(input(PIN_B7))             // Se ha pulsado RB7
      {
       delay_ms(100); //rebote
       output_low(PIN_B4);    //zero en la salida, led encendido       
      }
  }
  ap=0;  // la proxima pulsacion se va a apaga
}


void apaga()
{
   while(PIN_B7)  // Hasta que pulsemos RB7
   {
      if(input(PIN_B7))             // Se ha pulsado RB7
      {
      delay_ms(100); // rebote
      output_high(PIN_B4);    //Uno en la salida, led apagado     
      }
  }
  ap=1;  //la proxima pulsacion se va a enciende
}

//Principal, deveria encender y apagar un led en RB4, con un pulsador en RB7
//Elpulsador cuando entra envia +5V al pin 13 (RB7)
//el LED esta con el anodo al + y el catodo al pin 10 (RB4) del 16F84A

void main()
{     
      set_tris_B(0b10001111);    // RB0,1,2,3 y 7 entradas RB4,5 y 6 salidas 
      output_high(PIN_B4);       // zero la salida, led apagado


      if(ap=1)
      {
      enciende();
      }
      else
      { 
      apaga();
      }
}
Saludos,

Jose

Desconectado Mario_2004

  • PIC10
  • *
  • Mensajes: 30
Re: Microcursillo en C
« Respuesta #362 en: 23 de Abril de 2006, 17:46:56 »
Hola Bigdogo, tienes un  error en esta línea:
Código: [Seleccionar]
if(ap=1)
le estás asignando siempre el valor 1 a la variable ap, cambialo por lo siguiente:
Código: [Seleccionar]
if(ap==1)
saludos

Mario

Desconectado Bigdogo

  • PIC10
  • *
  • Mensajes: 17
Re: Microcursillo en C
« Respuesta #363 en: 23 de Abril de 2006, 18:30:36 »
Hoal Mario,

Gracias por la ayuda, hecho la modificacion y infelizmente sigue igual, o sea, se enciende y no se apaga.
Saludos,

Jose

Desconectado Bigdogo

  • PIC10
  • *
  • Mensajes: 17
Re: Microcursillo en C
« Respuesta #364 en: 23 de Abril de 2006, 18:35:10 »
Mofificaciom, pero sigue igual, se enciende y no se apaga.

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

//globales
int ap=1;

//Rutinas

void enciende()
{
   while(PIN_B7)  // Hasta que pulsemos RB7
   {
      if(input(PIN_B7))             // Se ha pulsado RB7
      {
       delay_ms(100); //rebote
       output_low(PIN_B4);    //zero en la salida, led encendido       
      }
  }
  ap=0;  // la proxima pulsacion se va a apaga
}


void apaga()
{
   while(PIN_B7)  // Hasta que pulsemos RB7
   {
      if(input(PIN_B7))             // Se ha pulsado RB7
      {
      delay_ms(100); // rebote
      output_high(PIN_B4);    //Uno en la salida, led apagado     
      }
  }
  ap=1;  //la proxima pulsacion se va a enciende
}

//Principal, deveria encender y apagar un led en RB4, con un pulsador en RB7
//Elpulsador cuando entra envia +5V al pin 13 (RB7)
//el LED esta con el anodo al + y el catodo al pin 10 (RB4) del 16F84A

void main()
{     
      set_tris_B(0b10001111);    // RB0,1,2,3 y 7 entradas RB4,5 y 6 salidas 
      output_high(PIN_B4);       // zero la salida, led apagado


      if(ap==1)
      {
      enciende();
      }
      else
      { 
      apaga();
      }
}
Saludos,

Jose

Desconectado Mario_2004

  • PIC10
  • *
  • Mensajes: 30
Re: Microcursillo en C
« Respuesta #365 en: 23 de Abril de 2006, 20:20:07 »
Hola Jose, prueba con este código:

Código: [Seleccionar]
#include <16F84A.h>
#use delay(clock=4000000)
#use fast_io(B)
#fuses HS,NOWDT,NOPUT

//globales
int ap=1;

//Rutinas

void enciende(){
do{  // Hasta que pulsemos RB7
delay_ms(100); //rebote
output_low(PIN_B4);    //zero en la salida, led encendido
}while(input(PIN_B7));
ap=0;  // la proxima pulsacion se va a apaga
}

void apaga(){
do{  // Hasta que pulsemos RB7
delay_ms(100); // rebote
output_high(PIN_B4);    //Uno en la salida, led apagado
}while(input(PIN_B7));
ap=1;  //la proxima pulsacion se va a enciende
}

//Principal, deveria encender y apagar un led en RB4, con un pulsador en RB7
//Elpulsador cuando entra envia +5V al pin 13 (RB7)
//el LED esta con el anodo al + y el catodo al pin 10 (RB4) del 16F84A

void main(){
set_tris_B(0b10001111);    // RB0,1,2,3 y 7 entradas RB4,5 y 6 salidas
output_high(PIN_B4);       // zero la salida, led apagado

while(true){
if(input(PIN_B7)){
if(ap==1)
enciende();
else
apaga();
}
}
}
saludos,

Mario

Desconectado Bigdogo

  • PIC10
  • *
  • Mensajes: 17
Re: Microcursillo en C
« Respuesta #366 en: 28 de Abril de 2006, 19:55:07 »
Muchisimas gracias Mario y perdona por no haver contestado anteriormente, pero estava fuera de mi ciudad.

Tu código funciona perfectamente, y si me permites una pregunta, en el código:

void enciende(){
   do{  // Hasta que pulsemos RB7
      delay_ms(100); //rebote
      output_low(PIN_B4);    //zero en la salida, led encendido
   }while(input(PIN_B7));
   ap=0;  // la proxima pulsacion se va a apaga
}

la linea while(input(PIN_B7)); significa "1 enquanto la entrada B7  sea igual a 1 ( boton sin pulsar)" ?

muchas gracias mas una vez,
Saludos,

Jose

Desconectado zimanka

  • PIC10
  • *
  • Mensajes: 7
Re: Microcursillo en C
« Respuesta #367 en: 30 de Abril de 2006, 11:56:54 »
mi inquietud es acerca de como comunicar varios pic entre si siendo uno maestro y 3 esclavos y el maestro comunicarse serial con el pc si alguien me puede ayudar porfavor gracias

Desconectado Bigdogo

  • PIC10
  • *
  • Mensajes: 17
Re: Microcursillo en C
« Respuesta #368 en: 03 de Mayo de 2006, 19:42:11 »
Hola a todos

Vuelvo con mas dudas...
Suponer que la funcion beep, emite un pitido en un altavoz.
Suponer que tengo un pulsador en RB7.
porque cuando ejecuto el siguinte codigo solo escucho un beep despues de pulsar el pulsador? Yo creia que durante la ejecucion del programa, siempre escucharia un beep, independiente si pulso o no el pulsador!

void main()
{
   set_tris_B(0b10001111);    // RB0,1,2,3 y 7 entradas RB4,5 y 6 salidas

         while(true)
         {
         beep();
          if(input(PIN_B7)){  //si pulsamos switch en RB7
          hace_algo();
          }
}

esto nó es un loop infinito?

Saludos,

Jose

Desconectado LabPIC

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 143
Re: Microcursillo en C
« Respuesta #369 en: 03 de Mayo de 2006, 19:50:25 »
Hola  :mrgreen:

He programado en builder C++, pero tiene algo de tiempo que no lo hago y me gustaría retomarlo, quisiera que me recomendaran algun soft para programar en C  que pueda bajar de la red, pero para principiantes .

Saludos  :-)
¡¡¡Viva México cabrones!!!

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Microcursillo en C
« Respuesta #370 en: 04 de Mayo de 2006, 02:14:05 »
Hola a todos

Vuelvo con mas dudas...
Suponer que la funcion beep, emite un pitido en un altavoz.
Suponer que tengo un pulsador en RB7.
porque cuando ejecuto el siguinte codigo solo escucho un beep despues de pulsar el pulsador? Yo creia que durante la ejecucion del programa, siempre escucharia un beep, independiente si pulso o no el pulsador!

void main()
{
   set_tris_B(0b10001111);    // RB0,1,2,3 y 7 entradas RB4,5 y 6 salidas

         while(true)
         {
         beep();
          if(input(PIN_B7)){  //si pulsamos switch en RB7
          hace_algo();
          }
}

esto nó es un loop infinito?



Teóricamente sí es un bucle infinito, y debería estar haciendo beep continuamente, salvo por dos circunstancias:
- no sabemos qué pasa en hace_algo(). Puede que el control del programa nunca retorne desde esa función.
- falta una llave de cierre, ¿seguro que te ha compilado bien ese programa?

LabPIC, si te refieres a un C para PC, deberías preguntarlo en el subforo de C++, seguro que allí encuentras respuesta rápida. Si te refieres a un C para microcontroladores PIC, la mayoría usamos CCS. Puedes descargar una demo de 30 días desde aquí:
http://www.ccsinfo.com/content.php?page=compdemo

Desconectado erkys

  • PIC10
  • *
  • Mensajes: 24
Re: Microcursillo en C
« Respuesta #371 en: 04 de Mayo de 2006, 02:38:24 »
  :shock:  Por favor me podrias explicar para que son cada uno de los siguientes programas; cuales son sus limitaciones y uso; etc
           PCM
           PCWH
           PCW
           Demo Pic C Compiler-PCW

Existe una versiones demo de los anteriores y cuales son sus limitaciones de estos demos;

 :-) Para una persona que esta comenzando a programar los PIC desde cero;  cual demo de los cuatro programas listados ; me recomienda (tengo PIC: 112f683; 16f628A; 16f873A,16f877A); veo muy buenos los ejemplos del Microcursillo en C. y quisiera comenzar a constuir algunos y practicar los publicados aca en el Microcursillo en C       
« Última modificación: 06 de Mayo de 2006, 15:55:36 por erkys »

Desconectado LabPIC

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 143
Re: Microcursillo en C
« Respuesta #372 en: 04 de Mayo de 2006, 11:59:24 »
Hola a todos  :mrgreen:

Gracias Nocturno por el comentario, me refería a un C para PICs, descargare el CCS versión Demo e informare mis avances  :D

Saludos
¡¡¡Viva México cabrones!!!

Desconectado Bigdogo

  • PIC10
  • *
  • Mensajes: 17
Re: Microcursillo en C
« Respuesta #373 en: 04 de Mayo de 2006, 19:03:32 »
Gracias Nocturno, aqui te pongo el codigo para que eches una ojeada:

#include <16F84A.h>
#use delay(clock=4000000)
#use fast_io(B)
#fuses HS,NOWDT,NOPUT

//globales
int tono,vel,dado1,dado2,dado3,dado4,a=0,direccion=0;

//Rutinas

void beep(int tono,vel)  // Para generar un sonido
{
   int i,j;
      for(i=0; i<=vel; i++) // vel = duracion del tono
      {
         for(j=0; j<=4; j++)
         {
         output_high(PIN_A0);      // La distancia entre pulso y pulso viene determinada
         delay_us(200*(6-tono));   //  por el parámetro tono
         output_low(PIN_A0);
         delay_us(200*(6-tono));
      }
   }
}


void grava_default(){
   while(input(PIN_B7));
   {

      delay_ms(50); //rebote
      output_low(PIN_B4);    //zero en la salida, led encendido
                 write_eeprom(direccion,1); //grava valores default
                 write_eeprom(direccion+1,2); //en la memoria
                 write_eeprom(direccion+2,3); //1,2,3,4
                 write_eeprom(direccion+3,4); //     
    }
  }





void main()
{
   set_tris_B(0b10001111);    // RB0,1,2,3 y 7 entradas RB4,5 y 6 salidas
   output_high(PIN_B4);       // zero la salida, led apagado



   while(true){
   
   beep(3,50);
   
      if(input(PIN_B7)){  //si pulsamos switch en RB7

            grava_default(); //grava valores default en memoria


      }
}
}

compilado perfectamente.
Saludos,

Jose

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Microcursillo en C
« Respuesta #374 en: 05 de Mayo de 2006, 01:46:48 »
No entiendo el objetivo del programa, aunque me parece entender que debería estar pitando continuamente y grabar unos valores (1,2,3 y 4) en la eeprom cuando se pulse una tecla.

En teoría debería hacerlo así, aunque veo que has definido el fuse HS para un oscilador de 4MHz.

Para ese clock el fuse correcto es XT.

No sé si será ese el error, pero podrías probar cambiándolo.