Autor Tema: (Ayuda) Multiplexacion de Displays con PIC18F4550  (Leído 2104 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Lyon

  • PIC10
  • *
  • Mensajes: 1
(Ayuda) Multiplexacion de Displays con PIC18F4550
« 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/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:
Código: [Seleccionar]
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.
« Última modificación: 17 de Octubre de 2018, 23:06:01 por Lyon »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:(Ayuda) Multiplexacion de Displays con PIC18F4550
« Respuesta #1 en: 18 de Octubre de 2018, 06:31:13 »
Citar
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

Desconectado AleSergi

  • PIC16
  • ***
  • Mensajes: 207
Re:(Ayuda) Multiplexacion de Displays con PIC18F4550
« Respuesta #2 en: 18 de Octubre de 2018, 10:36:30 »
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.