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

Temas similares

29/01/2013 #1


Secuencia binaria de 4 bits con pic16f84a
Buen dia amigos, hice un programa donde al pulsar un boton se encienden respectivamente cada led dependiendo del valor de una variable contador... o sea la variable contador en su primer momento vale 0 y lo muestra en la salida, luego vale 1 y lo muestra en la salida, y asi sucesivamente hasta llegar a 15 que es cuando se encienden los 4 led's y de ahí llego al final, lo que no he podido hacer es como hacer que se detenga cuando llegue a 15, y no se como comparar el valor de la variable con el valor 15..

Dejo adjunto la programacion y el esquematico.
29/01/2013 #2

Avatar de Basalto

Al igual que en el otro ejercicio que te corregía tiene muchos errores de código, pero ya funciona perfectamente. Fijate bien en la rutina retardo, ya que te cambie mucho codigo. Tienes que pulsar el botón seguido, supongo que lo quieres así. Por compara el valor 15 no te preocupes que cuando sea igual a 16 a efectos visuales va a ser lo mismo ya que es "0x00010000". No te entiendo en lo que dices de parar, ya que si estas pulsando seguido aun que lo pares, entra en el bucle otra vez. Lo tendrías que corregir detectando solamente la pulsación. Se puede comprobar se es 15 así:

btfss PORTB,0
goto salto
btfss PORTB,1
goto salto
btfss PORTB,2
goto salto
btfss PORTB,3
goto salto
movlw 0x00
movfw PORTB
goto Inicio

salto aqui continuas el programa por que aun no es 15

Gracias a ti, me desoxide un poco con ensambrado, casi lo tenía olvidado. Un saludo
29/01/2013 #3


hey gracias, pero ya consegui resolverlo, y lo hice haciendo pruebas y analizando paso a paso las instrucciones... Pero lo que me dices del debug me interesa bastante, utilizo un libro, pero es que hay cosas que no me quedan claras y por eso debo recurrir aqui.. Voy a colgar el corregido y asi lo testean y me dicen que tal!!.

Como se podran dar de cuenta cuando lo prueben, no arranca desde el bit 1, se pasa al 2 y comienza...
Archivos Adjuntos
Tipo de Archivo: rar secuencia_binaria.rar (51,1 KB (Kilobytes), 46 visitas)
29/01/2013 #4


gracias.. lo voy a revizar.. Ahora cuando termine el otro lo cuelgo pero ese quedara listo sin errores..
29/01/2013 #5

Avatar de Basalto

Por cierto, en la simulación para dejar el pulsador activado mientras estas haciendo el debug, le pulsas con el boton derecho y le seleccionas "TOGGLE". Un saludo
29/01/2013 #6

Avatar de fdesergio

Bueno si bien es cierto es mejor comparar el valor del contador con el numero 15, se hace restando el contador con W (previamente cargado con 15) y el resultado colocandolo en W, luego se verifica la bandera de cero, si esta en 1 es igual a 15 y no permites que se incremente el contador, si esta en 0 no son iguales y permites incrementar el contador, chauuuuu
29/01/2013 #7

Avatar de Basalto

fdesergio dijo: Ver Mensaje
Bueno si bien es cierto es mejor comparar el valor del contador con el numero 15, se hace restando el contador con W (previamente cargado con 15) y el resultado colocandolo en W, luego se verifica la bandera de cero, si esta en 1 es igual a 15 y no permites que se incremente el contador, si esta en 0 no son iguales y permites incrementar el contador, chauuuuu
movlw 0x15
subwf variable,w

Si Z=1, variable es igual a 15
29/01/2013 #8

Avatar de fdesergio

Código:
movlw     0x0f    ; si es decimal si seria .15
bcf       status,zero     ;me aseguro que esta en cero antes de la resta
subwf     variable,w
btfss       status,zero
goto        contar uno mas
goto        no contar
Perdon copie mal , correjido
29/01/2013 #9


Listo pero con un detalle..
Hey que bien, por lo menos pensé igual que ustedes.
Lo que no logro resolver es porque el programa no enciende el led con numero 1, y en la simulación se toma su tiempo, como si mandase la señal pero no lo prende y enciende el 2 y sigue ahí en adelante. Colocare el codigo completo para que lo vean, ya arreglado solo con el detalle del bit 1.
Código PHP:
; **** CABECERA****
    list 
p=16F84A
    
#include P16F84A.inc
    
__CONFIG _CP_OFF _WDT_OFF _PWRTE_ON _XT_OSC
SALIDA        EQU        1
ENTRADA        EQU     0
cont1         EQU        0x0c
cont2        EQU        0x0d
cont3        EQU        0x0e
valor        EQU        0x1c

Reset         org     0x00
            
goto     Inicio
            org        0x05

Inicio        
    bsf        STATUS
,RP0
            movlw    0xff
            movwf     TRISA
            movlw    0x00
            movwf    TRISB
            bcf        STATUS
,RP0
            bcf        PORTA
,ENTRADA
                    
            clrf    valor
inicio2
            btfss    PORTA
,ENTRADA
            
goto     apagar
    aqui      incf     valor
,1
            movwf    PORTB
            call    retardo
            call    apagar2
            call    retardo

            movlw    0x0f
            bcf        STATUS
,Z    
            subwf    valor
,w
    
            btfss    STATUS
,2
            
goto    aqui
            
goto    apagar3
;---------------------------------
apagar        movlw    0x00
            movwf    PORTB
            clrf    valor
            
goto    inicio2
;---------------------------------
apagar2        movlw    0x00
            movwf    PORTB
            
return
;---------------------------------
apagar3        movlw    0x00
            movwf    PORTB
            clrf    valor
            
goto    fin
;---------------------------------
retardo        movlw    d'5'
            
movwf    cont3
            movlw    d
'255'
            
movwf    cont2
            movlw    d
'255'
            
movwf    cont1
            nop
            decfsz    cont1
,F
            
goto    $-.2
            decfsz    cont2
,F
            
goto    $-.6
            decfsz    cont3
,F
            
goto    $-.10
            
return            
fin
end 
29/01/2013 #10
Moderador

Avatar de D@rkbytes

lcgs dijo: Ver Mensaje
Como se podran dar de cuenta cuando lo prueben, no arranca desde el bit 1, se pasa al 2 y comienza...
Mira este ejemplo, es más sencillo y empieza de 0

Saludos.
Archivos Adjuntos
Tipo de Archivo: rar Contador 0-15.rar (22,4 KB (Kilobytes), 37 visitas)
30/01/2013 #11

Avatar de fdesergio

Lo que veo es que haces BCF PORTA, entrada, si es una entrada NO SE PUEDE borrar por soft porque depende del exterior, lo unico que puedes borra son salidas, lo de la demora puede ser que nunca pasas el valor del contador a w para pasarlo al PORTB y ademas usa una instruccion RETURN que solo se usa en subrutinas, ademas sin comentarios es imposible seguir el hilo, chauuuuuuuu
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.