elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


+  Foro de elhacker.net
|-+  Informática
| |-+  Electrónica
| | |-+  Modificar este código a algo más complejo
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: Modificar este código a algo más complejo  (Leído 10,233 veces)
Meta


Desconectado Desconectado

Mensajes: 3.499



Ver Perfil WWW
Re: Modificar este código a algo más complejo
« Respuesta #10 en: 5 Agosto 2014, 04:11 am »

Hola:

Pensé que guardando el valor contador, es suficiente con solo un byte recordar las dos tablas donde van. Voy a examinarlo mejor tu código.

Le has puesto dos variables. ADDR y VALUE para guardar.

Saludo.


« Última modificación: 5 Agosto 2014, 04:13 am por Meta » En línea

Meta


Desconectado Desconectado

Mensajes: 3.499



Ver Perfil WWW
Re: Modificar este código a algo más complejo
« Respuesta #11 en: 8 Agosto 2014, 05:47 am »

Hola:

Ahora me funciona todo.

Código
  1. ;
  2. ; Un pulsador en RA4 va incrementando un Contador, entre [1-4].
  3. ; La salida se envía a un display de 7 seg. en PORTB, y hacia salidas en PORTA.
  4. ; El Contador queda guardado en la EEPROM.
  5. ;
  6. ; (Contador)  |RB 76543210 |RA 76543210
  7. ; ------------|------------------------
  8. ;       1     |   00000011 |   00000010
  9. ;       2     |   00100100 |   00000101
  10. ;       3     |   00001100 |   00000110
  11. ;       4     |   00111100 |   00001001
  12. ;
  13. ; PORTA:
  14. ;  RA0 : OE1
  15. ;  RA1 : OE2
  16. ;  RA2 : A21
  17. ;  RA3 : AUX
  18. ;  RA4 : Pulsador
  19. ;
  20. ; PORTB : display de 7 segmentos. a = RB0
  21. ;
  22.  
  23. ;*******************************************************************************
  24. ; Listado y condiciones de ensamblado
  25.  
  26.    LIST    P=16F88           ; 4 Mhz
  27.    INCLUDE <P16F88.INC>
  28.    ;radix       hex
  29.    ERRORLEVEL  -302            ; Turn off banking message
  30.  
  31. ;*******************************************************************************
  32. ; Fusibles
  33.  
  34.    __CONFIG _CONFIG1, _CP_OFF & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_ON & _WDT_OFF & _INTRC_IO
  35.  
  36. ; _CP_OFF           : Protección de código
  37. ; _DEBUG_OFF        : Debug en circuito
  38. ; _WRT_PROTECT_OFF  : Protección a escritura en memoria de programa
  39. ; _CPD_OFF          : Protección de código de datos
  40. ; _LVP_OFF          : Programación en baja tensión
  41. ; _BODEN_OFF        : Reset por Brown-out
  42. ; _MCLRE_ON         : Reset por pin externo
  43. ; _PWRTE_ON         : Retraso al reset
  44. ; _WDT_OFF          : Watchdog
  45. ; _XT_OSC           : Oscilador externo del tipo XT
  46.  
  47.  
  48. ;*******************************************************************************
  49. ; Definiciones
  50.  
  51. ; Máscaras de E/S de los puertos. 0 = salida, 1 = entrada
  52. ;                    |76543210|
  53. #DEFINE PUERTO_A    b'00010000'
  54. #DEFINE PUERTO_B    b'00000000'
  55.  
  56. ; Incorporar sentencias de comprobación de la EEPROM
  57. #DEFINE test_eeprom 0
  58.  
  59. ;*******************************************************************************
  60. ; Variables
  61. Variables   UDATA_SHR
  62. Contador    RES 1                   ; Contador en la SRAM
  63.  
  64. ; ******************************************************************************
  65. ; EEPROM
  66.  
  67. ; Dirección del Contador dentro de la EEPROM
  68. EE_Contador EQU 0x02
  69.  
  70. ; Debemos desplazarnos a la zona de memoria más allá del 0x2100, que corresponde
  71. ; a la zona de la EEPROM en la mayoría de los PIC (ver documentación).
  72. ; Este valor es el que se grabará en la EEPROM en el momento de grabar el programa
  73. ; en el µcontrolador.
  74.    ORG     0x2100 + EE_Contador
  75.    DE      0x01                               ; valor inicial de ee_Contador
  76.  
  77. ;*******************************************************************************
  78.  
  79.    ORG    0x0000
  80.  
  81. Inicio
  82.    banksel ANSEL           ; bank 1
  83.    clrf    ANSEL           ; puerto A digital
  84.    movlw   PUERTO_A        ; definir E/S puerto A
  85.    movwf   TRISA
  86.    movlw   PUERTO_B        ; definir E/S puerto B
  87.    movwf   TRISB
  88.    movlw   b'01100000'     ; 4 MHz
  89.    movwf   OSCCON
  90.    call    EEPROM_LeeDato
  91.  
  92.  
  93. #if test_eeprom
  94. ; Comprobar que el Contador es correcto (esta parte es opcional)
  95.    decf    Contador, w     ; leemos el Contador y le quitamos 1
  96.    andlw   0x3             ; nos quedamos solo con los bits inferiores
  97.    addlw   0x1             ; volvemos a sumarle 1
  98.    movwf   Contador        ; y lo guardamos
  99. #endif
  100.    goto    Visualiza       ; ir a presentar
  101.  
  102. ; Bucle principal
  103. Principal
  104.    btfsc   PORTA, RA4      ; leer pulsador
  105.    goto    Principal       ; No, esperar
  106. ;
  107. ; Se ha pulsado el botón
  108.    call    incrementa_Contador
  109. Visualiza
  110.    call    visualiza_Contador
  111.    call    salida_hacia_A
  112.  
  113. ; Esperar liberación del botón
  114. Espera_levantar
  115.    call    Retardo_100ms   ; Esperar la suelta del botón
  116.  
  117.    btfss   PORTA, RA4      ; leer pulsador
  118.    goto    Espera_levantar ; No, esperar
  119.  
  120. ; Repetir
  121.    goto    Principal
  122.  
  123.  
  124. ; ******************************************************************************
  125. ;; salida_hacia_A
  126. ;
  127. ; Según el valor del Contador ([1-4]), lo transforma en otro, basado en una
  128. ; tabla y lo saca por el puerto A
  129. ;
  130.  
  131. salida_hacia_A
  132.    call    transforma_Contador
  133.    movwf   PORTA           ; visualiza en puerto A
  134.    return
  135.  
  136. transforma_Contador
  137.    decf    Contador, w     ; leemos el Contador y le restamos 1
  138.    addwf   PCL, f          ; saltamos dentro de la tabla
  139.  
  140.    ;                            |76543210|
  141.    retlw   b'00000010'
  142.    retlw   b'00000101'
  143.    retlw   b'00000110'
  144.    retlw   b'00001001'
  145.  
  146. ; ******************************************************************************
  147. ;; incrementa_Contador
  148. ;
  149. ; Incrementa el valor de la variable Contador, entre 1 y 4, inclusives.
  150. ;
  151.  
  152. incrementa_Contador
  153.    bcf     Contador, 2     ; Si el Contador valía 4, ahora vale 0
  154.    incf    Contador, f     ; Incrementa el Contador
  155.    call    EEPROM_EscribeDato
  156.  
  157. ; ******************************************************************************
  158. ;; visualiza_Contador
  159. ;
  160. ; Muestra el valor del Contador en el display de 7 segmentos
  161. ;
  162.  
  163. visualiza_Contador
  164.    movfw   Contador        ; leemos Contador
  165.    call    w_a_digito      ; transformación a dígito 7 segmentos
  166.    movwf   PORTB           ; visualiza en puerto B
  167.    return
  168.  
  169. w_a_digito         addwf   PCL, f          ; salta al dígito indexado por w
  170.  
  171. ;            |76543210|
  172.    retlw   b'00111111'     ; 0
  173.    retlw   b'00000110'     ; 1
  174.    retlw   b'01011011'     ; 2
  175.    retlw   b'01001111'     ; 3
  176.    retlw   b'01100110'     ; 4
  177.    retlw   b'01101101'     ; 5
  178.    retlw   b'01111101'     ; 6
  179.    retlw   b'00000111'     ; 7
  180.    retlw   b'01111111'     ; 8
  181.    retlw   b'01101111'     ; 9
  182.  
  183. ; ----------------------------------------------------------------------------------------------------
  184. ; Espera = 100ms
  185. ; Frecuencia de reloj = 4Mhz
  186. ;
  187. ; Espera real = 0.1 segundos = 100000 ciclos
  188. ; Error = 0.00 %
  189.  
  190. Retardo_var        udata_shr
  191.  
  192. Retardo_100ms_d1    res 1
  193. Retardo_100ms_d2    res 1
  194.  
  195. Retardo_code       code
  196.  
  197. Retardo_100ms
  198. ;99993 cycles
  199. movlw 0x1E
  200. movwf Retardo_100ms_d1
  201. movlw 0x4F
  202. movwf Retardo_100ms_d2
  203. Retardo_100ms_0
  204. decfsz Retardo_100ms_d1, f
  205. goto $+2
  206. decfsz Retardo_100ms_d2, f
  207. goto Retardo_100ms_0
  208.  
  209. ;3 cycles
  210. goto $+1
  211. nop
  212.  
  213. ;4 cycles (including call)
  214. return
  215.  
  216. ; ******************************************************************************
  217.  
  218. ; Leer valor del Contador en la EEPROM
  219. EEPROM_LeeDato
  220.    banksel EEADR           ; bank 2
  221.    movlw   EE_Contador     ; dirección de la EEPROM a leer
  222.    movwf   EEADR
  223.  
  224.    banksel EECON1          ; bank 3
  225.    bcf     EECON1, EEPGD   ; acceso a la memoria de datos
  226.    bsf     EECON1, RD      ; inicia la lectura
  227.  
  228.    banksel EEDATA          ; bank 2
  229.    movf    EEDATA, w       ; dato leído en W
  230.    movwf   Contador        ; guardar en SRAM
  231.    ;
  232.    banksel PORTA           ; bank 0, durante el programa
  233.    return
  234.  
  235. ; Escribe el Contador en la EEPROM
  236. EEPROM_EscribeDato
  237.    banksel EECON1          ; bank 3
  238.    btfsc   EECON1, WR      ; esperar para poder escribir
  239.    goto    $-1
  240.  
  241.    banksel EEADR           ; bank 2
  242.    movlw   EE_Contador     ; dirección donde vamos a escribir
  243.    movwf   EEADR
  244.  
  245.    movf    Contador, w     ; el valor que vamos a escribir
  246.    movwf   EEDATA
  247.  
  248.    banksel EECON1          ; bank 3
  249.    bcf     EECON1, EEPGD   ; acceso a la memoria de datos
  250.    bsf     EECON1, WREN    ; activa la escritura
  251.  
  252.    ;                    bcf     INTCON, GIE     ; desactivar interrupciones
  253.  
  254.    movlw   b'01010101'     ; valores mágicos (requeridos)
  255.    movwf   EECON2
  256.    movlw   b'10101010'
  257.    movwf   EECON2
  258.  
  259.    bsf     EECON1, WR      ; comienza la escritura
  260.  
  261.    ;                    bsf     INTCON, GIE     ; reactiva interrupciones
  262.  
  263.    bcf     EECON1, WREN    ; desactiva escrituras
  264.  
  265.    banksel PORTA           ; volvemos a bank 0
  266.    return
  267.                    END
  268.  
  269.  
  270.  

Gracias por tu tiempo.  :D


En línea

Meta


Desconectado Desconectado

Mensajes: 3.499



Ver Perfil WWW
Re: Modificar este código a algo más complejo
« Respuesta #12 en: 15 Agosto 2014, 09:44 am »

Buenas:

Voy hacerles una pregunta. Sobre el código de arriba quiero hacer algo parecido del PIC16F88 al PIC16F630 para saber si realmente funciona. Hablo de adaptación del código y usando un decodificador 74LS48.

Transformar este esquema...


Con este otro.

Habiendo el primer circuito con menos componentes. ¿Por qué usar el segundo esquema también?

Porque otras personas que quieren montar el circuito no pueden debido a que su local de electrónica favorita no tienen el PIC16F88 y si el PIC16F630 junto con el decodificador de 7 segmentos 74LS48.

Partiendo del código de abajo del PIC16F88 para analizarlo bien.
Código:
; 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.
; El Contador queda guardado en la EEPROM.
;
; (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
;

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

    LIST    P=16F88           ; 4 Mhz
    INCLUDE <P16F88.INC>
    ;radix       hex
    ERRORLEVEL  -302            ; Turn off banking message

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

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

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


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

; Máscaras de E/S de los puertos. 0 = salida, 1 = entrada
;                    |76543210|
#DEFINE PUERTO_A    b'00010000'
#DEFINE PUERTO_B    b'00000000'

; Incorporar sentencias de comprobación de la EEPROM
#DEFINE test_eeprom 0

;*******************************************************************************
; Variables
Variables   UDATA_SHR
Contador    RES 1                   ; Contador en la SRAM

; ******************************************************************************
; EEPROM

; Dirección del Contador dentro de la EEPROM
EE_Contador EQU 0x02

; Debemos desplazarnos a la zona de memoria más allá del 0x2100, que corresponde
; a la zona de la EEPROM en la mayoría de los PIC (ver documentación).
; Este valor es el que se grabará en la EEPROM en el momento de grabar el programa
; en el µcontrolador.
    ORG     0x2100 + EE_Contador
    DE      0x01                               ; valor inicial de ee_Contador

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

    CODE    0x0000

Inicio
    banksel ANSEL           ; bank 1
    clrf    ANSEL           ; puerto A digital
    movlw   PUERTO_A        ; definir E/S puerto A
    movwf   TRISA
    movlw   PUERTO_B        ; definir E/S puerto B
    movwf   TRISB
    movlw   b'01100000'     ; 4 MHz
    movwf   OSCCON
    call    EEPROM_LeeDato


#if test_eeprom
; Comprobar que el Contador es correcto (esta parte es opcional)
    decf    Contador, w     ; leemos el Contador y le quitamos 1
    andlw   0x3             ; nos quedamos solo con los bits inferiores
    addlw   0x1             ; volvemos a sumarle 1
    movwf   Contador        ; y lo guardamos
#endif
    goto    Visualiza       ; ir a presentar

; Bucle principal
Principal
    btfsc   PORTA, RA4      ; leer pulsador
    goto    Principal       ; No, esperar
;
; Se ha pulsado el botón
    call    incrementa_Contador
Visualiza
    call    visualiza_Contador
    call    salida_hacia_A

; Esperar liberación del botón
Espera_levantar
    call    Retardo_100ms   ; Esperar la suelta del botón

    btfss   PORTA, RA4      ; leer pulsador
    goto    Espera_levantar ; No, esperar

; Repetir
    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     ; Si el Contador valía 4, ahora vale 0
    incf    Contador, f     ; Incrementa el Contador
    call    EEPROM_EscribeDato

; ******************************************************************************
;; 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

; ----------------------------------------------------------------------------------------------------

Retardo_var        udata_shr

Retardo_100ms_d1    res 1
Retardo_100ms_d2    res 1

Retardo_code       code

Retardo_100ms
;99993 cycles
movlw 0x1E
movwf Retardo_100ms_d1
movlw 0x4F
movwf Retardo_100ms_d2
Retardo_100ms_0
decfsz Retardo_100ms_d1, f
goto $+2
decfsz Retardo_100ms_d2, f
goto Retardo_100ms_0

;3 cycles
goto $+1
nop

;4 cycles (including call)
return

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

; Leer valor del Contador en la EEPROM
EEPROM_LeeDato
    banksel EEADR           ; bank 2
    movlw   EE_Contador     ; dirección de la EEPROM a leer
    movwf   EEADR

    banksel EECON1          ; bank 3
    bcf     EECON1, EEPGD   ; acceso a la memoria de datos
    bsf     EECON1, RD      ; inicia la lectura

    banksel EEDATA          ; bank 2
    movf    EEDATA, w       ; dato leído en W
    movwf   Contador        ; guardar en SRAM
    ;
    banksel PORTA           ; bank 0, durante el programa
    return

; Escribe el Contador en la EEPROM
EEPROM_EscribeDato
    banksel EECON1          ; bank 3
    btfsc   EECON1, WR      ; esperar para poder escribir
    goto    $-1

    banksel EEADR           ; bank 2
    movlw   EE_Contador     ; dirección donde vamos a escribir
    movwf   EEADR

    movf    Contador, w     ; el valor que vamos a escribir
    movwf   EEDATA

    banksel EECON1          ; bank 3
    bcf     EECON1, EEPGD   ; acceso a la memoria de datos
    bsf     EECON1, WREN    ; activa la escritura

    ;                    bcf     INTCON, GIE     ; desactivar interrupciones

    movlw   b'01010101'     ; valores mágicos (requeridos)
    movwf   EECON2
    movlw   b'10101010'
    movwf   EECON2

    bsf     EECON1, WR      ; comienza la escritura

    ;                    bsf     INTCON, GIE     ; reactiva interrupciones

    bcf     EECON1, WREN    ; desactiva escrituras

    banksel PORTA           ; volvemos a bank 0
    return
    END


Antes de tocar algo.

¿Debo saber algo más?

Un saludo.

PD: Espero que no sea mucho de machacarte las neuronas por una adapación en asm.
En línea

Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Algo complejo.
Unix/Unix-Like
B€T€B€ 3 6,109 Último mensaje 15 Noviembre 2010, 23:38 pm
por B€T€B€
Contador de visitas algo complejo
PHP
mark182 2 4,055 Último mensaje 22 Abril 2012, 00:17 am
por mark182
Ayuda en modificar este código en c
Programación C/C++
amjrey617 4 2,907 Último mensaje 3 Marzo 2014, 12:43 pm
por amjrey617
necesito modificar este código de triqui esta C++ lo corro en koding linux
Programación C/C++
rapsolostyle 3 2,930 Último mensaje 1 Octubre 2015, 04:35 am
por 0xFer
Ven algo raro en este codigo basico con structs? en C
Programación C/C++
palacio29 4 2,632 Último mensaje 11 Septiembre 2016, 22:55 pm
por palacio29
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines