SoloCodigo
		Programación Específica => Microcontroladores => Microcontroladores MOTOROLA => Mensaje iniciado por: ElFabro en Miércoles 16 de Junio de 2010, 17:29
		
			
			- 
				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