Fiz um pequeno programa para receber caracteres envido do PC via hiperrterminal, para um 89S52.
Ao ligar fica acionando sequencialmente 8 leds na porta P2.
Quando chega o Caracter, o sequencial pára e o caracter é mostrado no porto p2 durante 5 segundos, depois continua acionando os leds sequencialmente.
Só que o programa está enviando o ASCII errado, e não consigo localizar onde está o erro. Se alguém puder me ajudar a localizar a falha eu agradeceria.
Taxa de 9600 Bps- Cristal do circuito de 11.0592MHZ
Caracter enviado "A"= 41h-> Chega 81h
Caracter enviado "B"= 42h-> Chega 82h
.
.
.
Caracter enviado "Z"= 5Ah-> Chega BAh
Outra sequencia:
Caracter enviado "0"= 30h-> Chega 70h
Caracter enviado "1"= 31h-> Chega 71h
.
.
.
Caracter enviado "?"= 3Fh-> Chega 7Fh
Outra sequencia:
Caracter enviado "a"= 61h-> Chega D1h
Caracter enviado "b"= 62h-> Chega D2h
.
.
.
Caracter enviado "o"= 6Fh-> Chega DFh
Abaixo o meu código em assembler:
- Código: Selecionar todos
;LABEL INSTR.OPERANDOS ;COMENTARIOS
$NOMOD51
$INCLUDE (C:\Asem51\MCU\89S52.MCU)
SAIDA EQU P2 ;DISPOSTO 8 LEDS PARA VISUALIZAR O CÓDIGO ASCII RECEBIDO PELA SERIAL
;ENVIADO PELO HIPERTERMINAL
ORG 0
LJMP INICIO
ORG 0023H ;INTERRUPÇÃO DO CANAL SERIAL
LJMP SERIAL_IRQ
INICIO: MOV SP,#2FH ;INICIALIZA STACK POINTER
MOV IE, #90H ;EA=ES--> APENAS INTERRUPÇÃO SERIAL HABILITADA
MOV TMOD,#21H ;(TIMER0 NO MODO1- CONTADOR 16 BITS-ROTINAS DE DELAY) - (TIMER1 NO MODO2 - 9600 BPS)
MOV SCON,#50H ;MODO 1 COM RECEPÇÃO HABILITADA
ORL PCON,#00H ;SMOD=0
MOV TL1,#0FDH ;9600 bps CRISTAL DE 11,0592 MHz
MOV TH1,#0FDH ;
SETB TR1 ;LIGA O CONTADOR COMEÇA A GERAR A TAXA DE 9600 Bauds
MOV SAIDA,#00H ;DESLIGA TODAS AS SAIDAS
LCALL DELAY1 ;DELAY 1SEGUNDO
MOV A,#01H ;ACIONA APENAS UMA SAIDA POR VEZ
MOV SAIDA,A ;SEQUENCIALMENTE (ANEL) - POR 1 SEGUNDO
LCALL DELAY1
REPETE: RL A
MOV SAIDA, A
LCALL DELAY1
LJMP REPETE ;FICA ACENDENDO OS LEDS EM LOOP- SÓ SAI COM A CHEGADA DE DADO VIA CANAL SERIAL
SERIAL_IRQ:
PUSH ACC ;SALVA CONTEÚDO DO ACUMULADOR
JNB RI,$ ;AGUARDA O FIM DA RECEPÇÃO
MOV A,SBUF ;GUARDA NO ACC O CONTEÚDO RECEBIDO SERIALMENTE ENVIADO PELO HIPERTERMINAL
MOV SAIDA,A ;ESCREVE O DADO RECEBIDO NO PORTO P2
CLR RI ;RESETA O FLAG QUE GEROU A INTERRUPÇÃO
LJMP DELAY5 ;MANTEM O DADO NA SAÍDA DURANTE 5 SEGUNDOS
POP ACC ;RESTAURA O CONTEÚDO DO ACUMULADOR
RETI ;VOLTA ACIONAR SEQUENCIALMENTE OS LEDS NA SAIDA "P2".
DELAY1: MOV R7,#10 ;1 SEGUNDO ;ATRASO DE 1S SE R7=20(USAR R7 COMO MULTIPLICADOR DE 50mS)
RET1: ;E TIMER CARREGADO COM (65535-50000) - BASE PARA 50mS
MOV TH0,#HIGH(65535-50000) ;BASE PARA 50mS X R7= VALOR DESEJADO
MOV TL0,#LOW(65535-50000) ;SE O CRISTAL FOR DE 12MHZ, 1 CICLO DE MAQUINA=1uS
SETB TR0
JNB TF0,$
CLR TF0
DJNZ R7,RET1
CLR TR0
RET
DELAY5: MOV R7,#100 ;5 SEGUNDOS ;ATRASO DE 1S SE R7=20(USAR R7 COMO MULTIPLICADOR DE 50mS)
RET5: ;E TIMER CARREGADO COM (65535-50000) - BASE PARA 50mS
MOV TH0,#HIGH(65535-50000) ;BASE PARA 50mS X R7= VALOR DESEJADO
MOV TL0,#LOW(65535-50000) ;SE O CRISTAL FOR DE 12MHZ, 1 CICLO DE MAQUINA=1uS
SETB TR0
JNB TF0,$
CLR TF0
DJNZ R7,RET5
CLR TR0
RET
END