Autor Tema: 12c508a en c  (Leído 5270 veces)

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

Desconectado ChOrChE

  • PIC10
  • *
  • Mensajes: 13
12c508a en c
« en: 19 de Junio de 2006, 12:27:35 »
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

Si alguien me pudiera ayudar. No se por donde cogerlo.

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: 12c508a en c
« Respuesta #1 en: 19 de Junio de 2006, 13:26:17 »
Es bastante sencillo realizarlo en "C". Podrias utilizar un bucle "while" para verificar "GP0" que se encierre en si mismo cuando valga 0 y con otro bucle "while" externo al anterior y que contenga un "case" para verificar las entradas y en función de esto poner las salidas. Esquemáticamente sería:

Código: CSS
  1. while(TRUE)
  2.    {
  3.    while(GP0=0){}:
  4.    switch (gp3*100+gp4*10+gp5)
  5.        {
  6.         case 0:  gp1 = 0 ; gp2 = 0; break;
  7.         case 1:  gp1 = 0 ; gp2 = 1; break;
  8.         ......
  9.         case 7:  gp1 = 0 ; gp2 = 0; break;
  10.         }
  11.    }

Esto es un ejemplo de implementación que tendras que trabajar para ponerlo a punto.

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 PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: 12c508a en c
« Respuesta #2 en: 19 de Junio de 2006, 14:34:05 »
Hola a todos. Tengo una duda jfh900  ¿como se usa el GeSHI? yo lo bajé de hxxp://qbnz.com/highlighter/ pero es puro código php, ¿habrá algún IDE ejecutable?.


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

Desconectado ChOrChE

  • PIC10
  • *
  • Mensajes: 13
Re: 12c508a en c
« Respuesta #3 en: 19 de Junio de 2006, 14:54:11 »
gracias por la respuesta compañero!
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 ){
                               
               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 jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: 12c508a en c
« Respuesta #4 en: 19 de Junio de 2006, 15:57:24 »
Alguna cosilla que he visto mal:

GP0= input(GP0);

Esto es incosistente, quita:

#define GP0  pin_a0 ;
 y la línea anterior la pones como las otras:

GP0= input_pin_port_a( 0 );

Por cierto faltan de definir las variables:

GP1, GP2, GP3, GP4, GP5

Procierto si quieres compactar el código puedes poner los "if" como:

else if (GP3=0 & GP4=0 & GP5=1){ GP1=0; GP2=1; }
else if (GP3=0 & GP4=1 & GP5=0){ GP1=1; GP2=1; }
...

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 jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: 12c508a en c
« Respuesta #5 en: 19 de Junio de 2006, 16:02:05 »
PalitroqueZ para utilizar GeSHI no tienes que descargar nada. Cuando abras un tema o respondas abre el campo despegable GeSHi y selecciona el elnguaje que vayas a poner. Esto añade dos etiquetas. Todo lo incluido entre las etiquetas saldrá formateado.

Saludos.
* 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 ChOrChE

  • PIC10
  • *
  • Mensajes: 13
Re: 12c508a en c
« Respuesta #6 en: 19 de Junio de 2006, 16:40:44 »
perdonad tenia tambien unos errores de asignacion. Gracias por la ayuda ahora queda mas legible y mejor.

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

void main()
   {

    // Descripcion de variables
        boolean GP0;
        boolean GP1;
        boolean GP2;
        boolean GP3;
        boolean GP4;
        boolean GP5;
        GP0= 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){
                               
               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;}
                   
                   }

Lo que no tengo claro es si tengo que definir los puertos como boolean. He visto en codigos que usan enteros tipo int.
No se. Como solo se trata de un solo pin dentro del puerto?¿?¿

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: 12c508a en c
« Respuesta #7 en: 19 de Junio de 2006, 16:56:41 »
Haber más modificaciones:

esto tiene que estar dentro del bucle para que se refresquen las variables:

Código: CSS
  1. GP0= input_pin_port_a( 0 )
  2. GP1= output_pin_port_a( 1 );
  3. GP2= output_pin_port_a( 2 );
  4. GP3= input_pin_port_a( 3 );
  5. GP4= input_pin_port_a( 4 );
  6. GP5= input_pin_port_a( 5 );

Esto te sobra ya que son salidas y esta mal definido aparte de que la asigación de las salidas lo haces en los if's

Código: CSS
  1. GP1= output_pin_port_a( 1 );
  2. GP2= output_pin_port_a( 2 );

La variable boolean creo que no esta definida. Si la quieres definir puedes poner:

typedef int8 boolean;

O directamente:

int8 GP3;
.............


Saludos
* 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 ChOrChE

  • PIC10
  • *
  • Mensajes: 13
Re: 12c508a en c
« Respuesta #8 en: 20 de Junio de 2006, 11:08:52 »
Hola a todos y gracias por vuestras respuestas, se que soy algo duro de mollera.
Lo primero me gustaria saber que diferencias existen entre Css y C.

Otra pregunta, si defino el pin del puerto GP0 dentro del while, como pongo la condicion en el while,? O tambien lo tenndria que poner fuera?

while (GP0){ 
       
        GP0= input_pin_port_a( 0 )
        GP1= output_pin_port_a( 1 );
        GP2= output_pin_port_a( 2 );

Esto va tomando forma pero no me lo compila. De todas formas voy a ver el programita este de CSS porque lo estoy haciendo con C2C-plus. Y creo que existen diferencias.

Desconectado ChOrChE

  • PIC10
  • *
  • Mensajes: 13
Re: 12c508a en c
« Respuesta #9 en: 20 de Junio de 2006, 11:23:35 »
De momento esta asi:

LIST p=12c508A, r=HEX;
#INCLUDE <C:\C2CPP\p12C508A.inc>;
#define    __CONFIG _MCLRE_OFF & _CP_OFF & _WDT_OFF & _IntRC_OSC;

void main()
   {
typedef int8 boolean; //Esto si que no lo tengo muy claro

    // Descripcion de variables
   
        boolean GP0;
        boolean GP1;
        boolean GP2;
        boolean GP3;
        boolean GP4;
        boolean GP5;

       
    //   Se ejecuta si  pin_a0 de GP0  esta a 1

        while (GP0){ 
       
        GP0= 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 );
         
                               
               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;}
               
                endif
                   
                   }
Me gustaria que me corrigieseis y que me digais lo que esta mal. Os agradezco un monton la paciencia que teneis conmigo. GRACIAS!
jfh900 eres un CRACK!

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: 12c508a en c
« Respuesta #10 en: 20 de Junio de 2006, 12:52:06 »
Bueno, mirando el CCS veo que no es compatible con el C2C. Por cierto CCS es una clase de compilador de "C" igual que los es C2C. Las modificaciones que yo hatia son:

Código: C
  1. LIST p=12c508A, r=HEX;
  2. #INCLUDE <C:\C2CPP\p12C508A.inc>;
  3. #define    __CONFIG _MCLRE_OFF & _CP_OFF & _WDT_OFF & _IntRC_OSC;
  4.  
  5. typedef int8 boolean; // lo sacamos fuera dl main
  6. #define GP1 output_pin_port_a( 1 ); // Declaramos lo que es GP1 y GP2
  7. #define GP2 output_pin_port_a( 2 );
  8.  
  9. void main()
  10.     {
  11.        // Descripcion de variables
  12.        boolean GP3;
  13.        boolean GP4;
  14.        boolean GP5;
  15.  
  16.        while(1)   // Ejecutar un bucle que se repite de forma indefinida
  17.        {
  18.        while (!input_pin_port_a( 0 )){}; // Se cierra en el 2º bucle si A0 = 0 y espera a que valga 1
  19.                                                        // Eliminamos una asignación innecesaria de GP0.
  20.        
  21.        GP3= input_pin_port_a( 3 ); // Leemos las variables de entrada que definiran las salidas
  22.        GP4= input_pin_port_a( 4 );
  23.        GP5= input_pin_port_a( 5 );
  24.                                
  25.        if (GP3==0 && GP4==0 && GP5==0)              { GP1=0;GP2=0;}
  26.             else if (GP3==0 && GP4==0 && GP5==1)   { GP1=0;GP2=1;}
  27.             else if (GP3==0 && GP4==1 && GP5==0)   { GP1=1;GP2=1;}
  28.             else if (GP3==0 && GP4==1 && GP5==1)   { GP1=0;GP2=1;}
  29.             else if (GP3==1 && GP4==0 && GP5==0)   { GP1=1;GP2=0;}
  30.             else if (GP3==1 && GP4==0 && GP5==1)   { GP1=0;GP2=0;}
  31.             else if (GP3==1 && GP4==1 && GP5==0)   { GP1=1;GP2=0;}
  32.             else if (GP3==1 && GP4==1 && GP5==1)   { GP1=1;GP2=1;}
  33.        endif
  34.        }
  35.    } // Cerramos en main

Las modificaciones echas son:

1º Declaramos las variables necesarias eliminando GP0 que utilizamos directamente la función de lectura para evitarnos asignaciones innecesarias. No se si GP1 y GP2 estan bien declaradas, por no disponer del manual del C2C.
2º Creamos un bucle infinito que siempre se esta ejecutando con while(1)
3º Creamos un bucle while (!input_pin_port_a( 0 )){}; que lo unico que hace es que si A0 es cero se queda esperando a que sea 1.
4º Leemos las variables de entrada
5º Ponemos las variables de salida.
6º Saltamos según el bucle infinito a 3º.

Basicamente este es el programa. Por desgracia no dispongo del C2C y no puedo compilarlo y simularlo para ver si tiene alguna fallo. Seguro que algo esta mal en la sintaxis pero ya digo que no dispongo del manual ni del compilador.

Pruebalo y nos comentas.

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 djpalas

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 595
    • Microtronic
Re: 12c508a en c
« Respuesta #11 en: 20 de Junio de 2006, 13:32:23 »
Buenas!!

Ya veo que se ha adelantado jfh900 y lo ha posteado antes que yo  :D.
Pero bueno ya que lo iba a postear pues lo pongo, asi veo si he fallado en algo, y que los maestros den su opinión  :-)

Código: C
  1. LIST p=12c508A, r=HEX;
  2. #INCLUDE <C:\C2CPP\p12C508A.inc>;
  3. #define    __CONFIG _MCLRE_OFF & _CP_OFF & _WDT_OFF & _IntRC_OSC;
  4.  
  5. #define GP1 output_pin_port_a(1);   //Definimos las macros de GP1 y GP2
  6. #define GP2 output_pin_port_a(2);
  7.  
  8.  
  9. typedef int8 boolean;   //ChOrChE esto es porque la forma de utilizar datos
  10.                         //binarios tienen que ser declarado como int8
  11.                         //por ello que para un uso mas habitual y mas
  12.                         //comprensible. Se define un tipo propio "boolean"
  13.                         //que corresponde a los tipos int8
  14.                         //Ejemplo:
  15.                         //
  16.                         //int8 GP0;
  17.                         //boolean GP0;
  18.  
  19. void main(){
  20.  
  21.                        
  22.    // Descripcion de variables
  23.    
  24.         boolean GP0;
  25.         boolean GP3;
  26.         boolean GP4;
  27.         boolean GP5;
  28.  
  29.    while(1){
  30.  
  31.         // Tendrias que colocarlo para comprobar el estado del GP0
  32.         // ya que podria no entrar nunca en el bucle, porque no
  33.         // has inicializado la variable a un valor distinto de 0
  34.         // para entrar en el bucle
  35.         GP0= input_pin_port_a(0);
  36.  
  37.         while (GP0){
  38.  
  39.         GP3= input_pin_port_a(3);
  40.         GP4= input_pin_port_a(4);
  41.         GP5= input_pin_port_a(5);
  42.  
  43.         //Si aplicamos karnaugh a cada una de las variable de Salida
  44.         //con respecto a las entradas, podemos simplificarla
  45.         //
  46.         // GP1 = (GP3 || GP4) && (~GP5)
  47.         // GP2 = (GP4 || GP5) && (~GP3)
  48.         //
  49.         // Con lo que podremos simplificar las comparaciones con tantos if
  50.                                
  51.             if((GP3 || GP4) && (~GP5))
  52.                   GP1=1;
  53.             else
  54.                   GP1=0;
  55.  
  56.             if((GP4 || GP5) && (~GP3))
  57.                   GP2=1;
  58.             else
  59.                   GP2=0;
  60.  
  61.          //Volvemos a comprobar el valor de GP0 para saber si seguir o salir                                    
  62.          GP0 = input_pin_port_a(0);
  63.          }
  64.    }
  65. }

Espero que te sirva de ayuda

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

Desconectado ChOrChE

  • PIC10
  • *
  • Mensajes: 13
Re: 12c508a en c
« Respuesta #12 en: 20 de Junio de 2006, 14:26:38 »
YA ME HE HECHO CON EL COMPILADOR CCS!
GRACIAS!
Ahora queda leer un mucho. De todas maneras esto de declarar los puerto como entrada y otros como salida es un poco lioso porque en ensamblador se configura un registro y ya esta!.
Lo que pasa es que a la hora de hacer codigo simplificas mucho la idea.

Me he dado cuenta que css define las salidas solas cuando abres un proyecto añadiendo al codigo el GP1 output_pin_port_a( 1 ); o algo parecido

Ahora si me cuentas algo con css lo pillare.


Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: 12c508a en c
« Respuesta #13 en: 20 de Junio de 2006, 14:29:05 »
Muy buen código. La única modificación que haria seria eliminar la variable GP0 ya que asignar el valor a una variable para despues hacer la comprobación del while y no utilizarla mas no tiene ningún sentido, luego se podria poner:

while (input_pin_port_a( 0 )){

La aplicación de karnaugh simplifica y optimiza el código. Enhorabuena por el código.

Saludos.
* 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 djpalas

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 595
    • Microtronic
Re: 12c508a en c
« Respuesta #14 en: 20 de Junio de 2006, 14:57:22 »
Buenas de nuevo!!

jfh900 muchas gracias  :) me di cuenta cuando lo revisé, pero como era horientativo no lo quise editar.

Ahora puedes aprovechar y decirme lo mismo que te puse en otro post de otro tema, un despiste lo tiene cualquiera  jejejeje  :wink:

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


 

anything