programa + proteus

hola gente, tengo un problema, estoy trabajando con un codigo para leer un encoder incrmental, el codigo anda bbien, pero al problarlo en proteus el simulador hace cualquier cosa :S, si puedem echarle una mirada y orientarme se los agradeceria mucho, adjunto codigo en c y simulacion en proteus, bienvenidas las recomendaciones, gracias
 

Adjuntos

  • Prototipo 2.rar
    1.5 KB · Visitas: 14
  • Proteus.rar
    13.6 KB · Visitas: 14
hola, como no tengo una idea clara de lo que estas haciendo con el "encoder" y los valores que muestras por el puerto D, solo puedo decirte que:

"=", es para asignación de un valor a una variable.
"==", es para la comparación y devuelve falso o verdadero según el caso.
 
si, si me di cuenta de ese error :p, el encoder lo simule con dos generadores desfasados, ya que el encoder que ocupo es en cuadratura, es decir, dos trenes de pulsos desfasados en 90° entre si, si se puede simular de otra forma ese desfase agradeceria que me dijeras, ya que en esta simulacion los desfase en tiempo, los led se encienden de acuerdo al valor que toma x en el programa, es decir, que x al llegar a cierto valor enciende ciertos led, y asi dependiendo de su valor.
 
Sí, lo de confundir el operador de igualdad '==' con el de asignación '=' es algo por el que casi todos hemos pasado. Y encima el compilador no da ningún aviso, porque se trata de una sentencia sintácticamente correcta: en cada if() estamos asignando valores '1' a flag_d y flad_i, y como el resultado es distinto de cero, los if() se ejecutan siempre.

Para la próxima vez, es mejor escribirlo al revés:

PHP:
if (1 == flag_d) {
De esta manera, si se nos olvida un '=', saltará inmediatamente un error, al compilar.
 
Última edición por un moderador:
Hola amigos, tengo un programa para el 18f452 que cuenta la entrada de un encoder y me gustaria que me ayudaran a mostrar el valor de la variable X en un display lcd modelo acm1602B, no se como alterar la rutina y la verdad no me manejo mucho ya que soy nuevo en esto, desde ya les doy las gracias, dejo el codigo abajo


Código:
#Include <18F452.h>           

#Fuses XT, NOWDT, NOPROTECT, NOLVP, BROWNOUT

#use Delay( Clock = 4000000 )

#Byte PortA = 0xF80           
#Byte PortB = 0xF81            
#Byte PortC = 0xF82            
#Byte PortD = 0xF83            
#Byte PortE = 0xF84           

// ------ Variable Global ------
int16 x = 3000;                   // Declaramos el valor de X como Byte, es decir, 8 bits.
                                       // Esta variable ha de ser global porque su valor lo
                                       // usaremos en la interrupción y en el programa principal.
                                      // Por tanto declaramos esta variable antes la interrupción
                                      // y de "void main".

// --------- Interrupción ---------
#INT_EXT                        // Interrupción Externa por RB0: Decodificación de Encoder.
Void IntRB0() 
{
   // CCS se encarga de desactiva automáticamente cualquier interrupción.
   // No hace falta guardar contextos de registros.

   If (Bit_Test(PortB, 0))      // Si RB0 se ha puesto a 1 (flanco de subida),
   {  
       Ext_Int_Edge(H_TO_L);    // entonces activar la siguiente interrupción por flanco de
                                            // bajada. 
       If (Bit_Test(PortB, 1))  // Si RB1 está a 1,
       {
          
           x++;                 // entonces incrementar una unidad el valor de X.
          
       }
   }
   Else                         // Si RB0 se ha puesto a 0 (flanco de bajada),
   {  
       Ext_Int_Edge(L_TO_H);    // entonces activar la siguiente interrupción por flanco de
                                // subida.
       If (Bit_Test(PortB, 1))  // Si RB1 está 1,
       {
          
           x--;                 // entonces decrementar una unidad el valor de X.
           
       }
   }
   
}

Void Main()                     // Inicio y configuración.
{
   Port_B_Pullups(FALSE);       
   Setup_ADC_Ports(NO_ANALOGS); // Sin comparadores ni ADCs, todo digital, etc...
   Setup_adc(ADC_CLOCK_DIV_2);
   Setup_spi(SPI_SS_DISABLED);
   Setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   Setup_timer_1(T1_DISABLED);
   Setup_timer_2(T2_DISABLED,0,1);

   

   Enable_Interrupts(Int_Ext);  // Activar Interrupción Externa a través de RB0. 
   Ext_Int_Edge(L_TO_H);        // Inicialmente detectar interrupción por flanco de subida. 
   Enable_Interrupts(GLOBAL);   // Interrupciones Generales Activadas. 

   Set_Tris_A(0b11111111);      // Puerto A todo entradas, en este caso no usamos el Puerto A.
   Set_Tris_B(0b11111111);      // Puerto B todo entradas, sólo usamos las entradas RB0 y RB1.
   Set_Tris_C(0b11111111);      // Puerto C todo entradas, en este caso no usamos el Puerto C.
   Set_Tris_D(0b00000000);      // Puerto D todo salidas  (8 bits que irán a los LEDs).
   
   
   PortD=0;
   
   // ---------- Programa Principial ----------
        
While (True){

 if((x>4000 && x<=4100)){
 
   bit_set(PORTD,2);
   delay_ms(2000);
   bit_clear(PORTD,2);
   }
 
 if((x<=2500 && x>=2300)){
  
    bit_set(PORTD,3);
    delay_ms(2000);
    bit_clear(PORTD,3);
 }
                                
 }}
 
Atrás
Arriba