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

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

Desconectado Bigdogo

  • PIC10
  • *
  • Mensajes: 17
Re: Microcursillo en C
« Respuesta #375 en: 05 de Mayo de 2006, 19:30:04 »
Gracias Nocturno por la observacion,

El objetivo del programa es apenas el aprendizaje del C para los PICS.  Con este programa queria saber si los datos se gravavan en la memoria y el beep era para estar seguro que el programa seguiria en un loop constante independiente si pulso el boton o no, lo que parece que el programa no lo hace, pues lo he simulado en proteus y solo hace beep despues que pulso el boton, y no descubro el porque!
Cuanto a la parte de memoria, funciona bien.

Esto podria utilizar para, por ejemplo,  parte de un proyeto para una cerradura electronica que no utilize un teclado y si pulsadores (botones).

He cambiado para XT y sigue lo mismo.

Como puedo hacer un loop infinito con la instruccion "FOR"
Saludos,

Jose

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Microcursillo en C
« Respuesta #376 en: 06 de Mayo de 2006, 03:48:19 »
Pues no tienes el problema en el bucle infinito, porque el while(TRUE) es perfectamente válido, pero si quieres probar con FOR podrías hacer:
     for (i=0; i>=0; i++) { ... }

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: Microcursillo en C
« Respuesta #377 en: 06 de Mayo de 2006, 07:41:10 »
Para usar el bucle for como infinito tambien vale de esta forma
Código: [Seleccionar]
               for( ; ; ){....}


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

Desconectado Bigdogo

  • PIC10
  • *
  • Mensajes: 17
Re: Microcursillo en C
« Respuesta #378 en: 06 de Mayo de 2006, 09:43:47 »
Gracias Nocturno,
Gracias vszener,
Saludos,

Jose

Desconectado Bigdogo

  • PIC10
  • *
  • Mensajes: 17
Re: Microcursillo en C
« Respuesta #379 en: 07 de Mayo de 2006, 15:04:45 »
Hola a todos,

Porque elsiguinte codigo solamente me grava el valor del puerto B en la posicion 0 de la memoria, y no en las posiciones 0,1,2 y 3 ?  (en el puerto A (A4) tengo una confirmacion que los datos en el puerto B estan listos y correctos)

void lee_datos(){
int i,valor=0;


            for(i=0;i<4 && input(pin_A4);i++)  //solo ejecuta si pin A4=1
         {
         
         valor=port_b &0b00001111;  //mascara para leer el valor deseado
            write_eeprom(i,valor);
            while (input(pin_A4)){   //espera que A4 cambie de estado (vuelva a 0)
            }
            }

}
Saludos,

Jose

Desconectado Bigdogo

  • PIC10
  • *
  • Mensajes: 17
Re: Microcursillo en C
« Respuesta #380 en: 08 de Mayo de 2006, 14:28:16 »
Hola,
Ya he conseguido que funcione:

void grava_pass(){ //grava 4 digitos en la memoria
int valor=0,v=0;


while(v<4){

         if(input(pin_A4) && v<4)
         {

               valor=port_b &0b00001111;
               write_eeprom(v,valor);

            while(input(pin_A4))
            {
            }
V++;         
            }

   }
}

No lo se si existe una manera mas practica, pero esta funciona.
Saludos,

Jose

Desconectado JCAK

  • PIC18
  • ****
  • Mensajes: 325
Re: Microcursillo en C
« Respuesta #381 en: 11 de Junio de 2006, 01:29:43 »
HOLA ...

Soy novato en esto del lenguaje C he visto códigos donde la instrucción es como la siguiente:

TCCR0B = (1 << WGM02) | (0 << CS02) | (0 << CS01) | (1 << CS00);

Yo interpreto esto como lo siguiente:

TCCR0B.WGM02 = 1
TCCR0B.CS02 = 0
TCCR0B.CS01 = 0
TCCR0B.CS00 = 1

Pero mi duda se presenta porque "<<" por lo que leí significa un desplazamiento a la izquierda y "|" significa OR (no me refiero al OR logico)

Entonces me gustaría si alguien con más experiencia me puede aclarar un poquito.


gracias
Julio - Argentina

Desconectado dayan

  • PIC10
  • *
  • Mensajes: 1
Re: Microcursillo en C
« Respuesta #382 en: 11 de Junio de 2006, 02:22:59 »
hey querido amigo quiero saber como hago para poder ver los cursos de programacion que ofreces en esta web, no se donde le tengo que dar click para poder leer el documento...te agradezco si me dices como hacerlo...ok?
tks

Desconectado ChOrChE

  • PIC10
  • *
  • Mensajes: 13
Re: Microcursillo en C
« Respuesta #383 en: 19 de Junio de 2006, 11:44:44 »
hola, yo si que soy un novato en comparacion con todos vosotros!!!
Estoy intentando hacer cosillas con el 12c508a, por empezar con algo facil.
Veo que declarais los puertos a o b como entradas y salidas.... pero en el 12c508 solo existe un puerto y se configuran sus entradas y salidas.
Si quisiera que se ejecutara el codigo dependiendo del estado de un solo pin, seria algo asi?

if ( input(PIN_A0) )
 {
 // Esto se ejecuta si A0 está a 1
 }
Espero aprender de vosotros, me esta gustando.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Microcursillo en C
« Respuesta #384 en: 19 de Junio de 2006, 14:48:57 »
Sí, eso que has escrito es correcto.
Es más, por defecto en CCS no tienes porqué definir los TRIS y, si utilizas la función "input()" el pin seleccionado se configurará automáticamente como entrada.
Esto es así salvo que declares #use fast_io, en cuyo caso el compilador te deja a ti la gestión de los TRIS.

Desconectado ChOrChE

  • PIC10
  • *
  • Mensajes: 13
Re: Microcursillo en C
« Respuesta #385 en: 19 de Junio de 2006, 15:01:27 »
Hola a todos. Siempre he programado en ensamblador y de c tengo poca idea.
me gustaria hacer pruebas con el 12c508a y variar las salidas dependiendo de las entradas. Y que ademas que el codigo se ejecute dependiendo del estado de GP0.
 
BIT ENABLE         SALIDAS                  ENTRADAS
GP0(IN)    GP1(OUT)  GP2(OUT)  GP3(IN)  GP4(IN)  GP5(IN)
   0               NO SE EJECUTACODIGO HASTA QUE GP0=1
   1                   0            0               0           0          0
   1                   0            1               0           0          1
   1                   1            1               0           1          0
   1                   0            1               0           1          1
   1                   1            0               1           0          0
   1                   0            0               1           0          1
   1                   1            0               1           1          0
   1                   0            0               1           1          1

He estado haciendo algo y no se si es una aberracion.

#LIST p=12c508, r=HEX;
#INCLUDE <p12C508.inc>;
#define    __CONFIG _MCLRE_OFF & _CP_OFF & _WDT_OFF & _IntRC_OSC;
#define GP0  pin_a0 ;

void main()
   {

    // Descripcion de variables
        boolean GP0;
        GP0= input(GP0);// de otra manera input_pin_port_a( 0 )
        GP1= output_pin_port_a( 1 );
        GP2= output_pin_port_a( 2 );
        GP3= input_pin_port_a( 3 );
        GP4= input_pin_port_a( 4 );
        GP5= input_pin_port_a( 5 );
       
    //   Se ejecuta si  pin_a0=GP0  esta a 1

        while( GP0 ){                                //podria ser como while( input(PIN_A0) )
                               
               if (GP3=0 &GP4=0 & GP5=0) {
               GP1=0;
               GP2=0;               
                           
                }else if (GP3=0 & GP4=0 & GP5=1){
                      GP1=0;
                      GP2=1;
                     
                }else if (GP3=0 & GP4=1 & GP5=0){
                      GP1=1;
                      GP2=1;
                             
                }else if (GP3=0 & GP4=1 & GP5=1){
                      GP1=0;
                      GP2=1;
 
                }else if (GP3=1 & GP4=0 & GP5=0){
                      GP1=1;
                      GP2=0;
                     
                }else if (GP3=1 & GP4=0 & GP5=1){
                      GP1=0;
                      GP2=0;
                     
                }else if (GP3=1 & GP4=1 & GP5=0){
                      GP1=1;
                      GP2=0;
                             
                }else if (GP3=1 & GP4=1 & GP5=1){
                      GP1=1;
                      GP2=1;
 
                }
                   }

Creo que se corresponde a la tabla pero si alguien me corrigiera no me vendria mal. GRACIAS!!


Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Microcursillo en C
« Respuesta #386 en: 19 de Junio de 2006, 15:12:16 »
Un comentario sin entrar en revisar a fondo. En C si pones "=" estás asignando un valor, aunque lo hagas dentro de un "if". Por tanto, para comprobación de condiciones lógicas, lo que debes usar es "=="

Por otra parte, el símbolo "&" es una operación a nivel de bits. Igualmente, para hacer AND dentro de un "if", tendrás que usar el operador "&&".

Desconectado ChOrChE

  • PIC10
  • *
  • Mensajes: 13
Re: Microcursillo en C
« Respuesta #387 en: 19 de Junio de 2006, 16:14:51 »
Gracias. No habia caido en eso. Lo que mas me preocupaba era si habia definido bien las variables,ya que lo que quiero es que sean pin configurados, no configurar un puerto entero como entrada -salida.
Supongo que seran de tipo booleano aunque no esten definidos como tal en GP1= output_pin_port_a( 1 );
o hay que definirlos como
#define GP0  pin_a0 ;
void main()
   {

    // Descripcion de variables
        boolean GP0;
        GP0= input(GP0);//

Desconectado Helena

  • PIC10
  • *
  • Mensajes: 30
Re: Microcursillo en C
« Respuesta #388 en: 01 de Julio de 2006, 11:13:06 »
Hola Mario 2004,

Tu codigo funciona muy bien, quiero hacer lo mismo pero con 4 pulsadores desde rb0 hasta rb3 y 4 salidas desde rb4 hasta rb7 como harìa para hacerlo funcionar?.

Muchas gracias

Besos

Helena :g)


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 Helena

  • PIC10
  • *
  • Mensajes: 30
Re: Microcursillo en C
« Respuesta #389 en: 01 de Julio de 2006, 11:15:34 »
Hola Mario 2004,

Tu codigo funciona muy bien, quiero hacer lo mismo pero con 4 pulsadores desde rb0 hasta rb3 y 4 salidas desde rb4 hasta rb7 como harìa para hacerlo funcionar?.

Muchas gracias

Besos

Helena :g)


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


 

anything