Hola gente. Estoy programando un GP32 para trabajar con la rutina de recepción de datos por interrupciones. Es decir que envio datos desde la pc al micro. El programa que hice simula muy bien pero en la vida real no anda del todo bien.
Soy nuevo en el foro asi que no se como adjuntar el codigo asi que hice copy paste. Por favor sepan disculpar.
Si alguien puede decirme que es lo que estoy configurando mal en al SCI se lo agradecería.
Saludos.
Chau.
**************************************************************
* EJEMPLO DEL USO DEL MÓDULO SCI PARA RECEPRIÓN DE DATOS *
**************************************************************
$Include 'GP32.inc'
RAMStart EQU $0040
RomStart EQU $E000 ; This is valid ROM on the GP32, GT16, and GT8
VectorStart EQU $FFDC
org RamStart
DATO ds 1 ;Variable ubicada en la dirección $0040
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
**************************************************************
* 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 5,SCC2 ;SCRIE=1 => Interrumpe cuando se
;completa el Receive Data Register.
bset 2,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
**************************************************************
* Configuro los puertos *
**************************************************************
mov #%11111111,ddrb
mov #$00,portb
**************************************************************
* Programa principal *
**************************************************************
clr DATO
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
mov SCDR,DATO
mov DATO,portb
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