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

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

Desconectado daltonico82

  • PIC12
  • **
  • Mensajes: 89
XOR en CCS
« en: 25 de Mayo de 2011, 18:33:38 »
Hola a todos:

Intento realizar una O-exclusiva con la intención de cambiar el estado (de 0 a 1, o de 1 a 0) del pin 0 del puerto D. No compila:

 if (valor[0]>S0Y1)
         {
         PORTD=(PORTD)ˆˆ(0X01);
         }

Gracias

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: XOR en CCS
« Respuesta #1 en: 25 de Mayo de 2011, 18:46:59 »
Hola daltonico82, para el XOR utiliza un solo signo ^

PORTD=(PORTD)^(0X01);

o así:

PORTD^=(0X01);


Saludos!

Edito: No son necesarios los paréntesis en ninguno de los dos casos...
« Última modificación: 25 de Mayo de 2011, 19:12:42 por bmb »

Desconectado daltonico82

  • PIC12
  • **
  • Mensajes: 89
Re: XOR en CCS
« Respuesta #2 en: 25 de Mayo de 2011, 19:14:50 »
Gracias por responder!!!

No me sirvió para lo que quiero. Explico: pretendo cambiar el estado del D0 sin modificar los demás pines del puerto. He definido el puerto D del siguiente modo:

#use fast_io(D)
........
........
#byte PORTD = 0X08
........
........
#bit D0=PORTD.0
#bit D1=PORTD.1
#bit D2=PORTD.2

Con el consejo de bmb ya me compila pero no va. Devería funcionar ya que por un lado D0 al hacer una XOR con 1: D0=0 XOR 1==>1     y      D0=1 XOR 1==>0

También se me ocurre hacerlo:

output_toggle(D0);

pero tampoco funciona.....


Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: XOR en CCS
« Respuesta #3 en: 25 de Mayo de 2011, 19:23:14 »
o puedes hacer también:

D0^=1;

aunque la funcion toggle debería funcionar
.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: XOR en CCS
« Respuesta #4 en: 25 de Mayo de 2011, 19:46:56 »
Gracias por responder!!!

No me sirvió para lo que quiero. Explico: pretendo cambiar el estado del D0 sin modificar los demás pines del puerto. He definido el puerto D del siguiente modo:

#use fast_io(D)
........
........
#byte PORTD = 0X08
........
........
#bit D0=PORTD.0
#bit D1=PORTD.1
#bit D2=PORTD.2

Con el consejo de bmb ya me compila pero no va. Devería funcionar ya que por un lado D0 al hacer una XOR con 1: D0=0 XOR 1==>1     y      D0=1 XOR 1==>0

También se me ocurre hacerlo:

output_toggle(D0);

pero tampoco funciona.....



Cuando hablas de que no te funciona... te referis a:

1. no te compila
2. compila pero en el simulador no anda
3. compila, en el simulador anda pero en el hard no
4. probas directo en el hard y no anda

- 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 #5 en: 26 de Mayo de 2011, 05:21:54 »
Hola.

Utilizo CCS y compila bien. No anda en el hard ya que lo pruebo directamente en la placa de desarrollo. Voy a revisar unas cuantas  cosas y la parte del programa en que lo utilizo ya que realice un programa sencillo donde en un while(1) hacia parpadear un led por este método y sí funciono. Ahora estoy en el trabajo.... cuando salga pruebo y si sigo sin hacerlo funcionar lo cuelgo...

Saludos

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: XOR en CCS
« Respuesta #6 en: 26 de Mayo de 2011, 08:30:12 »
Hola.

Utilizo CCS y compila bien. No anda en el hard ya que lo pruebo directamente en la placa de desarrollo. Voy a revisar unas cuantas  cosas y la parte del programa en que lo utilizo ya que realice un programa sencillo donde en un while(1) hacia parpadear un led por este método y sí funciono. Ahora estoy en el trabajo.... cuando salga pruebo y si sigo sin hacerlo funcionar lo cuelgo...

Saludos

¿Probaste simularlo en el MPLAB?
¿Para que pic lo estas haciendo?
¿Pones algún retardo como para poder 'ver' el parpadeo? Si no hay retardo entre xors, el parpadeo será tan rápido que tu ojo no lo podrá ver

- 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 #7 en: 26 de Mayo de 2011, 08:54:10 »
Nunca utilicé MPLAB. Quizás vaya siendo hora...
Empleo un 16f877.
Lo del parpadeo lo hice con otro programa y sí pongo un retardo de 500 ms.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: XOR en CCS
« Respuesta #8 en: 26 de Mayo de 2011, 09:27:45 »
Nunca utilicé MPLAB. Quizás vaya siendo hora...
Empleo un 16f877.
Lo del parpadeo lo hice con otro programa y sí pongo un retardo de 500 ms.

Podes subir el código completo?
En lo poco que escribiste veo qeu utilizas el puerto D. ¿Tenés desactivado el PSP (Parallel Slave Port) ?
- 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 #9 en: 26 de Mayo de 2011, 10:34:05 »
Hola de nuevo, gracias por ser tan atento.

Este es el código dónde intento hacer la XOR:

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

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

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

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

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

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

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



 

void main()
{
   delay_ms(50);
   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;
   //int e=0;
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
   //delay_ms(300);
   
   while(true)
      {
        //delay_ms(500);
        //D0^=1;
         if(flag==1)
         {
     
  if (valor[2]<(SX2))//las X
  {
  if (valor[2]>(SX1))
  {
  Xok=1;
  }
  }
 
  if (Xok==1)
         {
         if (valor[0]<S0Y2)
         {
         if (valor[0]>S0Y1)
         {
         //PORTD=(PORTD)^(0x01);
         D0^=1;
        //output_toggle(D0);
         }
         }
         }

if (Xok==1)
         {
         if (valor[0]<S1Y2)
         {
         if (valor[0]>S1Y1)
         {
         //output_toggle(D1);
         PORTD=0X02;
         delay_ms(1000);
         PORTD=0X00;
         }
         }
         }

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


       
       
       
      }
}
}

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: XOR en CCS
« Respuesta #10 en: 26 de Mayo de 2011, 10:53:28 »
Suponiendo que le envias la info correcta por la usart y que el baudeaje este bien ,etc.

Te sugiero usar una variable intermedia, no el portd directamente.

Por ej. 

MIPORTD ^= 1;  (esto invierte todo el puerto por supuesto).
PORTD = MIPORTD;

y siempre trabaja con MIPORTD y fijate si así te funciona.

Lo mismo podría ser MIPORTD una variable de bit y que se la asignes al pin D0.

Fijate y luego me comentas

- 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 bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: XOR en CCS
« Respuesta #11 en: 26 de Mayo de 2011, 11:30:19 »
... cambiar el estado (de 0 a 1, o de 1 a 0) del pin 0 del puerto D...

Si la intención es cambiar de estado un pin del puerto D en CCS, esto: output_toggle(D0); no te va a funcionar ya que output_toggle() es una macro interna de CCS y solo te va a funcionar si pones allí uno de los pines declarados en el archivo .h, por ejemplo output_toggle(PIN_D1).  Para invertir el estado de un pin en CCS, también puedes usar por ejemplo:

Código: C
  1. if (valor[0]>S0Y1)
  2.   {
  3.       if(bit_test(PORTD,1))
  4.          bit_clear(PORTD,1);
  5.       else
  6.          bit_set(PORTD,1);
  7.   }

O ya que tienes declarados los pines del puerto D, puedes también:

Código: C
  1. if (valor[0]>S0Y1)
  2.   {
  3.       if(D1)
  4.          D1 = 0;
  5.       else
  6.          D1 = 1;
  7.   }

Saludos!

EDITO: Cambio por un error en bit_test...
« Última modificación: 26 de Mayo de 2011, 11:33:13 por bmb »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: XOR en CCS
« Respuesta #12 en: 26 de Mayo de 2011, 11:44:49 »
Estoy de acuerdo que aproveche la función implementada, pero igualmente sirve entender que se puede utilizar la otra forma, que dependiendo de la arquitectura es lo mismo.

Dado que en un 16F, realizar output_toggle(PIN_A2) lleva a que el compilador genere las mismas instrucciones que PORTA^=0x04;  Ahora en un 18F no es lo mismo, ya que output_toggle(PIN_A2) utiliza la instrucción BTG de assembler, y en "C" lo correcto sería LATA=LATA^0x04; que genera lo mismo que en un 16F :)


Saludos!
« Última modificación: 26 de Mayo de 2011, 12:20:13 por Suky »
No contesto mensajes privados, las consultas en el foro

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: XOR en CCS
« Respuesta #13 en: 26 de Mayo de 2011, 11:53:57 »
Estoy de acuerdo que aproveche la función implementada, pero igualmente sirve entender que se puede utilizar la otra forma, que dependiendo de la arquitectura es lo mismo.

Dado que en un 16F, realizar output_toggle(PIN_A2) lleva a que el compilador genere las mismas instrucciones que PORTA^=0x04;  Ahora en un 18F no es lo mismo, ya que output_toggle(PIN_A2) utiliza la instrucción BTG de assembler, y en "C" lo correcto sería LATA=PORTA^0x04; que genera lo mismo que en un 16F :)

En realidad mas allá de la función embebida que vaya uno a saber qué hace jaja, mi pregunta iba justamente a que no es lo mismo querer que la salida cambie a hacer un toggle de lo que leemos del puerto y luego cambiarlo...si lo que queremos es que lo que cambie sea la salida

Por ej suky, tu código puede ser erróneo en un 18F, ya que la salida del latch puede ser diferente a la entrada, lo mismo en pic16.  Por eso le sugerí que use una variable auxiliar o "shadow registers" como le dicen los yankies a esta operatoria.

Ademas leer un solo "bit", internamente es igual a leer el puerto completo, por ello hay que tener cuidado cuando trabajamos con puertos de E/S.  

Justamente el portA que para la mayoría de los pics tiene puerto analógico, leerlo digitalmente nos traerá todos ceros, entonces si queremos modificarlo de esa forma, solo lograremos que siempre esté el mismo valor en la salida

En los 18F, el toggle de una salida se debe realizar sobre la misma salida, sobre el registro LATCHx, no sobre PORTx.  

Ni hablar si el toggle debe ser rápido, ahi entran en juego aspectos de la impedancia de lo que hay conectado por fuera del pin, etc.  Por ello existen los LATx , para justamente evitar este enorme problema que tenian los 16F


- 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 #14 en: 26 de Mayo de 2011, 12:08:53 »
 :D En el caso del 16F, CCS hace exactamente eso al realizar output_toggle  ;-)
No contesto mensajes privados, las consultas en el foro


 

anything