Autor Tema: Problema con comando IF en 16f628A  (Leído 2322 veces)

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

Desconectado LoPages

  • PIC10
  • *
  • Mensajes: 29
Problema con comando IF en 16f628A
« en: 30 de Junio de 2009, 09:07:07 »
Hola,

despues de cierto tiempo sin pasar por el foro (examenes Finales Facultad) he vuelto a reiniciar mi aprendizaje sobre microcontroladores en C y me encuentro con un cierto problema con los comandos IF, supongo que sera que al venir yo de lenguage pascal pues con el C me cuesta el uso de corchetes y me lio en su uso. Adjunto esquema en Proteus donde estoy probando el codigo.

En este codigo lo que yo queria era que cuando:
- RA0 y RA1= 1------> RB1 y RB2=1
- RA0=1 y RA1=0---> RB1=0 y RB2=1
- RA0=0 y RA1=1---> RB1=1 y RB2=0
- RA0 y RA1=0------> RB1 y RB2=0

Y este es mi codigo:
----------------------------

#include <16F628A.h>
#fuses XT,NOWDT
#use delay ( clock = 4000000 )
#BYTE TRISB = 0X86
#BYTE TRISA = 0X85
#BYTE PORTB = 0x06
#BYTE PORTA = 0x05
#BYTE OPTION_REG = 0x81

void main(){
portb=0b00000000;
porta=0b00000000;
trisb=0b00000000;
trisa=0b11111111;

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



Saludos y gracias de antemano!!
PD: Supongo que sera un error tonto en la estructura de los IF( supongo que algun corchete no estara bien), pero yo no lo encuentro.... :(
"Nuestra carrera es puta, pero nosotros lo somos mas!!!"---->By Meroño.

Desconectado kcire

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 84
Re: Problema con comando IF en 16f628A
« Respuesta #1 en: 02 de Julio de 2009, 21:23:29 »
Hola LoPages, con respecto a tu consulta pues decir lo siguiente:

El problema que se tiene con tu código creo yo, y espero no equivocarme, es jerarquizar los anidamientos que se tienen, la mejor forma de programar en C es dar un orden jerárquico o por niveles (así lo aprendí espero no estar errado).

Ya que en tu código se tiene el código casi al mismo nivel, entonces es más conflictivo saber dónde termina una sentencia if de las otras, por tal motivo no queda otra que acostumbrarse a la estructura del C.

Viendo tú código se lo resuelve de manera sencilla que paso a explicar:

Tenemos dos entradas y dos salidas como en la tabla siguiente:



Primero podríamos empezar por preguntarnos si RA0 es 0 y luego cubrir las dos opciones que se tienen en RA1 es 0 y RA1 es 1, acá el código:

Código: C
  1. if (bit_test(porta,0) == 0){
  2.          if (bit_test(porta,1) == 0){
  3.             bit_clear(portb,1);
  4.             bit_clear(portb,2);
  5.          }
  6.          if (bit_test(porta,1) == 1){
  7.             bit_set(portb,1);
  8.             bit_clear(portb,2);
  9.          }
  10.       }

En el código podemos ver que hacemos lo que nos planteamos al principio primero RA0 y luego las dos opciones de RA1.

Para el caso en que RA0 es 1 es similar a lo anterior, acá el código:

Código: C
  1. if(bit_test(porta,0)== 1){
  2.          if (bit_test(porta,1) == 0){
  3.             bit_clear(portb,1);
  4.             bit_set(portb,2);
  5.          }
  6.          if (bit_test(porta,1) == 1){
  7.             bit_set(portb,1);
  8.             bit_set(portb,2);
  9.          }
  10.       }

Y para ver que todo marcha bien, una imagen:



También podríamos usar los operadores lógicos como en el siguiente código, que realiza la misma tarea:

Código: C
  1. if (bit_test(porta,0) == 0 && bit_test(porta,0) == 0){
  2.             bit_clear(portb,1);
  3.             bit_clear(portb,2);
  4.       }
  5.       if (bit_test(porta,0) == 0 && bit_test(porta,1) == 1){
  6.             bit_set(portb,1);
  7.             bit_clear(portb,2);
  8.       }
  9.       if (bit_test(porta,0) == 1 && bit_test(porta,1) == 0){
  10.             bit_clear(portb,1);
  11.             bit_set(portb,2);
  12.       }
  13.       if (bit_test(porta,0) == 1 && bit_test(porta,1) == 1){
  14.             bit_set(portb,1);
  15.             bit_set(portb,2);
  16.       }

Espero no haber sido tan molesto con el amplio comentario, algo básico que espero sea de utilidad.

Un saludo, :lol:
Erick

"La imaginación es más rica que el lenguaje... sugiere con palabras, la imaginación podrá hacer el resto."


 

anything