Programacion en ensamblador

Hola a todos!
Disculpen la molestia pero soy nueva en electrónica Digital.

Quería saber si alguien puede echarle un vistazo a mi programa para saber en donde me estoy equivocando.
La finalidad del programa es realizar la operación AND. Teniendo dos entradas y una salida.
Las entradas son dadas por un DIPSWITCH.

Código:
   List P=16F877A
    INCLUDE <P16F877A.INC>
    __CONFIG _WDT_OFF&_PWRTE_ON&_XT_OSC&_LVP_OFF&_CP_OFF
    
;***********-Programa Principal-***************;
RESETEO:          ORG 0
                  GOTO INICIO
                  GOTO 5
                  
;***********-Inicio-********************;

INICIO  BSF STATUS,RP0 ;usamos el banco 1 de la memoria
            MOVLW b\'00000011\'
            MOVWF TRISB ;Configuramos como entradas rb0 y rb1, y como salida rb2
            BCF STATUS,RP0 ; accede a banco 0

LOOP    CALL CONDICION
         goto LOOP


CONDICION   BTFSS  PORTB,0 ; ENTRADA 1 ES CERO?
            goto OPCION_1
            goto OPCION_2
            return

OPCION_2    BTFSS PORTB,1 ;ENTRADA 2 ES CERO?
            GOTO OPCION_1
            BSF PORTB,2
GOTO    LOOP
return

OPCION_1   BCF PORTB,2
            return
end ...
 
Última edición por un moderador:
la instruccion return solo se usa para salir de una subrutina, ella recupera el PC (program Counter) debes hacerlo usando solo uan para no confundirte, si revisas solo sale de la subrutina BIEN en la etiqueta OPCION_1, en las demas veces no puede salir eimagino se vuelve loco tu programa, revsialo, chauuuuu
 
Gracias creo que si era un problema eso, sin embargo, sigue sin realizar su función como AND lógico, quizá alguna instrucción para hacer que la salida rb2 esté mal...
 
Pero porque tanto salto, más sencillo es de esta forma

LOOP
movlw b'00000011'
andwf PORTB,0
sublw 0x03
btfss STATUS ,Z
bcf PORTB,2
btfsc STATUS,Z
bsf PORTB,2
goto LOOP

salu2
 
Pero, si se contemplan ambas entradas? disculpa si hago preguntas absurdas, la verdad es que apenas programo, llevo semanas intentando esto. El maestro decía que quería dos entradas
 
Puedes probar el anterior programa en mplab, veraz que funciona
Pero igual te paso las descripciones:

LOOP
movlw b'00000011' ;carga en w el literal
andwf PORTB,0 ;realiza un and para quedarse con los 2 bits menos significativos (RB0,RB1)
;el resultado se almacena en W
sublw 0x03 ;resta y almacena: w = 3 - w
btfss STATUS ,Z ;verifica si el resultado es cero(bit STATUS Z). Lo mismo que un AND logico
bcf PORTB,2 ;si el resultado del AND es cero apaga RB2
btfsc STATUS,Z
bsf PORTB,2 ;caso contrario enciende RB2
goto LOOP
 
Última edición:
No, es parte del registro STATUS del micro al que no se tiene acceso por medios externos
El registro STATUS posee 8 bits, el bit 2 del registro es 'Z' que se activa( a '1') cuando el resultado de una operacion es cero.
Tambien puedes probar el codigo en proteus ,bastante util este programa para practicar con PIC

salu2
 
Muchísimas gracias,no tienes idea de cuanto me has ayudado, al parecer funciona a la perfección y ahora entiendo un poco más acerca del registro STATUS, aun tengo un problemin con la intencidad con la que enciende el led de la salida, pero supongo que es algún error de conexión
 
:S disculpen intentando aplicar lo mismo para cuatro entradas :T , no eh podido hacer que las salidas enciendan, creo que es una tontería en lo que me estoy equivocando pero podrían echarle un vistazo?


List P=16F877A
INCLUDE <P16F877A.INC>
__CONFIG _WDT_OFF&_PWRTE_ON&_XT_OSC&_LVP_OFF&_CP_OFF

;***********-Programa Principal-***************;
RESETEO: ORG 0
GOTO INICIO
GOTO 5

;***********-Inicio-********************;

INICIO BSF STATUS,RP0 ;usamos el banco 1 de la memoria
MOVLW b'11110000'
MOVWF TRISB ;Configuramos como entradas RB7,RB6,RB5,RB4, Y COMO SALIDAS RB3,RB2,RB1 Y RB0
BCF STATUS,RP0 ; accede a banco 0

LOOP
movlw b'11110000' ;carga en w el literal
andwf PORTB,0 ;realiza un and para quedarse con los 2 bits menos significativos (rb7,rb6,rb5,rb4)
;el resultado se almacena en W
sublw 0x0F ;resta y almacena: w = 11110000- w
btfss STATUS,Z ;verifica si el resultado es cero(bit STATUS Z). Lo mismo que un AND logico
GOTO APAGADO
GOTO ENCENDIDO

APAGADO BCF PORTB,3
BCF PORTB,2
BCF PORTB,1
BCF PORTB,0
GOTO LOOP
ENCENDIDO BSF PORTB,3
BSF PORTB,2
BSF PORTB,1
BSF PORTB,0
goto LOOP
end
 
La operacion del AND se muestra en una salida por lo general pero si quieres representarlo en cuatro, supongo que sera lo mismo . Amenos que estes intentando realizar otro tipo de logica :D

Aqui esta tu error
sublw 0x0F

0x0F = 1111 (en binario)
Pero tu quieres 11110000
que es en hexadecimal :
11110000 = 0xF0 (en hexa)

Puedes utilizar la calculadora de windows en modo Programador para realizar las conversiones mucho mas facil

salu2
 
GRACIAS!! tenías razón era mas sencillo con una salida...MUCHO mas sencillo, sigo teniendo problemas con que el led no se ilumina lo suficiente, pero al menos el programa ya funciona,

Te lo agradezco mucho

Saludos :)
 
Me funcionó muy bien mi programa, muchas gracias. D: ahora me encargaron controlar la intensidad de un led mediante el PWM, D: no encuentro mucha ayuda en internet, anduve investigando, pero sigo sin tener idea de como empezar, como sería la programación para que varíe la intensidad...podrían ayudarme?
 
Atrás
Arriba