Ir ao conteúdo
  • Cadastre-se

Erro Recepção serial


Valdenir_Duarte

Posts recomendados

Bom dia!

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:

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: ;1 SEGUNDO
MOV R7,#10 ;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: ;5 SEGUNDOS
MOV R7,#100 ;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

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!