Autor Tema: Rotar leds  (Leído 2651 veces)

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

Desconectado loren

  • PIC10
  • *
  • Mensajes: 24
Rotar leds
« en: 08 de Julio de 2006, 10:52:51 »
Hola, estoy haciendo rotar los leds de la puerta b de izquierda a derecha, como el coche fantástico, lo simulo con el mplab y va perfecto. Pero a la hora de hacerlo en la placa, cuando llega al final de la izquierda y ordena que rote a la derecha, me rota al principio, es decir, al led 0 de la puerta B, y no sé por qué ocurre, alguno me podrías decir algo, ya que lo simulo y va bien, pero a la hora de llevarlo a la práctica  no va.
Gracias y saludos.


      LIST   P=16F84A


ESTADO      EQU   03
PUERTAA      EQU   05
PUERTAB      EQU   06
RP0      EQU   05
TMR0      EQU   01
CONTADOR   EQU   0D
INTCON      EQU   0B
T0IF      EQU   02
OPT      EQU   01



      ORG    0


CONFIGURACION   bsf   ESTADO,RP0
      movlw   b'00000110'
      movwf   OPT
      movlw   b'11111'
      movwf   PUERTAA
      clrf   PUERTAB   
      bcf   ESTADO,RP0
      movlw   b'00000001'
      movwf   PUERTAB

PRINCIPAL   call   RETRASO
      btfss   PUERTAB,7
      goto   IZQUIERDA
      goto   DERECHA
            

IZQUIERDA   rlf   PUERTAB,1
      goto   PRINCIPAL


DERECHA      rrf   PUERTAB,1
      btfss   PUERTAB,0
      goto   DERECHA
      goto    PRINCIPAL   






RETRASO      movlw   d'3'      
      movwf   CONTADOR
RETRASO1   clrf   TMR0
RETRASO2   btfss   INTCON,T0IF
      goto   RETRASO2
      bcf   INTCON,T0IF
      decfsz   CONTADOR,1
      goto   RETRASO1
      return   
   


      END

Desconectado delirio

  • PIC12
  • **
  • Mensajes: 64
Re: Rotar leds
« Respuesta #1 en: 08 de Julio de 2006, 12:02:53 »
Hola loren, tu problema está en el sig punto:
DERECHA      rrf   PUERTAB,1
      btfss   PUERTAB,0
      goto   DERECHA
      goto    PRINCIPAL   
cuando el pic termina de rotar por ultima vez a la izquierda, lo introduces en esta rutina llamada derecha y no sale de ella hasta que termine de rotarlo hacia la derecha, pero sin retraso, y como lo hace tan rapido tus ojos no pueden verlo, has lo siguiente, agrégale una llamada a la rutina retraso de esta forma:

DERECHA      call   RETRASO
      rrf   PUERTAB,1
      btfss   PUERTAB,0
      goto   DERECHA
      goto    PRINCIPAL   

suerte y comentame si funcionó.

Desconectado loren

  • PIC10
  • *
  • Mensajes: 24
Re: Rotar leds
« Respuesta #2 en: 08 de Julio de 2006, 18:07:20 »
Hola delirio, muchas gracias por la respuesta, efectivamente era así, en el momento que vi tu respuesta sin llegar a probarlo lo vi claro. Cuando lo simulaba iba perfecto porque yo le anulaba el retraso, y claro está, la simulación no es tan rápida como el micro, mira que lo he mirado veces, pero me había encerrado que no me daba cuenta de ese detalle. Aparte del detalle éste, tambien le he anulado el retraso en el bucle principal y lo he metido en el de la IZQUIERDA, ya que como lo tenía, cuando llegaba al led 8 se producía dos retrasos seguidos, y al final lo he dejado así.
Gracias y saludos.


   LIST   P=16F84A


ESTADO      EQU   03
PUERTAA      EQU   05
PUERTAB      EQU   06
RP0      EQU   05
TMR0      EQU   01
CONTADOR   EQU   0D
INTCON      EQU   0B
T0IF      EQU   02
OPT      EQU   01


      ORG    0


CONFIGURACION   bsf   ESTADO,RP0
      movlw   b'00000110'
      movwf   OPT
      movlw   b'11111'
      movwf   PUERTAA
      clrf   PUERTAB   
      bcf   ESTADO,RP0
      movlw   b'00000001'
      movwf   PUERTAB

PRINCIPAL   btfss   PUERTAB,7
      goto   IZQUIERDA
      goto   DERECHA
            

IZQUIERDA   call   RETRASO
      rlf   PUERTAB,1
      goto   PRINCIPAL


DERECHA      call   RETRASO
      rrf   PUERTAB,1
      btfss   PUERTAB,0
      goto   DERECHA
      goto    PRINCIPAL   



RETRASO      movlw   d'2'      
      movwf   CONTADOR
RETRASO1   clrf   TMR0
RETRASO2   btfss   INTCON,T0IF
      goto   RETRASO2
      bcf   INTCON,T0IF
      decfsz   CONTADOR,1
      goto   RETRASO1
      return   
   


      END
« Última modificación: 08 de Julio de 2006, 18:09:33 por loren »

Desconectado loren

  • PIC10
  • *
  • Mensajes: 24
Re: Rotar leds
« Respuesta #3 en: 09 de Julio de 2006, 06:02:34 »
Al final lo he dejado así, con ayuda de 5 microinterruptores a través de la puerta A elegir la velocidad.
Gracias y saludos.


      LIST   P=16F84A   ;Este programa rota los leds de izquierda a derecha y viceversa
               ;se puede seleccionar entre un retraso entre leds de 0,03 segundos
               ;y 0,5 segundos, esta selcción se hace a través de la puerta A.


               ;Se define todos lo registros
            
ESTADO      EQU   03      
PUERTAA      EQU   05
PUERTAB      EQU   06
RP0      EQU   05
TMR0      EQU   01
CONTADOR   EQU   0D
INTCON      EQU   0B
T0IF      EQU   02
OPT      EQU   01


      ORG    0


CONFIGURACION   bsf   ESTADO,RP0
      movlw   b'00000101'   ;Se asigna el divisor de frecuencia al TMR0 con       
      movwf   OPT      ;un predivisor de 64.
      movlw   b'11111'
      movwf   PUERTAA      
      clrf   PUERTAB   
      bcf   ESTADO,RP0
      movlw   b'00000001'   ;Se comienza con el led 1, para que comience a rotar.   
      movwf   PUERTAB

PRINCIPAL   btfss   PUERTAB,7   ;Se comprueba si está encendido el led 8   
      goto   IZQUIERDA   ;Mientras no esté encendido se rota a la izquierda.
      goto   DERECHA      ;Si led 8 está encendido se empieza a rotar a la derecha.
            

IZQUIERDA   call   RETRASO      ;Rutina para rotar a la izquierda.
      rlf   PUERTAB,1
      goto   PRINCIPAL


DERECHA      call   RETRASO      ;Rutina para rotar a la derecha.
      rrf   PUERTAB,1
      btfss   PUERTAB,0   ;Comprueba si está encendido el led 1,
      goto   DERECHA      ;si no lo está sigue rotando a la derecha
      goto    PRINCIPAL   ;y si lo está lo manda a PRINCIPAL para que empiece el ciclo.   



RETRASO      movf   PUERTAA,0   ;Se toma el valor de la puerta A, a dicho valor
      addlw   01      ;se le añade 1, ya que si no cuando la puerta A valga cero
      movwf   CONTADOR   ;la variable contador pasaría a valer 256, con lo cual el retraso
RETRASO1   clrf   TMR0      ;podría valer 4 segundos, una cantidad muy grande.
RETRASO2   btfss   INTCON,T0IF
      goto   RETRASO2
      bcf   INTCON,T0IF
      decfsz   CONTADOR,1
      goto   RETRASO1
      return   
   


      END