Ejemplo SCI Recepción por Interrupciones

De Wikitronica
Revisión del 20:28 17 mar 2013 de Racuna (Discusión | contribuciones)

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



Este artículo está incompleto. Necesita trabajo adicional. Revisar la discusión.


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