Lenguaje ensamblador en PIC16F84A

acabo de comenzar en esto de los pic, y bueno, tomé un ejemplo del libro de desarrollo de proyectos para simularlo en proteus pero no sucede nada, alguien me puede ayudar a ver que estoy haciendo mal...
este es el programa

si porta = numero se encienden todos los leds
si porta > se encieden los led pares de salida
si porta < se encienden los leds del nibble alto y se apagan los del bajo
; zona de datos******
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC ;configuracion para el grabador
LIST P=16F84A ; procesador utilizado
INCLUDE <P16F84A.INC> ; Fichero donde se definen las etiquetas del PIC

Numero EQU d'13' ; valor de CONST
;zona de codigos*****
ORG 0 ; el programa inicia en la dirección 0
Inicio
bsf STATUS,RP0 ; Acceso al banco 1
clrf TRISB ; configuracion de puerto B como salida
movlw b'00011111'
movwf TRISA ; configuracion de puerto A como entrada
bcf STATUS,RP0 ; acceso al banco 0

Principal
movlw Numero ; carga el número a comparar
subwf PORTA,W ; (PORTA)-CONST -> (W)
movlw b'11110000' ; supone (PORTA) es menor
btfss STATUS,C ; ¿C=1?.¿(W)Positivo?,¿(PORTA)>=CONST?
goto ActivaSalida ; No. C=0,por tanto (PORTA)<Numero
movlw b'11111111' ; Supone que son iguales
btfsc STATUS,Z ; ¿Z=0?,¿son distintos?
goto ActivaSalida ; no son iguales ya que Z=1
movlw b'01010101' ; sí, por tanto (PORTA)> CONST

ActivaSalida
movwf PORTB ; Resusltado se visualiza por el puerto de salida
goto Principal ; crea un bucle cerrado e infinito

END ; Termina programa.

y este es mi diagrama en proteus:
(el del archivo)
 

Adjuntos

  • practicas_149.zip
    38.6 KB · Visitas: 44
siempre le echado la culpa a la version de MPLab

necesitaras usar cblock y e inicializar Numero

Código:
   __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC 	;configuracion para el grabador
  LIST P=16F84A 				; procesador utilizado
  INCLUDE <P16F84A.INC> 		; Fichero donde se definen las etiquetas del PIC

   cblock 0x20
       Numero  ; valor de CONST
    endc

;zona de codigos*****

 ORG 0 				; el programa inicia en la dirección 0
Inicio
 bsf STATUS,RP0 	; Acceso al banco 1
 clrf TRISB 		; configuracion de puerto B como salida
 movlw b'00011111'
 movwf TRISA 		; configuracion de puerto A como entrada
 bcf STATUS,RP0 	; acceso al banco 0

 movlw d'3'
 movwf  Numero

Principal	
 movlw Numero 		; carga el número a comparar
 subwf PORTA,W 		; (PORTA)-CONST -> (W)
 movlw b'11110000' 	; supone (PORTA) es menor
 btfss STATUS,C 	; ¿C=1?.¿(W)Positivo?,¿(PORTA)>=CONST?
 goto ActivaSalida 	; No. C=0,por tanto (PORTA)<Numero
 movlw b'11111111' 	; Supone que son iguales
 btfsc STATUS,Z 	; ¿Z=0?,¿son distintos?
 goto ActivaSalida 	; no son iguales ya que Z=1
 movlw b'01010101' 	; sí, por tanto (PORTA)> CONST

ActivaSalida
 movwf PORTB 		; Resusltado se visualiza por el puerto de salida
 goto Principal 	; crea un bucle cerrado e infinito

 END ; Termina programa.
 
anthony123 dijo:
mabauti dijo:
siempre le echado la culpa a la version de MPLab
Porque lo dices?

Quiza en anteriores versiones , la directiva Numero EQU d'13' equivaldria a sustituir el texto Numero por el texto d'13'; en la version que trabajo (7.5), eso equivale a reservar el espacio de memoria ram 0Dh asignandole la etiqueta Numero.

Quiza alguien que haya trabajado con las primeras versiones pueda corroborarlo
 
:D :D :D
hola MICHEL85, te comento que el programa que tienes esta funcionando muy bien.

Un error que note es el de la palabra de configuracion "__CONFIG"
habitualmente este "__CONFIG" va despues de declarar al prosesador y Fichero donde se definen las etiquetas del PIC, pues si le podes como esta en tu ASM genera un error al compilar "Al menos eso me pasa a mi". por lo demas todo esta ok.

tambien hay un problema en el circuito armado en el proteus.
"las resistencias que se conectan a la barra de leds del puerto_B no estan vien conectadas y son de valores altos".

te reembio tu ejemplo con las modificaciones que le hice al circuito y al ASM."
EL Mplab que utilizo es el 8.1, y el Proteus7.2...

Un saludo y que te baya bien.
 

Adjuntos

  • practicas_181.rar
    42.4 KB · Visitas: 49
Estuve revisando el datasheet del PIC16F84A y en el tema de TRISA y PORTA / TRISB y PORTB en el apartado de ejemplo siempre empiezan por clrf y luego PORTA o PORTB, es necesario iniciar así para configurar qué bits serán entradas y salidas (RB0, RB1, ...., RA0,RA1,...)?
Porque cree que obviando eso (lo que está encerrado) también funcionaría o me equivoco?
 

Adjuntos

  • p2_LI.jpg
    p2_LI.jpg
    115.8 KB · Visitas: 7
  • p3_LI.jpg
    p3_LI.jpg
    117.3 KB · Visitas: 6
Si no me confundo, lo que hace es darle un valor (en este caso 0, o lo mismo LOW) al PORTA y PORTB, ya que antes de inicializar estan con un valor aleatorio. Osea que sin limpiar (CLeaR File), luego de iniciar como salida o entrada, algunos pines quedaran en ALTO (HIGH, o 1).
 
Por defecto los puertos se inicializan con un valor preestablecido en el POR (Power On Reset)
Por eso es que primero los inicia en 0 y después configura entradas y salidas.
En este caso, el orden de los factores no altera el producto.
Es decir, primero se pueden configurar qué pines serán entradas y salidas y después se les da un estado lógico, o viceversa.
Lógicamente que si se desea inicializar con otros estados, pues se establece.

Postdata:
Los valores que toman los registros durante el Power On Reset se encuentran en la hoja de datos.
 
Como echo de menos el asm de los PIC. No hay ni una sola placa de Arduino que trabajen con PIC, una pena.

Para recordar.
1 = Entrada.
0 = Salida.

Para no olvidar nunca, asocié esta tontería.

1 = IN, ya que IN tiene la letra I que se parece al número 1.
0 = OUT, ya que el número 0 se parece la letra O.

Los AVR es al revés.

La mayoría de esos ejemplos del dicho libro viene así:

bsf STATUS,RP0 ; Acceso al banco 1 clrf TRISB ; configuracion de puerto B como salida movlw b'00011111' movwf TRISA ; configuracion de puerto A como entrada bcf STATUS,RP0 ; acceso al banco 0

Todos los ejemplos funcionan.
 
Las aplicaciones deben resolver problemas complejos, los tiempos de generación de código son muy acotados y los lenguajes se vuelven obsoletos --> o te olvidás del ASM o te quedás en la prehistoria digital.
 
Hola Dr. Zoidberg:

Por si el amigo se pierde.

Los ASM a veces es importante, ya que lo puedes etiquetar y usar dentro de C de los PIC. Tiene su etiqueta. [ASM] y [/ASM]. Se usaba mucho en CSS, ya que este compilador no oficial de la casa Microchip, que actualmente por fin en su época sacaron el C8, C16 y C32.

Antes, si salía un PIC18F nuevo, el CSS, no se actualizaba, se necesitaba acceder a ciertos bancos de memoria que en C no podía, tenía que recurrir tocar el asm por medio con dichas etiquetas y poner esos cambios dentro de una función. A veces, se tardaba en actualizar el CSS para que se puede cambiar ciertas configuraciones de los bancos de memoria solo en C.

Aunque parezca increible, hay muchos usando ASM en el foro oficial de Microchip. En mi caso con Arduino no lo uso tanto pero no lo abandono porque lo relaciono todos juntos. mezclas de tecnología en la misma PCB.

Saludos.
 
Atrás
Arriba