Usando Macros
March 18, 2008 at 5:23 pm | Posted in HowTo, Tutorial | 10 CommentsEl uso de subrutinas lo vimos por primera vez en el tutorial Encendiendo y apagando LED’s… ahora con retardo! Ahí se vio la manera en la que se llama y se regresa de las subrutinas. También se dijo que el empleo de subrutinas hacía el código más entendible, otra forma de hacer el código entendible es mediante el uso de Macros.
Las macros son de alguna forma similares a las subrutinas ya que son conjuntos de intrucciones que se ejecutan de manera secuencial mediante una llamada a una orden de ejecución, sin embargo tiene diferencias muy significativas. Mientras que una subrutina aparece una sola vez en el código, cada vez que se “invoca” una macro se inserta el código de esta en el programa. Otra diferencia es que a una macro se le pueden especificar parámetros de entrada y a una subrutina no.
Lea el artículo completo en el blog Circuitos electronicos.
10 Comments »
RSS feed for comments on this post. TrackBack URI
Leave a comment
Create a free website or blog at WordPress.com.
Entries and comments feeds.
Hola desde Matamoros Tam., Mx.
Permiteme falicitarte y agradecerte por tu blog, es mi primer dia en programacion de microcontroladores y ya termine los que me habian “encargado”. Soy programador de software pero siempre tuve curiosidad por los micros. Gracias de nuevo y seguire por aqui.
Saludos
Comment by Marcos— April 19, 2008 #
Hola Marcos, gracias por tu comentario, me da gusto que te haya servido este blog.
Comment by micropic— April 19, 2008 #
Saludos desde Guatemala! interesante las notas que tienen asi dan ganas de seguir aprendiendo sigan asi!
ojala sigan con mas notas de assembler y haber cuando sacan algo de picbasic pro, pero por el momento tienen muchas cosas interesantes.
saludos.
Comment by Carlos— April 29, 2008 #
Somehow i missed the point. Probably lost in translation 🙂 Anyway … nice blog to visit.
cheers, Fitfully.
Comment by Fitfully— June 18, 2008 #
lo primero es decirte gracias por todo, es impresionante lo facil y bien esplicados que estan los temas. Para las personas como yo , que estamos empezando con los pics, esto es fabuloso. Ahora me gustaria que subieras algun trabajo sobre el USAR del 16F628a quiero comunicarme con un PC y no lo eh conseguido desde ya muchas gracias saludos desde uruguay
Comment by Emi— August 7, 2008 #
Man eres un duro en assembler, te felicito un mundo. tengo un proyecto que me mando la universidad y no tengo idea de que hacer ni de cómo empezar es realizar un juego que se llama juego de la vida, por fa mándame tu email para mandarte las especificaciones del juego para que así me orientes, claro si cuentas con el tiempo, gracias
Comment by McCollins— December 23, 2008 #
ahh el pic que debo utilizar el el 16f877
Comment by McCollins— December 23, 2008 #
jeje se nota mi impericia en esto el pic bueh ya lo conocen el 16f877 de 40 paticas.
Si necesitas o necesitan alguna otra especificación o si alguien aparte de micropic esta dispuesto a ayudarme por fa sabre agradecerles pmccollins@gmail.com
Comment by McCollins— December 23, 2008 #
Hola de nuevo, después de leer cuanto tutorial se me cruzara en la vida y al ver que nadie en el foro me pudo ayudar pues…..bueh pude resolver, aquí está el código si se animan léanlo y aporte como se pudiera mejorar…
el codigo
LIST P=16F877
INCLUDE
interruptor EQU 0x20
contador_ledon EQU 0x21
auxB EQU 0x23
auxC EQU 0x25
auxD EQU 0x26
CONF_ADCON1 equ b’00000110′ ; valor para la configuracion PORTA E/S digital
aux EQU 0x27
CBLOCK 0x28
R_ContA ; Contadores para los retardos.
R_ContB
R_ContC
ENDC
ORG 0x00
GOTO INICIO
ORG 0X05
INICIO:
bsf STATUS,RP0 ; Ir banco 1
bcf STATUS,RP1
movlw CONF_ADCON1 ; {Configurar el PORTA como digital
movwf ADCON1 ;}
CLRF TRISB ; PUERTOB SALIDA
CLRF TRISC ; PUERTOC SALIDA
CLRF TRISD ; PUERTOD SALIDA
movlw b’000001′ ;{RA entrada
movwf TRISA ;}
bcf STATUS,RP0 ; Ir banco 0
clrf PORTA
clrf PORTB
clrf PORTC
clrf PORTD
switch ;verifico el estado del interuptor
movf PORTA,w ; garga w con el contenido del puerto A
movwf interruptor ;
xorlw b’00000000′ ;evalúo que conjunto de generación esta activo
BTFSS STATUS,2 ; si el bit de status esta en cero brinco mustra el grupo B sino, muestra el A
goto generacion_1B
goto generacion_1A
generacion_1A
clrf PORTB ; limpio los puertos que
clrf PORTC ; seran utilizado como
clrf PORTD ; salida
bsf PORTB,0 ; Enciendo cada Led agregándole un 1 lógico al bit 0 del puerto B
bsf PORTB,3 ; un 1 lógico al bit 3 del puertoB
bsf PORTD,3 ; un 1 lógico al bit 3 del puertoD
;++++++++ verifica si se cambia de estado del inteuptor +++++++++++++
movf PORTA,w
xorwf interruptor
btfss STATUS,2 ; ++++ si el estado cambio llama al otro grupo de organismo ++++
; ++++ sino, se toma unos segundos encendido antes de cambiar a su estado futuro ++++
goto generacion_1B ; ++++ no me interesa que retorne a la siguiente línea +++++
call busy_waiting ; espera 5 segundos antesde cambiar
goto generacion_2A
generacion_2A
clrf PORTB ; limpio los puertos que
clrf PORTC ; seran utilizado como
clrf PORTD ; salida
bsf PORTB,0 ; Enciendo cada Led agregándole un 1 lógico al bit 0 del puerto B
bsf PORTB,3 ; un 1 lógico al bit 3 del puertoB
bsf PORTC,0 ; un 1 lógico al bit 0 del puertoc
bsf PORTC,3 ; un 1 lógico al bit 3 del puertoc
bsf PORTD,0 ; un 1 lógico al bit 0 del puertoD
bsf PORTD,3 ; un 1 lógico al bit 3 del puertoD
movf PORTA,w
xorwf interruptor
btfss STATUS,2 ; ++++ si el estado cambio llama al otro grupo de organismo ++++
; ++++ sino se toma unos segundos encendido antes de cambiar a su estado futuro ++++
goto generacion_1B ; ++++ no me interesa que retorne a la siguiente línea +++++
call busy_waiting ; espera 5 segundos antesde cambiar
goto generacion_3A
generacion_3A
clrf PORTB ; limpio los puertos que
clrf PORTC ; seran utilizado como
clrf PORTD ; salida
bsf PORTB,1 ; Enciendo cada Led agregándole un 1 lógico al bit 0 del puerto B
bsf PORTB,2 ; un 1 lógico al bit 3 del puertoB
bsf PORTC,1 ; un 1 lógico al bit 0 del puertoc
bsf PORTC,2 ; un 1 lógico al bit 3 del puertoc
bsf PORTD,1 ; un 1 lógico al bit 0 del puertoD
bsf PORTD,2 ; un 1 lógico al bit 3 del puertoD
movf PORTA,w
xorwf interruptor
btfss STATUS,2 ; ++++ si el estado cambio llama al otro grupo de organismo ++++
; ++++ sino se toma unos segundos encendido antes de cambiar a su estado futuro ++++
goto generacion_1B ; ++++ no me interesa que retorne a la siguiente línea +++++
call busy_waiting ; espera 5 segundos antesde cambiar
goto generacion_2A
generacion_1B
clrf PORTB ; limpio los puertos que
clrf PORTC ; seran utilizado como
clrf PORTD ; salida
bsf PORTC,0 ; un 1 lógico al bit 0 del puertoc
bsf PORTC,1 ; un 1 lógico al bit 3 del puertoc
bsf PORTD,0 ; un 1 lógico al bit 0 del puertoD
movf PORTA,w
subwf interruptor
btfss STATUS,2 ; ++++ si el estado cambio llama al otro grupo de organismo ++++
; ++++ sino se toma unos segundos encendido antes de cambiar a su estado futuro ++++
goto generacion_1A ; ++++ no me interesa que retorne a la siguiente línea +++++
call busy_waiting ; espera 5 segundos antesde cambiar
goto buscar_newgen
;+++++++++++++++++++++++chequeo vecinos del bit 0 del puerto D+++++++++++++++++++
buscar_newgen
movlw b’00000000′
movwf contador_ledon ; inicializo contador
btfss PORTB,0
btfsc PORTB,0
incf contador_ledon
btfss PORTB,1
btfsc PORTB,1
incf contador_ledon
btfss PORTB,3
btfsc PORTB,3
incf contador_ledon
btfss PORTD,1
btfsc PORTD,1
incf contador_ledon
btfss PORTD,3
btfsc PORTD,3
incf contador_ledon
btfss PORTC,0
btfsc PORTC,0
incf contador_ledon
btfss PORTC,1
btfsc PORTC,1
incf contador_ledon
btfss PORTC,3
btfsc PORTC,3
incf contador_ledon
;++++++++++++++++++++++++++++++fin chequeo +++++++++++++++++++++++
;+++++++++++++si el contador vale 2 deja el bit prendido++++++++
movlw b’00000000′
movwf auxD
movf contador_ledon,w
movwf aux
movlw b’00000010′
subwf aux,w
btfss STATUS,2 ;++++si no da 2 ve cuanto vale contador++++
goto tresD0 ;++++ ++++
btfsc PORTD,0 ;+++creo q resuelvo el problema, bueh a dormir 3 horas y luego seguir, mi hallaca que me la guerden ++++++
bsf auxD,0 ; ++++si contador vale 2 deja el led prendido++++
goto bit1D
tresD0
movf contador_ledon,w
movwf aux
movlw b’00000011′
subwf aux,w
btfss STATUS,2 ;++++ si el contador vale 3 deja el led prendido ++++
goto ceroD0 ;++++ sino lo apaga ++++
bsf auxD,0
goto bit1D
ceroD0
bcf auxD,0
goto bit1D
bit1D ;+++++++++++++++++++++++chequeo vecinos del bit 1 del puerto D+++++++++++++++++++
movlw b’00000000′
movwf contador_ledon ; inicializo contador
btfss PORTB,0
btfsc PORTB,0
incf contador_ledon
btfss PORTB,1
btfsc PORTB,1
incf contador_ledon
btfss PORTB,2
btfsc PORTB,2
incf contador_ledon
btfss PORTD,0
btfsc PORTD,0
incf contador_ledon
btfss PORTD,2
btfsc PORTD,2
incf contador_ledon
btfss PORTC,0
btfsc PORTC,0
incf contador_ledon
btfss PORTC,1
btfsc PORTC,1
incf contador_ledon
btfss PORTC,2
btfsc PORTC,2
incf contador_ledon
;++++ igual fin chequeo++++
movf contador_ledon,w
movwf aux
movlw b’00000010′
subwf aux,w
btfss STATUS,2 ;++++si no da 2 ve cuanto vale contador++++
goto tresD1 ;++++ ++++
btfsc PORTD,1;++++ si hay un cero en el bit y el contador da 2 no hagas nada ve al otro, pero si hay un 1 en el bit mantenlo
bsf auxD,1 ; ++++si contador vale 2 deja el led prendido++++
goto bit2D
tresD1
movf contador_ledon,w
movwf aux
movlw b’00000011′
subwf aux,w
btfss STATUS,2 ;++++ si el contador vale 3 deja el led prendido ++++
goto ceroD1 ;++++ sino lo apaga ++++
bsf auxD,1
goto bit2D
ceroD1
bcf auxD,1
goto bit2D
bit2D ;+++++++++++++++++++++++chequeo vecinos del bit 2 del puerto D+++++++++++++++++++
movlw b’00000000′
movwf contador_ledon ; inicializo contador
btfss PORTB,1
btfsc PORTB,1
incf contador_ledon
btfss PORTB,2
btfsc PORTB,2
incf contador_ledon
btfss PORTB,3
btfsc PORTB,3
incf contador_ledon
btfss PORTD,1
btfsc PORTD,1
incf contador_ledon
btfss PORTD,3
btfsc PORTD,3
incf contador_ledon
btfss PORTC,1
btfsc PORTC,1
incf contador_ledon
btfss PORTC,2
btfsc PORTC,2
incf contador_ledon
btfss PORTC,3
btfsc PORTC,3
incf contador_ledon
;++++ igual fin chequeo++++
movf contador_ledon,w
movwf aux
movlw b’00000010′
subwf aux,w
btfss STATUS,2 ;++++si no da 2 ve cuanto vale contador++++
goto tresD2 ;++++ ++++
btfsc PORTD,2
bsf auxD,2 ; ++++si contador vale 2 deja el led prendido++++
goto bit3D
tresD2
movf contador_ledon,w
movwf aux
movlw b’00000011′
subwf aux,w
btfss STATUS,2 ;++++ si el contador vale 3 deja el led prendido ++++
goto ceroD2 ;++++ sino lo apaga ++++
bsf auxD,2
goto bit3D
ceroD2
bcf auxD,2
goto bit3D
bit3D ;+++++++++++++++++++++++chequeo vecinos del bit 3 del puerto D+++++++++++++++++++
movlw b’00000000′
movwf contador_ledon ; inicializo contador
btfss PORTB,0
btfsc PORTB,0
incf contador_ledon
btfss PORTB,2
btfsc PORTB,2
incf contador_ledon
btfss PORTB,3
btfsc PORTB,3
incf contador_ledon
btfss PORTD,0
btfsc PORTD,0
incf contador_ledon
btfss PORTD,2
btfsc PORTD,2
incf contador_ledon
btfss PORTC,0
btfsc PORTC,0
incf contador_ledon
btfss PORTC,2
btfsc PORTC,2
incf contador_ledon
btfss PORTC,3
btfsc PORTC,3
incf contador_ledon
;++++ igual fin chequeo++++
movf contador_ledon,w
movwf aux
movlw b’00000010′
subwf aux,w
btfss STATUS,2 ;++++si no da 2 ve cuanto vale contador++++
goto tresD3 ;++++ ++++
btfsc PORTD,3
bsf auxD,3 ; ++++si contador vale 2 deja el led prendido++++
goto PrtC ;++++verificar puerto C ++++
tresD3
movf contador_ledon,w
movwf aux
movlw b’00000011′
subwf aux,w
btfss STATUS,2 ;++++ si el contador vale 3 deja el led prendido ++++
goto ceroD3 ;++++ sino lo apaga ++++
bsf auxD,3
goto PrtC ;++++ verifica…
ceroD3
bcf auxD,3
goto PrtC ;++++bueh verificar q pasa en los alrededores de cada bit en portC+++++
PrtC ; +++ bueh a seguir buscando bit en 1 ++++
movlw b’00000000′ ;+++++++++++++++++++++++ chequeo vecinos del bit 0 del puerto c +++++++++++++++++++
movwf contador_ledon ; inicializo contador
btfss PORTD,0
btfsc PORTD,0
incf contador_ledon
btfss PORTD,1
btfsc PORTD,1
incf contador_ledon
btfss PORTD,3
btfsc PORTD,3
incf contador_ledon
btfss PORTC,1
btfsc PORTC,1
incf contador_ledon
btfss PORTC,3
btfsc PORTC,3
incf contador_ledon
btfss PORTB,0
btfsc PORTB,0
incf contador_ledon
btfss PORTB,1
btfsc PORTB,1
incf contador_ledon
btfss PORTB,3
btfsc PORTB,3
incf contador_ledon
;++++++++++++++++++++++++++++++fin chequeo +++++++++++++++++++++++
;+++++++++++++si el contador vale 2 deja el bit prendido++++++++
movlw b’00000000′
movwf auxC
movf contador_ledon,w
movwf aux
movlw b’00000010′
subwf aux,w
btfss STATUS,2 ;++++si no da 2 ve cuanto vale contador++++
goto tresC0 ;++++ ++++
btfsc PORTC,0
bsf auxC,0 ; ++++si contador vale 2 deja el led prendido++++
goto bit1C
tresC0
movf contador_ledon,w
movwf aux
movlw b’00000011′
subwf aux,w
btfss STATUS,2 ;++++ si el contador vale 3 deja el led prendido ++++
goto ceroC0 ;++++ sino lo apaga ++++
bsf auxC,0
goto bit1C
ceroC0
bcf auxC,0
goto bit1C
bit1C ;+++++++++++++++++++++++chequeo vecinos del bit 1 del puerto C+++++++++++++++++++
movlw b’00000000′
movwf contador_ledon ; inicializo contador
btfss PORTD,0
btfsc PORTD,0
incf contador_ledon
btfss PORTD,1
btfsc PORTD,1
incf contador_ledon
btfss PORTD,2
btfsc PORTD,2
incf contador_ledon
btfss PORTC,0
btfsc PORTC,0
incf contador_ledon
btfss PORTC,2
btfsc PORTC,2
incf contador_ledon
btfss PORTB,0
btfsc PORTB,0
incf contador_ledon
btfss PORTB,1
btfsc PORTB,1
incf contador_ledon
btfss PORTB,2
btfsc PORTB,2
incf contador_ledon
;++++ igual fin chequeo++++
movf contador_ledon,w
movwf aux
movlw b’00000010′
subwf aux,w
btfss STATUS,2 ;++++si no da 2 ve cuanto vale contador++++
goto tresC1 ;++++ ++++
btfsc PORTC,1
bsf auxC,1 ; ++++si contador vale 2 deja el led prendido++++
goto bit2C
tresC1
movf contador_ledon,w
movwf aux
movlw b’00000011′
subwf aux,w
btfss STATUS,2 ;++++ si el contador vale 3 deja el led prendido ++++
goto ceroC1 ;++++ sino lo apaga ++++
bsf auxC,1
goto bit2C
ceroC1
bcf auxC,1
goto bit2C
bit2C ;+++++++++++++++++++++++chequeo vecinos del bit 2 del puerto C+++++++++++++++++++
movlw b’00000000′
movwf contador_ledon ; inicializo contador
btfss PORTD,1
btfsc PORTD,1
incf contador_ledon
btfss PORTD,2
btfsc PORTD,2
incf contador_ledon
btfss PORTD,3
btfsc PORTD,3
incf contador_ledon
btfss PORTC,1
btfsc PORTC,1
incf contador_ledon
btfss PORTC,3
btfsc PORTC,3
incf contador_ledon
btfss PORTB,1
btfsc PORTB,1
incf contador_ledon
btfss PORTB,2
btfsc PORTB,2
incf contador_ledon
btfss PORTB,3
btfsc PORTB,3
incf contador_ledon
;++++ igual fin chequeo++++
;+++ veo el resultado del contador para hacer las asiganciones +++
movf contador_ledon,w
movwf aux
movlw b’00000010′
subwf aux,w
btfss STATUS,2 ;++++si no da 2 ve cuanto vale contador++++
goto tresC2 ;++++ ++++
btfsc PORTC,2
bsf auxC,2 ; ++++si contador vale 2 deja el led prendido++++
goto bit3C
tresC2
movf contador_ledon,w
movwf aux
movlw b’00000011′
subwf aux,w
btfss STATUS,2 ;++++ si el contador vale 3 deja el led prendido ++++
goto ceroC2 ;++++ sino lo apaga ++++
bsf auxC,2
goto bit3C
ceroC2
bcf auxC,2
goto bit3C
bit3C ;+++++++++++++++++++++++chequeo vecinos del bit 3 del puerto D+++++++++++++++++++
movlw b’00000000′
movwf contador_ledon ; inicializo contador
btfss PORTD,0
btfsc PORTD,0
incf contador_ledon
btfss PORTD,2
btfsc PORTD,2
incf contador_ledon
btfss PORTD,3
btfsc PORTD,3
incf contador_ledon
btfss PORTC,0
btfsc PORTC,0
incf contador_ledon
btfss PORTC,2
btfsc PORTC,2
incf contador_ledon
btfss PORTB,0
btfsc PORTB,0
incf contador_ledon
btfss PORTB,2
btfsc PORTB,2
incf contador_ledon
btfss PORTB,3
btfsc PORTB,3
incf contador_ledon
;++++ igual fin chequeo++++
movf contador_ledon,w
movwf aux
movlw b’00000010′
subwf aux,w
btfss STATUS,2 ;++++si no da 2 ve cuanto vale contador++++
goto tresC3 ;++++ ++++
btfsc PORTC,3
bsf auxC,3 ; ++++si contador vale 2 deja el led prendido++++
goto PrtB ;++++verificar puerto C ++++
tresC3
movf contador_ledon,w
movwf aux
movlw b’00000011′
subwf aux,w
btfss STATUS,2 ;++++ si el contador vale 3 deja el led prendido ++++
goto ceroC3 ;++++ sino lo apaga ++++
bsf auxC,3
goto PrtB ;++++ verifica…. ++++
ceroC3
bcf auxC,3
goto PrtB ;++++ sigh X-D aqui vamos otra vez verificar q pasa en los alrededores de cada bit en portB+++++
PrtB; +++ aqui vamos de nuevo a seguir buscando bit en 1 ++++
movlw b’00000000′ ;+++++++++++++++++++++++ chequeo vecinos del bit 0 del puerto c +++++++++++++++++++
movwf contador_ledon ; inicializo contador
btfss PORTD,0
btfsc PORTD,0
incf contador_ledon
btfss PORTD,1
btfsc PORTD,1
incf contador_ledon
btfss PORTD,3
btfsc PORTD,3
incf contador_ledon
btfss PORTB,1
btfsc PORTB,1
incf contador_ledon
btfss PORTB,3
btfsc PORTB,3
incf contador_ledon
btfss PORTC,0
btfsc PORTC,0
incf contador_ledon
btfss PORTC,1
btfsc PORTC,1
incf contador_ledon
btfss PORTC,3
btfsc PORTC,3
incf contador_ledon
;++++++++++++++++++++++++++++++fin chequeo +++++++++++++++++++++++
;+++++++++++++si el contador vale 2 deja el bit prendido++++++++
movlw b’00000000′
movwf auxB
movf contador_ledon,w
movwf aux
movlw b’00000010′
subwf aux,w
btfss STATUS,2 ;++++si no da 2 ve cuanto vale contador++++
goto tresB0 ;++++ ++++
btfsc PORTB,0
bsf auxB,0 ; ++++si contador vale 2 deja el led prendido++++
goto bit1B
tresB0
movf contador_ledon,w
movwf aux
movlw b’00000011′
subwf aux,w
btfss STATUS,2 ;++++ si el contador vale 3 deja el led prendido ++++
goto ceroB0 ;++++ sino lo apaga ++++
bsf auxB,0
goto bit1B
ceroB0
bcf auxB,0
goto bit1B
bit1B ;+++++++++++++++++++++++chequeo vecinos del bit 1 del puerto C+++++++++++++++++++
movlw b’00000000′
movwf contador_ledon ; inicializo contador
btfss PORTD,0
btfsc PORTD,0
incf contador_ledon
btfss PORTD,1
btfsc PORTD,1
incf contador_ledon
btfss PORTD,2
btfsc PORTD,2
incf contador_ledon
btfss PORTB,0
btfsc PORTB,0
incf contador_ledon
btfss PORTB,2
btfsc PORTB,2
incf contador_ledon
btfss PORTC,0
btfsc PORTC,0
incf contador_ledon
btfss PORTC,1
btfsc PORTC,1
incf contador_ledon
btfss PORTC,2
btfsc PORTC,2
incf contador_ledon
;++++ igual fin chequeo++++
movf contador_ledon,w
movwf aux
movlw b’00000010′
subwf aux,w
btfss STATUS,2 ;++++si no da 2 ve cuanto vale contador++++
goto tresB1 ;++++ ++++
btfsc PORTB,1
bsf auxB,1 ; ++++si contador vale 2 deja el led prendido++++
goto bit2B
tresB1
movf contador_ledon,w
movwf aux
movlw b’00000011′
subwf aux,w
btfss STATUS,2 ;++++ si el contador vale 3 deja el led prendido ++++
goto ceroB1 ;++++ sino lo apaga ++++
bsf auxB,1
goto bit2B
ceroB1
bcf auxB,1
goto bit2B
bit2B ;+++++++++++++++++++++++chequeo vecinos del bit 2 del puerto C+++++++++++++++++++
movlw b’00000000′
movwf contador_ledon ; inicializo contador
btfss PORTD,1
btfsc PORTD,1
incf contador_ledon
btfss PORTD,2
btfsc PORTD,2
incf contador_ledon
btfss PORTD,3
btfsc PORTD,3
incf contador_ledon
btfss PORTB,1
btfsc PORTB,1
incf contador_ledon
btfss PORTB,3
btfsc PORTB,3
incf contador_ledon
btfss PORTC,1
btfsc PORTC,1
incf contador_ledon
btfss PORTC,2
btfsc PORTC,2
incf contador_ledon
btfss PORTC,3
btfsc PORTC,3
incf contador_ledon
;++++ igual fin chequeo++++
;+++ veo el resultado del contador para hacer las asiganciones +++
movf contador_ledon,w
movwf aux
movlw b’00000010′
subwf aux,w
btfss STATUS,2 ;++++si no da 2 ve cuanto vale contador++++
goto tresB2 ;++++ ++++
btfsc PORTB,2
bsf auxB,2 ; ++++si contador vale 2 deja el led prendido++++
goto bit3B
tresB2
movf contador_ledon,w
movwf aux
movlw b’00000011′
subwf aux,w
btfss STATUS,2 ;++++ si el contador vale 3 deja el led prendido ++++
goto ceroB2 ;++++ sino lo apaga ++++
bsf auxB,2
goto bit3B
ceroB2
bcf auxB,2
goto bit3B
bit3B ;+++++++++++++++++++++++chequeo vecinos del bit 3 del puerto D+++++++++++++++++++
movlw b’00000000′
movwf contador_ledon ; inicializo contador
btfss PORTD,0
btfsc PORTD,0
incf contador_ledon
btfss PORTD,2
btfsc PORTD,2
incf contador_ledon
btfss PORTD,3
btfsc PORTD,3
incf contador_ledon
btfss PORTB,0
btfsc PORTB,0
incf contador_ledon
btfss PORTB,2
btfsc PORTB,2
incf contador_ledon
btfss PORTC,0
btfsc PORTC,0
incf contador_ledon
btfss PORTC,2
btfsc PORTC,2
incf contador_ledon
btfss PORTC,3
btfsc PORTC,3
incf contador_ledon
;++++ igual fin chequeo++++
movf contador_ledon,w
movwf aux
movlw b’00000010′
subwf aux,w
btfss STATUS,2 ;++++si no da 2 ve cuanto vale contador++++
goto tresB3 ;++++ ++++
btfsc PORTB,3 ; igual reviso si es un 0 o un 1
bsf auxB,3 ; ++++si contador vale 2 deja el led prendido++++
goto newgen_B ;++++verificar puerto C ++++
tresB3
movf contador_ledon,w
movwf aux
movlw b’00000011′
subwf aux,w
btfss STATUS,2 ;++++ si el contador vale 3 deja el led prendido ++++
goto ceroB3 ;++++ sino lo apaga ++++
bsf auxB,3
goto newgen_B
ceroB3
bcf auxB,3
goto newgen_B
newgen_B
movf auxD,w
movwf PORTD
movf auxB,w
movwf PORTB
movf auxC,w
movwf PORTC
movf PORTA,w
xorwf interruptor
btfss STATUS,2 ; ++++ si el estado cambio llama al otro grupo de organismo ++++
; ++++ sino se toma unos segundos encendido antes de cambiar a su estado futuro ++++
goto generacion_1A ; ++++ no me interesa que retorne a la siguiente línea +++++
call busy_waiting ; espera 5 segundos antesde cambiar
goto buscar_newgen
;+++++++++++++++++++++++++++++++++++++++++++++++++++
busy_waiting ; La llamada “call” aporta 2 ciclos máquina.
movlw d’50’ ; Aporta 1 ciclo máquina. Este es el valor de “N”.
goto Retardo_1Decima
Retardo_1Decima
movwf R_ContC ; Aporta 1 ciclo máquina.
R1Decima_BucleExterno2
movlw d’100′ ; Aporta Nx1 ciclos máquina. Este es el valor de “M”.
movwf R_ContB ; Aporta Nx1 ciclos máquina.
R1Decima_BucleExterno
movlw d’249′ ; Aporta MxNx1 ciclos máquina. Este es el valor de “K”.
movwf R_ContA ; Aporta MxNx1 ciclos máquina.
R1Decima_BucleInterno
nop ; Aporta KxMxNx1 ciclos máquina.
decfsz R_ContA,F ; (K-1)xMxNx1 cm (si no salta) + MxNx2 cm (al saltar).
goto R1Decima_BucleInterno ; Aporta (K-1)xMxNx2 ciclos máquina.
decfsz R_ContB,F ; (M-1)xNx1 cm (cuando no salta) + Nx2 cm (al saltar).
goto R1Decima_BucleExterno ; Aporta (M-1)xNx2 ciclos máquina.
decfsz R_ContC,F ; (N-1)x1 cm (cuando no salta) + 2 cm (al saltar).
goto R1Decima_BucleExterno2 ; Aporta (N-1)x2 ciclos máquina.
return ; El salto del retorno ap
nop
END
Comment by McCollins— January 20, 2009 #
excelente explicación, muy clara y facil de enteder, gracias!!
Comment by ALEX— December 7, 2009 #