Autor Tema: nuevo programando pic  (Leído 2966 veces)

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

Desconectado alfmalo000

  • PIC10
  • *
  • Mensajes: 13
nuevo programando pic
« en: 11 de Abril de 2019, 11:58:35 »
Hola.
Soy bastante novato en la programación de pics.
Estoy intentado hacer un nuevo proyecto, en el cual tengo esta tabla de la verdad:

Estado anterior RB4                RA3               RA2                       salida( RB4)
           0                                     0                   0                               1
           0                                     0                   1                               0
           0                                     1                   0                               1
           0                                     1                   1                               0
           1                                     0                   0                               1
           1                                     0                   1                               0
           1                                     1                   0                               1
           1                                     1                   1                               1


El codigo que he desarrolado es el siguiente:
En el cual creo una variable "salida" en el que guardo el resultado que saco por RB4, la salida.
No veo el problema pero no me funciona correctamente.
Please a ver si me echais una manita que ya no se que probar mas....

#include <16f84a.h>
#fuses xt, nowdt
#use delay (clock=4000000)
#byte trisa=0x85
#byte trisb=0x86
#byte porta=0x05
#byte portb=0x06

int1 salida=1;

void main()
{
trisa=0xff;
trisb=0x00;
PORTB=0xff;
while (true)
{

if((bit_test(porta,2)==0)&&(bit_test(porta,3)==0)&&(salida==0)){
bit_set(portb,4)&(salida=1);
}
else{
if((bit_test(porta,2)==1)&&(bit_test(porta,3)==0)&&(salida==0)){
bit_clear(portb,4)&(salida=0);
}
else{
if((bit_test(porta,2)==0)&&(bit_test(porta,3)==1)&&(salida==0)){
bit_set(portb,4)&(salida=1);
}
else{
if((bit_test(porta,2)==1)&&(bit_test(porta,3)==1)&&(salida==0)){
bit_clear(portb,4)&(salida=0);
}
else{
if((bit_test(porta,2)==0)&&(bit_test(porta,3)==0)&&(salida==1)){
bit_set(portb,4)&(salida=1);
}
else{
if((bit_test(porta,2)==0)&&(bit_test(porta,3)==1)&&(salida==1)){
bit_set(portb,4)&(salida=1);
}
else{
if((bit_test(porta,2)==1)&&(bit_test(porta,3)==1)&&(salida==1)){
bit_set(portb,4)&(salida=1);
}
}
}
}
}
}
}
}
}


Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re:nuevo programando pic
« Respuesta #1 en: 11 de Abril de 2019, 17:58:47 »
 
Ese operador AND de manejo de bits que has calzado en cada IF es probable que no funcione como piensas. De hecho en el ejemplo, que anda por internet, y que has usado de partida para tu código, solo se emplea para setear la salida de varios puertos a nivel de bit, no para dar valores a una variable.

No se que necesidad hay de encadenar instrucciones con & dentro de los IF. Una cosa es interrogar el estado de varios puertos, y una variable, con un AND lógico &&, y otra el uso del AND como un operador de manejo de bits.

Prueba así.

Código: C++
  1. if((bit_test(porta,2)==0)&&(bit_test(porta,3)==0)&&(salida==0))
  2. {
  3.    bit_set(portb,4);
  4.    salida=1;
  5. }
« Última modificación: 11 de Abril de 2019, 19:57:19 por planeta9999 »

Conectado Eduardo2

  • PIC24F
  • *****
  • Mensajes: 965
Re:nuevo programando pic
« Respuesta #2 en: 11 de Abril de 2019, 19:26:55 »
....
El codigo que he desarrolado es el siguiente:
En el cual creo una variable "salida" en el que guardo el resultado que saco por RB4, la salida.
No veo el problema pero no me funciona correctamente.
Please a ver si me echais una manita que ya no se que probar mas....
...

 :shock:  Demasiadas comparaciones para un flip-flop RS.

Tampoco veo la necesidad de la variable "salida" siendo que ya tenés el estado de RB4.

Por lo pronto cambiá toda esa cadena de comparaciones por:

while (true)
{
    if(bit_test(porta,2) == 0){
        bit_set(portb,4) ;
        salida = 1 ;
    }
    else if(bit_test(porta,3) == 0){
        bit_clear(portb,4) ;
        salida = 0 ;
    }
}


Que hace lo mismo.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:nuevo programando pic
« Respuesta #3 en: 11 de Abril de 2019, 21:51:48 »
Por Karnaugh tambien podes obtener que el resultado de tu tabla y que puede representarse como:

(RB4 AND RB3) OR NOT RB2

Como no hay un operador para setear un bit segun el valor de una variable en CCS, tuve que usar un if o un operador ternario que es lo mismo.. Por las dudas pongo los 2 ya que no se como lo toma el compilador o cual te resulta mas simple. Ya tenes varias opciones de lo mismo :P

Código: C
  1. while (true)
  2. {
  3.     salida = (((bit_test(porta,4) && bit_test(porta,3)) || !bit_test(porta,2))
  4.     salida ? bit_set(porta,4) : bit_set(porta,4);
  5. }

Código: C
  1. while (true)
  2. {
  3.     salida = (((bit_test(porta,4) && bit_test(porta,3)) || !bit_test(porta,2))
  4.     if(salida){
  5.       bit_set(porta,4);
  6.     }else {
  7.       bit_set(porta,4);
  8.     }
  9. }

Conectado Eduardo2

  • PIC24F
  • *****
  • Mensajes: 965
Re:nuevo programando pic
« Respuesta #4 en: 12 de Abril de 2019, 00:45:36 »
Por Karnaugh tambien podes obtener que el resultado de tu tabla y que puede representarse como:

(RB4 AND RB3) OR NOT RB2

Como no hay un operador para setear un bit segun el valor de una variable en CCS, tuve que usar un if o un operador ternario que es lo mismo.....

Se puede declarar los bits de las variables y queda bonito (para qué quiero la variable salida teniendo B4)

Código: [Seleccionar]
#bit B4 = 0x06.4
#bit A3 = 0x05.3
#bit A2 = 0x05.2

.......................................
.......................................

    while (true)
    {
         B4 = B4&&A3 || !A2 ;
    }

Desconectado alfmalo000

  • PIC10
  • *
  • Mensajes: 13
Re:nuevo programando pic
« Respuesta #5 en: 12 de Abril de 2019, 05:01:03 »
Hola.
Os agradezco mucho la ayuda.

En su dia me construi una placa entrenadora del pic 16f84a. Las entradas RA2 y RA3 las simulo metiendo 5v o llevandolas a masa 0v.

He probado lo que me has comentado Planeta9999, modificando las líneas, pero me sigue sin funcionar, siempre tengo la salida RB4 a  1 (5v medidos con el polimetro, la salida RB4 respecto a masa). No entiendo bien porqué no funciona, algo se me escapa...  :cry:

Voy a probar el resto de cosas que me comentais.

#include <16f84a.h>
#fuses xt, nowdt
#use delay (clock=4000000)
#byte trisa=0x85
#byte trisb=0x86
#byte porta=0x05
#byte portb=0x06

int1 salida=0;

void main()
{
trisa=0xff;
trisb=0x00;
PORTB=0x00;
while (true)
{

if((bit_test(porta,2)==0)&&(bit_test(porta,3)==0)&&(salida==0)){
bit_set(portb,4);
salida=1;
}
else{
if((bit_test(porta,2)==1)&&(bit_test(porta,3)==0)&&(salida==0)){
bit_clear(portb,4);
salida=0;
}
else{
if((bit_test(porta,2)==0)&&(bit_test(porta,3)==1)&&(salida==0)){
bit_set(portb,4);
salida=1;
}
else{
if((bit_test(porta,2)==1)&&(bit_test(porta,3)==1)&&(salida==0)){
bit_clear(portb,4);
salida=0;
}
else{
if((bit_test(porta,2)==0)&&(bit_test(porta,3)==0)&&(salida==1)){
bit_set(portb,4);
salida=1;
}
else{
if((bit_test(porta,2)==0)&&(bit_test(porta,3)==1)&&(salida==1)){
bit_set(portb,4);
salida=1;
}
else{
if((bit_test(porta,2)==1)&&(bit_test(porta,3)==1)&&(salida==1)){
bit_set(portb,4);
salida=1;
}
}
}
}
}
}
}
}
}



Ese operador AND de manejo de bits que has calzado en cada IF es probable que no funcione como piensas. De hecho en el ejemplo, que anda por internet, y que has usado de partida para tu código, solo se emplea para setear la salida de varios puertos a nivel de bit, no para dar valores a una variable.

No se que necesidad hay de encadenar instrucciones con & dentro de los IF. Una cosa es interrogar el estado de varios puertos, y una variable, con un AND lógico &&, y otra el uso del AND como un operador de manejo de bits.

Prueba así.

Código: C++
  1. if((bit_test(porta,2)==0)&&(bit_test(porta,3)==0)&&(salida==0))
  2. {
  3.    bit_set(portb,4);
  4.    salida=1;
  5. }

Desconectado alfmalo000

  • PIC10
  • *
  • Mensajes: 13
Re:nuevo programando pic
« Respuesta #6 en: 12 de Abril de 2019, 05:19:30 »
Hola KillerJC.

He probado también lo que me comentas, pero leyndo leyendo (que me he vuelto loco  :? tanto leer, si me equivoco coregirme que los gurus soy vosotros), es que si utilizas el comando bit_test para una salida la conviertes en entrada, no?

Al programar el pic con el programa de abajo, no me funciona correctamente, me deja la tensión de salida del RB4 a 1,8v mas o menos todo el rato, independiente del estado de las entradas RA2 y RA3.


#include <16f84a.h>
#fuses xt, nowdt
#use delay (clock=4000000)
#byte trisa=0x85
#byte trisb=0x86
#byte porta=0x05
#byte portb=0x06

int1 salida=0;

void main()
{
while (true)
    {
        salida = (((bit_test(portb,4) && bit_test(porta,3)) || !bit_test(porta,2)));
        if(salida)
        {
          bit_set(portb,4);
        }
        else
        {
          bit_set(portb,4);
        }
    }
}

Por Karnaugh tambien podes obtener que el resultado de tu tabla y que puede representarse como:

(RB4 AND RB3) OR NOT RB2

Como no hay un operador para setear un bit segun el valor de una variable en CCS, tuve que usar un if o un operador ternario que es lo mismo.. Por las dudas pongo los 2 ya que no se como lo toma el compilador o cual te resulta mas simple. Ya tenes varias opciones de lo mismo :P

Código: C
  1. while (true)
  2. {
  3.     salida = (((bit_test(porta,4) && bit_test(porta,3)) || !bit_test(porta,2))
  4.     salida ? bit_set(porta,4) : bit_set(porta,4);
  5. }

Código: C
  1. while (true)
  2. {
  3.     salida = (((bit_test(porta,4) && bit_test(porta,3)) || !bit_test(porta,2))
  4.     if(salida){
  5.       bit_set(porta,4);
  6.     }else {
  7.       bit_set(porta,4);
  8.     }
  9. }

Desconectado alfmalo000

  • PIC10
  • *
  • Mensajes: 13
Re:nuevo programando pic
« Respuesta #7 en: 12 de Abril de 2019, 05:36:01 »
Hola Eduardo2

He probado tu codigo y si funciona :-/, pero me queda la duda el porque las soluciones propuestas anteriores no funcionan.
Muchas gracias a todos.

#include <16f84a.h>
#fuses xt, nowdt
#use delay (clock=4000000)
#byte trisa=0x85
#byte trisb=0x86
#byte porta=0x05
#byte portb=0x06
#bit B4 = 0x06.4
#bit A3 = 0x05.3
#bit A2 = 0x05.2

void main()
{
trisa=0xff;
trisb=0x00;
PORTB=0xff;

    while (true)
    {
         B4 = B4&&A3 || !A2 ;
    }
}


Por Karnaugh tambien podes obtener que el resultado de tu tabla y que puede representarse como:

(RB4 AND RB3) OR NOT RB2

Como no hay un operador para setear un bit segun el valor de una variable en CCS, tuve que usar un if o un operador ternario que es lo mismo.....

Se puede declarar los bits de las variables y queda bonito (para qué quiero la variable salida teniendo B4)

Código: [Seleccionar]
#bit B4 = 0x06.4
#bit A3 = 0x05.3
#bit A2 = 0x05.2

.......................................
.......................................

    while (true)
    {
         B4 = B4&&A3 || !A2 ;
    }

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:nuevo programando pic
« Respuesta #8 en: 12 de Abril de 2019, 07:53:26 »
Si perdon... es porque no uso CCS....

Si usas input, y no definiste a los pines como FAST entonces si se van a cambiar a entrada.. Pero input_state segun el manual no te cambia la direccion.

El codigo seria asi:

Código: C
  1. void main()
  2. {
  3. while (true)
  4.     {
  5.         output_bit(PIN_RB4,((input_state(PIN_RB4) && input_state(PIN_RA3)) || !input_state(PIN_RA2)));
  6.      }
  7. }

Deberia funcionar, espero :P

Conectado Eduardo2

  • PIC24F
  • *****
  • Mensajes: 965
Re:nuevo programando pic
« Respuesta #9 en: 12 de Abril de 2019, 14:54:33 »
.... pero me queda la duda el porque las soluciones propuestas anteriores no funcionan.

Al menos tu código original no funcionaba porque son 8 casos y comparás 7. 
El caso que te falta es justamente el que estando RB4 en 1 lo manda a 0  (A2=1 , A3 = 0   el sexto caso de tu tabla)

Desconectado alfmalo000

  • PIC10
  • *
  • Mensajes: 13
Re:nuevo programando pic
« Respuesta #10 en: 22 de Abril de 2019, 02:45:21 »
Ostras es verdad!!!
Muchas gracias a todos por la ayuda.
Eduardo, voy a probar a meter el caso que me falta y a probar ...
Un saludo a todos.

.... pero me queda la duda el porque las soluciones propuestas anteriores no funcionan.

Al menos tu código original no funcionaba porque son 8 casos y comparás 7. 
El caso que te falta es justamente el que estando RB4 en 1 lo manda a 0  (A2=1 , A3 = 0   el sexto caso de tu tabla)


 

anything