Autor Tema: XOR en CCS  (Leído 13234 veces)

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

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: XOR en CCS
« Respuesta #15 en: 26 de Mayo de 2011, 12:18:25 »
:D En el caso del 16F, CCS hace exactamente eso al realizar output_toggle  ;-)

Bueno, está mal ji... otra razón más para no usarlo jajajaja
 :afro:
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado daltonico82

  • PIC12
  • **
  • Mensajes: 89
Re: XOR en CCS
« Respuesta #16 en: 26 de Mayo de 2011, 18:36:05 »
Gracias colegas!!! Entre vuestras respuestas magistrales, seguro está la solución ó más de una solución.

Sigue sin funcionar bien. He dudado del trabajo anterior pero las coordenas que testeo llegan bien, lo comprobe con el programa que os dejo, en este activo el pin uno cuando me llegan unas coordenadas, el pin 2 con otras y así con el pin 3 del puerto D...... sólo que yo lo quiero activar y desactivar una salida del puerto al llegarme unas coordenadas concretas.... un interruptor

Código: [Seleccionar]
if (Xok==1)
         {
         if (valor[0]<S0Y2)
         {
         if (valor[0]>S0Y1)
         {
         //PORTD=(PORTD)^(0x01);
         //D0^=1;
        //output_toggle(D1);
        //MIPORTD^=1;
        //D0=MIPORTD;
        /*if(D1)
        D1 = 0;
        else
        D1 = 1;*/
        /*if(cansado==0)
        {
        PORTD=0X01;
        cansado=1;
        }
        else
        {
        PORTD=0X00;
        cansado=0;
        }*/
       
      PORTD=0X01;
     


         }
         }
         }
       
         

if (Xok==1)
         {
         if (valor[0]<S1Y2)
         {
         if (valor[0]>S1Y1)
         {
         //output_toggle(D1);
         PORTD=0X02;
         
         }
         }
         }
         
         
if (Xok==1)
         {
         if (valor[0]<S2Y2)
         {
         if (valor[0]>S2Y1)
         {
         //output_toggle(D2);
         PORTD=0X04;
       
         }
         }
         }

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: XOR en CCS
« Respuesta #17 en: 26 de Mayo de 2011, 22:10:04 »
Sigue sin funcionar bien. He dudado del trabajo anterior pero las coordenas que testeo llegan bien, lo comprobe con el programa que os dejo, en este activo el pin uno cuando me llegan unas coordenadas, el pin 2 con otras y así con el pin 3 del puerto D...... sólo que yo lo quiero activar y desactivar una salida del puerto al llegarme unas coordenadas concretas.... un interruptor


Y cuando te llegan esas coordenadas concretas, la salida cambia ahora al valor esperado q pusiste ahora? mas allá que no haga el toggle...

otra consulta, entre coordenada y coordenada hay un tiempo prudente? podes ver el cambio o es muy rápido?

probaste hacer uso de una variable auxiliar como te dije?
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado daltonico82

  • PIC12
  • **
  • Mensajes: 89
Re: XOR en CCS
« Respuesta #18 en: 27 de Mayo de 2011, 08:06:07 »
Ahora con este programa.... el puerto cambia de 0x01 a 0x02 o a 0x04 sin problemas cuado recibo las distintas coordenadas.

Probé con la variable intermedia pero no funcionó.... sigo dádole vueltas


Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: XOR en CCS
« Respuesta #19 en: 27 de Mayo de 2011, 08:32:54 »
Ahora con este programa.... el puerto cambia de 0x01 a 0x02 o a 0x04 sin problemas cuado recibo las distintas coordenadas.

Probé con la variable intermedia pero no funcionó.... sigo dádole vueltas


Mostrame el código donde usas la variable intermedia así lo vemos en conjunto; si no te anda el toggle pero si te muestra el led fijo cuando recibe las coordenadas entonces o bien recibis muchas veces la info (o el codigo la interpreta muchas veces) y hace el toggle más de una vez  o bien estas haciendo mal el toggle

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: XOR en CCS
« Respuesta #20 en: 27 de Mayo de 2011, 10:57:44 »
Algunas cosas a mejorar, si tienes valores que van ser constantes y no van a ser modificados conviene definirlos mediante la directiva #define o colocarle const como atibuto:

Código: [Seleccionar]
#define SX1 0X2B
const int SX1=0X2B;

Luego, cuando ocurre la interrupción por recepción de datos, significa que ha llegado el bit stop, así que preguntar si hay datos es redundante, el if(kbhit()) es innecesario.

Se puede reorganizar los if de la siguiente manera:
Código: [Seleccionar]
  while(true){
         if(flag==1)
{    
flag=0;
if((valor[2]<(SX2))&&(valor[2]>(SX1)))//las X
{
Xok=1;
}
  
if (Xok==1)
{
if((valor[0]<S0Y2)&&(valor[0]>S0Y1))
{
output_toggle(D0);
//delay_ms(500);
}

if((valor[0]<S1Y2)&&(valor[0]>S1Y1))
{
PORTD=0X02;
delay_ms(1000);
PORTD=0X00;
}

if((valor[0]<S2Y2)&&(valor[0]>S2Y1))
{
PORTD=0X04;
delay_ms(1000);
PORTD=0X00;
}
Xok=1;
}
        }
}


Lo más importante, te falta resetear las banderas que ya han sido tratadas, sino salta nuevamente sin ocurrir ningun evento.


Saludos!

No contesto mensajes privados, las consultas en el foro

Desconectado daltonico82

  • PIC12
  • **
  • Mensajes: 89
Re: XOR en CCS
« Respuesta #21 en: 27 de Mayo de 2011, 13:48:38 »
HOLA!!! :oops: :oops: :oops:

Empleo las mejoras o necesarias que me indicas Suky.... pero si coloco el flag=0; lo que me pasa es lo siguiente:

Si pulso tecla 0 por ejemplo no pasa nada. Si a continuación pulso tecla 0 de nuevo se activa D0. Si la segunda vez pulso tecla 1 por ejemplo se activa D0, luego en la proxima pulsación sea cual sea la tecla se activaría D1(que correspondia con la pulsación de tecla 1) y asi sucesivamente....es decir hace lo deseado una pulsación después.

Sigo con esto, ahora y lo del toggle... El código está asi:

Código: [Seleccionar]
#include <16f877.h>
#fuses HS,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP,NOCPD,NOWRT
#use delay(clock=20000000)
#use RS232 (baud=38400, bits=8, parity=N, xmit=PIN_C6, rcv=PIN_C7)

#use fast_io(A)
#use fast_io(B)
#use fast_io(C)                   
#use fast_io(D)                   
#use fast_io(E)                   

#byte PORTA = 0X05
#byte PORTB = 0X06
#byte PORTC = 0X07                     
#byte PORTD = 0X08
#byte PORTE = 0X09

#bit D0=PORTD.0
#bit D1=PORTD.1
#bit D2=PORTD.2

const int SX1=0X2B;//coordenadas max y min: X
const int SX2=0X61;

const int S0Y1=0X26;//coordenadas max y min: Y_TECLA S0
const int S0Y2=0x3C;

const int S1Y1=0X40;//coordenadas max y min: Y_TECLA S1
const int S1Y2=0x59;

const int S2Y1=0X5B;//coordenadas max y min: Y_TECLA S2
const int S2Y2=0x73;

int1 Xok=0;
int lectura=0;
int valor[4];
int i=0;
int1 flag=0;

#int_rda
void RDA_isr()
{
           
        lectura=getc();
        valor[i]=lectura;
        i++;
         if(i==4)
         {
              flag=1;
              i=0;
         }
     
}

void main()
{
   
   delay_ms(50);//incialización controlador
   SET_TRIS_A (0xFF);
   SET_TRIS_B (0x0F);
   SET_TRIS_C (0x80);
   SET_TRIS_D (0X00);
   /*for(i=0;i<4;i++)
      {
         valor[i]=0;   
      }*/
   //flag=0;
   //lectura=0x00;
   PORTD=0X00;
   int1 contador=0;
   int1 MIPORTD=0;
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
   
   
    while(true){
         if(flag==1)
      {     
         //flag=0;
         
         if((valor[2]<(SX2))&&(valor[2]>(SX1)))//las X; las 3 teclas en este caso están alineadas verticalmente==>mismas coordenadas X
         {
            Xok=1;
         }
         
         if (Xok==1)
         {
            if((valor[0]<S0Y2)&&(valor[0]>S0Y1))
            {
               //output_toggle(D0);
               //delay_ms(500);
               PORTD=0X01;
             
            }
           
           
            if((valor[0]<S1Y2)&&(valor[0]>S1Y1))
            {
               PORTD=0X02;
               
            }
           
           
            if((valor[0]<S2Y2)&&(valor[0]>S2Y1))
            {
               PORTD=0X04;
               
            }
           
            Xok=0;
         }
       
     
   }
   
}//while(1)
}//main()

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: XOR en CCS
« Respuesta #22 en: 27 de Mayo de 2011, 13:56:26 »
Estas seguro que te envía 4 bytes por tecla pulsada? No tengo idea de donde provienen esos datos, por eso la pregunta
No contesto mensajes privados, las consultas en el foro

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: XOR en CCS
« Respuesta #23 en: 27 de Mayo de 2011, 14:23:34 »
Sigo con esto, ahora y lo del toggle... El código está asi:

Pero salvo que esté leyendo muy apuradamente pero no veo que hayas un toggle en ese código.

Porque no haces lo siguiente

1. Inicia una variable uqe se llame toggle con 0 --> toggle=0
2. Cuando recibis la coordenada que esperas [1] para hacer el toggle, tomá una variable que se llame toggle y hacela modificarse así toggle ^= 1 o si queres podrias hacer toggle = ~toggle o como se te ocurra, hay muchas formas de hacer que cambie
3. PIN de SALIDA = toggle ; donde pin de salida es el que queres que se active/desactive.  O bien algo más sencillo sería

Código: [Seleccionar]
if (toggle) PINSALIDA=1; else PINSALIDA=0;
Espero te sirva de ayuda




Nota
 [1] En este punto coincido con suky que no sabemos bien que recibís porque hablas de 1 sola tecla pero en el código esperas 4 bytes
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado daltonico82

  • PIC12
  • **
  • Mensajes: 89
Re: XOR en CCS
« Respuesta #24 en: 27 de Mayo de 2011, 19:17:18 »
Bien, os pido disculpas por no haber explicado bien: el controlador  envía 4 bytes. Trabajo con el valor[0] y valor[2] que son las coordenadas X e Y. Esto funciona bien pues soy capaz de comprobar si estoy o no pulsando una zona del panel táctil y en consecuencia, por ejemplo poner PORTD=0XFF;

Hice esto, y pasa algo raro: si pulso el boton 1 (donde puse el toggle para probar) se activa D0, pero si vuelvo a pulsar el boton 1 no hace nada. Si pulso muchas veces en alguna ocasión se desactiva:

Código: [Seleccionar]
[/covoid main()
{
   
   delay_ms(50);//incialización controlador
   SET_TRIS_A (0xFF);
   SET_TRIS_B (0x0F);
   SET_TRIS_C (0x80);
   SET_TRIS_D (0X00);
   /*for(i=0;i<4;i++)
      {
         valor[i]=0;   
      }*/
   //flag=0;
   //lectura=0x00;
   PORTD=0X00;
   int1 contador=0;
   int1 MIPORTD=0;
   int1 toggle=0;
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
   
   
    while(true)
    {
         if(flag==1)
      {     
         //flag=0;
         
         if((valor[2]<(SX2))&&(valor[2]>(SX1)))//las X; las 3 teclas en este caso están alineadas verticalmente==>mismas coordenadas X
         {
            Xok=1;
         }
         
         if (Xok==1)
         {
            if((valor[0]<S0Y2)&&(valor[0]>S0Y1))//pulso boton 1
            {
               //output_toggle(D0);
               //delay_ms(500);
               toggle ^= 1;
               D0=toggle;
             
            }
           
           
            if((valor[0]<S1Y2)&&(valor[0]>S1Y1))//pulso boton 2
            {
               PORTD=0X02;
               
            }
           
           
            if((valor[0]<S2Y2)&&(valor[0]>S2Y1))//pulso boton 3
            {
               PORTD=0X04;
               
            }
           
            Xok=0;
         }
       
     
   }
   
}//while(1)
}//main()
de]

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: XOR en CCS
« Respuesta #25 en: 27 de Mayo de 2011, 19:32:09 »
Lo que estoy seguro es que necesitas resetear flag a 0 después de tratar los datos. De esa manera distingues entre las distintas tramas, sino desde la primera vez que pulses ingresará a trabajar con los datos en valor[] y puede que estés recibiendo otros...

Lo que se puede realizar por si se reciben muchos datos a la vez es:

Código: [Seleccionar]
void RDA_isr()
{
           
        lectura=getc();
        if(flag==0){
        valor[i]=lectura;
        i++;
         if(i==4)
         {
              flag=1;
              i=0;
         }
     }     
}

Y colocar flag a 0 al final del if() del bucle principal. Entonces, si estas trabajando con los datos recibidos anteriormente no existe la posibilidad de irlos reemplazando antes de tratarlos.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado daltonico82

  • PIC12
  • **
  • Mensajes: 89
Re: XOR en CCS
« Respuesta #26 en: 31 de Mayo de 2011, 15:44:58 »
HOLA A TODOS!!!

Gracias por su ayuda. Creo que en este hilo se muestran unas cuantas formas de alternar de uno a cero el pin de un puerto. Al final todas o casi todas la formas que me habeis comentado han funcionado, por lo tanto... mi programa es el que daba problema.

A parte de que me ayudasteis a extructurarlo, me llevasteis a hacer pruebas que no habia tenido en cuenta, me recordasteis la importancia de rsetear banderas y variables.... logré hacerlo funcionar.... poniendo un retardo de 50 ms.

Coloco aquí varias formas en las que funciono el "toggle_pin" o la "XOR del puerto" :

 if ((Xok==1)&&(valor[0]<S0Y2)&&(valor[0]>S0Y1))//opcion 1
         {
         Xok=0;
         D0^=1;
         }

if ((Xok==1)&&(valor[0]<S0Y2)&&(valor[0]>S0Y1))//opcion2
         {
         Xok=0;
         PORTD^=(0X01);
         }

if ((Xok==1)&&(valor[0]<S0Y2)&&(valor[0]>S0Y1))//opcion 3
         {
         Xok=0;
         output_toggle(PIN_D0);
         }

if ((Xok==1)&&(valor[0]<S1Y2)&&(valor[0]>S1Y1))//opcion 4
         {
         Xok=0;
         toggle1 = ~toggle1;
         D1=toggle1;
         }

 if ((Xok==1)&&(valor[0]<S0Y2)&&(valor[0]>S0Y1))//opcion 5
         {
         Xok=0;
         toggle = ~toggle;
         if(toggle) D0=1;
         else D0=0;
         }
         
     
Ahora os dejo el código como lo tengo en estos momentos.Lo extructuraré  más pero ahora el siguiente paso es controlar la comunicación rs232 pero para enviar datos y conseguir emitir un "pitido" para una pulsación válida en la touch. Sobre este tema preguntaré en el hilo "mil vueltas sobre una secilla comunicacion serie", nos vemos por alli. Gracias por la estimable gran ayuda!!! :mrgreen: :D :g) ;-)

Código:
Código: [Seleccionar]
#include <16f877.h>
#fuses HS,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP,NOCPD,NOWRT
#use delay(clock=20000000)
#use RS232 (baud=38400, bits=8, parity=N, xmit=PIN_C6, rcv=PIN_C7)
//#use RS232 (baud=38400, xmit=PIN_C6, rcv=PIN_C7)

#use fast_io(A)
#use fast_io(B)
#use fast_io(C)                   
#use fast_io(D)                   
#use fast_io(E)                   

#byte PORTA = 0X05
#byte PORTB = 0X06
#byte PORTC = 0X07                     
#byte PORTD = 0X08
#byte PORTE = 0X09

#bit D0=PORTD.0
#bit D1=PORTD.1
#bit D2=PORTD.2

const int SX1=0X2B;//coordenadas max y min: X
const int SX2=0X61;

const int S0Y1=0X26;//coordenadas max y min: Y_TECLA S0
const int S0Y2=0x3C;

const int S1Y1=0X40;//coordenadas max y min: Y_TECLA S1
const int S1Y2=0x59;

const int S2Y1=0X5B;//coordenadas max y min: Y_TECLA S2
const int S2Y2=0x73;

int1 Xok=0;
int lectura=0;
int valor[4];
int i=0;
int1 flag=0;

#int_rda

void RDA_isr()
{
           
        lectura=getc();
        valor[i]=lectura;
        i++;
         if(i==4)
         {
              flag=1;
              i=0;
         }
     
}

/*void RDA_isr()
{
         
         lectura=getc();
         if(flag==0){
           valor[i]=lectura;
           i++;
            if(i==4)
            {
                 flag=1;
                 i=0;
            }
        }     
} */


void main()
{
   
   delay_ms(50);//incialización controlador
   SET_TRIS_A (0xFF);
   SET_TRIS_B (0x00);
   SET_TRIS_C (0x80);
   SET_TRIS_D (0X00);
 
   setup_adc(ADC_OFF);
   setup_spi(FALSE);
   setup_psp(PSP_DISABLED);
   /*for(i=0;i<4;i++)
      {
         valor[i]=0;   
      }*/
   //flag=0;
   //lectura=0x00;
   PORTD=0X00;
   PORTB=0X00;
   
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
   
   
    while(true)
    {
         if(flag==1)
      {   
     
     delay_ms(50);
         flag=0;
         
         if((valor[2]<(SX2))&&(valor[2]>(SX1)))//las X; las 3 teclas en este caso están alineadas verticalmente==>mismas coordenadas X
         {
            Xok=1;
         }
         
         if ((Xok==1)&&(valor[0]<S0Y2)&&(valor[0]>S0Y1))
         {
         Xok=0;
         output_toggle(PIN_D0);
         }
         
         if ((Xok==1)&&(valor[0]<S1Y2)&&(valor[0]>S1Y1))
         {
         Xok=0;
         output_toggle(PIN_D1);
         }
   
         if ((Xok==1)&&(valor[0]<S2Y2)&&(valor[0]>S2Y1))
         {
         Xok=0;
         output_toggle(PIN_D2);
         }

         
   
      }//flag==1
     
   
}//while(1)
}//main()


 

anything