Ejemplo Timer TPM por interrupciones

De Wikitronica
Saltar a: navegación, buscar
;*******************************************************************
;* Ejemplo de manejo del Timer TPM utilizando interrupciones.      *
;* Se configura el timer para que interrumpa cuando el contador    *
;* tiene el mismo valor que el registro modulo.                    *
;* Cada vez que se interrumpe se niegan los Leds                   *
;*******************************************************************

; Include derivative-specific definitions
            INCLUDE 'derivative.inc'
;
; export symbols
;
            XDEF _Startup
            ABSENTRY _Startup

;
; variable/data section
;
            ORG    RAMStart         ; Insert your data definition here
ExampleVar: DS.B   1

;
; code section
;
            ORG    ROMStart

_Startup:
            LDHX   #RAMEnd+1        ; initialize the stack pointer
            TXS
            ;------------------------------------------
            ;Configuracion de los pines del Demoqe128
            BSR Configurar_GPIO
			
			;------------------------------------------
            ;Configuracion del timer TPM1 			
			BSR Configurar_TPM
			
            CLI                     ; enable interrupts            
mainLoop: 
            NOP
            feed_watchdog
            BRA    mainLoop            
            
;**************************************************************
;* .             Subrutinas de Configuracion                  *
                                                              *
;**************************************************************
Configurar_GPIO:
			; Configuración de los leds del DEMOQE como salida
			; Los Leds tienen lógica negada
			;Parte inferior de Puerto C (0:5)
            LDA #$3F
            STA PTCDD
			STA PTCD
			;------------------------------------------
			;Parte superior de Puerto D (6:7)
            LDA #$C0
            STA PTEDD   
			STA PTED		 
            RTS
			
Configurar_TPM:
            ;Configuracion del timer TPM1 
            

            ;Valor maximo de conteo (Probar diferentes valores)
            LDHX    #$FFFF
            STHX    TPM1MOD            



            

            ;(Contador SIN interrupciones al hacer overflow)

            LDA #%01001111
            ; TPM1SC: TOF=0,TOIE=1,CPWMS=0,CLKSB=0,CLKSA=0,PS2=1,PS1=1,PS0=1 
            ;Probar diferentes valores de PS2,PS1,PS0
            STA TPM1SC
             
            RTS
            
;**************************************************************
;* .             Rutinas de atencion a las interrupciones     *
                                                              *
;**************************************************************
            
Interrupcion_TPM1:
            ;Limpiamos las banderas de interrupcion
            ;Primero se lee el regristro TPMxSC
            LDA TPM1SC
            ;Luego se baja el bit 7 (TOF) escribiendo 0
            AND #%01111111
            STA TPM1SC
            
            ;------------------------------------------
            ;Negamos los pines de los puertos            
            ;Los leds del demoqe son los primeros 6 de PTC
            ; junto a los 2 ultimos de PTE            
            ;Los tratamos por separado                 
            LDA PTCD
            COMA
			;------------------------------------------
			;Mascara de bits para pines inferiores  PTC
            AND #%00111111              
            STA PTCD   
			
            LDA PTED
            COMA
			;------------------------------------------
			;Mascara de bits para pines superiores PTE
            AND #%11000000   
            STA PTED
            
            ;Regresamos de la interrupcion
            RTI     

;**************************************************************
;* spurious - Spurious Interrupt Service Routine.             *
;*             (unwanted interrupt)                           *
;**************************************************************
spurious:                           ; placed here so that security value
            NOP                     ; does not change all the time.
            RTI

;**************************************************************
;*                 Interrupt Vectors                          *
;**************************************************************
            ORG   Vtpm1ovf
            DC.W  Interrupcion_TPM1
            
            ORG   $FFFA

            DC.W  spurious          ;
            DC.W  spurious          ; SWI
            DC.W  _Startup          ; Reset

Contributors

Racuna, Vegabante