TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: Lyon en 17 de Octubre de 2018, 22:55:23
-
Buenas noches,
Ante todo, gracias por permitirme ser parte de este foro(1er post jeje), y el día de hoy hago este post debido a que necesito ayuda respecto a un "proyecto" que estoy haciendo en el PIC18f4550. He programado mi pic para que muestre el numero que deseo en 6 Display, y con otro puerto del pic "escojer" que displays son los que quiero que se activen. Sí funciona, pero lo que no logro resolver es como hacer que los display se actualizen tan rapido para que el ojo humano no lo distinga. Cuando uso retardos lentos, de 100ms o por ahi, funciona bien pero se logra ver los numeros uno por uno, pero al reducir el retardo de actualizacion a 20ms o menos, el proteus me da el warning “Simulation is not running in real time due to excessive CPU load.” y la simulación corre muy lenta (mostrando nuevamente como los display se activan uno por uno) aunque el "Counter timer" despues de 1 segundo de simulacion efectivamente me muestra que los display se actualizan a la velocidad que quiero. Adjunto fotos:
(https://ibb.co/cvFLFf)https://ibb.co/cvFLFf (https://ibb.co/cvFLFf)
(https://ibb.co/cAvy1L)https://ibb.co/cAvy1L (https://ibb.co/cAvy1L)
Mi duda es la siguiente: Ese warning se da debido a que el proteus no logra simularlo pero en la vida real no habría problema alguno? O creen que puede ser algo en mi codigo que causa esa sobrecarga en el CPU y que en la vida real de todas formas fallaría
Adjunto mi codigo:
list p=18f4550 ;Modelo del microcontrolador
#include<p18f4550.inc> ;Llamo a la librería de nombre de los regs
;Zona de los bits de configuración
CONFIG PLLDIV = 5 ; PLL Prescaler Divide by 5 (20 MHz/5 = 4 MHZ)
CONFIG CPUDIV = OSC4_PLL6 ; System Clock Postscaler (20 MHz/4 = 5 MHz)
CONFIG USBDIV = 2 ; USB Clock Full-Speed (96 MHz/2 = 48 MHz)
CONFIG FOSC = HS ; Oscillator Selection bits (HS oscillator)
CONFIG PWRT = ON ; Power-up Timer Enable bit (PWRT enabled)
CONFIG BOR = OFF ; Brown-out Reset disabled
CONFIG BORV = 3 ; Brown-out Reset Voltage (Minimum 2.05V)
CONFIG WDT = OFF ; Watchdog Timer disabled
CONFIG CCP2MX = OFF ; CCP2 MUX bit (CCP2 is multiplexed with RB3)
CONFIG PBADEN = OFF ; PORTB A/D (PORTB<4:0> configured as digital I/O)
CONFIG MCLRE = ON ; MCLR Pin Enable bit (MCLR pin enabled)
CONFIG STVREN = ON ; Stack Full/Underflow will cause Reset
CONFIG LVP = OFF ; Single-Supply ICSP disabled
;Declaramos las variables a partir de la dirección 0x30
CBLOCK 0x30
conta1
conta2
conta3
limite1
limite2
limite3
X1
X2
X3
;
ENDC
;*******************************************************************************
; Reset Vector
;*******************************************************************************
ORG 0x0000
GOTO MAIN
;*******************************************************************************
; MAIN PROGRAM
;*******************************************************************************
ORG 0x0020
MAIN:
MOVLW 0x0F
MOVWF ADCON1
SETF TRISA
MOVLW 0X00
MOVWF TRISB
MOVWF TRISD
MOVLW h'30'
MOVWF conta1
MOVWF conta2
MOVWF conta3
MOVWF LATB
MOVLW h'2F'
MOVWF limite1
MOVWF limite2
MOVWF limite3
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
rest11 MOVF conta1,0
MOVWF LATB;;;
MOVLW b'00000001'
MOVWF LATD
MOVLW .1
CALL retardo
CLRF LATD
BTFSS PORTA,0,0
goto rebote1
goto rest21
rest12 MOVF limite1,0
CPFSEQ conta1
GOTO sigue11
GOTO dig1
sigue11 MOVLW 0xF9
CPFSEQ conta1
GOTO sigue12
GOTO cero1
sigue12
;MOVF conta1,0
;MOVWF LATB;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
rest21
MOVF conta2,0
MOVWF LATB;;;
MOVLW b'00000010'
MOVWF LATD
MOVLW .1
CALL retardo
CLRF LATD
BTFSS PORTA,1,0
goto rebote2
goto rest31
rest22 MOVF limite2,0
CPFSEQ conta2
GOTO sigue21
GOTO dig2
sigue21 MOVLW 0xF9
CPFSEQ conta2
GOTO sigue22
GOTO cero2
sigue22 ;MOVF conta2,0
;MOVWF LATB;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
rest31
MOVF conta3,0
MOVWF LATB;;;
MOVLW b'00000100'
MOVWF LATD
MOVLW .1
CALL retardo
CLRF LATD
BTFSS PORTA,5,0
goto rebote3
goto rest11
rest32 MOVF limite3,0
CPFSEQ conta3
GOTO sigue31
GOTO dig3
sigue31 MOVLW 0xF9
CPFSEQ conta3
GOTO sigue32
GOTO cero3
sigue32
;MOVF conta3,0
;MOVWF LATB;;;
goto rest11
prueba SETF LATB
goto prueba
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
rebote1 BTFSS PORTA,0,0
GOTO rebote1
DECF conta1
goto rest12
dig1 MOVLW 0x0010
SUBWF limite1
MOVLW d'6'
SUBWF conta1
goto sigue11
cero1 MOVLW h'30'
MOVWF conta1
MOVLW h'2F'
MOVWF limite1
goto sigue12
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
rebote2 BTFSS PORTA,1,0
GOTO rebote2
DECF conta2
goto rest22
dig2 MOVLW 0x0010
SUBWF limite2
MOVLW d'6'
SUBWF conta2
goto sigue21
cero2 MOVLW h'30'
MOVWF conta2
MOVLW h'2F'
MOVWF limite2
goto sigue22
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
rebote3 BTFSS PORTA,5,0
GOTO rebote3
DECF conta3
goto rest32
dig3 MOVLW 0x0010
SUBWF limite3
MOVLW d'6'
SUBWF conta3
goto sigue31
cero3 MOVLW h'30'
MOVWF conta3
MOVLW h'2F'
MOVWF limite3
goto sigue32
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
retardo MOVWF X1
LX1 MOVLW .1
MOVWF X2
LX2 MOVLW .250
MOVWF X3
LX3 NOP
NOP
DECFSZ X3,1
GOTO LX3
DECFSZ X2,1
GOTO LX2
DECFSZ X1,1
GOTO LX1
RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
END
Disculpen si hay "malas costumbres" en el código, apenas llevo una semana en esto de los microcontroladores y en assembler. Muchas gracias por su tiempo, tengan ustedes un buen día.
-
Mi duda es la siguiente: Ese warning se da debido a que el proteus no logra simularlo pero en la vida real no habría problema alguno? O creen que puede ser algo en mi codigo que causa esa sobrecarga en el CPU y que en la vida real de todas formas fallaría
Si quisieras verlo continuo en el Proteus entonces deberias quitar los delays.
Si quisieras hacerlo para probarlo en un protoboard, considero que unos 20ms seria lo correcto.
El Proteus funciona para algunas cosas, y lo que me paso a mi es que al acostumbrarme tanto a la simulación del Proteus, el día que no lo tuve, no sabia que hacer. Entonces termine desinstalandolo por completo :D
-
Esos led display siete segmentos, suelo ponerlos con un tiempo de 6mS a cada uno, cuando son cuatro.
Simulando con el Proteus, nunca me corrieron a tiempo real, asi que directamente bajo muchísimo el tiempo de refresco, o empleo un 74hc595 por cada digito para el prototipado y simulación. En el circuito real lo dejo conmutando como dije al principio.
El tiempo de conmutación lo saco según parecen que "flotan" o no los dígitos,
Sabiendo que en el cine era de 25 a 30 fps, y con tasa doble, pues eran dos exposiciones por cada fotograma, andamos en 50, 60. Yo elijo 41, como para no coincidir con la frecuencia de red.
Entonces la cuenta me dice 1/(41*4)= 6097uSeg. y con ese número pongo un temporizador que dispara una interrupción y hace la conmutación de los dígitos en segundo plano y me olvido del asunto del display y me concentró en la tarea principal.