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

Temas similares

19/10/2010 #121

Avatar de Alerce

Respuesta: ASM desde 0 (ASM desde cero)
hay una duda que tengo con respecto a como se realizan los salto indexados cuando se tiene una tabla que sobrepase las 256 pociciones.¿Como se trabaja en esos casos los registros PCLATCH,PChigh y PClow para acceder a la posicion de la tabla deseada?
podrian realizar un ejemplo al respecto.

Felicitaciones a Leon Elec y Meta por este curso.

saludos.
19/10/2010 #122

Avatar de Meta

Respuesta: ASM desde 0 (ASM desde cero)
Puedes encontrar la respuesta por aquí.

http://www.pic16f84a.org/index.php?o...6f84&Itemid=60

Saludo.
20/10/2010 #123

Avatar de Alerce

Respuesta: ASM desde 0 (ASM desde cero)
Gracias Meta lo estudiare...
19/11/2010 #124

Avatar de Lord Chango

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:

Leon Elec dijo: Ver Mensaje
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!
05/12/2010 #125

Avatar de Psyco83

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?
05/12/2010 #126

Avatar de ByAxel

Psyco83 dijo: Ver Mensaje
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?
No.
La única instrucción que borra o pone a cero un registro es clrf, el resto solo hace una copia.
saludos
05/12/2010 #127

Avatar de Psyco83

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
06/12/2010 #128

Avatar de Meta

Psyco83 dijo: Ver Mensaje
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.
12/02/2011 #129

Avatar de Lord Chango

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!
15/02/2011 #130

Avatar de dukex

Lord Chango dijo: Ver Mensaje
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 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, mucha suerte ....




Saludos.
15/02/2011 #131

Avatar de Lord Chango

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


dukex dijo: Ver Mensaje
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...

Gracias y saludos!
24/02/2011 #132


Ayuda con las descargas
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
10/05/2011 #133


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
10/05/2011 #134


principiantetardio dijo: Ver Mensaje
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?
10/05/2011 #135
Moderador

Avatar de Chico3001

principiantetardio dijo: Ver Mensaje
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... 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 =65535, usa esta rutina como ejemplo:

Código:
incf contador_l,f;
btfsc status,z;
incf contador_h_f;
10/05/2011 #136


0rland0 dijo: Ver Mensaje
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, 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.

Chico3001 dijo: Ver Mensaje
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 =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

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



Gracias por el aporte
Archivos Adjuntos
Tipo de Archivo: txt rutinas incluidas.txt (567 Bytes, 47 visitas)
11/05/2011 #137
Moderador

Avatar de Chico3001

principiantetardio dijo: Ver Mensaje
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
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..
11/05/2011 #138


Chico3001 dijo: Ver Mensaje
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..



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 , espero que me salga sino las ojeras me van a llegar a la cintura

Gracias




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

Bueno GRACIAS A TODOS por sus aportes y guias
27/09/2011 #139


Estructuras de control if/for en mpasm
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.
28/09/2011 #140
Moderador

Avatar de Chico3001

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
¿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.