TODOPIC
Misceláneas - Interés General => Off Topic => Mensaje iniciado por: tongas321 en 22 de Julio de 2013, 14:30:43
-
Hola, buen dia, disculpen las molestias, estuve viendo en el foro pero no logro solucionar mi problema (soy bastante duro para esto), les comento, fui a rendir un final de Tecnicas Digitales II, de mi carrera ing. en telecomunicaciones y me tomo dos problemas que tenian que ver con programacion, y en el examen me fue mal, pero me quede con la sangre en el ojo por saber como eran, si alguien tiene tiempo o quiere practicar me podria dar una mano en resolverlos
Problema 1):
Realizar un juego de luces (8bits del puerto B) cuya secuencia dependerá de unos interruptores conectados en el puerto A (5 bits del puerto A) que realicen las siguiente acciones:
Si A es 00001 la secuencia de luces del puerto B sera 8 leds parpadeantes
Si A es 00010 los leds realizaran un recorrido de derecha a izquierda
Si A es 00100 los leds realizara un recorrido de izquierda a derecha
Problema 2):
De la siguiente rutina:
a) explicar que hace y agregar explicaciones
b)Dar valores de los registros antes de entrar al bucle
c) dar valores de los registros cuando termina el bucle
contA equ 0x10
dato equ 0x11
resul equ 0x12
auxi equ 0x13
Rutina
movlw D'08'
movwf contA
clrf resul
movf dato,0
movwf auxi
vol rlf auxi,1
btfsc status,0
incf resul,1
decf contA,1
btfss status,2
goto vol
return
eso son los dos problemas, el 2) creo que lo hice medianamente bien, pero el 1) todo mal jaja, si alguien me da una mano lo agradezco muchisimo, que tengan un buen dia y gracias de antemano
-
Estaría muy bien que muestres el código que utilizaste para el problema 1. Tal vez sería mejor que lo coloques en el foro de assembler ya que seguramente recibirás mayor ayuda.
-
es que el problema es que yo entregue en el final el programa que hice yo, pero lo hice totalmente mal saque 0 puntos jaja, no quiero que me den el programa completo, sino alguna que otra ayuda, como por ejemplo yo creo que tengo que usar la instrucción RLF y RRF para que los leds se muevan pero no se muy bien como funcionan, igual se agradece cualquier ayuda jaja
-
Realizar un juego de luces (8bits del puerto B) cuya secuencia dependerá de unos interruptores conectados en el puerto A (5 bits del puerto A) que realicen las siguiente acciones:
Si A es 00001 la secuencia de luces del puerto B sera 8 leds parpadeantes
Si A es 00010 los leds realizaran un recorrido de derecha a izquierda
Si A es 00100 los leds realizara un recorrido de izquierda a derecha
A ver te voy poner una orientacion, no lo probe ni simule, a ver si tenemos suerte y NO funciona, y lo tendras que arreglar tu :lol:, a lo mejor no mucho, falta la ultima secuencia, configuracion de puertos, la demora...como te digo no es el programa hecho, solo orientativo.
He obviado los antirrebotes, tambie que no dice nada de un pulsador que pare las secuencias etc.
MAIN
btfsc PORTA,0 ;chequeamos si PORTA,0 esta a 0
goto LEDS_PARPADEANTES ;esta a 1, hace primera secuencia
btfsc PORTA,1 ;chequeamos si PORTA,1 esta a 0
goto DESPLAZA_DI ;esta a 1, hace desplazar derecha a izquierda
btfsc PORTA,2 ;chequeamos si PORTA,2 esta a 0
goto DESPLAZA_ID ;esta a 1, hace desplazar izquierda a derecha
LEDS_PARPADEANTES
movlw 0xFF ;encendemos todos los LEDs
movwf PORTB
call DEMORA_200 ;llamamos demora 200ms (o el tiempo que quieras)
clrf PORTB ;apagamos LEDs
goto LEDS_PARPADEANTES ;habria que tener un pulsador para parar???
;pero no dice nada de como lo quiere
DESPLAZA_DI
bsf PORTB,0 ;enciende LED derecha
call DEMORA_200
rlf PORTB,1 ;rota PORTB a izquierda y resultado queda en PORTB
btfss STATUS,Z ;chequea flag acarreo, si esta a 1, desbordo Byte
call DEMORA_200
goto $-3 ;no esta Z a 1, va 2 posiciones arriba a rrl
goto DESPLAZA_DI ;ya desbordo, empieza secuencia otra vez
Problema 2):
De la siguiente rutina:
a) explicar que hace y agregar explicaciones
b)Dar valores de los registros antes de entrar al bucle
c) dar valores de los registros cuando termina el bucle
contA equ 0x10
dato equ 0x11
resul equ 0x12
auxi equ 0x13
Rutina
movlw D'08'
movwf contA
clrf resul
movf dato,0
movwf auxi
vol rlf auxi,1
btfsc status,0
incf resul,1
decf contA,1
btfss status,2
goto vol
return
En este yo diria que el profe metio la pata ¿Que PIC es? lo digo porque en la serie 16f creo que en ninguno se pueden poner los registros aqui:
contA equ 0x10
dato equ 0x11
resul equ 0x12
auxi equ 0x13
Ahi hay registros propios del PIC, por tanto al principio y al final del bucle puede haber cualquier cosa.
en el 16f887 son estos:
T1CON 10h
TMR2 11h
T2CON 12h
SSPBUF 13h
Bueno dile que te parece que es asi y a ver que opina. ¿Tiene muy mala hostia? :lol: :lol: Si estoy equivocado dale mi correo y que me envie a mi el suspenso :lol: :lol:
-
En este yo diria que el profe metio la pata ¿Que PIC es? lo digo porque en la serie 16f creo que en ninguno se pueden poner los registros aqui:
contA equ 0x10
dato equ 0x11
resul equ 0x12
auxi equ 0x13
Ahi hay registros propios del PIC, por tanto al principio y al final del bucle puede haber cualquier cosa.
en el 16f887 son estos:
T1CON 10h
TMR2 11h
T2CON 12h
SSPBUF 13h
Bueno dile que te parece que es asi y a ver que opina. ¿Tiene muy mala hostia? Si estoy equivocado dale mi correo y que me envie a mi el suspenso
No le digas nada :lol: :lol: porque si es un 16f84 si que valen esas direcciones, mira que olvidarme del 16f84.
-
es que el problema es que yo entregue en el final el programa que hice yo, pero lo hice totalmente mal saque 0 puntos jaja, no quiero que me den el programa completo, sino alguna que otra ayuda, como por ejemplo yo creo que tengo que usar la instrucción RLF y RRF para que los leds se muevan pero no se muy bien como funcionan, igual se agradece cualquier ayuda jaja
Hola tongas321.
Con el mayor de los respeto, creo que te falta estudiar un poco mas. No creo que la solucion sea venir a consultar a un foro. La instrucciones de los PICs las podes encontrar en millones de lugares de Internet y hay documentacion en ingles y en español. Con solo poner en Google RLF ya me propone 4 opciones de busqueda (rlf en mplab, rrf ensamblador, rlf pic, rlf en ensamblador). 3 microsegundos despues encuentro cosas como esta (http://www.electronicafacil.net/tutoriales/Juegos-instrucciones-PIC.php)
Hay libros en español, articulos, tutoriales e informacion en los foros como para que puedas prepararte.
Entiendo que no hayas podido hacer el programa, quizas por los nervios; lo que me parece mal es que pongas el enunciado sin ni siquiera un intento de hacer el programa. Del segundo programa no especificas lo que hace ni siquiera en una de las lineas de codigo. Hace aunque sea un intento. Pone un poquito mas de garra.
A estudiar viejo, es la unica forma que vas a sacar adelante esa materia. Pensa que fuiste a dar un final. Cuando estudies vas a ver que el examen no era tan dificil.
Por otro lado, por mas que te expliquemos esto, si te toma otra cosa vas a fallar de nuevo.
Cuando estudies y tengas en realidad cosas que no entiendas estamos aca para darte una mano.
Suerte en la proxima fecha del final.
Saludos.
-
tapi,
lamento decirte que veo muchos errores en tu código. Está mal la selección de secuencia, el parpadeo y el desplazamiento.
Igual, como dice Darkman, estamos en el año 2013. La información ABUNDA y el acceso es muy fácil.
Como decía un tío mío: "Aprobar es una cuestión de culo... de culo contra la silla."
Saludos.
-
tapi,
lamento decirte que veo muchos errores en tu código. Está mal la selección de secuencia, el parpadeo y el desplazamiento.
Hombre de eso se trataba Bruno :lol:, ya se lo digo aqui.
A ver te voy poner una orientacion, no lo probe ni simule, a ver si tenemos suerte y NO funciona, y lo tendras que arreglar tu ,
No trataba de hacerle el codigo, como bien dice Darkman, es demasiado simple para darselo hecho, solo orientarlo de como seria mas o menos, ahora que se lo trabaje el un poco. Lo hice en 5 o 10 minutos a toda prisa y sin pensar mucho.
-
Primero tapi8 muchas gracias por tu ayuda, me diste un par de ayudas para ver por donde lo arranco
segundo, disculpen si moleste a alguien, mi problema (que no soy el primero ni el ultimo) es que rendi mucho finales en esas 2 semanas porque estaba atrasado, y cuando nos pasa eso sabemos que a las ultimas materias no las estudiamos 100% siempre esperamos un poco de ayuda, igual ese no era todo el final, tenia mas problemas que hice bien pero esos dos daban 60% y bueno, no tuve la suerte de que me tome las cosas que sabia, ahora con mas tiempo espero rendirla bien, estos problemas no me los van a volver a tomar pero queria saber como encararlos para encarar los del proximo final porque por ahi son parecidos, vuelvo a pedir disculpa si moleste a alguien y agradecer a los que me dieron una mano, cuando haga los codigos lo subo para ver si estan bien o por ahi me pueden corregir algun que otro error, que tengan buen dia y disculpas y gracias nuevamente
-
Bueno, despues de leer bastante y con una mano de algunos colegas, y con un poco mas de tiempo, creo que entendi el concepto y ahora paso a mostrarles el problema ya echo, a ver si ustedes me dicen si puedo hacer algo mas simple o si contiene algun error.
list p=16f84
include "p16f84.inc"
x equ 0x0D
y equ 0x0E
temp equ 0x0C ; variable temporal
org 0x00
goto inicio
org 0x05
inicio clrf portB ;limpio latch de salida
bsf status,RP0 ;entro a banco 1
clrf trisB ; pongo como salida los Rb
movlw b'00111'
movwf trisA ;pongo Ra0,Ra1,Ra2, como entradas
bcf status,RP0 ;vuelvo a banco 0
loop movf portA,w ;leo lo que tengo en el puerto A
andlw b'00111' ;filtro Ra0, Ra1 y Ra2
movwf temp
btfsc status,Z ; llega '00000'?
goto apagado ; llega '00000', entonces apago todos o los mantengo apagados
movlw b'00001'
subwf temp,w
btfsc status,Z ; recibo '00001'?
goto parpadeo ; si, hago la secuencia de parpadeo'
movlw b'00010'
subwf temp,w
btfsc status,Z ; recibo '00010'?
goto DI ; si, hago la secuencia de derecha a izquierda
movlw b'00100'
subwf temp,w
btfsc status,z ;recibo '00100'?
goto ID ;si, hago secuencia de izquierda a derecha
goto loop
apagado clrf portB ;apago leds
goto loop
parpadeo movlw b'11111111'
movwf portB ;prendo todos los leds
call retardo ; los mantengo por cierto tiempo (100 ms)
clrf portB ; apago los leds
call ratardo
goto parpadeo ;sigue el ciclo indefinidamente ya que no me pide que lo pare
retardo movlw .130
movwf y
salto1 movlw .255
movwf x
salto2 decfst x,1
goto salto2
decfst y,1
goto salto1
return
DI bcf status,C ;limpio el flag de acarreo
bsf portB,0 ;enciendo el primer led
call retardo ; lo mantengo por cierto tiempo
volver rlf portB,1 ; prendo el led que le sigue
call retardo
btfss status,C ; se activa el acarreo?
goto volver ; no, entonces enciendo el otro led
goto DI ; si se activa el acarreo, entonces empiezo otra vez
ID bcf status,C ; limpio bandera de acarreo
bsf portB,7 ;enciendo ultimo led
call retardo
volver2 rrf portB,1 ; enciendo el de la derecha
call retardo
btfss status,C ;testeo si la bandera de acarreo se activa
goto volver2 ; no se activa, enciendo el led de al lado
goto ID ; se activa, vuelvo a encender el ultimo
yo creo que esta bien pero por ahi una mirada mas avanzada en el tema me puede dar algun consejo, gracias
-
Bien asi ya da mas gusto ayudarte :lol: :lol:
¿No usais el MPLAB? ¿Como depurais los programas? ¿Y como los simulais? Es que este programa ni siquiera compila da todos estos errores:
Executing: "C:\Program Files\Microchip\MPASM Suite\MPASMWIN.exe" /q /p16F84 "examen.asm" /l"examen.lst" /e"examen.err" /d__DEBUG=1
Error[113] C:\USERS\TAPI\DESKTOP\PRUEBAS MPLAB\EXAMEN.ASM 11 : Symbol not previously defined (portB)
Error[113] C:\USERS\TAPI\DESKTOP\PRUEBAS MPLAB\EXAMEN.ASM 12 : Symbol not previously defined (status)
Error[113] C:\USERS\TAPI\DESKTOP\PRUEBAS MPLAB\EXAMEN.ASM 13 : Symbol not previously defined (trisB)
Error[113] C:\USERS\TAPI\DESKTOP\PRUEBAS MPLAB\EXAMEN.ASM 15 : Symbol not previously defined (trisA)
Error[113] C:\USERS\TAPI\DESKTOP\PRUEBAS MPLAB\EXAMEN.ASM 16 : Symbol not previously defined (status)
Error[113] C:\USERS\TAPI\DESKTOP\PRUEBAS MPLAB\EXAMEN.ASM 18 : Symbol not previously defined (portA)
Error[113] C:\USERS\TAPI\DESKTOP\PRUEBAS MPLAB\EXAMEN.ASM 21 : Symbol not previously defined (status)
Error[113] C:\USERS\TAPI\DESKTOP\PRUEBAS MPLAB\EXAMEN.ASM 25 : Symbol not previously defined (status)
Error[113] C:\USERS\TAPI\DESKTOP\PRUEBAS MPLAB\EXAMEN.ASM 29 : Symbol not previously defined (status)
Error[113] C:\USERS\TAPI\DESKTOP\PRUEBAS MPLAB\EXAMEN.ASM 33 : Symbol not previously defined (status)
Error[113] C:\USERS\TAPI\DESKTOP\PRUEBAS MPLAB\EXAMEN.ASM 33 : Symbol not previously defined (z)
Error[113] C:\USERS\TAPI\DESKTOP\PRUEBAS MPLAB\EXAMEN.ASM 37 : Symbol not previously defined (portB)
Error[113] C:\USERS\TAPI\DESKTOP\PRUEBAS MPLAB\EXAMEN.ASM 41 : Symbol not previously defined (portB)
Error[113] C:\USERS\TAPI\DESKTOP\PRUEBAS MPLAB\EXAMEN.ASM 43 : Symbol not previously defined (portB)
Error[113] C:\USERS\TAPI\DESKTOP\PRUEBAS MPLAB\EXAMEN.ASM 44 : Symbol not previously defined (ratardo)
Error[122] C:\USERS\TAPI\DESKTOP\PRUEBAS MPLAB\EXAMEN.ASM 51 : Illegal opcode (decfst)
Error[113] C:\USERS\TAPI\DESKTOP\PRUEBAS MPLAB\EXAMEN.ASM 52 : Symbol not previously defined (salto2)
Warning[207] C:\USERS\TAPI\DESKTOP\PRUEBAS MPLAB\EXAMEN.ASM 53 : Found label after column 1. (decfst)
Error[122] C:\USERS\TAPI\DESKTOP\PRUEBAS MPLAB\EXAMEN.ASM 53 : Illegal opcode (y)
Error[113] C:\USERS\TAPI\DESKTOP\PRUEBAS MPLAB\EXAMEN.ASM 57 : Symbol not previously defined (status)
Error[113] C:\USERS\TAPI\DESKTOP\PRUEBAS MPLAB\EXAMEN.ASM 58 : Symbol not previously defined (portB)
Error[113] C:\USERS\TAPI\DESKTOP\PRUEBAS MPLAB\EXAMEN.ASM 60 : Symbol not previously defined (portB)
Error[113] C:\USERS\TAPI\DESKTOP\PRUEBAS MPLAB\EXAMEN.ASM 62 : Symbol not previously defined (status)
Error[113] C:\USERS\TAPI\DESKTOP\PRUEBAS MPLAB\EXAMEN.ASM 66 : Symbol not previously defined (status)
Error[113] C:\USERS\TAPI\DESKTOP\PRUEBAS MPLAB\EXAMEN.ASM 67 : Symbol not previously defined (portB)
Error[113] C:\USERS\TAPI\DESKTOP\PRUEBAS MPLAB\EXAMEN.ASM 69 : Symbol not previously defined (portB)
Error[113] C:\USERS\TAPI\DESKTOP\PRUEBAS MPLAB\EXAMEN.ASM 71 : Symbol not previously defined (status)
Error[129] C:\USERS\TAPI\DESKTOP\PRUEBAS MPLAB\EXAMEN.ASM 75 : Expected (END)
La mayoria son por poner los reg. con minusculas tienes que poner PORTA, PORTB, STATUS etc.
Esta instruccion tambien esta mal "decfst" y le falta el END.
Como ves usando el MPLAB (ademas es gratuito) ya te dice los errores que tienes, despues lo simulas y ves si hace lo que tu quieres o tienes algun fallo. Te debes acostumbrar a poner los FUSES, asi si alguien te lo mira sabe como estan configurados ya que muchas veces el error esta en la configuracin de los FUSES.
En la parte del chequeo es mas simple como te la puse yo, no funcionaba (como bien decia BrunoF) porque le faltaba un "goto MAIN" al final, pero es mucho mas facil de esta manera.
MAIN
btfsc PORTA,0 ;chequeamos si PORTA,0 esta a 0
goto LEDS_PARPADEANTES ;esta a 1, hace primera secuencia
btfsc PORTA,1 ;chequeamos si PORTA,1 esta a 0
goto DESPLAZA_DI ;esta a 1, hace desplazar derecha a izquierda
btfsc PORTA,2 ;chequeamos si PORTA,2 esta a 0
goto DESPLAZA_ID ;esta a 1, hace desplazar izquierda a derecha
goto MAIN ;si los tres son 0 sigue en MAIN
Bajate el MPLAB de la pagina de Microchip y asi sabras hacer todo esto tu mismo, sin tener que depender de nadie, ahi veras todo lo que hace tu programa paso por paso.
En el almacen del assembler tambien tienes un programa para generar las demoras que te las hace automaticamente.
-
Muchas gracias, estoy bajando el MPLAB, y pronto tendre noticias nuevas
con respecto al programa, yo pensaba que si lo hacia como me me decis (testeando el BIT 0 si es 1 o no), mi problema seria si me llega 00011, el BIT 0 seria 1 pero la secuencia no es la pedida para que parpadee y lo mismo lo hara, no se si se entiende mi idea, y otra pregunta mas
aca
movlw b'00001'
subwf temp,w
btfsc status,Z ; recibo '00001'?
goto parpadeo ; si, hago la secuencia de parpadeo'
movlw b'00010'
subwf temp,w
btfsc status,Z ; recibo '00010'?
goto DI ; si, hago la secuencia de derecha a izquierda
movlw b'00100'
subwf temp,w
btfsc status,z ;recibo '00100'?
goto ID ;si, hago secuencia de izquierda a derecha
goto loop
cuando yo por ejemplo a temp, le resto 00001, suponiendo que temp contiene el valor 00011, al restarle el 00001, en temp a mi me queda el valor 00011, o el valor 00010?, ya que de ser de la segunda manera mi programa no funcionaria porque al restar la segunda vez siempre se activaria la secuencia que mueve de izquierda a derecha, muchas gracias por la ayuda
-
Muchas gracias, estoy bajando el MPLAB, y pronto tendre noticias nuevas
con respecto al programa, yo pensaba que si lo hacia como me me decis (testeando el BIT 0 si es 1 o no), mi problema seria si me llega 00011, el BIT 0 seria 1 pero la secuencia no es la pedida para que parpadee y lo mismo lo hara, no se si se entiende mi idea, y otra pregunta mas
aca
movlw b'00001'
subwf temp,w
btfsc status,Z ; recibo '00001'?
goto parpadeo ; si, hago la secuencia de parpadeo'
movlw b'00010'
subwf temp,w
btfsc status,Z ; recibo '00010'?
goto DI ; si, hago la secuencia de derecha a izquierda
movlw b'00100'
subwf temp,w
btfsc status,z ;recibo '00100'?
goto ID ;si, hago secuencia de izquierda a derecha
goto loop
cuando yo por ejemplo a temp, le resto 00001, suponiendo que temp contiene el valor 00011, al restarle el 00001, en temp a mi me queda el valor 00011, o el valor 00010?, ya que de ser de la segunda manera mi programa no funcionaria porque al restar la segunda vez siempre se activaria la secuencia que mueve de izquierda a derecha, muchas gracias por la ayuda
Fijate que la instrucción subwf lleva dos parámetros. El primero es el registro al cual se le resta el valor de W y el segundo es donde se almacena el resultado.
al hacer
el resultado se almacena en w
en cambio, al hacer
el resultado se almacena en el registro temp. f indica que el resultado será almacenado en el mismo registro que se está utilizando en la función.
-
muchas gracias! tenia esa duda, entonces dentro de todo estoy encaminado, muchas gracias por todo su apoyo, rindo el jueves y me siento con mucha mas fe que la ultima vez jajaja
-
Lo que te dice AngelGris es cierto, si lo haces asi haz caso de lo que te dice.
con respecto al programa, yo pensaba que si lo hacia como me me decis (testeando el BIT 0 si es 1 o no), mi problema seria si me llega 00011, el BIT 0 seria 1 pero la secuencia no es la pedida para que parpadee y lo mismo lo hara, no se si se entiende mi idea, y otra pregunta mas
Pero es que aqui no se hacen diferentes secuencias si estan dos o tres pulsados, esto ya seria otro planteamiento, te recuerdo como lo has puesto en un principio:
Realizar un juego de luces (8bits del puerto B) cuya secuencia dependerá de unos interruptores conectados en el puerto A (5 bits del puerto A) que realicen las siguiente acciones:
Si A es 00001 la secuencia de luces del puerto B sera 8 leds parpadeantes
Si A es 00010 los leds realizaran un recorrido de derecha a izquierda
Si A es 00100 los leds realizara un recorrido de izquierda a derecha
Fijate que ahi siempre hay uno solo a 1, se le puede dar prioridad a cualquiera de ellos, se puede hacer que si estan dos haga otra cosa, que si estan los tres haga otra...Se puede hacer lo que se quiera pero el planteamiento era este.
-
jajaja ya entiendo lo que me dices, muchas gracias, mañana rindo y creo estar a la altura jaja, mañana traere novedades jaja gracias
-
Muchisimas gracias (A TODOS) por sus consejos, criticas y buena o mala onda! jaja, finalmente aprobé con 6 el final! era un poquito mas complicado que el otro el programa, pero lo pude hacer gracias a la ayuda que me brindaron en este foro todos sus integrantes de muy buena fe, no me quedan mas que palabras de agradecimiento, buena vida para todos!
Aca les dejo (por si a alguien le interesa) el final que me tomaron, como veran, o por lo menos para mi, me parecio mas dificil que el anterior, pero gracias a dios yo estaba mucho mejor preparado gracias a este foro.
vuelvo a agradecer y a desearles un buen fin de semana!
(https://fbcdn-sphotos-f-a.akamaihd.net/hphotos-ak-ash3/q75/s480x480/1150267_10201448370068831_1222966874_n.jpg)
-
finalmente aprobé con 6 el final!
UUUyyy ¿Solo un 6? No se si te vamos a poder admitir en este foro con esa nota :5] :D :D
Bueno haremos un esfuerzo, si nos prometes estudiar mas :lol: :lol: