Autor Tema: PIC18F4550 y 4display a 7 segmentos- Ensamblador  (Leído 1252 veces)

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

Desconectado jefreyu12

  • PIC10
  • *
  • Mensajes: 11
PIC18F4550 y 4display a 7 segmentos- Ensamblador
« en: 29 de Abril de 2019, 14:02:32 »
Hola comunidad. Tengo un inconveniente que llevo tratando de solucionar ya hace un par de semanas y no he encontrado una solución a mi problema.
El problema es que estoy realizando una pequeña practica donde realizo un simple hola mundo que se pueda desplazar hacia la izquierda en el pic18f4550 y ya cuenta con los caracteres siendo pasados al display mi detalle es que hasta el dia de hoy no se como hacer ese desplazamiento manteniendo los valores que antes tenia sin que el display se apague o repita el mismo caracter que los demas displays. adjunto el codigo que ya he realizado y si alguien pudiera orientarme lo agradeceria mucho.
Adjunto una imagen del circuito que tengo ya:

https://1drv.ms/u/s!AqGT907LlTsahoUvflW6B-eLrdyCWQ

Código: ASM
  1. CONFIG FOSC = XT_XT
  2. list P = 18F4550
  3. INCLUDE <P18F4550.INC>
  4.  
  5. CBLOCK
  6. T1
  7. T2
  8. T3
  9. LETRAS
  10. DIGITOS
  11. endc
  12.  
  13. CONFIG WDT = OFF
  14. CONFIG MCLRE = ON
  15. #DEFINE display PORTD,0
  16.  
  17. ORG 0
  18.  
  19. clrf TRISB
  20. clrf TRISD
  21. clrf PORTB
  22. CLRF PORTD
  23. LETRAS.1 equ b'11001000' ; H
  24. LETRAS.2 equ b'10000001' ; O
  25. LETRAS.3 equ b'11110001' ; L
  26. LETRAS.4 equ b'10001000' ; A
  27.  
  28. LETRAS.5 equ b'11101010' ; M
  29. LETRAS.6 equ b'11000001' ; U
  30. LETRAS.7 equ b'10001001' ; N
  31. LETRAS.8 equ b'11000010' ; D
  32. LETRAS.9 equ b'10000001' ; O
  33.  
  34. DIGITOS.1 equ b'11110000'
  35. DIGITOS.2 equ b'11100000'
  36. DIGITOS.3 equ b'11010000'
  37. DIGITOS.4 equ b'11000000'
  38. DIGITOS.5 equ b'10110000'
  39. DIGITOS.6 equ b'10100000'
  40. DIGITOS.7 equ b'10010000'
  41. DIGITOS.8 equ b'10000000'
  42. DIGITOS.9 equ b'01110000'
  43. DIGITOS.10 equ b'01100000'
  44. DIGITOS.11 equ b'01010000'
  45. DIGITOS.12 equ b'01000000'
  46. DIGITOS.13 equ b'00110000'
  47. DIGITOS.14 equ b'00100000'
  48. DIGITOS.15 equ b'00010000'
  49. DIGITOS.16 equ b'00000000'
  50.  
  51.  
  52. inicio:
  53.  
  54.         movlw LETRAS.1;H
  55.         movwf PORTB
  56.         call retardo
  57.        
  58.         movlw LETRAS.2;O
  59.         movwf PORTB
  60.         call retardo
  61.        
  62.         movlw LETRAS.3;L
  63.         movwf PORTB
  64.         call retardo
  65.        
  66.         movlw LETRAS.4;A
  67.         movwf PORTB
  68.         call retardo
  69.        
  70.         movlw LETRAS.5;M
  71.         movwf PORTB
  72.         call retardo
  73.        
  74.         movlw LETRAS.6;U
  75.         movwf PORTB
  76.         call retardo
  77.        
  78.         movlw LETRAS.7;N
  79.         movwf PORTB
  80.         call retardo
  81.        
  82.         movlw LETRAS.8;D
  83.         movwf PORTB
  84.         call retardo
  85.        
  86.         movlw LETRAS.9;O
  87.         movwf PORTB
  88.         call retardo
  89.        
  90.         goto inicio
  91.        
  92. retardo: ; retardo de un segundo Formula Retardo = 10 x (100 x (1mS)) = 1000mS = 1 segundo
  93.        
  94.    movlw d'10'
  95.    movwf T3
  96.    movlw d'100'
  97.    movwf T2
  98.    movlw d'250'
  99.    movwf T1
  100.    nop
  101.    decfsz T1,F
  102.    goto $-.2
  103.    decfsz T2,F
  104.    goto $-.6
  105.    decfsz T3,F
  106.    goto $-.10
  107.    return
  108.  
  109. end
  110.  
« Última modificación: 29 de Abril de 2019, 14:27:13 por jefreyu12 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7390
Re:PIC18F4550 y 4display a 7 segmentos- Ensamblador
« Respuesta #1 en: 29 de Abril de 2019, 14:21:56 »
Necesitarias poner una imagen de como tenes conectados tus displays. Veo que envias todo al PORTB (que en el PIC18 deberia ser LATB) pero  hablas de multiples displays

Y segun tu programa  el funcionamiento parece ser a 1 solo display.

Muestra la H, espera
Muestra la O, espera
Muestra la L, espera

Entonces no entiendo porque afirmas:

Citar
no se como hacer ese desplazamiento manteniendo los valores que antes tenia sin que el display se apague o repita el mismo caracter que los demas displays.

Espero que se entienda mi duda... Tu codigo funciona, solo se apaga muy brevemente, y es para un display. Tu duda, ademas de decir que se apaga o queda el mismo caracter, habla sobre repetirse en varios displays..
« Última modificación: 29 de Abril de 2019, 14:28:02 por KILLERJC »

Desconectado jefreyu12

  • PIC10
  • *
  • Mensajes: 11
Re:PIC18F4550 y 4display a 7 segmentos- Ensamblador
« Respuesta #2 en: 29 de Abril de 2019, 14:27:49 »
Necesitarias poner una imagen de como tenes conectados tus displays. Veo que envias todo al PORTB (que en el PIC18 deberia ser LATB) pero  hablas de multiples displays

Recien ahora adjunte una imagen en onedrive para que se visualice

Desconectado jefreyu12

  • PIC10
  • *
  • Mensajes: 11
Re:PIC18F4550 y 4display a 7 segmentos- Ensamblador
« Respuesta #3 en: 29 de Abril de 2019, 14:39:52 »
Necesitarias poner una imagen de como tenes conectados tus displays. Veo que envias todo al PORTB (que en el PIC18 deberia ser LATB) pero  hablas de multiples displays

Y segun tu programa  el funcionamiento parece ser a 1 solo display.

Muestra la H, espera
Muestra la O, espera
Muestra la L, espera

Entonces no entiendo porque afirmas:

Citar
no se como hacer ese desplazamiento manteniendo los valores que antes tenia sin que el display se apague o repita el mismo caracter que los demas displays.

Espero que se entienda mi duda... Tu codigo funciona, solo se apaga muy brevemente, y es para un display. Tu duda, ademas de decir que se apaga o queda el mismo caracter, habla sobre repetirse en varios displays..



A lo mejor no me explique bien. si, ahora lo tengo para 1 display, es esa la parte que no logro superar, ya que necesito que haga algo como.
H display 1
O display 2
L display 3
A display 4
se limpia pantalla
y se va desplanzado para el
M
U
N
D
O
y asi infinitamente.
mi cuestion es no se como manipular un segundo port porque esa idea tenia que un port maneje los 7 segmentos y el otro el de los digitos, pero no me hallo al realizarlo solo consigo que se repita el mismo caracter en los 4 display

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7390
Re:PIC18F4550 y 4display a 7 segmentos- Ensamblador
« Respuesta #4 en: 29 de Abril de 2019, 14:45:08 »
Ahora se entiende...

Tu problema es que necesitas multiplexarlo... Si te fijas en tu imagen, a la derecha del display que dice 1234, esos son los comunes del display. Vos lo tenes unidos a todos, por lo tanto Todos se encuentran encendido al mismo tiempo. Vas a necesitar 4 pines, 1 para cada display.

Lo que debes hacer vos... por ahora, luego lo vamos complicando es

Apagar todo. Enviar la H, Encender el 1.
Apagar el 1. Enviar la O, Encender el 2.
Apagar el 2. Enviar la L, Encender el 3.
Apagar el 3. Enviar la A, Encender el 4.

Asi mostrarias la palabra HOLA, si pensas hacerlo en fisico, deberias agregar demoras y tambien transistores para manejar los comunes. En la simulacion del proteus si pones demoras no se ve bien.Proba hacer el programa que te cuento, y que eso sea el loop, vas a ver el cambio.

Como hacer para que "gire" el texto ya es otro tema aparte, primero entender esto y luego tratar de girarlo.

Desconectado jefreyu12

  • PIC10
  • *
  • Mensajes: 11
Re:PIC18F4550 y 4display a 7 segmentos- Ensamblador
« Respuesta #5 en: 29 de Abril de 2019, 15:03:26 »
Ahora se entiende...

Tu problema es que necesitas multiplexarlo... Si te fijas en tu imagen, a la derecha del display que dice 1234, esos son los comunes del display. Vos lo tenes unidos a todos, por lo tanto Todos se encuentran encendido al mismo tiempo. Vas a necesitar 4 pines, 1 para cada display.

Lo que debes hacer vos... por ahora, luego lo vamos complicando es

Apagar todo. Enviar la H, Encender el 1.
Apagar el 1. Enviar la O, Encender el 2.
Apagar el 2. Enviar la L, Encender el 3.
Apagar el 3. Enviar la A, Encender el 4.

Asi mostrarias la palabra HOLA, si pensas hacerlo en fisico, deberias agregar demoras y tambien transistores para manejar los comunes. En la simulacion del proteus si pones demoras no se ve bien.Proba hacer el programa que te cuento, y que eso sea el loop, vas a ver el cambio.

Como hacer para que "gire" el texto ya es otro tema aparte, primero entender esto y luego tratar de girarlo.

Muchas gracias, lo que comentaste ya lo consegui hacer,  mi duda en esta parte es como puedo mantener el texto sin necesidad de que se apague, a ver me explico.
H;1
O;2
l;3
A;4
Activar los 4 digitos cada uno con su respectiva letra y despues desplazarlas es decir algo asi.
HOLA MUNDO; al aparecer HOLA que la H desparezca hacia la izquierda y aparezca la letra M a la derecha en el lugar libre
Adjunto mi codigo ya modificado

Código: ASM
  1. CONFIG FOSC = XT_XT
  2. list P = 18F4550
  3. INCLUDE <P18F4550.INC>
  4. CBLOCK
  5. T1
  6. T2
  7. T3
  8. LETRAS
  9. DIGITOS
  10. endc
  11. CONFIG WDT = OFF
  12. CONFIG MCLRE = ON
  13. #DEFINE display PORTD,0
  14. ORG 0
  15. clrf TRISB
  16. clrf TRISD
  17. clrf PORTB
  18. CLRF PORTD
  19. LETRAS.1 equ b'11001000' ; H
  20. LETRAS.2 equ b'10000001' ; O
  21. LETRAS.3 equ b'11110001' ; L
  22. LETRAS.4 equ b'10001000' ; A
  23. LETRAS.5 equ b'11101010' ; M
  24. LETRAS.6 equ b'11000001' ; U
  25. LETRAS.7 equ b'10001001' ; N
  26. LETRAS.8 equ b'11000010' ; D
  27. LETRAS.9 equ b'10000001' ; O
  28.  
  29. DIGITOS.1 equ b'00000001' ;prende digito 1
  30. DIGITOS.2 equ b'00000010' ;prende digito 2
  31. DIGITOS.3 equ b'00000100' ;prende digito 3
  32. DIGITOS.4 equ b'00001000' ;prende digito 4
  33. inicio:
  34.  
  35.         movlw DIGITOS.1;prende digito 1
  36.         movwf PORTD
  37.         movlw LETRAS.1;H
  38.         movwf PORTB
  39.         call retardo
  40.         movlw DIGITOS.2; prende digito 2
  41.         movwf PORTD
  42.         movlw LETRAS.2;O
  43.         movwf PORTB
  44.         call retardo
  45.         movlw DIGITOS.3; prende digito 3
  46.         movwf PORTD
  47.         movlw LETRAS.3;L
  48.         movwf PORTB
  49.         call retardo
  50.         movlw DIGITOS.4; prende digito 4
  51.         movwf PORTD
  52.         movlw LETRAS.4;A
  53.         movwf PORTB
  54.         call retardo
  55.         movlw DIGITOS.1; prende digito 1
  56.         movwf PORTD
  57.         movlw LETRAS.5;M
  58.         movwf PORTB
  59.         call retardo
  60.         movlw DIGITOS.2; prende digito 2
  61.         movwf PORTD
  62.         movlw LETRAS.6;U
  63.         movwf PORTB
  64.         call retardo
  65.         movlw DIGITOS.3; prende digito 3
  66.         movwf PORTD
  67.         movlw LETRAS.7;N
  68.         movwf PORTB
  69.         call retardo
  70.         movlw DIGITOS.4; prende digito 4
  71.         movwf PORTD
  72.         movlw LETRAS.8;D
  73.         movwf PORTB
  74.         call retardo
  75.         movlw DIGITOS.1; prende digito 1
  76.         movwf PORTD
  77.         movlw LETRAS.9;O
  78.         movwf PORTB
  79.         call retardo
  80.        
  81.         goto inicio
  82.        
  83. retardo: ; retardo de un segundo Formula Retardo = 10 x (100 x (1mS)) = 1000mS = 1 segundo
  84.    movlw d'10'
  85.    movwf T3
  86.    movlw d'100'
  87.    movwf T2
  88.    movlw d'250'
  89.    movwf T1
  90.    nop
  91.    decfsz T1,F
  92.    goto $-.2
  93.    decfsz T2,F
  94.    goto $-.6
  95.    decfsz T3,F
  96.    goto $-.10
  97.    return
  98. end
  99.  

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7390
Re:PIC18F4550 y 4display a 7 segmentos- Ensamblador
« Respuesta #6 en: 29 de Abril de 2019, 15:49:47 »
Es que ahora se termina lo simple. Hay que buscar una forma de guardar el "HOLA MUNDO" en alguna parte y tratar de mostrarlo. ¿ Por que guardarlo? porque me permite que tenga una posicion de memoria, la cual yo vaya incrementando y mostrando los 4 caracteres desde esa posicion.

Por ejemplo comenzamos con "HOLA MUNDO" y nos situamos en la H.. Los 4 primeros serian "HOLA", despues de un tiempo procedo a incrementar la posicion de memoria y que apunte ahora a la "O" entonces los 4 primeros ahora serian "OLA " esta es la forma mas sencilla de pensarlo.

Primero tenes que ver como almacenar eso en la memoria de programa, en la RAM no tiene mucho sentido.
Para guardarlo en la memoria de programa tenes por ejemplo la directiva DB

Código: ASM
  1. my_hola DB b'11001000', b'10000001',b'11110001', ......... asi para todos los demas ,....         ; Aca tenes tu HOLA MUNDO
  2.  
Ya con eso guardamos nuestra palabra "HOLA MUNDO" dentro de la flash.. Ahora hay que usarla... Para eso tiene lo que se llama "tablas", yo debo apuntar con un puntero y acceder.

Código: ASM
  1. MOVLW UPPER(my_hola)
  2. MOVWF TBLPTRU
  3. MOVLW HIGH(my_hola)
  4. MOVWF TBLPTRH
  5. MOVLW LOW(my_hola)
  6. MOVWF TBLPTRL

Luego necesito leerlo, y esto lo puedo hacer con la instruccion TBLRD*, incrementaria 3 veces mas y mostraria, finalmente decrementaria 2.
Hasta aca nuevamente estamos mejor... El problema viene en que necesitamos hacer que termine... podrias poner un valor mas y que quede "HOLA MUNDO",0xFF, asi cuando se encuentre con un 0xFF deje de aumentar y comienze de nuevo.

Algo asi:

Código: ASM
  1. loop:
  2.    TBLRD*+
  3.    Apago todo
  4.    MOVFF TABLAT, PORTB
  5.    Enciendo 1
  6.    TBLRD*+
  7.    Apago 1
  8.    MOVFF TABLAT, PORTB
  9.    Enciendo 2
  10.    TBLRD*+
  11.    Apago 2
  12.    MOVFF TABLAT, PORTB
  13.    Enciendo 3
  14.    TBLRD*+
  15.    Apago 3
  16.    MOVFF TABLAT, PORTB
  17.    Enciendo 4
  18.    COMF TABLAT, W ; Reviso que le valor no sea 0xFF
  19.    BZ    VOLVER_A_EMPEZAR
  20.    MOVLW 3
  21.    SUBWF TBLPTRL ; Le resto 3
  22.    BNC loop ; Continuo si no tengo que arreglarlo
  23.    DECF TBLPTRH, F
  24.    BNC loop
  25.    DECF TBLPTRU, F
  26.    BRA loop

El codigo no esta probado, simplemente es para darte una orientacion, ni siquiera si reemplazas el pseudocodigo se si funciona exactamente, pero te va a dar una idea.

Desconectado jefreyu12

  • PIC10
  • *
  • Mensajes: 11
Re:PIC18F4550 y 4display a 7 segmentos- Ensamblador
« Respuesta #7 en: 29 de Abril de 2019, 16:12:50 »
Entiendo a grandes rasgos lo que me estas explicando, mi única duda con respecto a ese detalle es: al realizar la lectura de la tabla y el envio del dato , lo que sucede es se prende el display correspondiente y luego se apaga el display para dar paso al siguiente dato y encendido de display?

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7390
Re:PIC18F4550 y 4display a 7 segmentos- Ensamblador
« Respuesta #8 en: 29 de Abril de 2019, 16:57:27 »
Son 2 cosas aparte
El multiplexado es para poder mostrar en los 4 displays, tenes que cambiar display a display como lo hiciste con "HOLA",

la diferencia ahora es que cambia lo que vas a mostrar.

Para hacerlo mas simple.

Tu rutina de multiplexado podria tomar la memoria de 0x0000 y mostrar lo que posee ahi, asi hasta 0x0003 (los 3 display)
Luego cuando se repita por ejemplo unas 10 veces proecdes a cambiar lo que esta en 0x0000 a 0x0003 para mostrar otra cosa.. el multiplexado no cambia, sigue mostrando esos lugares.

Entonces tendrias 2 programas que se ejecutan en diferentes tiempos... Supongamos uno cada 20ms para el multiplexado y otro al pasar unas 25 veces ( cada 500ms ) pasa la letra.

Si se te complica hace lo que dije aca...

Crea un programa que muestre 4 posiciones de memoria. Y luego cada cierto tiempo, modificas esas memorias como si las estuvieras pasando.
« Última modificación: 29 de Abril de 2019, 17:06:23 por KILLERJC »

Desconectado remi04

  • PIC18
  • ****
  • Mensajes: 254
Re:PIC18F4550 y 4display a 7 segmentos- Ensamblador
« Respuesta #9 en: 30 de Abril de 2019, 04:55:00 »
Entiendo a grandes rasgos lo que me estas explicando, mi única duda con respecto a ese detalle es: al realizar la lectura de la tabla y el envio del dato , lo que sucede es se prende el display correspondiente y luego se apaga el display para dar paso al siguiente dato y encendido de display?

Yo diría más bien, que al realizar la lectura de la tabla apagues los 4 comunes primero. Realizas la lectura de la tabla y cambias los 4 valores por el siguiente “fotograma” y ahora vuelves al multiplexado y ya tienes los 4 encendidos con el nuevo fotograma. 

  En verdad no hace falta que apagues los 4 antes de leer la tabla y cambiar por que eso se realiza tan rápido que es imposible percibir a simple vista que un display se ha quedado “pillado” unos nS de más mientras se leía la tabla y se cambiaban los 4 valores de memoria para cada dígito.

Desconectado jefreyu12

  • PIC10
  • *
  • Mensajes: 11
Re:PIC18F4550 y 4display a 7 segmentos- Ensamblador
« Respuesta #10 en: 06 de Mayo de 2019, 23:39:33 »
Hola de nuevo, pues al final pude resolver mi problema no del modo mas eficiente pero lo resolví y me surgió otro ahora y es el de pasarlo a físico, realmente estoy usando la misma configuración que en proteus pero al momento de alimentar el pic simplemente no me funciona. No se si sabras sobre pasarlo a fisico

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7390
Re:PIC18F4550 y 4display a 7 segmentos- Ensamblador
« Respuesta #11 en: 07 de Mayo de 2019, 06:35:26 »
Hola de nuevo, pues al final pude resolver mi problema no del modo mas eficiente pero lo resolví y me surgió otro ahora y es el de pasarlo a físico, realmente estoy usando la misma configuración que en proteus pero al momento de alimentar el pic simplemente no me funciona. No se si sabras sobre pasarlo a fisico

Hay muchas cosas que diferencia que funcione en la simulacion y no en fisico. Lo que le falta mirando el circuito:
- No tiene resistencias para cada uno de los segmentos, asi limitar la corriente, debido a que el pin del PIC tiene un maximo, y todo el puerto tambien.
- Falta transistores para manejar los comunes, como dije necesitas manejar mas corriente de lo que puede el pin, en este caso todos los leds que estan encendidos en ese momento, por eso necesitas el transistor.
- En la simulacion funciona mejor si no posee delays en el multiplexado, ya que la simulacion va lenta. Pero en fisico, los delays son necesarios, sino no se veria casi nada en el display
- Siemrpe que tengas FUSES, intenta definirlos a todos, asi estas seguro de lo que debe hacer. La simulacion no lo tiene en cuenta a esto.

Desconectado remi04

  • PIC18
  • ****
  • Mensajes: 254
Re:PIC18F4550 y 4display a 7 segmentos- Ensamblador
« Respuesta #12 en: 07 de Mayo de 2019, 10:53:56 »
Te veo corriendo con el cazamoscas detrás del puerto RB7  :lol:.

  Los 4 comunes al mismo puerto, no se como no ha explotado el 4550 hasta en el proteus..

Desconectado jefreyu12

  • PIC10
  • *
  • Mensajes: 11
Re:PIC18F4550 y 4display a 7 segmentos- Ensamblador
« Respuesta #13 en: 07 de Mayo de 2019, 15:39:30 »
En base a lo que me comentaron ya realice las correcciones .
un detalle que me llamo la atencion es que estoy tuve que invertir el valor binario cuando deseo prender un digito, mas alla de eso fue el unico detalle que me llamo la atencion
Adjunto mi codigo final de como lo deje y una liga hacia como tengo ya el diseño del circuito:
https://1drv.ms/u/s!AqGT907LlTsahosgLe7ynqaJadZ9iQ
Código: ASM
  1. ;PROGRAMA HOLA MUNDO
  2. ;**************************
  3. list P = 18F4550
  4. INCLUDE <P18F4550.INC>
  5. ;****************************************
  6. ;Configuracion de FUSES
  7. CONFIG FOSC = HS
  8. CONFIG CPUDIV = OSC1_PLL2
  9. CONFIG PWRT = ON
  10. CONFIG BOR = OFF
  11. CONFIG WDT = OFF
  12. CONFIG LVP = OFF
  13. CONFIG PBADEN = OFF
  14. CONFIG MCLRE = ON
  15. CONFIG DEBUG = OFF
  16. CONFIG XINST = OFF
  17.  
  18. ;Otra opcion
  19. ;CONFIG FOSC = HS
  20. ;CONFIG CPUDIV = OSC1_PLL2
  21. ;CONFIG BOR = OFF
  22. ;CONFIG PWRT = ON
  23. ;CONFIG WDT = OFF
  24. ;CONFIG MCLRE = OFF
  25. ;CONFIG PBADEN = OFF
  26. ;CONFIG LVP = OFF
  27.  
  28. ;*****************************************
  29. ; VARIABLES
  30. CBLOCK
  31. T1
  32. T2
  33. T3
  34. LETRAS
  35. DIGITOS
  36. endc
  37. ;****************************************
  38. ;Comienzo del programa
  39. ORG 0
  40. ;BSF PLL, PLLDIV2,1
  41. ;BSF PLL, PLLDIV1,0
  42. ;BSF PLL, PLLDIV0,0
  43.  
  44. clrf TRISB
  45. clrf TRISD
  46. clrf PORTB
  47. CLRF PORTD
  48.  
  49. LETRAS.1 equ b'11001000' ; H b'00110111'
  50. LETRAS.2 equ b'10000001' ; O b'01111110'
  51. LETRAS.3 equ b'11110001' ; L b'00001110'
  52. LETRAS.4 equ b'10001000' ; A b'01110111'
  53. LETRAS.5 equ b'11101010' ; M b'00010101'
  54. LETRAS.6 equ b'11000001' ; U b'00111110'
  55. LETRAS.7 equ b'10001001' ; N b'01110110'
  56. LETRAS.8 equ b'11000010' ; D b'00111101'
  57. LETRAS.9 equ b'10000001' ; O b'01111110'
  58.  
  59. DIGITOS.1 equ b'11111110' ;prende digito 1 b'11111110' b'00000001'
  60. DIGITOS.2 equ b'11111101' ;prende digito 2 b'11111101' b'00000010'
  61. DIGITOS.3 equ b'11111011' ;prende digito 3 b'11111011' b'00000100'
  62. DIGITOS.4 equ b'11110111' ;prende digito 4 b'11110111' b'00001000'
  63. inicio:
  64.  
  65.         movlw DIGITOS.1;prende digito 1
  66.         movwf PORTD
  67.         movlw LETRAS.1;H
  68.         movwf LATB
  69.         call retardo
  70.         bsf PORTB,1
  71.         movlw DIGITOS.2; prende digito 2
  72.         movwf PORTD
  73.         movlw LETRAS.2;O
  74.         movwf PORTB
  75.         call retardo
  76.         movlw DIGITOS.3; prende digito 3
  77.         movwf PORTD
  78.         movlw LETRAS.3;L
  79.         movwf PORTB
  80.         call retardo
  81.         movlw DIGITOS.4; prende digito 4
  82.         movwf PORTD
  83.         movlw LETRAS.4;A
  84.         movwf PORTB
  85.         call retardo
  86.         movlw DIGITOS.1; prende digito 1
  87.         movwf PORTD
  88.         movlw LETRAS.5;M
  89.         movwf PORTB
  90.         call retardo
  91.         movlw DIGITOS.2; prende digito 2
  92.         movwf PORTD
  93.         movlw LETRAS.6;U
  94.         movwf PORTB
  95.         call retardo
  96.         movlw DIGITOS.3; prende digito 3
  97.         movwf PORTD
  98.         movlw LETRAS.7;N
  99.         movwf PORTB
  100.         call retardo
  101.         movlw DIGITOS.4; prende digito 4
  102.         movwf PORTD
  103.         movlw LETRAS.8;D
  104.         movwf PORTB
  105.         call retardo
  106.         movlw DIGITOS.1; prende digito 1
  107.         movwf PORTD
  108.         movlw LETRAS.9;O
  109.         movwf PORTB
  110.         call retardo
  111.        
  112.         goto inicio
  113.        
  114. retardo: ; retardo de un segundo Formula Retardo = 10 x (100 x (1mS)) = 1000mS = 1 segundo
  115.    movlw d'10'
  116.    movwf T3
  117.    movlw d'100'
  118.    movwf T2
  119.    movlw d'250'
  120.    movwf T1
  121.    nop
  122.    decfsz T1,F
  123.    goto $-.2
  124.    decfsz T2,F
  125.    goto $-.6
  126.    decfsz T3,F
  127.    goto $-.10
  128.    return
  129. end
  130.  
  131.  

Desconectado remi04

  • PIC18
  • ****
  • Mensajes: 254
Re:PIC18F4550 y 4display a 7 segmentos- Ensamblador
« Respuesta #14 en: 07 de Mayo de 2019, 16:54:36 »
En base a lo que me comentaron ya realice las correcciones .
un detalle que me llamo la atencion es que estoy tuve que invertir el valor binario cuando deseo prender un digito, mas alla de eso fue el unico detalle que me llamo la atencion
Adjunto mi codigo final de como lo deje y una liga hacia como tengo ya el diseño del circuito:
https://1drv.ms/u/s!AqGT907LlTsahosgLe7ynqaJadZ9iQ
Código: ASM
  1. ;PROGRAMA HOLA MUNDO
  2. ;**************************
  3. list P = 18F4550
  4. INCLUDE <P18F4550.INC>
  5. ;****************************************
  6. ;Configuracion de FUSES
  7. CONFIG FOSC = HS
  8. CONFIG CPUDIV = OSC1_PLL2
  9. CONFIG PWRT = ON
  10. CONFIG BOR = OFF
  11. CONFIG WDT = OFF
  12. CONFIG LVP = OFF
  13. CONFIG PBADEN = OFF
  14. CONFIG MCLRE = ON
  15. CONFIG DEBUG = OFF
  16. CONFIG XINST = OFF
  17.  
  18. ;Otra opcion
  19. ;CONFIG FOSC = HS
  20. ;CONFIG CPUDIV = OSC1_PLL2
  21. ;CONFIG BOR = OFF
  22. ;CONFIG PWRT = ON
  23. ;CONFIG WDT = OFF
  24. ;CONFIG MCLRE = OFF
  25. ;CONFIG PBADEN = OFF
  26. ;CONFIG LVP = OFF
  27.  
  28. ;*****************************************
  29. ; VARIABLES
  30. CBLOCK
  31. T1
  32. T2
  33. T3
  34. LETRAS
  35. DIGITOS
  36. endc
  37. ;****************************************
  38. ;Comienzo del programa
  39. ORG 0
  40. ;BSF PLL, PLLDIV2,1
  41. ;BSF PLL, PLLDIV1,0
  42. ;BSF PLL, PLLDIV0,0
  43.  
  44. clrf TRISB
  45. clrf TRISD
  46. clrf PORTB
  47. CLRF PORTD
  48.  
  49. LETRAS.1 equ b'11001000' ; H b'00110111'
  50. LETRAS.2 equ b'10000001' ; O b'01111110'
  51. LETRAS.3 equ b'11110001' ; L b'00001110'
  52. LETRAS.4 equ b'10001000' ; A b'01110111'
  53. LETRAS.5 equ b'11101010' ; M b'00010101'
  54. LETRAS.6 equ b'11000001' ; U b'00111110'
  55. LETRAS.7 equ b'10001001' ; N b'01110110'
  56. LETRAS.8 equ b'11000010' ; D b'00111101'
  57. LETRAS.9 equ b'10000001' ; O b'01111110'
  58.  
  59. DIGITOS.1 equ b'11111110' ;prende digito 1 b'11111110' b'00000001'
  60. DIGITOS.2 equ b'11111101' ;prende digito 2 b'11111101' b'00000010'
  61. DIGITOS.3 equ b'11111011' ;prende digito 3 b'11111011' b'00000100'
  62. DIGITOS.4 equ b'11110111' ;prende digito 4 b'11110111' b'00001000'
  63. inicio:
  64.  
  65.         movlw DIGITOS.1;prende digito 1
  66.         movwf PORTD
  67.         movlw LETRAS.1;H
  68.         movwf LATB
  69.         call retardo
  70.         bsf PORTB,1
  71.         movlw DIGITOS.2; prende digito 2
  72.         movwf PORTD
  73.         movlw LETRAS.2;O
  74.         movwf PORTB
  75.         call retardo
  76.         movlw DIGITOS.3; prende digito 3
  77.         movwf PORTD
  78.         movlw LETRAS.3;L
  79.         movwf PORTB
  80.         call retardo
  81.         movlw DIGITOS.4; prende digito 4
  82.         movwf PORTD
  83.         movlw LETRAS.4;A
  84.         movwf PORTB
  85.         call retardo
  86.         movlw DIGITOS.1; prende digito 1
  87.         movwf PORTD
  88.         movlw LETRAS.5;M
  89.         movwf PORTB
  90.         call retardo
  91.         movlw DIGITOS.2; prende digito 2
  92.         movwf PORTD
  93.         movlw LETRAS.6;U
  94.         movwf PORTB
  95.         call retardo
  96.         movlw DIGITOS.3; prende digito 3
  97.         movwf PORTD
  98.         movlw LETRAS.7;N
  99.         movwf PORTB
  100.         call retardo
  101.         movlw DIGITOS.4; prende digito 4
  102.         movwf PORTD
  103.         movlw LETRAS.8;D
  104.         movwf PORTB
  105.         call retardo
  106.         movlw DIGITOS.1; prende digito 1
  107.         movwf PORTD
  108.         movlw LETRAS.9;O
  109.         movwf PORTB
  110.         call retardo
  111.        
  112.         goto inicio
  113.        
  114. retardo: ; retardo de un segundo Formula Retardo = 10 x (100 x (1mS)) = 1000mS = 1 segundo
  115.    movlw d'10'
  116.    movwf T3
  117.    movlw d'100'
  118.    movwf T2
  119.    movlw d'250'
  120.    movwf T1
  121.    nop
  122.    decfsz T1,F
  123.    goto $-.2
  124.    decfsz T2,F
  125.    goto $-.6
  126.    decfsz T3,F
  127.    goto $-.10
  128.    return
  129. end
  130.  
  131.  

 Invertir los bits en los 7 segmentos para que te funcione responde a que estás invirtiendo el común.

  Mira, tienes que conocer si el display que estás usando lleva a común los ánodos o los cátodos.

  Si es un display con cátodos a común, para encender un segmento tienes que poner a 1 ese segmento y a cero el cátodo.  Pero ojo, como los comunes no se pueden poner directos a un puerto (por que lo fries), tienes que poner un transistor por medio que puede ser npn normal o mosfet.  Entonces, si el display es con cátodos a común, y tienes que poner ese común al colector del transistor. El emisor del transistor a masa , entonces para activar ese digito tienes que poner un 1 en la base del transistor, luego un 1 en cada segmento a encender.

Si el display tienes los ánodos a común, entonces el transistor lo pones con el colector a vdd, el emisor al común (ánodos) y la base al control de ese dígito. Entonces para activar un dígito en este caso, pones un 1 en la base (esto es igual que antes) sin embargo en los segmentos tienes que poner un cero para encenderlos.

  Espero no haberte liado más, pero es que esto es fundamental y elemental que debes conocer antes de plantear el circuito y el control.