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

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ASM (Moderador: Eternal Idol)
| | | |-+  TMR0 como contador por pulsos (P16F628A)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: TMR0 como contador por pulsos (P16F628A)  (Leído 1,753 veces)
danissj

Desconectado Desconectado

Mensajes: 6


Ver Perfil
TMR0 como contador por pulsos (P16F628A)
« en: 28 Septiembre 2018, 00:16 am »

Buenas gente, soy nuevo en el foro, y vengo con una duda, un poco fácil para ustedes. Verán estoy haciendo un trabajo para la facultad, sencillo, somos nuevos en assembler, y me piden por un DISPLAY de 7 segmentos contar automaticamente, en hexadecimal, hasta 15 (F), y despues decrementar también automáticamente, el problema surge que me piden entre cada cambio de display un retardo de 1 segundo hecho únicamente con el TMR0, y a la vez pausar y reanudar el programa mediante un pulsador en RB0.
Nunca hice retardos por el TMR0, solo los hacía mediante loops de contadores contando los ciclos de maquina etc...

Verán, lo que hice fue el programa beta que cuento hasta 15 y decremento, automaticamente, con un retardo de 1 segundo, tambien llegue a hacer una pausa.
Lo que me faltaría saber es el loop para continuar y reanudar, lo intente hacer btfss y btfsc pero no le encuentro la vuelta. tambien hacer un retardo unicamente con el TMR0.

Hasta ahora, si presiono RB0 se para el programa pero no lo puedo reanudar, les paso el .asm.



Código:
#include    <p16f628a.inc>

Contador    equ    0x20
AuxStatus    equ    0x21
AuxW        equ    0x22
Contador3    equ    0x24
CONT            EQU        0x27
CONT2            EQU        0x28
CONT3            EQU        0x29

    org        0
    goto    Configuracion
    org        0x04
Interrupcion:
    btfsc    PORTB,0
    goto    $
    bcf        INTCON,GIE                    ;INHABILITO INTERRUPCIONES GLOBALES
    bcf        INTCON,INTF                    ;BAJO EL FLAG DE INTERRUPCION DE RB0
    bsf        INTCON,GIE                    ;HABILITO INTERRUPCIONES GLOBALES
    movwf    AuxW                        ;GUARDO EL CONTENIDO DE W
    movfw    STATUS
    movwf    AuxStatus                    ;GUARDO EL CONTENIDO DEL STATUS
    movwf    STATUS
    movfw    AuxW
    retfie   

Configuracion:
    bsf        INTCON,GIE                    ;HABILITO INTERRUPCIONES GLOBALES
    bsf        INTCON,INTE                    ;HABILITO INTERRUPCIONES POR RB0
    bsf        STATUS,RP0                    ;CAMBIO A BANCO 1
    clrf    TRISB                        ;SETEA TODOS LOS BITS DEL TRISB EN 0
    bsf        TRISB,0                        ;RB0 COMO ENTRADA
    bcf        STATUS,RP0                    ;CAMBIO A BANCO 0
    movlw    B'10000000'                    ;EL DISPLAY INICIA EN 0
    movwf    PORTB
    clrf    Contador                    ;INICIALIZO EL CONTADOR EN 0                   

Inicio:
    movlw    d'15
    movwf    Contador3
    incf    Contador,1                    ;SI FUE PULSADO, SE INCREMENTA EL CONTADOR EN 1
    movfw    Contador                    ;SE PASA EL VALOR DE CONTADOR A W
    call    Display
    movwf    PORTB
    call    delay_1s
    decfsz    Contador3,f
    goto    $-.6                        ;HASTA CALL PRESION
    movlw    d'15
    movwf    Contador3
    decf    Contador,1
    movfw    Contador
    call    Display
    movwf    PORTB
    call    delay_1s
    decfsz    Contador3,f
    goto    $-.6                        ;HASTA CALL PRESION
    goto    Inicio
   

Display:
    addwf    PCL,1
    retlw   B'01111110'             ;NUMERO 0
    retlw   B'00001100'             ;NUMERO 1
    retlw   B'10110110'             ;NUMERO 2
    retlw   B'10011110'             ;NUMERO 3
    retlw   B'11001100'             ;NUMERO 4
    retlw   B'11011010'             ;NUMERO 5
    retlw   B'11111010'             ;NUMERO 6
    retlw   B'00001110'             ;NUMERO 7
    retlw   B'11111110'             ;NUMERO 8
    retlw   B'11011110'             ;NUMERO 9
    retlw   B'11101110'             ;LETRA A
    retlw   B'11111000'             ;LETRA B
    retlw   B'01110010'             ;LETRA C
    retlw   B'10111100'             ;LETRA D
    retlw   B'11110010'             ;LETRA E
    retlw   B'11100010'             ;LETRA F
    clrf    Contador        ;REINICIA EL CONTADOR
    retlw    B'01111110'        ;NUMERO 0
    return   

 

DELAY_1MS
    MOVLW .250
    MOVWF CONT
LOOP   
    NOP
    DECFSZ CONT,F
    GOTO LOOP   
    RETURN

DELAY_10MS
    MOVLW .10
    MOVWF CONT2
LOOP2   
    CALL DELAY_1MS
    DECFSZ CONT2,F
    GOTO LOOP2   
    RETURN

DELAY_1S
    MOVLW .100
    MOVWF CONT3
LOOP3
    CALL DELAY_10ms
    DECFSZ CONT3,F
    GOTO LOOP3
    RETURN


end


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
TMR0 16f84a 1 segundo de retraso
Electrónica
Toxico 1 6,187 Último mensaje 11 Marzo 2008, 03:53 am
por dabo
Generar pulsos en el puerto paralelo
Programación Visual Basic
dhul 0 2,154 Último mensaje 7 Agosto 2007, 22:48 pm
por dhul
los pulsos digitales
Electrónica
romancero 3 8,339 Último mensaje 7 Diciembre 2010, 03:11 am
por romancero
Enviar pulsos por usb linux
GNU/Linux
_niu 1 3,188 Último mensaje 14 Octubre 2011, 00:37 am
por Foxy Rider
Interrupcion RB0 y inicio del TMR0 CCS
Electrónica
eric090 3 6,844 Último mensaje 8 Junio 2013, 15:57 pm
por ruibal69
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines