Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Meta

#811
Hola:

Por lo que cuentas, falta vovler en Escribir_EEPROM volver al banco 00, justo antes del return.

Por ahora lo he hecho así. Creo, solo creo, que no hace falta usar dos direcciones, solo uno, el del contador.

Código (asm) [Seleccionar]
;
; Un pulsador en RA4 va incrementando un contador, entre [1-4].
; La salida se envía a un display de 7 seg. en PORTB, y hacia salidas en PORTA.
;
; (Contador)  |RB 76543210 |RA 76543210
; ------------|------------------------
;       1     |   00000011 |   00000010
;       2     |   00100100 |   00000101
;       3     |   00001100 |   00000110
;       4     |   00111100 |   00001001
;
; PORTA:
;  RA0 : OE1
;  RA1 : OE2
;  RA2 : A21
;  RA3 : AUX
;  RA4 : Pulsador
; PORTB : display de 7 segmentos. a = RB0
;

; ZONA DE DATOS ****************************************************************

;*******************************************************************************
; Listado y condiciones de ensamblado

    LIST   P=16F88          ; 4 Mhz
    radix       dec
    errorlevel  -302            ; Turn off banking message

;*******************************************************************************
; Bibliotecas

    INCLUDE <P16f88.INC>

;*******************************************************************************
; Fusibles

    __CONFIG _CONFIG1, _CP_OFF & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_ON & _WDT_OFF & _INTRC_IO
;_XT_OSC

; _CP_OFF: Protección de código DESACTIVADO.
; _DEBUG_OFF: Debug en circuito DESACTIVADO.
; _WRT_PROTECT_OFF: Protección a escritura en memoria de programa DESACTIVADO.
; _CPD_OFF: Protección de código de datos DESACTIVADO.
; _LVP_OFF: Programación en baja tensión DESACTIVADO.
; _BODEN_OFF: Reset por Brown-out DESACTIVADO.
; _MCLRE_ON: Reset por pin externo ACTIVADO.
; _PWRTE_ON: Retraso al reset ACTIVADO.
; _WDT_OFF: Watchdog DESACTIVADO.
; _XT_OSC: Oscilador externo del tipo XT.

    __CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF

; _IESO_OFF: Modo de intercambio de externo a interno DESACTIVADO.
; _FCMEN_OFF: Monitor de CLK DESACTIVADO.


;*******************************************************************************
; Definiciones

; Máscaras de E/S de los puertos
; 0 = salida, 1 = entrada
;                    |76543210|
#define PORTA_ES    b'00010000'
#define PORTB_ES    b'00000000'

;*******************************************************************************
; Variables
area_compartida:    udata_shr

contador            res 1                       ; Contador [1-4]


; ZONA DE CÓDIGOS **************************************************************

programa:           code

                    ORG     000h

Inicio:
                    banksel ANSEL           ; bank 1
                    clrf    ANSEL           ; Puerto analógico a digital.
                    movlw   PORTA_ES        ; definir E/S puerto A
                    movwf   TRISA
                    movlw   PORTB_ES        ; definir E/S puerto B
                    movwf   TRISB
;
                    movlw   0               ; inicializamos contador
                    movwf   contador
                    call    Leer_EEPROM     ; Lectura de la EEPROM.

; Bucle principal
                    BANKSEL OSCCON
                    movlw   b'01100000'     ; 4 MHz
                    movwf   OSCCON
                    banksel PORTA           ; bank 0, siempre
                    goto Inicializado
Principal:
                    movf    PORTA, w        ; leer puerto A
                    andlw   PORTA_ES        ; nos quedamos sólo con lo interesante

                    btfss   STATUS, Z       ; ¿Se ha pulsado? Lo está si RA4 == 0
                    goto    Principal       ; No, esperar
;
; Aquí llegamos con el botón pulsado
Inicializado:
                    call    incrementa_contador
                    call    visualiza_contador
                    call    salida_hacia_A

; Esperamos que levante el botón
Espera_levantar:
                    call    Retardo_100ms   ; Esperar la suelta del pulsador
                    movf    PORTA, w        ; leer puerto A
                    andlw   PORTA_ES        ; nos quedamos sólo con lo interesante
                    btfsc   STATUS, Z       ; ¿Sigue pulsado? Lo está si RA4 == 0
                    goto    Espera_levantar ; No, esperar
;
                    goto    Principal


; ******************************************************************************
;; salida_hacia_A
;
; Según el valor del contador ([1-4]), lo transforma en otro, basado en una
; tabla y lo saca por el puerto A
;

salida_hacia_A:     call    transforma_contador
                    movwf   PORTA           ; visualiza en puerto A
                    return

transforma_contador:
                    decf    contador,w      ; leemos el contador y le restamos 1
                    addwf   PCL, f          ; saltamos dentro de la tabla

;                            |76543210|
                    retlw   b'00000010'
                    retlw   b'00000101'
                    retlw   b'00000110'
                    retlw   b'00001001'

; ******************************************************************************
;; incrementa_contador
;
; Incrementa el valor de la variable contador, entre 1 y 4, inclusives.
;

incrementa_contador:
                    bcf     contador,2
                    incf    contador
                    call    Escribir_EEPROM ; Escribir dato en la EEPROM.
                    return

; ******************************************************************************
;; visualiza_contador
;
; Muestra el valor del contador en el display de 7 segmentos
;

visualiza_contador:
                    movfw   contador        ; leemos contador
                    call    w_a_digito      ; transformación a dígito 7 segmentos
                    movwf   PORTB           ; visualiza en puerto B
                    return

w_a_digito:         addwf   PCL, f          ; salta al dígito indexado por w

;                            |76543210|
                    retlw   b'00111111'     ; 0
                    retlw   b'00000110'     ; 1
                    retlw   b'01011011'     ; 2
                    retlw   b'01001111'     ; 3
                    retlw   b'01100110'     ; 4
                    retlw   b'01101101'     ; 5
                    retlw   b'01111101'     ; 6
                    retlw   b'00000111'     ; 7
                    retlw   b'01111111'     ; 8
                    retlw   b'01101111'     ; 9

; ----------------------------------------------------------------------------------------------------
; Espera = 100ms
; Frecuencia de reloj = 4Mhz
;
; Espera real = 0.1 segundos = 100000 ciclos
; Error = 0.00 %

Retardo_par:        udata_shr

Retardo_100ms_d1    res 1
Retardo_100ms_d2    res 1


Retardo_code:       code

Retardo_100ms:
                                    ;99993 ciclos
                    movlw   0x1E
                    movwf   Retardo_100ms_d1
                    movlw   0x4F
                    movwf   Retardo_100ms_d2

Retardo_100ms_loop:
                    decfsz  Retardo_100ms_d1, f
                    goto    $+2
                    decfsz  Retardo_100ms_d2, f
                    goto    Retardo_100ms_loop

                                    ;3 ciclos
                    goto    $+1
                    nop

                                    ;4 ciclos (incluyendo la llamada)
                    return

; Generado por delay_pic.pl (Joaquín Ferrero. 2014.07.22)
; ./delay_pic.pl -s Retardo_100ms 4Mhz 100ms
; mar 22 jul 2014 19:22:23 CEST
; http://perlenespanol.com/foro/generador-de-codigos-de-retardo-para-microcontroladores-pic-t8602.html
; ----------------------------------------------------------------------------------------------------

; ******************************************************************************

;Subrutinas EEPROM -----------------------------------------------------------

Leer_EEPROM
    BANKSEL EEADR           ; Selecciona el registro EEADR.
    movf    contador, W
    movwf   EEADR           ; Dato dirección de momoria a leer.
    BANKSEL EECON1          ; Selecciona el banco EECON1.
    bcf     EECON1, EEPGD    ; Punto a memoria de datos
    bsf     EECON1, RD      ; a Leer.
    BANKSEL EEDATA          ; Seleccionar banco de EEDATA.
    movf    EEDATA, W       ; W = EEDATA.
    BANKSEL PORTA
    return

Escribir_EEPROM
    BANKSEL EECON1          ; Selecciona banco de EECON1.
    btfsc   EECON1, WR      ; Espera para escribir
    goto    $-1             ; a completar.
    BANKSEL EEADR           ; Selecciona el banco EEADR.
    movf    contador, W
    movwf   EEADR           ; Dirección dato de memoria a escribir.
    BANKSEL EECON1          ; Selecciona el banco EECOn1.
    bcf     EECON1, EEPGD   ; Punto a dato de memoria.
    bsf     EECON1, WREN    ; Activar escritura.
    bcf     INTCON, GIE     ; Desactiva interrupciones.

; El fabricante especifica que hay que seguir esta secuencia para escritura en EEPROm.

    movlw   0x55
    movwf   EECON2          ; Escribe 55h.
    movlw   0xAA
    movwf   EECON2          ; Escribe AAh.
    bsf     EECON1, WR

    bsf     INTCON, GIE     ; Activa interrupciones.
    bcf     EECON1, WREN    ; Desactiva escrituras.
    BANKSEL PORTA
    return

                END 


Lo que no me guarda nada.
#812
Algo he hecho que no se guarda los datos en la EEPROM.

Código (asm) [Seleccionar]
;
; Un pulsador en RA4 va incrementando un contador, entre [1-4].
; La salida se envía a un display de 7 seg. en PORTB, y hacia salidas en PORTA.
;
; (Contador)  |RB 76543210 |RA 76543210
; ------------|------------------------
;       1     |   00000011 |   00000010
;       2     |   00100100 |   00000101
;       3     |   00001100 |   00000110
;       4     |   00111100 |   00001001
;
; PORTA:
;  RA0 : OE1
;  RA1 : OE2
;  RA2 : A21
;  RA3 : AUX
;  RA4 : Pulsador
; PORTB : display de 7 segmentos. a = RB0
;

; ZONA DE DATOS ****************************************************************

;*******************************************************************************
; Listado y condiciones de ensamblado

    LIST   P=16F88          ; 4 Mhz
    radix       dec
    errorlevel  -302            ; Turn off banking message

;*******************************************************************************
; Bibliotecas

    INCLUDE <P16f88.INC>

;*******************************************************************************
; Fusibles

    __CONFIG _CONFIG1, _CP_OFF & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_ON & _WDT_OFF & _INTRC_IO
;_XT_OSC

; _CP_OFF: Protección de código DESACTIVADO.
; _DEBUG_OFF: Debug en circuito DESACTIVADO.
; _WRT_PROTECT_OFF: Protección a escritura en memoria de programa DESACTIVADO.
; _CPD_OFF: Protección de código de datos DESACTIVADO.
; _LVP_OFF: Programación en baja tensión DESACTIVADO.
; _BODEN_OFF: Reset por Brown-out DESACTIVADO.
; _MCLRE_ON: Reset por pin externo ACTIVADO.
; _PWRTE_ON: Retraso al reset ACTIVADO.
; _WDT_OFF: Watchdog DESACTIVADO.
; _XT_OSC: Oscilador externo del tipo XT.

    __CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF

; _IESO_OFF: Modo de intercambio de externo a interno DESACTIVADO.
; _FCMEN_OFF: Monitor de CLK DESACTIVADO.


;*******************************************************************************
; Definiciones

; Máscaras de E/S de los puertos
; 0 = salida, 1 = entrada
;                    |76543210|
#define PORTA_ES    b'00010000'
#define PORTB_ES    b'00000000'

;*******************************************************************************
; Variables
area_compartida:    udata_shr

contador            res 1                       ; Contador [1-4]


; ZONA DE CÓDIGOS **************************************************************

programa:           code

                    ORG     000h

Inicio:
                    banksel ANSEL           ; bank 1
                    clrf    ANSEL           ; Puerto analógico a digital.
                    movlw   PORTA_ES        ; definir E/S puerto A
                    movwf   TRISA
                    movlw   PORTB_ES        ; definir E/S puerto B
                    movwf   TRISB
;
                    movlw   0               ; inicializamos contador
                    movwf   contador
                    call    Leer_EEPROM     ; Lectura de la EEPROM.

; Bucle principal
                    BANKSEL OSCCON
                    movlw   b'01100000'     ; 4 MHz
                    movwf   OSCCON
                    banksel PORTA           ; bank 0, siempre
                    goto Inicializado
Principal:
                    movf    PORTA, w        ; leer puerto A
                    andlw   PORTA_ES        ; nos quedamos sólo con lo interesante

                    btfss   STATUS, Z       ; ¿Se ha pulsado? Lo está si RA4 == 0
                    goto    Principal       ; No, esperar
;
; Aquí llegamos con el botón pulsado
Inicializado:
                    call    incrementa_contador
                    call    visualiza_contador
                    call    salida_hacia_A

; Esperamos que levante el botón
Espera_levantar:
                    call    Retardo_100ms   ; Esperar la suelta del pulsador
                    movf    PORTA, w        ; leer puerto A
                    andlw   PORTA_ES        ; nos quedamos sólo con lo interesante
                    btfsc   STATUS, Z       ; ¿Sigue pulsado? Lo está si RA4 == 0
                    goto    Espera_levantar ; No, esperar
;
                    goto    Principal


; ******************************************************************************
;; salida_hacia_A
;
; Según el valor del contador ([1-4]), lo transforma en otro, basado en una
; tabla y lo saca por el puerto A
;

salida_hacia_A:     call    transforma_contador
                    movwf   PORTA           ; visualiza en puerto A
                    return

transforma_contador:
                    decf    contador,w      ; leemos el contador y le restamos 1
                    addwf   PCL, f          ; saltamos dentro de la tabla

;                            |76543210|
                    retlw   b'00000010'
                    retlw   b'00000101'
                    retlw   b'00000110'
                    retlw   b'00001001'

; ******************************************************************************
;; incrementa_contador
;
; Incrementa el valor de la variable contador, entre 1 y 4, inclusives.
;

incrementa_contador:
                    bcf     contador,2
                    incf    contador
                    return

; ******************************************************************************
;; visualiza_contador
;
; Muestra el valor del contador en el display de 7 segmentos
;

visualiza_contador:
                    movfw   contador        ; leemos contador
                    call    w_a_digito      ; transformación a dígito 7 segmentos
                    movwf   PORTB           ; visualiza en puerto B
                    return

w_a_digito:         addwf   PCL, f          ; salta al dígito indexado por w

;                            |76543210|
                    retlw   b'00111111'     ; 0
                    retlw   b'00000110'     ; 1
                    retlw   b'01011011'     ; 2
                    retlw   b'01001111'     ; 3
                    retlw   b'01100110'     ; 4
                    retlw   b'01101101'     ; 5
                    retlw   b'01111101'     ; 6
                    retlw   b'00000111'     ; 7
                    retlw   b'01111111'     ; 8
                    retlw   b'01101111'     ; 9

; ----------------------------------------------------------------------------------------------------
; Espera = 100ms
; Frecuencia de reloj = 4Mhz
;
; Espera real = 0.1 segundos = 100000 ciclos
; Error = 0.00 %

Retardo_par:        udata_shr

Retardo_100ms_d1    res 1
Retardo_100ms_d2    res 1


Retardo_code:       code

Retardo_100ms:
                                    ;99993 ciclos
                    movlw   0x1E
                    movwf   Retardo_100ms_d1
                    movlw   0x4F
                    movwf   Retardo_100ms_d2

Retardo_100ms_loop:
                    decfsz  Retardo_100ms_d1, f
                    goto    $+2
                    decfsz  Retardo_100ms_d2, f
                    goto    Retardo_100ms_loop

                                    ;3 ciclos
                    goto    $+1
                    nop

                                    ;4 ciclos (incluyendo la llamada)
                    return

                    call    Escribir_EEPROM

; Generado por delay_pic.pl (Joaquín Ferrero. 2014.07.22)
; ./delay_pic.pl -s Retardo_100ms 4Mhz 100ms
; mar 22 jul 2014 19:22:23 CEST
; http://perlenespanol.com/foro/generador-de-codigos-de-retardo-para-microcontroladores-pic-t8602.html
; ----------------------------------------------------------------------------------------------------

; ******************************************************************************

;Subrutinas EEPROM -----------------------------------------------------------

Leer_EEPROM
    BANKSEL EEADR           ; Selecciona el registro EEADR.
    movf    contador, W
    movwf   EEADR           ; Dato dirección de momoria a leer.
    BANKSEL EECON1          ; Selecciona el banco EECON1.
    bcf     EECON1, EEPGD    ; Punto a memoria de datos
    bsf     EECON1, RD      ; a Leer.
    BANKSEL EEDATA          ; Seleccionar banco de EEDATA.
    movf    EEDATA, W       ; W = EEDATA.
    return

Escribir_EEPROM
    BANKSEL EECON1          ; Selecciona banco de EECON1.
    btfsc   EECON1, WR      ; Espera para escribir
    goto    $-1             ; a completar.
    BANKSEL EEADR           ; Selecciona el banco EEADR.
    movf    contador, W
    movwf   EEADR           ; Dirección dato de memoria a escribir.
    BANKSEL EECON1          ; Selecciona el banco EECOn1.
    bcf     EECON1, EEPGD   ; Punto a dato de memoria.
    bsf     EECON1, WREN    ; Activar escritura.
    bcf     INTCON, GIE     ; Desactiva interrupciones.

; El fabricante especifica que hay que seguir esta secuencia para escritura en EEPROm.

    movlw   0x55
    movwf   EECON2          ; Escribe 55h.
    movlw   0xAA
    movwf   EECON2          ; Escribe AAh.
    bsf     EECON1, WR

    bsf     INTCON, GIE     ; Activa interrupciones.
    bcf     EECON1, WREN    ; Desactiva escrituras.


                END 




El circuito funciona de maravilla, pero no guarda los datos.

Saludo.
#813
Buenas:

Tenía los conectores no muy bien colocados. Gracias por la ayuda e ideas. Ahora me funciona de maravilla.




El siguiente y último reto que nunca he usado la EEPROM interna del PIC16F88, no me sale a pesar de leer bien su hoja de datos. En la página 29 del datasheet te dice códigos pero a mi no me funciona o no se hacerlo.

Lo que quiero hacer es guardar los últimos datos seleccionados por el pulsador de las dos tablas de la verdad. Por ejemplo, si estamos en el número 2 del Display, al apagarlo y encenderlo otra vez el PIC, aparezca precisamente el 2, que es el último número que se mostró. Se incluye también el guardado de la tabla de la verdad de datos.




Los que sepan, una ayudita. Por lo que veo, no se me da para nada bien guardar y recuperar datos en la EEPROM interna del PIC. Fijándome bien, se necesita una celda para guardar los 8 bits o un byte de la Tabla de la verdad gris del Display, y otra celda o posición de memoria también de 8 bits o un byte en la Tabla de la verdad verde de datos.



De todas formas, voy a intentarlo por si acaso.

Desde que funcione todo, subo un vídeo.

Saludo.
#814
Gracias.

Una tabla es para el display, la otra para datos, control para otros dispositivos.

Me pasé al PIC16F88 porque usa oscilador interno, lo he configurado a 4 MHz y no estoy seguro si realmente lo he hecho bien. A pesar que en el simulador Proteus 7.10 funciona muy bien, la realidad es muy distinta.



A la hora de montarlo en una demoboard para probarlo, me da en el display carácteres raros en vez del 1 al 4. Los Led azules que ven son los amarillos del esquema de arriba que si funciona a la perfección.



Los cables están bien. Lo que no se si este nuevo código está bien. En el proteus funciona, la realidad no.

Código (asm) [Seleccionar]
;
; Un pulsador en RA4 va incrementando un contador, entre [1-4].
; La salida se envía a un display de 7 seg. en PORTB, y hacia salidas en PORTA.
;
; (Contador)  |RB 76543210 |RA 76543210
; ------------|------------------------
;       1     |   00000011 |   00000010
;       2     |   00100100 |   00000101
;       3     |   00001100 |   00000110
;       4     |   00111100 |   00001001
;
; PORTA:
;  RA0 : OE1
;  RA1 : OE2
;  RA2 : A21
;  RA3 : AUX
;  RA4 : Pulsador
; PORTB : display de 7 segmentos. a = RB0
;

; ZONA DE DATOS ****************************************************************

;*******************************************************************************
; Listado y condiciones de ensamblado

    LIST   P=16F88          ; 4 Mhz
    radix       dec
    errorlevel  -302            ; Turn off banking message

;*******************************************************************************
; Bibliotecas

    INCLUDE <P16f88.INC>

;*******************************************************************************
; Fusibles

    __CONFIG _CONFIG1, _CP_OFF & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_ON & _WDT_OFF & _INTRC_IO
;_XT_OSC

; _CP_OFF: Protección de código DESACTIVADO.
; _DEBUG_OFF: Debug en circuito DESACTIVADO.
; _WRT_PROTECT_OFF: Protección a escritura en memoria de programa DESACTIVADO.
; _CPD_OFF: Protección de código de datos DESACTIVADO.
; _LVP_OFF: Programación en baja tensión DESACTIVADO.
; _BODEN_OFF: Reset por Brown-out DESACTIVADO.
; _MCLRE_ON: Reset por pin externo ACTIVADO.
; _PWRTE_ON: Retraso al reset ACTIVADO.
; _WDT_OFF: Watchdog DESACTIVADO.
; _XT_OSC: Oscilador externo del tipo XT.

    __CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF

; _IESO_OFF: Modo de intercambio de externo a interno DESACTIVADO.
; _FCMEN_OFF: Monitor de CLK DESACTIVADO.


;*******************************************************************************
; Definiciones

; Máscaras de E/S de los puertos
; 0 = salida, 1 = entrada
;                    |76543210|
#define PORTA_ES    b'00010000'
#define PORTB_ES    b'00000000'

;*******************************************************************************
; Variables
area_compartida:    udata_shr

contador            res 1                       ; Contador [1-4]


; ZONA DE CÓDIGOS **************************************************************

programa:           code

                    ORG     000h

Inicio:
                    banksel ANSEL           ; bank 1
                    clrf    ANSEL           ; Puerto analógico a digital.
                    movlw   PORTA_ES        ; definir E/S puerto A
                    movwf   TRISA
                    movlw   PORTB_ES        ; definir E/S puerto B
                    movwf   TRISB
;
                    movlw   0               ; inicializamos contador
                    movwf   contador

; Bucle principal
                    BANKSEL OSCCON
                    movlw   b'01100000'     ; 4 MHz
                    movwf   OSCCON
                    banksel PORTA           ; bank 0, siempre
                    goto Inicializado
Principal:
                    movf    PORTA, w        ; leer puerto A
                    andlw   PORTA_ES        ; nos quedamos sólo con lo interesante

                    btfss   STATUS, Z       ; ¿Se ha pulsado? Lo está si RA4 == 0
                    goto    Principal       ; No, esperar
;
; Aquí llegamos con el botón pulsado
Inicializado:
                    call    incrementa_contador
                    call    visualiza_contador
                    call    salida_hacia_A

; Esperamos que levante el botón
Espera_levantar:
                    call    Retardo_100ms   ; Esperar la suelta del pulsador
                    movf    PORTA, w        ; leer puerto A
                    andlw   PORTA_ES        ; nos quedamos sólo con lo interesante
                    btfsc   STATUS, Z       ; ¿Sigue pulsado? Lo está si RA4 == 0
                    goto    Espera_levantar ; No, esperar
;
                    goto    Principal


; ******************************************************************************
;; salida_hacia_A
;
; Según el valor del contador ([1-4]), lo transforma en otro, basado en una
; tabla y lo saca por el puerto A
;

salida_hacia_A:     call    transforma_contador
                    movwf   PORTA           ; visualiza en puerto A
                    return

transforma_contador:
                    decf    contador,w      ; leemos el contador y le restamos 1
                    addwf   PCL, f          ; saltamos dentro de la tabla

;                            |76543210|
                    retlw   b'00000010'
                    retlw   b'00000101'
                    retlw   b'00000110'
                    retlw   b'00001001'

; ******************************************************************************
;; incrementa_contador
;
; Incrementa el valor de la variable contador, entre 1 y 4, inclusives.
;

incrementa_contador:
                    bcf     contador,2
                    incf    contador
                    return

; ******************************************************************************
;; visualiza_contador
;
; Muestra el valor del contador en el display de 7 segmentos
;

visualiza_contador:
                    movfw   contador        ; leemos contador
                    call    w_a_digito      ; transformación a dígito 7 segmentos
                    movwf   PORTB           ; visualiza en puerto B
                    return

w_a_digito:         addwf   PCL, f          ; salta al dígito indexado por w

;                            |76543210|
                    retlw   b'00111111'     ; 0
                    retlw   b'00000110'     ; 1
                    retlw   b'01011011'     ; 2
                    retlw   b'01001111'     ; 3
                    retlw   b'01100110'     ; 4
                    retlw   b'01101101'     ; 5
                    retlw   b'01111101'     ; 6
                    retlw   b'00000111'     ; 7
                    retlw   b'01111111'     ; 8
                    retlw   b'01101111'     ; 9

; ----------------------------------------------------------------------------------------------------
; Espera = 100ms
; Frecuencia de reloj = 4Mhz
;
; Espera real = 0.1 segundos = 100000 ciclos
; Error = 0.00 %

Retardo_par:        udata_shr

Retardo_100ms_d1    res 1
Retardo_100ms_d2    res 1


Retardo_code:       code

Retardo_100ms:
                                    ;99993 ciclos
                    movlw   0x1E
                    movwf   Retardo_100ms_d1
                    movlw   0x4F
                    movwf   Retardo_100ms_d2

Retardo_100ms_loop:
                    decfsz  Retardo_100ms_d1, f
                    goto    $+2
                    decfsz  Retardo_100ms_d2, f
                    goto    Retardo_100ms_loop

                                    ;3 ciclos
                    goto    $+1
                    nop

                                    ;4 ciclos (incluyendo la llamada)
                    return

; Generado por delay_pic.pl (Joaquín Ferrero. 2014.07.22)
; ./delay_pic.pl -s Retardo_100ms 4Mhz 100ms
; mar 22 jul 2014 19:22:23 CEST
; http://perlenespanol.com/foro/generador-de-codigos-de-retardo-para-microcontroladores-pic-t8602.html
; ----------------------------------------------------------------------------------------------------

; ******************************************************************************

                END 


Saludo.
#815
Buenas:

He modificado un poco el código. El esquema es este circuito.


Nueva tabla de la verdad corregida.


La zona gris funciona de maravilla. El Display de 7 segmentos cuanta del 1 al 4 desde que pulse el pulsador. Si llega al 4, al pulsar una vez, llega al 1 así sucesivamente.

Fíjate ahora en la zona verde, es otra tabla de la verdad de datos, que se encienden los Led amarillos. Siempre es acorde al del display, por ejemplo.

Si en la tabla de la verdad zona gris del display es el número 2, tiene que estar acorde al mismo tiempo con el 2 de la zona verdad de datos.



El código lo hice más simple, solo funciona el Display del 1 al 4, pero no se que hacer para funcionar la zona verde de datos.
Código (asm) [Seleccionar]
; Cada vez que presione el pulsador conectado al pin RA4 incrementa un contador visualizado
; en el display.
;
; ZONA DE DATOS **********************************************************************

LIST P=16F84A
INCLUDE <P16F84A.INC>
__CONFIG _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

CBLOCK  0x0C
Contador ; El contador a visualizar.
ENDC

#DEFINE OE1 PORTA,0
#DEFINE OE2 PORTA,1
#DEFINE A21 PORTA,2
#DEFINE AUX PORTA,3
#DEFINE Pulsador PORTA,4 ; Pulsador conectado a RA4.
#DEFINE Display PORTB ; El display está conectado al Puerto B.

; ZONA DE CÓDIGOS ********************************************************************

ORG 0 ; El programa comienza en la dirección 0.
Inicio
  bsf STATUS,RP0 ; Acceso al Banco 1.
clrf Display ; Estas líneas configuradas como salidas.
bcf OE1
bcf OE2
bcf A21
bcf AUX
bsf Pulsador ; Línea del pulsador configurada como entrada.
bcf STATUS,RP0 ; Acceso al Banco 0.
call InicializaContador ; Inicializa el Contador y lo visualiza.
Principal
btfsc Pulsador ; ¿Pulsador presionado?, ¿(Pulsador)=0?
goto Fin ; No. Vuelve a leerlo.
; call Retardo_20ms ; Espera que se estabilicen los niveles de tensión.
btfsc Pulsador ; Comprueba si es un rebote.
goto Fin ; Era un rebote y sale fuera.
call IncrementaVisualiza ; Incrementa el contador y lo visualiza.
EsperaDejePulsar
btfss Pulsador ; ¿Dejó de pulsar?. ¿(Pulsador)=1?
goto EsperaDejePulsar ; No. Espera que deje de pulsar.
Fin goto Principal

; Subrutina "IncrementaVisualiza" ---------------------------------------------------------

IncrementaVisualiza
incf Contador,F ; Incrementa el contador y comprueba si ha
movlw d'4' ; llegado a su valor máximo mediante una
subwf Contador,W ; resta. (W)=(Contador)-4.
btfsc STATUS,C ; ¿C=0?, ¿(W) negativo?, ¿(Contador)<4?
InicializaContador
clrf Contador ; No, era igual o mayor. Por tanto, resetea.
Visualiza
movf Contador,W
; call Numero_a_7Segmentos ; Lo pasa a siete segmento para poder ser
call Tabla
movwf Display ; visualizado en el display.
return
Tabla
addwf PCL,F
DT 06h, 5Bh, 4Fh, 66h ; Números 1, 2, 3 y 4.


INCLUDE <RETARDOS.INC> ; Subrutinas de retardo.
END ; Fin del programa.


¿Hay alguna idea?

Saludo.
#816
Hola:

Siendo este código en asm para PIC16F84A, ya lo pasaré a PIC16F88.

; Implementar una tabla de la verdad mediante el manejo de tablas grabadas en ROM.
; Por ejemplo, la tabla será de 3 entradas y 6 salidas tal como la siguiente:
;
;         C  B  A  | S5  S4  S3  S2  S1  S0
;         -----------|---------------------------
;         0   0   0   |   0    0    1    0    1    0    ; (Configuración 0).
;         0   0   1   |   0    0    1    0    0    1    ; (Configuración 1).
;         0   1   0   |   1    0    0    0    1    1    ; (Configuración 2).
;         0   1   1   |   0    0    1    1    1    1    ; (Configuración 3).
;         1   0   0   |   1    0    0    0    0    0    ; (Configuración 4).
;         1   0   1   |   0    0    0    1    1    1    ; (Configuración 5).
;         1   1   0   |   0    1    0    1    1    1    ; (Configuración 6).
;         1   1   1   |   1    1    1    1    1    1    ; (Configuración 7).
;
; Las entradas C, B, A se conectarán a las líneas del puerto A: RA2 (C), RA1 (B) y RA0 (A).
; Las salidas se obtienen en el puerto B:
; RB5 (S5), RB4 (S4), RB3 (S3), RB2 (S2), RB1 (S1) y RB0 (S0).
;
; ZONA DE DATOS **********************************************************************

    LIST        P=16F84A
    INCLUDE        <P16F84A.INC>
    __CONFIG    _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

; ZONA DE CÓDIGOS ********************************************************************

    ORG     0                    ; El programa comienza en la dirección 0.
Inicio
    bsf        STATUS,RP0            ; Acceso al Banco 1.
    clrf    TRISB                ; Las líneas del Puerto B se configuran como salida.
    movlw    b'00011111'            ; Las 5 líneas del Puerto A se configuran como entrada.
    movwf    TRISA
    bcf        STATUS,RP0            ; Acceso al Banco 0.
Principal
    movf    PORTA,W                ; Lee el valor de las variables de entrada.
    andlw    b'00000111'            ; Se queda con los tres bits de entrada.
    addwf    PCL,F                ; Salta a la configuración adecuada.
Tabla
    goto    Configuracion0
    goto    Configuracion1
    goto    Configuracion2
    goto    Configuracion3
    goto    Configuracion4
    goto    Configuracion5
    goto    Configuracion6
    goto    Configuracion7
Configuracion0
    movlw     b'00001010'            ; (Configuración 0).
    goto    ActivaSalida
Configuracion1
    movlw     b'00001001'            ; (Configuración 1).
    goto    ActivaSalida
Configuracion2
    movlw     b'00100011'            ; (Configuración 2).
    goto    ActivaSalida
Configuracion3
    movlw     b'00001111'            ; (Configuración 3).
    goto    ActivaSalida
Configuracion4
    movlw     b'00100000'            ; (Configuración 4).
    goto    ActivaSalida
Configuracion5
    movlw     b'00000111'            ; (Configuración 5).
    goto    ActivaSalida
Configuracion6
    movlw     b'00010111'            ; (Configuración 6).
    goto    ActivaSalida
Configuracion7
    movlw     b'00111111'            ; (Configuración 7).
ActivaSalida
    movwf    PORTB                ; Visualiza por el puerto de salida.
    goto     Principal

    END
Partiendo del código de arriba, quiero hacer una tabla de la verdad para un display de 7 segmentos y la otra tabla es para configuración a otra cosa. En dicho display debe contar del 1 al 4.

La idea consiste con un pulsador, incrementar las dos tablas de la verdad.

¿Esto es posible?

Si no entiendes, lo explico de otra manera.

Un saludo.
#817
Hola:

Si peudes, pon una foto mejor.

Si puedes, consigues una memoria igual y sacrificas la EEPROM interna por la otra, lo he hecho así con Pendrive.

Saludo.
#818
Hola:

Aquí aprenderás todo tus preguntas.
http://www.pic16f84a.org/

Saludo.
#819
Cita de: #!drvy en  3 Mayo 2014, 17:23 PM
No se si lo sabes y es para hacer la gracia o no pero me siento obligado a citarlo xD

Saludos

Xdddddddddddd.
#820
Hola:

He leído esta noticia y miran como se quejan por Las Islas Canarias que está lejos.
La Agencia Tributaria actúa contra la venta de pulseritas de goma entre escolares.

   
CitarEsta misma mañana, la Agencia Tributaria junto a Policía Nacional y miembros de la Policía Canaria han puesto en marcha un amplio operativo en las siete islas con el objetivo de acabar con el negocio de venta de pulseritas de goma entre escolares, una actividad que actualmente se encuentra en un boom y que, según técnicos de Hacienda, podría estar moviendo millones de euros que no se declaran al fisco.
    Miembros de la policía sorprenden en el patio a un grupo de escolares que preparaba las fiestas de Mayo

    Miembros de la policía sorprenden en el patio a un grupo de escolares que preparaba las fiestas de Mayo

    Días atrás, diversas asociaciones de comerciantes se habían reunido con responsables de la Consejería de Empleo, Industria y Comercio para hacer llegar su queja por esta moda importada que les está produciendo, no sólo una caída de ventas en otros artículos de consumo habitual entre escolares sino que también se sabe que está generando un tráfico comercial no controlado que perjudica a quienes tienen su situación regularizada y pagan sus impuestos.

    Para Sebastián López, portavoz de las diferentes asociaciones afectadas, "la falta de control sobre los niños ha provocado que muchos de ellos hayan comenzado a tejer un entramado comercial de venta de pulseritas creadas durante las horas de recreo, en el comedor o traídas directamente desde casa, que nos está perjudicando gravemente.
    Desde nuestra asociación reclamamos al Gobierno que actúe, potenciando los pasatiempos tradicionales y fomentando nuestra cultura entre los mas pequeños a través de campañas de sensibilización acerca de las bondades de tratar el cuero para realizar cintos o zurrones para guardar las chuches, o del atractivo del barro y la arcilla para hacer figuras o útiles de juego. Son productos de las islas y los ponemos a disposición de los niños a precios razonables para que desarrollen su imaginación " -señaló el citado portavoz-.
    Un miembro de la policía realiza un control con perros adiestrados para la localización de pulseras de goma

    Un miembro de la policía realiza un control con perros adiestrados para la localización de pulseras de goma

    Por el momento, no ha trascendido el número de detenidos pero sí se ha señalado que en un CEIP de La Laguna la policía descubrió un taller clandestino ubicado en la zona de juego de Infantil donde varios niños se dedicaban a separar gomitas por colores, lo que en el argot policial se denomina "cortar la goma", y en el que se incautaron varios miles de pulseritas dobles listas para ser vendidas y una decena de telares de plástico, algunos de ellos con pulseras a punto de ser rematadas.

    Mientras la operación policial continúa, se respira una calma tensa en parques y plazas de nuestro archipiélago donde la policía está tomando posiciones para tratar de frenar cualquier conato de protesta en cuanto los escolares vuelvan a su casa y, tras hacer la tarea, comiencen a llegar a su lugar habitual de juego.

    Mientras tanto, Multicolors Spain, la filial española de la ultinacional líder en fabricación de gomas de colores ha suspendido su cotización en el IBEX35 ante rumores que indican que podría estar siendo investigada por estar detrás de una de las redes de creación y venta de abalorios mas activa de la provincia de Tenerife.

Fuente:
http://www.elbaifoilustrado.com/la-agencia-tributaria-actua-contra-la-venta-de-pulseritas-de-goma-entre-escolares/

Salu2.