TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: ErnestAl en 09 de Mayo de 2007, 19:48:37
-
Buenas de nuevo, como el post indica he realizado mi primer programa, pero no ha resultado como esperaba. El objetivo de este programita es algo sencillo, simplemente realizar una subida y bajada de los leds del puerto B con la peculiaridad de que dependiendo de lo que se seleccione por el PORTA el retardo varia en la secuenci.
Me estoy volviendo loco simulando con proteus(gracias a las ayudas del foro) pero mi programita no me toma el valor del PORTA , ¿me podeis dar una pista?
;Programa para la simulacion de una serie de leds
list P=16F877
radix hex
#include <p16f877.inc> ;incluimos la libreria del PIC 16F877
;********************Zona de Etiquetas**************
temp equ 0x20 ;registro temporal
tempi equ 0x21
aux equ 0x23
aux1 equ 0x24
port equ 0x25
;****************************************************************
;*************************************************************************************+
ORG 0x00
goto inicio
ORG 0x05
;*********************************CARGO VALOR DE REFERENCIA************
;****************COnfiguracion del controlador******************************************
inicio
bsf STATUS,RP0 ;acceso al banco 1
bcf STATUS,RP1
;*******PUERTOS******************************************
clrf TRISB ;puerta B como salida, aqui estaran los leds que vamos a usar
movlw b'00000011'
movwf TRISA ;puerta A0 y A1 entrada digital para seleccionar tiempo
bsf TRISC,5 ;Lo usaremos como boton de START
;*******CONFIGURACION DEL TMR0****************************
movlw b'00000111'
movwf OPTION_REG ;configuracion del timer0 con un preescalado de 256
clrf INTCON
bcf STATUS,RP0
bcf STATUS,RP1 ;acceso al banco 0
movlw b'00000110'
movwf ADCON1 ;CONFIGURO LAS PATILLAS COMO DIGITALS
;**************FIN DE LA CONFIGURACION DEL CONTROLADOR**********************************
;****************************************************************************************
;**************COMIENZO DEL PROGRAMA**************************************************
main
clrf PORTB
movlw b'00000001'
movwf aux
movlw b'00000010'
movwf aux1
btfss PORTC,5
goto main
call tiempo
bsf PORTB,0
call retardo ;encendemos la primera bombilla y esperamos el mismo retardo
call ida
call vuelta
goto inicio
;****************************rutina Programa ***********************************
ida rlf PORTB,1
call retardo
btfss PORTB,7
goto ida
return
vuelta rrf PORTB,1
call retardo
btfss PORTB,0
goto vuelta
return ;volvemos al principio
;****************************************CALCULO DEL RETARDO
retardo
movf temp,W
movwf tempi
clrf TMR0
bcf INTCON,T0IF
retardo_2 btfss INTCON,T0IF
goto retardo_2
decfsz tempi,f
goto retardo_3
return
retardo_3 bcf INTCON,T0IF
goto retardo_2
;***************************COMPARACION PARA SELECICONAR RETARDO********************************
tiempo
movf PORTA,W
movwf port
subwf aux,W
bz _1_seg ;Igual rtetardo 1seg
bc comparo2 ;mayor
bnc _0_5_seg ;menor
comparo2 movf port,W
subwf aux1,W
bz _1_5_seg
bc _2_seg
_0_5_seg movlw D'8'; Retardo de 0.5 segundo
movwf temp
return
_1_seg movlw D'15' ; Retardo de 1 Segundo
movwf temp
return
_1_5_seg movlw D'23' ; Retardo de 1.5 segundos
movwf temp
return
_2_seg movlw D'30' ;RETARDO de 2 SEG
movwf temp
return
end
-
en primer lugar te pregunto algo, porq vuelves a inicializar todo el programa cuando:
call retardo ;encendemos la primera bombilla y esperamos el mismo retardo
call ida
call vuelta
goto inicio ; ME REFIERO A ESTA PARTE
-
pq sino lo hacia asi, a proteus se le iba la pinza. Lo acabo de cambiar y he vuelto a simular y nada....todo sigue igual. Ahora marcho al curro que llego tarde, luego seguire luchando
Muchas Gracias
-
pues no veo porq dices que el proteus le daba la pinza, no es necesario en verdad, sugiero que cambies esa parte y en vez de poner GOTO INICIO coloques simplemente GOTO MAIN.
veamos otro punto mas... m.... podriamos cambiar esta parte:
tiempo
movf PORTA,W
movwf port
subwf aux,W
bz _1_seg ;Igual rtetardo 1seg
bc comparo2 ;mayor
bnc _0_5_seg ;menor
comparo2 movf port,W
subwf aux1,W
bz _1_5_seg
bc _2_seg
por esto
tiempo movfw PORTA
andlw 0x03 ; solo me interesa los 2 primeros pines del portA
addwf PCL,F
goto _0_5_seg
goto _1_seg
goto _1_5_seg
goto _2_seg
me cuentas que tal te fue sino ya aplicamos el metodo agresivo :twisted:
-
muchisimas gracias micro_cadaver por tu ayuda, pero sigo sin poder conseguir algo tan sencillo como capturar el valor de PORTA, simulando en proteus aunque varie el valor de las entradas PORTA siempre es '0'
Muchisimas gracias por vuestra ayuda
-
bueno entonces apliquemos el metodo agresivo , sube tus archivos todos dentro de un rar tanto el ASM del pic como el archivo DSN del proteus y veamos que sucedeeeeeee :-/ toy seguro q debe ser un minimo detalle lo que te falte
-
aqui esta mi pequeño....da calentamientos de cabeza pero espero poder dominarlo algun dia
GRACIAS
-
hola ernesto, (supongo que asi te llamas), te tengo 2 noticias, una mala y la otra buena, supongo que querras saber primero la mala, jejeje, pues es la siguiente: el ADCON1 no esta en el banco 0 sino en el 1, revisar el datasheet porfavor. :mrgreen:. y la buena es que todo el resto del programa como lo mandastes esta ok :-/ :-/ :-/ :-/ :-/ y lo carge al proteus sin mover nada y arranco, cuando mueves las entradas del porta se modifica la velocidad de la rotacion del led, antes no te hacia caso la rutina de leer el portA porque simplemente no estaba configurada adecuadamente como digital, como te escribi mas arriba, el ADCON1 esta en el BANCO 1. :-) informame de tus avances.
-
Buenos dias desde la peninsula!!!!muchisimas gracias micro_cadaver, ha sido modificar lo que me has comentado y mi programa tiene vida jejejejejeje, Ahora me marcho al trabajo (voy a llegar tarde,pero tenia que probar si eso funcionaba).
Luego cuando vuelva me pondre con otro programita
MUCHISIMAS GRACIAS
-
Hola ErnestAl
pues te felicito por hacer andar tu primer programa :-/
¿sabias que esta es la parte mas dura para un picmaníaco?
ya veras que con el tiempo y las practicas las cosas iran mejorando 8)