Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

14/04/2014 #1


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
14/04/2014 #2

Avatar de Saint_

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.
15/04/2014 #3


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.
15/04/2014 #4

Avatar de JoaquinFerrero

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:

Código PHP:
if (== flag_d) { 
De esta manera, si se nos olvida un '=', saltará inmediatamente un error, al compilar.
15/04/2014 #5


gracias por el consejo
15/04/2014 #6

Avatar de Saint_

puedes utilizar el motor-encoder de proteus.
17/04/2014 #7


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);
 }
                                
 }}
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.