TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: loren 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
-
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ó.
-
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
-
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