• Domingo 22 de Diciembre de 2024, 07:50

Autor Tema:  Denme una mano con el SCI del GP32  (Leído 1959 veces)

ElFabro

  • Miembro activo
  • **
  • Mensajes: 31
    • Ver Perfil
Denme una mano con el SCI del GP32
« en: Miércoles 16 de Junio de 2010, 17:29 »
0
Hola gente. Estoy tratando de arrancar el SCI del GP32 pero resulta que lo simulo y al parecer no funciona bien. Para simular que he recibido un dato uso la palabra SCDI seguido del dato, por ejemplo SCDI $A0.
A continuación adjunto el codigo.
Saludos.
Chau.

**************************************************************
*               EJEMPLO DEL USO DEL MÓDULO TIM               *
**************************************************************
$Include 'GP32.inc'

RAMStart     EQU  $0040
RomStart     EQU  $E000         ; This is valid ROM on the GP32, GT16, and GT8
VectorStart  EQU  $FFDC

    org RamStart

    org RomStart

**************************************************************
* Main_Init - This is the point where code starts executing  *
*             after a RESET.                                 *
**************************************************************
Main_Init:
       rsp
       clra                      ; Initialize A,X so that interrupt
       clrx                      ; processing doesn't stop with
                                 ; uninitialized register warning
                                 ; when push A,X on the stack
       cli                       ; Allow interrupts to happen

       mov       #$61,config1    ;COP deshabilitado
       mov       #$03,config2    ; For GT16 - turn on external clock
                                 ; For GP32 - SCI clock source is Bus
                                 ;            (Automatic for GT16)

**************************************************************
* Configuro el PLL para generar una frecuencia de 4.9152 MHz *
**************************************************************
       clr      PCTL             ;PLL:OFF
       bset     1,PCTL           ;P= 0 E= 2
       mov      #2,PMSH          ;N HI= 2
       mov      #1,PMDS          ;R= 1 (default)
       mov      #$58,PMSL        ;N LOW= 58
       mov      #$80,PMRS        ;L= 80
       bset     5,PCTL           ;PLL:ON
       bset     7,PBWC           ;enganche automatico

wait_pll:                       ;esperar que LOCK sea = 1
       brclr    6,PBWC,wait_pll ;
       bset     4,PCTL          ;cambia a frecuencia del PLL

*************************************************************
*                       MODULO SCI                                *
*************************************************************

******************************************************************
* SELECCION DEL BAUD RATE                                       *
* ESTOY TRABAJANDO CON UNA FRECUENCIA DE BUS    *
* INTERNO DE 4.9152 MHz.                                       *
******************************************************************

   mov #%00000011,SCBR   ;SCP1-SCP0=00 => Divisor por 1
                                ;76.80 KBaudios.
                                ;SCR2-SCR0=011 => Divisor por 8
                                ;9600 Baudios.

*************************************************
* SELECCIÓN DE LA LONGITUD DEL CARACTER Y TIPO  *
* DE PARIDAD.                                   *
*************************************************

   mov #%01000000,SCC1    ;ENSCI=1 => Habilito al SCI y al
                                ;SCI Baud rate.
                                ;M=0 => 8 bits de datos.
                                ;PEN=0 => Sin paridad.

*************************************************
* INTERRUPCIONES Y CONFIGURACION DEL TRANSMISOR   *
* USAR ESTO EN CASO DE SOLO TRANSMITIR.      *
*************************************************

        ;bclr 7,SCC2             ;SCTIE=0 => No interrumpe cuando
                   ;TX Data Register está vacio.
        ;bset 6,SCC2             ;TCIE=1 => Interrupción cuando la
                    ;TX está completa.
        ;bset 3,SCC2             ;TE=1 => Habilito la operación de TX.

*************************************************
* INTERRUPCIONES Y CONFIGURACION DEL RECEPTOR   *
* USAR ESTO EN CASO DE SOLO RECIBIR.      *
*************************************************

        bset 2,SCC2             ;SCRIE=1 => Interrumpe cuando se
                                       ;completa el Receive Data Register.
        bset 5,SCC2             ;RE=1 => Habilito interrupción del
                   ;receptor.

*************************************************
* SCI CONTROL REGISTER 3         *
*************************************************

   mov #%00000000,SCC3   ;b5=b4=0 => DMA no habilitado
                            ;b3=0 => Deshabilito interrupción por overrun error
                            ;b2=0 => Deshabilito interrupción por noise error
                            ;b1=0 => Deshabilito interrupción por framing error
                            ;b0=0 => Deshabilito interrupción por parity error

**************************************************************
*                    Programo el ADC                         *
**************************************************************

       mov     #%10000000,adclk         ;Programo el prescaler del clock del ADC
                                        ;b7-5 = ADIV[2:0] prescaler del clock del ADC 1XX = DIV/16
                                        ;32.768MHz/16 = 2.048MHz (Frec de trabajo del ADC)
                                        ;B4-0 = NO SE USAN = 0
       mov      #%01100010,adscr        ;Programo el modulo ADC
                                        ;b7 = COCO Conversion completa Solo lectura
                                        ;b6 = AIEN Habilitacion de interrupcion del ADC (lo activa)
                                        ;b5 = ADCO Conversion continua si = 1
                                        ;b4-0 = ADCH[2:0] Selecciona 1 de los canales del ADC (ADC2=PTB2)

**************************************************************
*                    Programo el Timer                       *
**************************************************************

       mov     #%01110110,T1SC          ;Frec
                                        ;b7=0 (TOF) Timer no fue reseteado
                                        ;b6=1 (TOE) Habilita interrupción Timer Overflow
                                        ;b5=1 Timer Detenido (Timer stopped)
                                        ;b4=1 Resetea el Contador y el Prescaler
                                        ;b2,1,0=110 Divide Frec Int Bus en 64
       mov     #$FF,T1MODH
       mov     #$FF,T1MODL              ;T1MODH:T1MODL=FFFF

;------ Canal 0 -----------------------------------------------------------------

       mov     #%01010110,T1SC0         ;b6=1 => Habilito interrupcion del TIM.
                                        ;b5=0,b4=1,b3=0,b2=1 => Output Compare,
                                        ;Toggle Output on Compare.
                                        ;b1=1 => Cambia el estado de la salida
                                        ;cuando hay timer overflow.
       mov     #$FF,T1CH0H
       mov     #$00,T1CH0L              ;T1CH0H:T1CH0L=FF00

;------ Canal 1 -----------------------------------------------------------------

       mov     #%01010110,T1SC1         ;b6=1 => Habilito interrupcion del TIM.
                                        ;b5=0,b4=1,b3=0,b2=1 => Output Compare,
                                        ;Toggle Output on Compare.
                                        ;b1=1 => Cambia el estado de la salida
                                        ;cuando hay timer overflow.
       mov     #$00,T1CH1H
       mov     #$80,T1CH1L              ;T1CH1H:T1CH1L=0080

       mov     #%01000110,T1SC          ;Arranco el timer (b5=0)
                                        ;b4=0 No tiene efecto

**************************************************************
*                     Módulo TBM                                    *
**************************************************************
       bset     1,TBCR
       bset     2,TBCR
       bset     3,TBCR
       bclr     4,TBCR
       bclr     5,TBCR
       bclr     6,TBCR

**************************************************************
*                     Configuro los puertos                  *
**************************************************************
       mov      #%11110000,ddrb
       mov      #$00,portb
       bset        4,ddrd
       bset        5,ddrd
       bclr        4,portd
       bclr        5,portd
       bset        0,ddra
       bclr        0,porta

**************************************************************
*                     Programa principal                     *
**************************************************************
Lazo:
                bra Lazo

**************************************************************
*         Rutina de atención de interrupción del TBM         *
**************************************************************
TBM:
      nop
      rti
**************************************************************
* AtoD_ISR - ADC Conversion Complete Interrupt               *
*            Transmit ADC value out serial port (PTE0)       *
**************************************************************
AtoD_ISR:
       nop
       rti


**************************************************************
* T_ISR - Timer Interrupt Service Routine.               *
*             after a RESET.                                         *
**************************************************************
TIM1_isr:
       bclr 7,T1SC
       rti

TIM1CH0_isr:
       bclr 7,T1SC0
       rti

TIM1CH1_isr:
       bclr 7,T1SC1
       rti

TIM2_isr:
       bclr 7,T2SC
       rti

TIM2CH0_isr:
       bclr 7,T2SC0
       rti

TIM2CH1_isr:
       bclr 7,T2SC1
       rti

SCITX_isr:
       nop
       rti

SCIRX_isr:
       lda SCS1         ;Limpio el registro SCS1
       lda SCDR         ;Cargo al ACC con el valor del SCDR
       bclr 5,SCS1
       rti

**************************************************************
* DUMMY_ISR - Dummy Interrupt Service Routine.               *
*             Just does a return from interrupt.             *
**************************************************************
dummy_isr:

       rti           ; return


**************************************************************
* Vectors - Timer Interrupt Service Routine.                 *
*             after a RESET.                                 *
**************************************************************
   org  VectorStart

        dw  TBM          ; Time Base Vector
        dw  atod_isr     ; ADC Conversion Complete
        dw  dummy_isr    ; Keyboard Vector
        dw  SCITX_isr    ; SCI Transmit Vector
        dw  SCIRX_isr    ; SCI Receive Vector
        dw  dummy_isr    ; SCI Error Vector
        dw  dummy_isr    ; SPI Transmit Vector
        dw  dummy_isr    ; SPI Receive Vector
        dw  TIM2_isr     ; TIM2 Overflow Vector
        dw  TIM2CH1_isr  ; TIM2 Channel 1 Vector
        dw  TIM2CH0_isr  ; TIM2 Channel 0 Vector
        dw  TIM1_isr     ; TIM1 Overflow Vector
        dw  TIM1CH1_isr  ; TIM1 Channel 1 Vector
        dw  TIM1CH0_isr  ; TIM1 Channel 0 Vector
        dw  dummy_isr    ; ICG/CGM Vector
        dw  dummy_isr    ; ~IRQ1 Vector
        dw  dummy_isr    ; SWI Vector
        dw  main_init    ; Reset Vector