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

Temas similares

03/01/2011 #1


Ayuda con Secuencial de Luces en Pic 16F84A
Estimados,

Estoy haciendo un proyecto con el Pic 16F84A que hace lo siguiente. El puerto B está conectado a 8 led, y el RA0 está conectado a un switch. Cuando el switch está abierto, los led del puerto B encienden secuencialmente de RB0 a RB7 (con delay de 1 segundo), si enciendo el switch los led encenderan secuencialmente de RB7 a RB0. Mi problema es en el retardo, dado que se activa el led RB0, pero la rutina de retardo no sigue la secuencia. No se me ocurre como hacerlo.

Dejo el código en Assembler.
Código PHP:
INCLUDE <P16F84A.INC>
    LIST    
P=16F84A
    
    CBLOCK    0x0c
    reg1
    reg2
    ENDC

    org    0
    
goto inicio

inicio
    bsf        STATUS
,RP0      ;Entro al banco 1
    bsf        TRISA
,0            ;Configuro el RA0 como entrada
    clrf    TRISB            
;Dejo en cero el registro TRISB dejando como salida
    bcf        STATUS
,RP0        ;vuelvo al banco 0


switch
    
movlw    b'00000001'        Esta rutina escanea el puerto Adonde esta
    subwf    PORTA
,0            conectado el switch al RA0.    
    
btfsc    STATUS,Z        
    call    secuencia_2        
    call    secuencia_1
    
goto     switch            
    
secuencia_1
    movlw    
b'00000001'
    
movwf    PORTB
    call    retardo_1s
    movlw    
b'00000010'
    
movwf    PORTB
    call    retardo_1s
    movlw    
b'00000100'
    
movwf    PORTB
    call    retardo_1s
    movlw    
b'00001000'
    
movwf    PORTB
    call    retardo_1s
    movlw    
b'00010000'
    
movwf    PORTB
    call    retardo_1s
    movlw    
b'00100000'
    
movwf    PORTB
    call    retardo_1s
    movlw    
b'01000000'
    
movwf    PORTB
    call    retardo_1s
    movlw    
b'10000000'
    
movwf    PORTB
    call    retardo_1s
    
goto    switch

secuencia_2
    movlw    
b'10000000'
    
movwf    PORTB
    call    retardo_1s
    movlw    
b'01000000'
    
movwf    PORTB
    call    retardo_1s
    movlw    
b'00100000'
    
movwf    PORTB
    call    retardo_1s
    movlw    
b'00010000'
    
movwf    PORTB
    call    retardo_1s
    movlw    
b'00001000'
    
movwf    PORTB
    call    retardo_1s
    movlw    
b'00000100'
    
movwf    PORTB
    call    retardo_1s
    movlw    
b'00000010'
    
movwf    PORTB
    call    retardo_1s
    movlw    
b'00000001'
    
movwf    PORTB
    call    retardo_1s
    
goto    switch



retardo_1s
    movlw    0xF8
    movwf    reg2
    nop
    nop
    nop
bucle_1
    nop
    decfsz    reg2
    call    retardo_1ms
    
return
        
retardo_1ms
    movlw    0xF8
    movwf    reg1
    nop
    nop
    nop
bucle
    nop
    decfsz    reg1
    
goto    bucle
    
goto    bucle_1
    
    end 
03/01/2011 #2

Avatar de fdesergio

Estas cometiendo un error desde la rutina retardo_1ms mandas a una etiqueta que esta en otro lado y te metes nuevamente en la rutina retardo_1ms

eso no se puede hacer pues creas un conflicto de direccionamiento, la rutina retardo_1ms debes ejecutarla pero mandarla a otro lado y eso lo haces cuando llamas etiqueta bucle_1, miralo, chauuuuuuuuu

PD: la rutina retardo_1ms no tiene el RETURN
03/01/2011 #3


Aunque el problema no esta en la forma como sacas los datos, te recomiendo que le des una leida a las instruciones de rotacion de datos, rlf y rrf, con eso consigues el efecto de desplazamiento que necesitas.
03/01/2011 #4

Avatar de fdesergio

MVB dijo: Ver Mensaje
Aunque el problema no esta en la forma como sacas los datos, te recomiendo que le des una leida a las instruciones de rotacion de datos, rlf y rrf, con eso consigues el efecto de desplazamiento que necesitas.
Bueno la forma de programar es muy personal, yo tambien usaria la instruccion de rotar hacia izq o derech, es mas sencillo y menos instrucciones se usan, pero igual el resultado es el mismo, la forma como lee el switch tambien es muy larga se podria hacer testeando el BIT simplemente, chauuuuuu
03/01/2011 #5


fdesergio dijo: Ver Mensaje
Bueno la forma de programar es muy personal, yo tambien usaria la instruccion de rotar hacia izq o derech, es mas sencillo y menos instrucciones se usan, pero igual el resultado es el mismo, la forma como lee el switch tambien es muy larga se podria hacer testeando el BIT simplemente, chauuuuuu
Totalmente deacuerdo, pero con cosas asi se puede lograr un codigo mucho mas compacto, eficiente y entendible.
03/01/2011 #6

Avatar de fdesergio

Tambien te sugiero para los retardos usa un programita sencillo llamdo PICDELAY te hace el retardo y no te complicas con ello, chauuuuuuuuu
Archivos Adjuntos
Tipo de Archivo: rar Picdel_sp.rar (83,7 KB (Kilobytes), 128 visitas)
24/02/2012 #7


Podrian explicar como funciona el programa picdelay
25/02/2012 #8
Moderador

Avatar de D@rkbytes

linita dijo: Ver Mensaje
Podrian explicar como funciona el programa picdelay
Es muy sencillo.
1.- Se establece la frecuencia del oscilador en Mhz.
2.- Se establece el tiempo que se desea de retardo en Milisegundos. P.E (1000 Ms = 1 Segundo)
3.- Presionar Calcular Ciclos
4.- Presionar Genera Código (El programa empezara a generar el código)
5.- Se copia el código generado al programa.
6.- Se declaran las variables que el programa genera,
ya sea con PDel0 EQU 0xXX o dentro de un Bloque de variables CBLOCK 0xXX
(El mismo programa muestra como usar la función) CALL DEMORA

Adjunto un sencillo código de ejemplo para que quede más claro.
Suerte y hasta luego.
Archivos Adjuntos
Tipo de Archivo: rar Delay5.rar (14,3 KB (Kilobytes), 78 visitas)
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.