Lenguaje ensamblador para PIC desde 0

Hola a todos! Antes que nada quiero agradecer a quienes están haciendo este tutorial, ya que es extremadamente útil para quienes sabemos muy poco sobre assembler.

Vine para resaltar lo que creo es un error, y cito:

El CP incrementará en 1 el registro CONTADOR y evalúa el valor, si no es cero, ejecuta línea siguiente que es GOTO VOLVER, el cual se dirige de nuevo a la línea VOLVER INCFSZ CONTADOR el cual volverá a incrementar en 1 y evalua el valor, si es cero salta la línea GOTO VOLVER y ejecuta la instrucción INCF PORTA. Esta última línea, el programador pondrá la instrucción que necesite ejecutar...

en la página 28 del pdf, lo resaltado en negrita figura como "descontará", lo que produce confusión. Yo sé que es obvio que si la función se llama "Increment" es que suma, pero mas vale prevenir que curar.

Saludos!
 
Hola a todos, excelente el tuto... una consulta, la instrucción movf registro,w al mover el valor desde registro a w, borra lo que hay en registro?
 
Gracias compañero.... justamente ya hallé la falla en mi programa en asm que hacía que me visualizara 0 en una LCD al leer el registro, escribí movf registro y eso mueve el dato sobre si mismo y no a w que es el que uso para enviar el dato a la LCD, la forma correcta es movf registro,w.

Gracias y Saludos
 
Última edición:
Hola a todos, excelente el tuto... una consulta, la instrucción movf registro,w al mover el valor desde registro a w, borra lo que hay en registro?

En los PIC16F el que borra registro es clrf y el que borra registro de trabajo W es el clrw.

En los PIC18F tiene el clrf pero no se incluye el clrw, para borrar el W directamente hay que cargar un valor cero como movlw 0, movwf registro.
 
Hola a todos! Aprovecho este tema para postear una duda, estoy haciendo un conversor de binario a decimal separados por digitos, es decir, de un numero binario obtengo unidades, decenas y centenas, pero no puedo hacerla funcionar.
Esto es lo que tengo ahora:

Lord Chango dijo:
MOVF VF,W ;CENTENA
SUBLW .100
BTFSS STATUS,C
GOTO $+4 ;-->DECENA
MOVWF VF
INCF FC,F ;INCREMENTA DIGITO CENTENA
GOTO $-6 ;-->CENTENA
MOVF VF,W ;DECENA
SUBLW .10
BTFSS STATUS,C
GOTO $+4 ;-->UNIDAD
MOVWF VF
INCF FX,F ;INCREMENTA DIGITO DECENA
GOTO $-6 ;-->DECENA
MOVF VF,W ;UNIDAD
SUBLW .1
BTFSS STATUS,C
GOTO $+4 ;-->LCD
MOVWF VF
INCF FI,F ;INCREMENTA DIGITO UNIDAD
GOTO $-6 ;-->UNIDAD

-->LCD


VF es el valor a convertir; FI, FX y FC son las unidades, decenas y centenas respectivamente.
Esta mal el planteamiento? Porque no hay forma de hacerlo funcionar en el MPLAB.

Desde ya gracias!
 
Hola a todos! Aprovecho este tema para postear una duda, estoy haciendo un conversor de binario a decimal separados por digitos, es decir, de un numero binario obtengo unidades, decenas y centenas, pero no puedo hacerla funcionar.
Esto es lo que tengo ahora:




VF es el valor a convertir; FI, FX y FC son las unidades, decenas y centenas respectivamente.
Esta mal el planteamiento? Porque no hay forma de hacerlo funcionar en el MPLAB.

Desde ya gracias!

Hola, hace tiempo que no trabajo con PIC's:oops: por que me pasé a ATMEL pero creo que esta me la sé....el problema parece estar en las instrucciones:

SUBLW XXX
BTFSS STATUS,C

ya que tu quieres que vaya quitando bloques decimales desde el mayor al menor "CENTENAS, DECENAS,UNIDADES" Restandole "100,10,1" respectivamente para así sumar cuantos se dejó restar de cada uno. Ahora bien, no sé en cual de las intrucciones tuviste el error, si es que no te acuerdas que el bit C de STATUS tiene polaridad inversa cuando se útiliza SUBLW ó no sabes que SUBLW resta a W del literal(k - W --> W) y no al contrario como parece que pensaste(estas son las pistas claves).

NO VOY A DARTE EL CODIGO... pero aquí va algo para tener en cuenta:

trata de utilizar un registro intermedio para almacenar el valor de W en el cual estás trabajando, para luego almacenar en W 100,10 ó 1 según se el caso y posteriormente restar con SUBWF ese valor 100,10 ó 1 del registro.

quedando algo como:

MOVF VF,W
MOVWF R1 ;
MOVLW XX ;"100,10 ó 1"
SUBFW R1,F
BTFSS STATUS,C
GOTO XXX ;-->"DECENA, CENTENA ó UNIDAD"
MOVF R1
MOVWF VF
INCF XX,F ;INCREMENTA DIGITO "DECENA, CENTENA ó UNIDAD"
GOTO XX ;-->"DECENA, CENTENA ó UNIDAD


Ya con esto puedes seguir, debes tener en cuenta de pasar el registro en el que esas trabajando R1 por que si no VF no cambiará...... hay otra manera mas eficiente utilizando directamente VF en vez de R1 espero te dés cuenta:D, mucha suerte ....




Saludos.
 
Hola dukex, gracias por contestar!

Si se que C=0 cuando el resultado de la resta es menor que cero, pero parece que me pase por alto que SUBLW K --> W= K - W... Ya me pongo a cambiar esto


NO VOY A DARTE EL CODIGO... pero aquí va algo para tener en cuenta
Nunca pedi el codigo, por eso publique el mio... Todavia tengo ganas de renegar por mi cuenta... Por ahora...:D

Gracias y saludos!
 
Buenas tardes compañeros:
Me encuentro hoy con un dilema bastante raro.
Quisiera descargar los contenidos publicados por el compañero "elosciloscopio" en la página 6 de éste tema, pero hete aqui el problema, dicha página es la única que no me deja ingresar como usuario. Tras reiterados intentos desistí de intentar loguearme.

El problema (utilizando el imaginativo) pueda deberse a que dicho contenido se descargó 555 veces. Un número bastante singular en el ambiente electrónico (vaya coincidencia si lo es). Por eso apelo a el archivo de ustedes compañeros para volver a colgar estos contenidos.

Muchas Gracias
Saludos. Mauricio

La respuesta a este dilema es otro dilema, pero ésta vez funcional.
la solución fué incrementarle en un valor a la página de la descarga que redirecciona el link. (tal vez estoy divulgando información acerca del algoritmo de comprobación de identidad utilizado por los programadores de la página, pero ayudará a otros usuarios a resolver el mismo problema).

Saludos.
Mauricio
 
Última edición:
Hola a todos, ando un poco perdido con este temita, hice una rutina para contar cada vez que pulso un boton y funciona de maravillas solo que llega a 255 y luego pasa a cero, no doy con la idea para hacer que cuente indefinidamente.
Pongo el tramo de programa que me esta maltratando a ver si entre tantas mentes hay alguna que me tire una idea.


btfss porta,5 ;;controlo si el porta se puso alto
goto $-1 ;;si es no vuelvo atras hasta que pulse
btfsc porta,5 ;;si pulso vino aqui y controlo que se ponga bajo
goto $-1 ;;si es no vuelvo atras hasta que suelte
incf CONTADOR1 ;"si solto incremento el contador
call conversion1 ;;llamo a "conversion1"
call lectura ;;y llamo a lectura hasta que termine de leer
goto $-4 ;"vuelvo a ver si se pone en alto otra vez para aumentar
;"el contador

Con la rutina lectura logro ver el conteo en un display.


Gracias
 
Hola a todos, ando un poco perdido con este temita, hice una rutina para contar cada vez que pulso un boton y funciona de maravillas solo que llega a 255 y luego pasa a cero, no doy con la idea para hacer que cuente indefinidamente.
Pongo el tramo de programa que me esta maltratando a ver si entre tantas mentes hay alguna que me tire una idea.


btfss porta,5 ;;controlo si el porta se puso alto
goto $-1 ;;si es no vuelvo atras hasta que pulse
btfsc porta,5 ;;si pulso vino aqui y controlo que se ponga bajo
goto $-1 ;;si es no vuelvo atras hasta que suelte
incf CONTADOR1 ;"si solto incremento el contador
call conversion1 ;;llamo a "conversion1"
call lectura ;;y llamo a lectura hasta que termine de leer
goto $-4 ;"vuelvo a ver si se pone en alto otra vez para aumentar
;"el contador

Con la rutina lectura logro ver el conteo en un display.


Gracias

Hola, bueno me parece raro que te funcione por ese ultimo goto, porque cuando termine con la funcion lectura retrocedera 4 direcciones de memoria y queda en un goto $-1 (donde verificas que soltaron la tecla). La funcion conversion supongo que es para convertir a BCD o 7seg, si es asi, solo tienes que aumentar el numero de digitos a convertir modificando tu funcion conversion. No puedes hacer que cuente hasta infinito porque no tienes memoria infinita, podrias usar toda la memoria del pic para tener un contador bastante grande.

Yo le pondria etiquetas al programa

CICLO
btfss porta,5 ;;controlo si el porta se puso alto
goto CICLO ;;si es no vuelvo atras hasta que pulse
Revisar_PULSADOR
btfsc porta,5 ;;si pulso vino aqui y controlo que se ponga bajo
goto Revisar_PULSADOR ;;si es no vuelvo atras hasta que suelte
incf CONTADOR1 ;"si solto incremento el contador
call conversion1 ;;llamo a "conversion1"
call lectura ;;y llamo a lectura hasta que termine de leer
goto CICLO ;"vuelvo a ver si se pone en alto otra vez para aumentar
;"el contador

Por cierto, que hace la funcion lectura?
 
Hola a todos, ando un poco perdido con este temita, hice una rutina para contar cada vez que pulso un boton y funciona de maravillas solo que llega a 255 y luego pasa a cero

:LOL: no... pues no puedes resolver tu problema... nunca vas a poder hacer que el PIC cuente mas de 255 ya que es un procesador de 8 bits... y el numero mas grande que puedes representar en 8 bits es 255, para poder guardar valores mas grandes necesitas hacerlo en varios registros, con 2 tienes 16 bits y [LATEX]2^1^6[/LATEX]=65535, usa esta rutina como ejemplo:

Código:
incf contador_l,f;
btfsc status,z;
incf contador_h_f;
 
Hola, bueno me parece raro que te funcione por ese ultimo goto, porque cuando termine con la funcion lectura retrocedera 4 direcciones de memoria y queda en un goto $-1 (donde verificas que soltaron la tecla).

Disculpas, :D puse una de las tantas pruebas, la real lo hace volver 6 direcciones y funciona bien

La funcion conversion supongo que es para convertir a BCD o 7seg, si es asi,

No, salgo a un LCD, con los BCD ya tengo idea de como llegar

Por cierto, que hace la funcion lectura?

Justamente lee las Centenas, Decenas y Unidades y luego de haberlas transformado en ASCII las muestra en el LCD 2x16.

:LOL: no... pues no puedes resolver tu problema... nunca vas a poder hacer que el PIC cuente mas de 255 ya que es un procesador de 8 bits... y el numero mas grande que puedes representar en 8 bits es 255, para poder guardar valores mas grandes necesitas hacerlo en varios registros, con 2 tienes 16 bits y [LATEX]2^1^6[/LATEX]=65535, usa esta rutina como ejemplo:

Código:
incf contador_l,f;
btfsc status,z;
incf contador_h_f;

Hola, me oriento mas por tu respuesta, gracias ;)

contador_h_f seria el segundo contador?

deberia ampliar la rutina de conversion1 para las unidades de mil y las decenas de mil?

no me doy cuenta de como implementar ambos contadores, deberia leer 16 bits y no se como, ya me supera :confused:

Para mas info te copio la rutina de conversion que es de lo mas simple



Gracias por el aporte
 

Adjuntos

  • rutinas incluidas.txt
    567 bytes · Visitas: 63
Última edición:
contador_h_f seria el segundo contador?

deberia ampliar la rutina de conversion1 para las unidades de mil y las decenas de mil?

no me doy cuenta de como implementar ambos contadores, deberia leer 16 bits y no se como, ya me supera :confused:

error de dedo.... en vez de ser contador_h_f debe ser contador_h,f y si... contiene la parte alta del conteo

Y efectivamente, hay que actualizar todas las rutinas para que puedan manejar el nuevo contador de 16 bits, incluyendo la de conversion de binario a BCD, en este momento no tengo una a la mano pero las hay por todos lados... solo hay que encontrar una y pegarla en el codigo

Recuerda que con 16 bits vas a poder contar hasta 65535, si necesitas un numero mas alto hay que seguir añadiendo variables y las rutinas van a ser cada vez mas complejas.... es el precio a pagar por usar 8 bits.. :LOL:
 
error de dedo.... en vez de ser contador_h_f debe ser contador_h,f y si... contiene la parte alta del conteo

Recuerda que con 16 bits vas a poder contar hasta 65535, si necesitas un numero mas alto hay que seguir añadiendo variables y las rutinas van a ser cada vez mas complejas.... es el precio a pagar por usar 8 bits.. :LOL:




Bien vere como trabajar con esto de la parte alta y la baja, no lo tengo claro.
Se que serian como "0000 0000" para contador_h y "0000 0000 " para contador_l y que estarian en una sola palabra de "0000 0000 0000 0000" pero no se como unirlos, de alli en mas es sencillo para mi, pero es como la fiesta del otro lado del rio y no se nadar :enfadado:

Ja, por ahora estoy pagando con horas de sueño :oops: , espero que me salga sino las ojeras me van a llegar a la cintura :LOL:

Gracias


:aplauso: :aplauso: :aplauso: (y) (y) (y) :LOL: :LOL: :LOL:

Lo logre, y hasta lo entendi por eso los aplausos son para mi :D me los merezco despues de lo que me costo Y ERA TAN SIMPLE.

Bueno GRACIAS A TODOS por sus aportes y guias
 
Última edición:
Bueno pues mi duda es como dice el título valga la redundancia, ¿como puedo implementar estas estructuras de control en mpasm para utilizarlas en un pic?, la verdad es que apenas empiezo con eso de los pics y pues la verdad todavía no se me da mucho eso del ensamblador y pues les agradeceria una ayudadita si no es mucha molestia.

Bueno pues saludos y que tengan buen día.
 
tienes que implementarlas con operaciones logicas.... de tal manera que el resultado de cero

por ejemplo, un

if (reg1=5)

Código:
	movlw	H'05'
	xorfw	reg1,w
	btfss	status,z
	goto	false
	goto	true

for (reg1=0; reg1<10; reg1++)

Código:
	clrf	reg1		;reg1=0
ciclo:	....
	....
	....
	incf	reg1		;reg1++
	movlw	H'10'		;reg1<10?
	subwf	reg1,w		;
	btfss	status,z	;
	goto	ciclo
 
Última edición:
Atrás
Arriba