;=====================================================================================
; ENCABEZADOS
;=====================================================================================
LIST P=16F88, R=DEC ;ESPECIFICACIONES DEL MICRO
#INCLUDE <P16F88.INC> ; INCLUSION DE ARCHIVOS Y REGISTROS
__CONFIG _CONFIG1, _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _MCLR_OFF & _LVP_OFF & _INTRC_IO
__CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF
;=====================================================================================
; ETIQUETAS Y DECLARACION DE VARIABLES
; SE DEBE PONER EN CBLOCK EL INICIO DE LA MEMORIA RAM
; SEGUN EL MICROCONTROLADOR A USAR
;=====================================================================================
;SON 80 BYTES, BANCO 0
;VA DESDE LA POSICION DE MEMORIA H'20' HASTA H'6F'
CBLOCK H'20' ;SE PUEDE ESCRIBIR EN OCTAL O'23' EN BINARIO B'101' Y EN ASCII 'A'
BCD_Centenas
BCD_Decenas
BCD_Unidades
CONTADOR
DATO_A_ENVIAR
R1
R2
ENDC
#DEFINE Display PORTB
M EQU .65
N EQU .5
ORG 0x00
GOTO START
ORG 0x04 ;vector de interrupciones
GOTO Inter
;CONFIGURACION
BANKSEL PORTA ; SELECT BANK OF PORTA
CLRF PORTA ; INITIALIZE PORTA BY
BANKSEL OSCCON
MOVLW 0X60 ;RELOJ INTERNO 4MHZ
MOVWF OSCCON
BANKSEL ANSEL ; SELECT BANK OF ADCON1
MOVLW 0X00 ; CONFIGURE ALL PINS
MOVWF ANSEL ; AS DIGITAL INPUTS
BSF STATUS,RP0 ;PASO AL BANK 1
CLRF Display ;salida
BCF STATUS,RP0 ;PASO AL BANK 0
BANKSEL PORTA
MOVLW B'11110000'
MOVWF PORTA
MOVLW B'00100100'
MOVWF PORTB
BANKSEL TRISB
MOVLW B'00011000'
MOVWF TRISB
CLRF CONTADOR
START
BANKSEL PORTA
MOVF PORTA,W
MOVWF DATO_A_ENVIAR
CALL BIN_a_BCD
;--------------------PASO A DE BIN A BCD------------------------------
BIN_a_BCD
clrf BCD_Centenas ; Carga los registros con el resultado inicial.
clrf BCD_Decenas ; En principio las centenas y decenas a cero.
movwf BCD_Unidades ; Se carga el número binario a convertir.
BCD_Resta10
movlw .10 ; A las unidades se les va restando 10 en cada
subwf BCD_Unidades,W ; pasada. (W)=(BCD_Unidades) -10.
btfss STATUS,C ; ¿C = 1?, ¿(W) positivo?, ¿(BCD_Unidades)>=10?
goto BIN_BCD_Fin ; No, es menor de 10. Se acabó.
BCD_IncrementaDecenas
movwf BCD_Unidades ; Recupera lo que queda por restar.
incf BCD_Decenas,F ; Incrementa las decenas y comprueba si ha llegado
movlw .10 ; a 10. Lo hace mediante una resta.
subwf BCD_Decenas,W ; (W)=(BCD_Decenas)-10).
btfss STATUS,C ; ¿C = 1?, ¿(W) positivo?, ¿(BCD_Decenas)>=10?
goto BCD_Resta10 ; No. Vuelve a dar otra pasada, restándole 10 a
BCD_IncrementaCentenas ; las unidades.
clrf BCD_Decenas ; Pone a cero las decenas
incf BCD_Centenas,F ; e incrementa las centenas.
goto BCD_Resta10 ; Otra pasada: Resta 10 al número a convertir.
BIN_BCD_Fin
swapf BCD_Decenas,W ; En el nibble alto de (W) también las decenas.
addwf BCD_Unidades,W ; En el nibble bajo de (W) las unidades.
return ; Vuelve al programa principal.
;-------------------------------------------------------------------
;------------------ENVIO POR PUERTO SERIE------------------------------------
;********************************************************************************************
;Tx_Dato: Transmite vía serie el dato presente en el reg. W
TX_DATO BCF PIR1,TXIF ;Restaura el flag del transmisor
MOVWF TXREG ;Almacena el byte a transmitir
BSF STATUS,RP0
Tx_Dato_Wait BTFSS TXSTA,TRMT ;Byte transmitido ??
GOTO Tx_Dato_Wait ;No, esperar
BCF STATUS,RP0
return ;Si
;******************************************************************************************
;Tratamiento de la interrupción
Inter BTFSS PIR1,RCIF ;Ha sido interrupción en la recepción ??
retfie ;No, falsa interrupción
BCF PIR1,RCIF ;Si, restaurar el flag de interrupción
MOVLW .0 ;Lee el dato recibido
MOVWF Display ;Lo saca por el display unidades
MOVLW .0
MOVWF Display ;Lo saca por el display decenas
BSF PORTB,3
BSF PORTB,4
CALL Retardo_1ms
BCF PORTB,3
BCF PORTB,4
CALL TX_DATO ;Lo retransmite a modo de eco
retfie
;*******************************************************************************************
;Programa principal de transmision
STR
movlw b'11001111'
movwf OPTION_REG ;Preescaler de 128 asociado al WDT
movlw b'00100100'
movwf TXSTA ;TX en On, modo asíncrono con 8 bits y alta velocidad
movlw .25
movwf SPBRG ;9600 baudios con Fosc=4MHz
BSF PIE1,RCIE ;Habilita interrupción en la recepción
BCF STATUS,RP0 ;Selecciona banco 0
movlw b'10010000'
movwf RCSTA ;USART en On, recepción contínua
bsf INTCON,PEIE ;Activa interrupción de periféricos
bsf INTCON,GIE ;Activa interrupciones
;Loop
;AQUI TU PROGRAMA
;para enviar datos sólo carga W con el valor a enviar y llama a la subrutina Tx_Dato
MOVF DATO_A_ENVIAR
CALL TX_DATO
;Lo recibido te lo guarda automáticamente en el registro RCREG y te lo muestra por puerto B
;goto Loop
;-----------------------MULTIPLEXADOWACHOOOOOOO--------------
BANKSEL PORTB
MOVF BCD_Unidades,W
CALL SIETE_SEGMENTOS
MOVWF Display
BSF PORTB,3
CALL Retardo_1ms
BCF PORTB,3
MOVF BCD_Decenas,W
CALL SIETE_SEGMENTOS
MOVWF Display
BSF PORTB,4
CALL Retardo_1ms
BCF PORTB,4
;----------(SI TUVIERA OTRO O MÁS DISPLAYS LOS PONGO A PARTIR DE ACA:)--------------
MOVF BCD_Centenas,W
CALL SIETE_SEGMENTOS
MOVWF Display
BSF PORTB,6
CALL Retardo_1ms
BCF PORTB,6
RETURN
Retardo_1ms
MOVLW N
MOVWF R1
S2 MOVLW M
MOVWF R2
S1 DECFSZ R2
GOTO S1
DECFSZ R1
GOTO S2
RETURN
SIETE_SEGMENTOS ; TABLA
ADDWF PCL,F
RETLW B'11000000' ; EL CODIGO 7 SEGMENTOS PERTENECE AL NUMERO 0
RETLW B'11111001' ; EL CODIGO 7 SEGMENTOS PERTENECE AL NUMERO 1
RETLW B'10100100' ; EL CODIGO 7 SEGMENTOS PERTENECE AL NUMERO 2
RETLW B'10110000' ; EL CODIGO 7 SEGMENTOS PERTENECE AL NUMERO 3
RETLW B'10011001' ; EL CODIGO 7 SEGMENTOS PERTENECE AL NUMERO 4
RETLW B'10010010' ; EL CODIGO 7 SEGMENTOS PERTENECE AL NUMERO 5
RETLW B'10000011' ; EL CODIGO 7 SEGMENTOS PERTENECE AL NUMERO 6
RETLW B'11111000' ; EL CODIGO 7 SEGMENTOS PERTENECE AL NUMERO 7
RETLW B'10000000' ; EL CODIGO 7 SEGMENTOS PERTENECE AL NUMERO 8
RETLW B'10011000' ; EL CODIGO 7 SEGMENTOS PERTENECE AL NUMERO 9
END
1- Limitar para cuando este la "animacion" de los ceros que la funcion "Mostrar display" y/o las demas funciones se ejecuten cuando este en marcha la animacion esa.
2- Hacer el programa para los ceros, eso es todo.
Necesitaría un poco de ayuda con un programa que tengo que realizar para febrero (Para el colegio) de programación en lenguaje assemble
;========================PLANTILLA 16F88=========================================
;_CONFIG1
;_CONFIG2
;Configuration Byte 1 Options
;_CP_ALL ;All Program Memory Protected
;_CP_OFF ;No Code Protection
;_CCP1_RB0 CCP1 function on RB0
;_CCP1_RB3 CCP1 function on RB3
;_DEBUG_OFF In-Circuit Debugger disabled, RB6 and RB7 are general purpose I/O pins
;_DEBUG;_ON In-Circuit Debugger enabled, RB6 and RB7 are dedicated to the debugger
;_WRT_PROTECT;_OFF ;No program memory write protection
;_WRT_PROTECT_256 ;First 256 program memory protected
;_WRT_PROTECT_2048 ;First 2048 program memory protected
;_WRT_PROTECT_ALL ;All of program memory protected
;_CPD_ON Data EE Memory Code Protection Enabled
;_CPD_OFF Data EE Memory Code Protection Disabled
;_LVP_ON Low-Voltage Programming Enable Enabled
;_LVP_OFF Low-Voltage Programming Enable Disabled
;_BODEN_ON Brown Out Reset Detec Enabled
;_BODEN_OFF Brown Out Reset Detec Disabled
;_MCLR_ON Pin function is MCLR
;_MCLR_OFF Pin function is digital Input, MCLR internally tied to VDD
;_PWRTE_OFF 72 msec. Time Up Delay Off
;_PWRTE_ON 72 msec. Time Up Delay On
;_WDT_ON Watchdog Timer Enable bit On
;_WDT_OFF Watchdog Timer Enable bit Off
;_EXTRC_CLKOUT
;_EXTRC_IO ;Habilita el Clock Externo -
;_INTRC_CLKOUT
;_INTRC_IO ;Habilita el Oscilador Interno - Pines RA6 y RA7 activados
;_EXTCLK
;_HS_OSC HS oscillator
;_XT_OSC XT oscillator
;_LP_OSC LP oscillator
;Configuration Byte 2 Options
;_IESO_ON Internal External Switchover mode enabled
;_IESO_OFF Internal External Switchover mode disabled
;_FCMEN_ON Fail-Safe Clock Monitor enabled
;_FCMEN_OFF Fail-Safe Clock Monitor disabled
;=====================================================================================
;
;=====================================================================================
; ENCABEZADOS
;=====================================================================================
list p=16f88, r=dec ;especificaciones del micro
#include <p16f88.inc> ; inclusion de archivos y registros
__CONFIG _CONFIG1, _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _MCLR_OFF & _LVP_OFF & _INTRC_IO
__CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF
;=====================================================================================
; ETIQUETAS y Declaracion de Variables
; se debe poner en CBLOCK el inicio de la memoria RAM
; segun el Microcontrolador a usar
;=====================================================================================
;son 80 BYTES, BANCO 0
;va desde la posicion de memoria H'20' hasta H'6F'
CBLOCK H'20' ;se puede escribir en octal O'23' en binario B'101' y en ASCII 'a'
d1
d2
d3
ENDC
;*** VARIABLES PARA TODOS LOS BANCOS ***
; son 16 bytes en Bank0/1/2/3
;*******************************************
CBLOCK H'70' ;van desde H'70' hasta H'7F'
;son Variables usadas en la subrutina INTERRUPCION
W_TEMP, STATUS_TEMP
FSR_TEMP, PCLATH_TEMP
DATO_A_ENVIAR
UNIDADES
DECENAS
CONTADOR_DISPLAYS
FLAG
;BCDH
;BCDL
ENDC
;BANCO 1 -- son 80 BYTES, desde H'A0' hasta H'EF'
;y luego vienen 16 Bytes compartidos desde H'F0' hasta H'FF'
CBLOCK H'A0'
ENDC
;BANCO 2 son 80 BYTES, desde H'110' hasta H'16F'
;y luego vienen 16 Bytes compartidos desde H'170' hasta H'17F'
CBLOCK H'110'
ENDC
;BANCO 3 son 80 BYTES, desde H'190' hasta H'1EF'
;y luego vienen 16 Bytes compartidos desde H'1F0' hasta H'1FF'
CBLOCK H'190'
ENDC
;
;PROGRAMA DE TESTEO DE PICS INVIERTE EL ESTADO DE PORTB
;SEGUN SE PULSE RA0 (TIENE UN DELAY DE 100ms POR LO MALO DE LOS PULSADORES)
;org 0x000
; goto INICIA
org 0x00
NOP
NOP
GOTO CONFIGURACION
org 0x04
GOTO INTERRUPCION
CONFIGURACION ; Aca configuro todo (puertos, timers, inicializo todas las variables a 00 o el valor que tengan, cargo valor de timer y activo interrupciones al ultimo )
BANKSEL PORTA ; SELECT BANK OF PORTA
CLRF PORTA ; INITIALIZE PORTA BY
BANKSEL OSCCON
MOVLW 0X60 ;RELOJ INTERNO 4MHZ
MOVWF OSCCON
BANKSEL ANSEL ; SELECT BANK OF ADCON1
MOVLW 0X00 ; CONFIGURE ALL PINS
MOVWF ANSEL ; AS DIGITAL INPUTS
BANKSEL TRISA
MOVLW 0X0F ; VALUE USED TO
MOVWF TRISA ; SET RA<7:0> AS INPUTS
BANKSEL TRISB
CLRF TRISB
BANKSEL PORTA
CLRF INTCON
CALL TIMER
BANKSEL DECENAS
MOVLW .78
MOVWF CONTADOR_DISPLAYS
CLRF PORTB
MOVLW .0
MOVWF DECENAS
MOVLW .0
MOVWF UNIDADES
CLRF FLAG
BANKSEL OSCCON
MOVLW 0X60 ;RELOJ INTERNO 4MHZ
MOVWF OSCCON
BANKSEL PORTA ; BANK0
MOVLW B'00001111' ;entradas y salidas
MOVWF PORTA
MOVLW B'11000000'
MOVWF PORTB
BANKSEL TRISA ; BANK1
MOVLW B'00001111' ;entradas y salidas
MOVWF TRISA
MOVLW B'11100100'
MOVWF TRISB
MOVLW B'00000000'
MOVWF ANSEL ; PORTA INPUTS = DIGITAL NOT ANALOG
;
; BAUD RATE SETTINGS
;
; BAUD VALUES WITH BRGH = 0
; ((20000000/9600)/64)-1 = 32
; MOVLW D'207' ; 1200 BAUD @ 16 MHZ FOSC +0.16 ERR
; MOVLW D'103' ; 2400 BAUD @ 16 MHZ FOSC +0.16 ERR
; MOVLW D'25' ; 9600 BAUD @ 16 MHZ FOSC +0.16 ERR
; MOVLW D'12' ; 19200 BAUD @ 16 MHZ FOSC +0.16 ERR
; MOVLW D'255' ; 1200 BAUD @ 20 MHZ FOSC +1.73 ERR
; MOVLW D'129' ; 2400 BAUD @ 20 MHZ FOSC +0.16 ERR
; MOVLW D'32' ; 9600 BAUD @ 20 MHZ FOSC -1.36 ERR
; MOVLW D'15' ; 19200 BAUD @ 20 MHZ FOSC +1.73 ERR
; BAUD VALUES WITH BRGH = 1
; ((20000000/9600)/16)-1 = 32
MOVLW D'25' ; 9600 BAUD @ 20 MHZ FOSC +0.16 ERR
MOVWF SPBRG
MOVLW B'00100100' ; BRGH = 1
MOVWF TXSTA ; ENABLE ASYNC TRANSMISSION, SET BRGH
BANKSEL RCSTA ; BANK0
MOVLW B'10010000'
MOVWF RCSTA ; ENABLE ASYNC RECEPTION
MOVF RCREG,W
MOVF RCREG,W
MOVF RCREG,W ; FLUSH RECEIVE BUFFER
TIMER
BANKSEL OPTION_REG
MOVLW B'00000110'
MOVWF OPTION_REG
BCF INTCON,6 ;INT EXTERNAS
BSF INTCON,5 ;TMR0
BCF INTCON,4 ;INT RB0
BCF INTCON,3 ;INT RB4-RB7
BCF INTCON,1 ;BANDERA RB0
BCF INTCON,0 ;BANDERA RB4-RB7
BCF INTCON,2 ;BANDERA TMROIF
BSF INTCON,7 ;INT GENERAL
MOVLW D'217'
BANKSEL TMR0
MOVWF TMR0
RETURN
GOTO MAIN
;******COMIENZO DE INTERRUPCION********
INTERRUPCION
;guardo contexto
SWAPF STATUS, W ;Swap status to be saved into W
CLRF STATUS ;bank 0, regardless of current bank, Clears IRP,RP1,RP0
MOVWF STATUS_TEMP ;Save status to bank zero STATUS_TEMP register
MOVF PCLATH, W ;Only required if using page 1
MOVWF PCLATH_TEMP ;Save PCLATH into W
CLRF PCLATH ;Page zero, regardless of current page
CLRF PORTB
;--------------------------------------------------------------------------
BTFSC PIR1,RCIF ; Pregunto por si llego algo en la UART
GOTO int_uart
BTFSS INTCON,TMR0IF ; Pregunto si la interrupcion fue del timer
GOTO salir_int ; Aca podria seguir agregando por eso pregunte arriba, y puse el GOTO, sino no hacia flata pregunta si era lo unico 2 que estaba activo
DECF CONTADOR_DISPLAYS ;Implemento contador por si es muy corta la interrupcion y para hacerla mas larga ( es decir contar la cantidad de interrupciones )
BTFSS STATUS,Z
GOTO salir_int
BSF FLAG,1 ; mi flag al pasar X veces por aca habilitando que se muestre
MOVLW .217 ; Recargo mi temporizador
MOVWF TMR0
MOVLW .78 ; Recargo mi contador
MOVWF CONTADOR_DISPLAYS
BCF INTCON,TMR0IF
GOTO salir_int
int_uart
BSF FLAG,0 ; mi flag de que llego algo por la UART
MOVF RCREG ; Limpio el buffer de lectura
MOVF RCREG ; Limpio el buffer de lectura
MOVF RCREG ; Limpio el buffer de lectura, 3 por que es posible tener 2 en la FIFO + 1 en el shift register, al vaciar la FIFO se pone a 0 RCIF
salir_int
;devuelvo el contexto------------------------------------
BCF INTCON,TMR0IF
MOVLW .217
MOVWF TMR0
MOVF PCLATH_TEMP, W ;Restore PCLATH;
MOVWF PCLATH ;Move W into PCLATH
SWAPF STATUS_TEMP, W ;Swap STATUS_TEMP register into W
;(sets bank to original state)
MOVWF STATUS ;Move W into STATUS register
SWAPF W_TEMP, F ;Swap W_TEMP
SWAPF W_TEMP, W ;Swap W_TEMP into W
RETFIE
;******FIN DE INTERRUPCION********
;******COMIENZO DE PROGRAMA PRINCIPAL********
MAIN
CALL TOMAR_DATOS
CALL ENVIAR
CALL MOSTRAR_DISPLAYS
CALL ANIMACION
GOTO MAIN
;-------------------------------------------------------------------------------
; *************** Toma de datos y conversion a BCD ********************
;
; Registro de entrada: PORTA 3:0
; Registros de salida: dato original: DATO_A_ENVIAR , BCD: UNIDADES, DECENAS
TOMAR_DATOS
BANKSEL PORTA
MOVF PORTA,W ;supongo que esta en el porta el dato en el nibble bajo
ANDLW 0x0F ; solo dejo pasar el nibble bajo
MOVWF DATO_A_ENVIAR ; lo guardo en DATO_A_ENVIAR asi las demas subrutinas pueden usar el valor original que se tomo
addlw .256-.10 ; Procedo a pasarlo a BCD
BTFSC STATUS,C
addlw .6
addlw -(.256-.10) ; Final del paso a BCD
MOVWF UNIDADES ; Utilizo al registro como un registro temporal. UNIDADES = decenas:unidades
SWAPF UNIDADES,W ; Cambio de lugar los nibbles W = unidades:decenas
ANDLW 0x0F ; Elimino las unidades en W, me quedan las decenas ... W = 0:decenas
MOVWF DECENAS ; Guardo las decenas
MOVF UNIDADES,W ; Vuelvo a cargar todo el resultado del BCD -> decenas:unidades
ANDLW 0x0F ; Elimino las decenas W = 0:unidades
MOVWF UNIDADES ; Guardo las unidades
RETURN
; *************** Realiza multiplexado en los displays ********************
;
; Registro de entrada: FLAG,2 (flag de displays) , FLAG,1(flag de tiempo), DECENAS y UNIDADES
; Registros de salida: PORTB 3:0 bits BCD al 4511, PORTB,6 catodo_unidades y PORTB,7 catodo_decenas
MOSTRAR_DISPLAYS
BANKSEL PORTA
BTFSC FLAG,2 ; Con este indico que display estoy mostrando, si esta en 1 significa que es mi 2do display
GOTO display2
display1
BTFSS FLAG,1 ; Espero hasta que pase el tiempo se ejecute la interrupcion y me habilite la flag sino sigo saliendo
RETURN
BCF PORTB,6 ; apago catodo_unidades
MOVF DECENAS,W
MOVWF PORTB ; Aca supongo que todo lo demas que no es dato esta en 0
BSF PORTB,7 ; enciendo mi diplay de decenas
BSF FLAG,2 ; Activo el flag para que pase al otro display ( 2 )
BCF FLAG,1 ; Desactivo el flag del timer
RETURN
display2
BTFSS FLAG,1
RETURN
BCF PORTB,7 ; apago catodo_decenas
MOVF UNIDADES,W
MOVWF PORTB ; Aca supongo que todo lo demas que no es dato esta en 0
BSF PORTB,6 ; activo catodo_unidades
BCF FLAG,2 ; Activo el flag para que pase al otro display ( 1 )
BCF FLAG,1 ; Desactivo el flag del timer
RETURN
; *************** Envia datos por la UART ********************
;
; Registro de entrada: DATOS_A_ENVIAR
; Registros de salida: Ninguno
ENVIAR
;Aca me fijo si es de 0 a 9 asi le sumo 0x30 ('0') o si es una A a F asi le sumo una 'A' a DATO_A_ENVIAR
BANKSEL TXSTA
BTFSS TXSTA,TRMT ; Pregunto por si esta libre el USART para mandar otro dato
RETURN
BANKSEL PORTA
MOVF DATO_A_ENVIAR,W
ANDLW 0x0F ; Limito a 15 aunque ya lo hice en tomar_datos
SUBLW .9
BTFSC STATUS,C ; Si esta en 0 es negativo, es decir 9 - DATO_A_ENVIAR = negativo o 9 < DATO_A_ENVIAR , apartir de 10 se pondria C = 1
GOTO SUMO30
SUMOA ; el dato no es cero por lo tanto sumo A
MOVF DATO_A_ENVIAR,W
ADDLW .55 ; 'A' - 10
MOVWF TXREG ;Cargo el valor asi se envia
RETURN
SUMO30 ; el dato que llega es 0 entonces sumo 0x30 a dato a enviar
MOVF DATO_A_ENVIAR,W
ADDLW 0x30
MOVWF TXREG ;Cargo el valor asi se envia
RETURN
; *************** Enia datos por la UART ********************
;
; Registro de entrada: FLAG,1 (flag de tiempo) y FLAG,0 (indicador de que algo llego)
; Registros de salida: Ninguno
ANIMACION
BTFSS FLAG,0 ;Pregunto si algo llego, sino no hago nada.
RETURN
CLRF FLAG
MOVLW .0
MOVWF UNIDADES
MOVLW .0
MOVWF DECENAS
GOTO MULTI
MULTI
BTFSS CONTADOR_DISPLAYS,0
GOTO DISP2
GOTO DISP1
DISP1
BANKSEL UNIDADES
MOVF UNIDADES,0
BANKSEL PORTB
MOVWF PORTB
MOVLW B'00000010'
MOVWF CONTADOR_DISPLAYS
BSF PORTB,7
RETURN
DISP2
BANKSEL DECENAS
MOVF DECENAS,0
BANKSEL PORTB
MOVWF PORTB
MOVLW B'00000001'
MOVWF CONTADOR_DISPLAYS
BSF PORTB,6
BCF FLAG,0
RETURN
ENDEl mensaje/error que me tira dice así: [PIC16 CORE] PC=0x0053. Stack underflow executing RETURN instruction.
Sinceramente te pido disculpas :cry: assembler es el lenguaje que más me va a costar aprender bien y para esta materia que me tengo que sacar sabiendo el lenguaje sino a fin de año no tengo mi título.
MOSTRAR_DISPLAYS
BANKSEL PORTA
BTFSC FLAG,2 ; Con este indico que display estoy mostrando, si esta en 1 significa que es mi 2do display
GOTO display2
display1
BTFSS FLAG,1 ; Espero hasta que pase el tiempo se ejecute la interrupcion y me habilite la flag sino sigo saliendo
RETURN
BCF PORTB,6 ; apago catodo_unidades
MOVF DECENAS,W
MOVWF PORTB ; Aca supongo que todo lo demas que no es dato esta en 0
BSF PORTB,7 ; Prendo mi diplay de decenas
BSF FLAG,2 ; Activo el flag para que pase al otro display ( 2 )
BCF FLAG,1 ; Desactivo el flag del timer
RETURN
display2
BTFSS FLAG,1
RETURN
BCF PORTB,7 ; apago catodo_decenas
MOVF UNIDADES,W
MOVWF PORTB ; Aca supongo que todo lo demas que no es dato esta en 0
BSF PORTB,6 ; activo catodo_unidades
BCF FLAG,2 ; Activo el flag para que pase al otro display ( 1 )
BCF FLAG,1 ; Desactivo el flag del timer
RETURN
Por ahora solo ese es mi problema porque hice solo la parte de cambiar de bin a bcd y anda, la parte de enviar por puerto serie también anda, también lo muestra pero no como necesito