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.
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
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:Citarno 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..
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.
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?
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
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!AqGT907LlTsahosgLe7ynqaJadZ9iQCódigo: ASM
;PROGRAMA HOLA MUNDO ;************************** list P = 18F4550 INCLUDE <P18F4550.INC> ;**************************************** ;Configuracion de FUSES CONFIG FOSC = HS CONFIG CPUDIV = OSC1_PLL2 CONFIG PWRT = ON CONFIG BOR = OFF CONFIG WDT = OFF CONFIG LVP = OFF CONFIG PBADEN = OFF CONFIG MCLRE = ON CONFIG DEBUG = OFF CONFIG XINST = OFF ;Otra opcion ;CONFIG FOSC = HS ;CONFIG CPUDIV = OSC1_PLL2 ;CONFIG BOR = OFF ;CONFIG PWRT = ON ;CONFIG WDT = OFF ;CONFIG MCLRE = OFF ;CONFIG PBADEN = OFF ;CONFIG LVP = OFF ;***************************************** ; VARIABLES CBLOCK T1 T2 T3 LETRAS DIGITOS endc ;**************************************** ;Comienzo del programa ORG 0 ;BSF PLL, PLLDIV2,1 ;BSF PLL, PLLDIV1,0 ;BSF PLL, PLLDIV0,0 clrf TRISB clrf TRISD clrf PORTB CLRF PORTD LETRAS.1 equ b'11001000' ; H b'00110111' LETRAS.2 equ b'10000001' ; O b'01111110' LETRAS.3 equ b'11110001' ; L b'00001110' LETRAS.4 equ b'10001000' ; A b'01110111' LETRAS.5 equ b'11101010' ; M b'00010101' LETRAS.6 equ b'11000001' ; U b'00111110' LETRAS.7 equ b'10001001' ; N b'01110110' LETRAS.8 equ b'11000010' ; D b'00111101' LETRAS.9 equ b'10000001' ; O b'01111110' DIGITOS.1 equ b'11111110' ;prende digito 1 b'11111110' b'00000001' DIGITOS.2 equ b'11111101' ;prende digito 2 b'11111101' b'00000010' DIGITOS.3 equ b'11111011' ;prende digito 3 b'11111011' b'00000100' DIGITOS.4 equ b'11110111' ;prende digito 4 b'11110111' b'00001000' inicio: movlw DIGITOS.1;prende digito 1 movwf PORTD movlw LETRAS.1;H movwf LATB call retardo bsf PORTB,1 movlw DIGITOS.2; prende digito 2 movwf PORTD movlw LETRAS.2;O movwf PORTB call retardo movlw DIGITOS.3; prende digito 3 movwf PORTD movlw LETRAS.3;L movwf PORTB call retardo movlw DIGITOS.4; prende digito 4 movwf PORTD movlw LETRAS.4;A movwf PORTB call retardo movlw DIGITOS.1; prende digito 1 movwf PORTD movlw LETRAS.5;M movwf PORTB call retardo movlw DIGITOS.2; prende digito 2 movwf PORTD movlw LETRAS.6;U movwf PORTB call retardo movlw DIGITOS.3; prende digito 3 movwf PORTD movlw LETRAS.7;N movwf PORTB call retardo movlw DIGITOS.4; prende digito 4 movwf PORTD movlw LETRAS.8;D movwf PORTB call retardo movlw DIGITOS.1; prende digito 1 movwf PORTD movlw LETRAS.9;O movwf PORTB call retardo goto inicio retardo: ; retardo de un segundo Formula Retardo = 10 x (100 x (1mS)) = 1000mS = 1 segundo movlw d'10' movwf T3 movlw d'100' movwf T2 movlw d'250' movwf T1 nop decfsz T1,F goto $-.2 decfsz T2,F goto $-.6 decfsz T3,F goto $-.10 return end
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!AqGT907LlTsahosgLe7ynqaJadZ9iQCódigo: ASM
;PROGRAMA HOLA MUNDO ;************************** list P = 18F4550 INCLUDE <P18F4550.INC> ;**************************************** ;Configuracion de FUSES CONFIG FOSC = HS CONFIG CPUDIV = OSC1_PLL2 CONFIG PWRT = ON CONFIG BOR = OFF CONFIG WDT = OFF CONFIG LVP = OFF CONFIG PBADEN = OFF CONFIG MCLRE = ON CONFIG DEBUG = OFF CONFIG XINST = OFF ;Otra opcion ;CONFIG FOSC = HS ;CONFIG CPUDIV = OSC1_PLL2 ;CONFIG BOR = OFF ;CONFIG PWRT = ON ;CONFIG WDT = OFF ;CONFIG MCLRE = OFF ;CONFIG PBADEN = OFF ;CONFIG LVP = OFF ;***************************************** ; VARIABLES CBLOCK T1 T2 T3 LETRAS DIGITOS endc ;**************************************** ;Comienzo del programa ORG 0 ;BSF PLL, PLLDIV2,1 ;BSF PLL, PLLDIV1,0 ;BSF PLL, PLLDIV0,0 clrf TRISB clrf TRISD clrf PORTB CLRF PORTD LETRAS.1 equ b'11001000' ; H b'00110111' LETRAS.2 equ b'10000001' ; O b'01111110' LETRAS.3 equ b'11110001' ; L b'00001110' LETRAS.4 equ b'10001000' ; A b'01110111' LETRAS.5 equ b'11101010' ; M b'00010101' LETRAS.6 equ b'11000001' ; U b'00111110' LETRAS.7 equ b'10001001' ; N b'01110110' LETRAS.8 equ b'11000010' ; D b'00111101' LETRAS.9 equ b'10000001' ; O b'01111110' DIGITOS.1 equ b'11111110' ;prende digito 1 b'11111110' b'00000001' DIGITOS.2 equ b'11111101' ;prende digito 2 b'11111101' b'00000010' DIGITOS.3 equ b'11111011' ;prende digito 3 b'11111011' b'00000100' DIGITOS.4 equ b'11110111' ;prende digito 4 b'11110111' b'00001000' inicio: movlw DIGITOS.1;prende digito 1 movwf PORTD movlw LETRAS.1;H movwf LATB call retardo bsf PORTB,1 movlw DIGITOS.2; prende digito 2 movwf PORTD movlw LETRAS.2;O movwf PORTB call retardo movlw DIGITOS.3; prende digito 3 movwf PORTD movlw LETRAS.3;L movwf PORTB call retardo movlw DIGITOS.4; prende digito 4 movwf PORTD movlw LETRAS.4;A movwf PORTB call retardo movlw DIGITOS.1; prende digito 1 movwf PORTD movlw LETRAS.5;M movwf PORTB call retardo movlw DIGITOS.2; prende digito 2 movwf PORTD movlw LETRAS.6;U movwf PORTB call retardo movlw DIGITOS.3; prende digito 3 movwf PORTD movlw LETRAS.7;N movwf PORTB call retardo movlw DIGITOS.4; prende digito 4 movwf PORTD movlw LETRAS.8;D movwf PORTB call retardo movlw DIGITOS.1; prende digito 1 movwf PORTD movlw LETRAS.9;O movwf PORTB call retardo goto inicio retardo: ; retardo de un segundo Formula Retardo = 10 x (100 x (1mS)) = 1000mS = 1 segundo movlw d'10' movwf T3 movlw d'100' movwf T2 movlw d'250' movwf T1 nop decfsz T1,F goto $-.2 decfsz T2,F goto $-.6 decfsz T3,F goto $-.10 return end
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.
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!AqGT907LlTsahosgLe7ynqaJadZ9iQCódigo: ASM
;PROGRAMA HOLA MUNDO ;************************** list P = 18F4550 INCLUDE <P18F4550.INC> ;**************************************** ;Configuracion de FUSES CONFIG FOSC = HS CONFIG CPUDIV = OSC1_PLL2 CONFIG PWRT = ON CONFIG BOR = OFF CONFIG WDT = OFF CONFIG LVP = OFF CONFIG PBADEN = OFF CONFIG MCLRE = ON CONFIG DEBUG = OFF CONFIG XINST = OFF ;Otra opcion ;CONFIG FOSC = HS ;CONFIG CPUDIV = OSC1_PLL2 ;CONFIG BOR = OFF ;CONFIG PWRT = ON ;CONFIG WDT = OFF ;CONFIG MCLRE = OFF ;CONFIG PBADEN = OFF ;CONFIG LVP = OFF ;***************************************** ; VARIABLES CBLOCK T1 T2 T3 LETRAS DIGITOS endc ;**************************************** ;Comienzo del programa ORG 0 ;BSF PLL, PLLDIV2,1 ;BSF PLL, PLLDIV1,0 ;BSF PLL, PLLDIV0,0 clrf TRISB clrf TRISD clrf PORTB CLRF PORTD LETRAS.1 equ b'11001000' ; H b'00110111' LETRAS.2 equ b'10000001' ; O b'01111110' LETRAS.3 equ b'11110001' ; L b'00001110' LETRAS.4 equ b'10001000' ; A b'01110111' LETRAS.5 equ b'11101010' ; M b'00010101' LETRAS.6 equ b'11000001' ; U b'00111110' LETRAS.7 equ b'10001001' ; N b'01110110' LETRAS.8 equ b'11000010' ; D b'00111101' LETRAS.9 equ b'10000001' ; O b'01111110' DIGITOS.1 equ b'11111110' ;prende digito 1 b'11111110' b'00000001' DIGITOS.2 equ b'11111101' ;prende digito 2 b'11111101' b'00000010' DIGITOS.3 equ b'11111011' ;prende digito 3 b'11111011' b'00000100' DIGITOS.4 equ b'11110111' ;prende digito 4 b'11110111' b'00001000' inicio: movlw DIGITOS.1;prende digito 1 movwf PORTD movlw LETRAS.1;H movwf LATB call retardo bsf PORTB,1 movlw DIGITOS.2; prende digito 2 movwf PORTD movlw LETRAS.2;O movwf PORTB call retardo movlw DIGITOS.3; prende digito 3 movwf PORTD movlw LETRAS.3;L movwf PORTB call retardo movlw DIGITOS.4; prende digito 4 movwf PORTD movlw LETRAS.4;A movwf PORTB call retardo movlw DIGITOS.1; prende digito 1 movwf PORTD movlw LETRAS.5;M movwf PORTB call retardo movlw DIGITOS.2; prende digito 2 movwf PORTD movlw LETRAS.6;U movwf PORTB call retardo movlw DIGITOS.3; prende digito 3 movwf PORTD movlw LETRAS.7;N movwf PORTB call retardo movlw DIGITOS.4; prende digito 4 movwf PORTD movlw LETRAS.8;D movwf PORTB call retardo movlw DIGITOS.1; prende digito 1 movwf PORTD movlw LETRAS.9;O movwf PORTB call retardo goto inicio retardo: ; retardo de un segundo Formula Retardo = 10 x (100 x (1mS)) = 1000mS = 1 segundo movlw d'10' movwf T3 movlw d'100' movwf T2 movlw d'250' movwf T1 nop decfsz T1,F goto $-.2 decfsz T2,F goto $-.6 decfsz T3,F goto $-.10 return end
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.
Si claro entiendo en gran parte. mi display de 4 digitos 7 segmentos es de anodo comun y se que debo enviar un 0 para que los segmentos se enciendan y 1 para los que no quiero que se enciendan.
Mi detalle estuvo con prender los digitos si es que notaron la imagen del nuevo circuito que puse
estoy usando transistores 2n2222 NPN la base lo conecto a la salida del pin del pic, el colector lo dirijo hacia la entrada para encender digito en el display y los emisores los tengo conectados a tierra.
No se si este correcto en respecto a eso
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!AqGT907LlTsahosgLe7ynqaJadZ9iQCódigo: ASM
;PROGRAMA HOLA MUNDO ;************************** list P = 18F4550 INCLUDE <P18F4550.INC> ;**************************************** ;Configuracion de FUSES CONFIG FOSC = HS CONFIG CPUDIV = OSC1_PLL2 CONFIG PWRT = ON CONFIG BOR = OFF CONFIG WDT = OFF CONFIG LVP = OFF CONFIG PBADEN = OFF CONFIG MCLRE = ON CONFIG DEBUG = OFF CONFIG XINST = OFF ;Otra opcion ;CONFIG FOSC = HS ;CONFIG CPUDIV = OSC1_PLL2 ;CONFIG BOR = OFF ;CONFIG PWRT = ON ;CONFIG WDT = OFF ;CONFIG MCLRE = OFF ;CONFIG PBADEN = OFF ;CONFIG LVP = OFF ;***************************************** ; VARIABLES CBLOCK T1 T2 T3 LETRAS DIGITOS endc ;**************************************** ;Comienzo del programa ORG 0 ;BSF PLL, PLLDIV2,1 ;BSF PLL, PLLDIV1,0 ;BSF PLL, PLLDIV0,0 clrf TRISB clrf TRISD clrf PORTB CLRF PORTD LETRAS.1 equ b'11001000' ; H b'00110111' LETRAS.2 equ b'10000001' ; O b'01111110' LETRAS.3 equ b'11110001' ; L b'00001110' LETRAS.4 equ b'10001000' ; A b'01110111' LETRAS.5 equ b'11101010' ; M b'00010101' LETRAS.6 equ b'11000001' ; U b'00111110' LETRAS.7 equ b'10001001' ; N b'01110110' LETRAS.8 equ b'11000010' ; D b'00111101' LETRAS.9 equ b'10000001' ; O b'01111110' DIGITOS.1 equ b'11111110' ;prende digito 1 b'11111110' b'00000001' DIGITOS.2 equ b'11111101' ;prende digito 2 b'11111101' b'00000010' DIGITOS.3 equ b'11111011' ;prende digito 3 b'11111011' b'00000100' DIGITOS.4 equ b'11110111' ;prende digito 4 b'11110111' b'00001000' inicio: movlw DIGITOS.1;prende digito 1 movwf PORTD movlw LETRAS.1;H movwf LATB call retardo bsf PORTB,1 movlw DIGITOS.2; prende digito 2 movwf PORTD movlw LETRAS.2;O movwf PORTB call retardo movlw DIGITOS.3; prende digito 3 movwf PORTD movlw LETRAS.3;L movwf PORTB call retardo movlw DIGITOS.4; prende digito 4 movwf PORTD movlw LETRAS.4;A movwf PORTB call retardo movlw DIGITOS.1; prende digito 1 movwf PORTD movlw LETRAS.5;M movwf PORTB call retardo movlw DIGITOS.2; prende digito 2 movwf PORTD movlw LETRAS.6;U movwf PORTB call retardo movlw DIGITOS.3; prende digito 3 movwf PORTD movlw LETRAS.7;N movwf PORTB call retardo movlw DIGITOS.4; prende digito 4 movwf PORTD movlw LETRAS.8;D movwf PORTB call retardo movlw DIGITOS.1; prende digito 1 movwf PORTD movlw LETRAS.9;O movwf PORTB call retardo goto inicio retardo: ; retardo de un segundo Formula Retardo = 10 x (100 x (1mS)) = 1000mS = 1 segundo movlw d'10' movwf T3 movlw d'100' movwf T2 movlw d'250' movwf T1 nop decfsz T1,F goto $-.2 decfsz T2,F goto $-.6 decfsz T3,F goto $-.10 return end
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.
Si claro entiendo en gran parte. mi display de 4 digitos 7 segmentos es de anodo comun y se que debo enviar un 0 para que los segmentos se enciendan y 1 para los que no quiero que se enciendan.
Mi detalle estuvo con prender los digitos si es que notaron la imagen del nuevo circuito que puse
estoy usando transistores 2n2222 NPN la base lo conecto a la salida del pin del pic, el colector lo dirijo hacia la entrada para encender digito en el display y los emisores los tengo conectados a tierra.
No se si este correcto en respecto a eso
No. Si es anodo común, los emisores los tienes que poner a vdd y los colectores a cada común de cada dígito. El transistor tiene que ser PNP por ejemplo el Bc557 te vale.
Luego como bien ha dicho el compañero usa una resistencia de base. 1K debería ser suficiente. Pero puedes mirar el datasheet del transistor y calcular la corriente máxima de base para cuando el transistor esté en saturación con los 7 segmentos prendidos .
Saludos.