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