Ejemplo SCI Transmisión por Interrupciones

De Wikitronica
Saltar a: navegación, buscar

El siguiente es un ejemplo de Transmisión de una Tabla de caractares ASCII por puerto Serial para la tarjeta DEMOQE128.

;*******************************************************************
;Ejemplo de Transmision Serial de una tabla por interrupciones     *
;*******************************************************************

; Include derivative-specific definitions
            INCLUDE 'derivative.inc'
;
; export symbols
;
            XDEF _Startup
            ABSENTRY _Startup
ROMTable:      EQU     $3000  ;Lugar donde definimos la Tabla
;
; variable/data section
;
            ORG    RAMStart         ; Insert your data definition here
Apuntador: DS.B   1                 ; Apuntador al Byte que se va a mandar
;
; code section
;
            ORG    ROMStart
_Startup:
            LDHX   #RAMEnd+1        ; initialize the stack pointer
            TXS
            LDA #$00
            STA SCI1BDH   ;/* Tasa alta de transmisión deshabilitada (Baud high disabled)*/
            LDA #$1A      ;/* Pre-escaler ajustado: [SBR12:SBR0] = 4Mhz/(16*9600) =~ 26,04d= 1A (hex)*/ 
            STA SCI1BDL   ;/*Baud Rate = 9600bps*/
            LDA #$00
            STA SCI1C1    ;/*Transmisión y recepción normal de 8 bits sin paridad*/
            LDA #$AC
            STA SCI1C2    ;/*Habilita transmisor y receptor y habilita interrupciones*/
            LDHX #$0
            LDA #$0
            STA Apuntador ;Apuntador a la Tabla 
            CLI           ; enable interrupts
            
mainLoop:
            ; Insert your code here
            NOP
            feed_watchdog
            BRA    mainLoop
;**************************************************************
;* spurious - Spurious Interrupt Service Routine.             *
;*             (unwanted interrupt)                           *
;**************************************************************

spurious:                           ; placed here so that security value
            NOP                     ; does not change all the time.
            RTI

Transmite: PSHH           ; La interrupción no guarda H (la guardamos nosotros)
           LDA SCI1S1     ; Se baja la bandera de transmisión            
           CLRH
           LDX Apuntador       
           LDA Tabla,X
           CMP #$0        ;Comparamos si llegamos al final de la tabla
           BEQ FinTrans   ;Si es el final apagamos el SCI
                                 
           STA SCI1D      ;Mandamos el siguiente valor de la tabla
           
           LDA Apuntador  ;Incrementamos el Apuntador 
           INCA
           STA Apuntador
           PULH           ; Retornamos H
           RTI
           
FinTrans:  MOV #$00, SCI1C2 ; Deshabilitamos completamente el SCI
           PULH             ; Retornamos H
           RTI          
;**************************************************************
;*                 Tabla en ROM                               *
;**************************************************************
       ORG     ROMTable
Tabla: DC.B    'H'
       DC.B    'O'
       DC.B    'L'
       DC.B    'A'
       DC.B    0
;**************************************************************
;*                 Interrupt Vectors                          *
;**************************************************************
            ORG   $FFDE ; Posición en memoria donde se encuentra el vector de interrupción   
            DC.W  Transmite     ; Rutina de Transmisión
            
            ORG   $FFFA 
            DC.W  spurious          ;
            DC.W  spurious          ; SWI
            DC.W  _Startup          ; Reset

Contributors

Racuna