Ejemplo SCI Recepción por Interrupciones

De Wikitronica
Revisión del 13:36 5 mar 2013 de Racuna (Discusión | contribuciones) (Página creada con «Categoría: EC2721 - Arquitectura del Computador 1 Categoría: EC3731 - Arquitectura del Computador 2 Categoría:MC9S08QE128 El siguiente es un ejemplo de Recep...»)

(dif) ← Revisión anterior | Revisión actual (dif) | Revisión siguiente → (dif)
Saltar a: navegación, buscar

El siguiente es un ejemplo de Recepción de datos por puerto serial utilizando interrupciones. Los datos recibidos son mostrados por los LEDS de la tarjeta de desarrollo DEMOQE128.

;*******************************************************************
;* Ejemplo de recepción serial por interrupciones
;* Se muestra el dato recibido por los LEDS del DEMOQE128
;*******************************************************************

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

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

;
; code section
;
            ORG    ROMStart

_Startup:
            LDHX   #RAMEnd+1        ; initialize the stack pointer
            TXS
            
            LDA #%00000011
            STA SOPT1 ;Disable Watch Dog, Enable BKGND debugging  
            
            LDA #$0
            STA DatoSerial ;inicialización de la variable
            
            BSR InitGPIO
            BSR InitSerial
            CLI                     ; enable interrupts

mainLoop:
            ; Insert your code here
            BSR MostrarDato
            
            BRA    mainLoop
            
;**************************************************************
;* Rutinas de inicializacion                                  *
;**************************************************************
            
InitGPIO:                ;Se configuran los LEDS del DEMOQE como salida
            LDA #$3F     ;Pines 0:5 del Puerto C y 6:7 del Puerto E como salida
            STA PTCDD
            STA PTCD
            LDA #$C0
            STA PTEDD
            STA PTED
            RTS   
            
InitSerial:
            LDA #$00
            STA SCI1BDH
            LDA #$1A     ;/* Pre-escaler ajustado: [SBR12:SBR0] = 4Mhz/(16*9600) =~ 26,04d= 1A (hex)*/ 
            STA SCI1BDL  ;/*Baud Rate = 9600bps para un clock de 4MHZ*/
            LDA #$00
            STA SCI1C1   ;/*Transmisión y recepción normal de 8 bits sin paridad*/
            LDA #%00100100
            STA SCI1C2   ;/*Habilita solo el receptor CON interrupciones*/ 
            RTS 


          
;**************************************************************
;* Rutina para mostrar el dato por el puerto                  *
;**************************************************************
          
          
MostrarDato:  
          LDA DatoSerial
                          ;Mostramos los pines 0:5 del PTC
          LDA #%00111111   ;Mascara de bits
          AND DatoSerial
          COMA            ;Logica negada en los leds
          STA PTCD
                          ;Mostramos los pines 6:7 del PTE           
          LDA #%11000000   ;Mascara de bits superiores
          AND DatoSerial
          COMA            ;Logica negada en los leds
          STA PTED
          RTS             ;Se sale de la sub rutina y vuelve al PC+1 de donde fue Llamada.
          
;**************************************************************
;* Rutina de interrupción serial para recepción               *
;**************************************************************          
            
RecepcionSerial:  
          LDA SCI1S1                  ;Primer paso para limpiar la bandera
          LDA SCI1D                   ;Segundo paso para limpiar la bandera. Se lee el dato recibido
          STA DatoSerial              ;Se coloca el valor del acumulador en la variable DatoSerial.
          RTI                         ;Se sale de la sub rutina y vuelve al PC+1 de donde fue Llamada.          

;**************************************************************
;* 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   $FFE0 ; Posición en memoria del vector de interrupción Serial para recibir  
            DC.W  RecepcionSerial     ; Rutina de recepción
            
            
            ORG   $FFFA

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

Contributors

Racuna