Erro Recepção serial

Software e Hardware para linha x51

Moderadores: 51, guest2003, Renie, gpenga

Erro Recepção serial

Mensagempor Canabrava » 01 Set 2012 23:47

Boa noite!

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
ABRAÇOS!
--------------------
Canabrava
Avatar do usuário
Canabrava
Bit
 
Mensagens: 14
Registrado em: 18 Nov 2006 16:50

Re: Erro Recepção serial

Mensagempor andre_luis » 02 Set 2012 07:31

Te confesso que é difícil debugar um programa que eu não tenha acompanhado desde o início.
Porém, catando na Web, notei diferença na sua configuração para a mesma taxa :

Imagem


+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor Canabrava » 02 Set 2012 11:39

Olá!

Pelo visto a configuração é a mesma da minha:

MOV TMOD,#20h -> Configura Timer1 no modo "2" ( , porém Timer0 fica no modo "0". Como eu preciso do Timer0 para gerar Delay, usei:
MOV TMOD,#21h ->Configura Timer1 no modo "2" para gerar a taxa e Timer0 no modo"1" para as rotinas de delay
MOV TH1,#-3 , é o mesmo que MOV TH1,#0FDh.

a diferença do seu código para o meu é que no seu a interrupção do serial não está habilitada.

Eu testei com o seu código e o resultado foi exatamente o o mesmo.
ABRAÇOS!
--------------------
Canabrava
Avatar do usuário
Canabrava
Bit
 
Mensagens: 14
Registrado em: 18 Nov 2006 16:50

Mensagempor brasilma » 03 Set 2012 14:19

Cana, a noite te envio minha rotina de comunicação serial que funciona redonda.

Abç.
" A Teoria orienta e a Prática decide" ;-)
Avatar do usuário
brasilma
Dword
 
Mensagens: 3621
Registrado em: 11 Out 2006 15:39
Localização: Planeta Terra

Mensagempor Canabrava » 03 Set 2012 18:03

Valeu!

Fico aguardando para testá-la.
ABRAÇOS!
--------------------
Canabrava
Avatar do usuário
Canabrava
Bit
 
Mensagens: 14
Registrado em: 18 Nov 2006 16:50

Mensagempor brasilma » 03 Set 2012 19:19

Enxuguei para o mínimo necessário.

O cristal do controlador é de 24MHz.

Abraços.


ORG 23H ; interrupcao serial
LJMP SERIAL_INT ;


; Inicializa Timers
INITTIMER: MOV TMOD,#21H ; Timer 1 (2=timer 8 bits auto-reload) e timer 0 (1=timer 16bits)
;MOV TH1,#0CCH ; 1202 = ((2^SMOD)/32)*(OSC/(12*(256-204))) =
;MOV TL1,TH1 ; = ((2^0)/32)*(24x10^6/(12*(52))) (CCH=204)
MOV TH1,#0F3H ; 4808 = ((2^SMOD)/32)*(OSC/(12*(256-243))) =
MOV TL1,TH1 ; =((2^0)/32)*(24x10^6/(12*(13))) (F3H=243)
;MOV TH1,#0F3H ; 9615 = ((2^SMOD)/32)*(OSC/(12*(256-243))) =
;MOV TL1,TH1 ; =((2^1)/32)*(24x10^6/(12*(13))) (F3H=243)

; *** Não esquecer de ajustar o SMOD ***
; Inicializa Serial
INITSERIAL: MOV SCON,#50H ; Serial Mode 1 (8-bit, start (0), 8 data, stop (1) Baud Rate Var-
; -iable ) + REN (Rec Enable) = 1

;*** Configurado aqui e reconfugurado mais abaixo (configuracao da balanca) para conf printer ***
;MOV PCON,#00H ; SMOD 0 - obs: este registrador nao e bit enderessavel - 1200, 4800
MOV PCON,#80H ; SMOD 1 - obs: este registrador nao e bit enderessavel - 9600

; Inicializa Ints
INITINT: SETB EA ; Abilita Interrupcoes

SETB ES ; Abilita Serial - Config no programa; evita recepcao qdo fora hora

MOV IP,#10H ; Define Serial Port Interrupt como High

; Liga Timers
SETB TR1 ; Liga timer 1



; |############################|
; -=| TRATAMENTO RECEPCAO SERIAL |=-
; | used regs: R0 |
; |############################|

SERIAL_INT: JNB RI,SERIALD2 ; sai se n foi interrupcao de REC (Rx e Tx geral a mesma int serial)

SERIALD3: PUSH PSW
PUSH ACC
PUSH 00H

CLR RI ; deve ser resetado por software

MOV A,SBUF
POP 00H
POP ACC
POP PSW

SERIALD2: RETI
" A Teoria orienta e a Prática decide" ;-)
Avatar do usuário
brasilma
Dword
 
Mensagens: 3621
Registrado em: 11 Out 2006 15:39
Localização: Planeta Terra

Mensagempor Canabrava » 04 Set 2012 05:44

logo mais à noite eu testo e posto o resultado
ABRAÇOS!
--------------------
Canabrava
Avatar do usuário
Canabrava
Bit
 
Mensagens: 14
Registrado em: 18 Nov 2006 16:50

Mensagempor Canabrava » 04 Set 2012 20:43

Então Pessoal!

Rodei a Rotina do brasilma.
Como o meu cristal é de 11.0592 Mhz, mudei o valor da recarga do Timer1 de 243(F3H) para 253 (FDH). e para uma taxa de 9600, ajustei o SMOD para "0" (MOV PCOM,#00H).

Retirei as linhas excedentes para deixar mais legível e ficou do jeito postado mais abaixo.

O Resultado foi o mesmo
Usei o Hiperterminal configurado para Com1, 9600 Bud, Bits de dados=8, paridade=nenhum, bits de parad=1, Controle de fluxo= nenhum.
Usei também o RCOMSERIAL, baixado do site Rogercom.

Ajustei a taxa para 2400, fazendo TH1=0F4H (244d), e o Resultado também foi o mesmo!!

Código: Selecionar todos

;Rotina postada pelo brasilma -  http://asm51.eng.br/phpBB/viewtopic.php?t=13991      

$NOMOD51                         
$INCLUDE (C:\Asem51\MCU\89S52.MCU)

;LABEL   INSTR.OPERANDOS    ;COMENTARIOS
   SAIDA   EQU P2

   ORG 0
   LJMP INITTIMER      ;Icialização e e programa principal
   
   ORG 23H       ; interrupcao serial
   LJMP SERIAL_INT    ;


; Inicializa Timers
INITTIMER:
   MOV TMOD,#21H       ; Timer 1 (2=timer 8 bits auto-reload) e timer 0 (1=timer 16bits)
   MOV TH1,#0FDH       ; 9600 = ((2^SMOD)/32)*(OSC/(12*(256-253))) = > COMO O CRISTAL É DE 11.0592Mhz
            ; Se Valor de TH1=FDH (253d) a taxa será de 9600 para smod=0
   MOV TL1,TH1       ; =((2^0)/32)*(11.0592x10^6/(12*(3))) (FDH=253)

; *** Não esquecer de ajustar o SMOD ***

; Inicializa Serial
INITSERIAL:
   MOV SCON,#50H       ; Serial Mode 1 (8-bit, start (0), 8 data, stop (1) Baud Rate Variable ) + REN (Rec Enable) = 1
;*** Configurado aqui e reconfugurado mais abaixo (configuracao da balanca) para conf printer ***

   MOV PCON,#00H       ; SMOD 0 - obs: este registrador nao e bit enderessavel - 9600 Se cristal = 11.0592Mhz


; Inicializa Ints
INITINT:   
   SETB EA       ; Abilita Interrupcoes
   SETB ES       ; Abilita Serial - Config no programa; evita recepcao qdo fora hora
   MOV IP,#10H       ; Define Serial Port Interrupt como High

; Liga Timers
   SETB TR1       ; Liga timer 1 - Começa a gerar a taxa do serial
      
   MOV SAIDA,#00H      ;ZERA A SAÍDA
   LJMP $         ;Fica  em loop aguardando a chegada do dado



; |############################|
; -=| TRATAMENTO RECEPCAO SERIAL |=-
; | used regs: R0 |
; |############################|
     //////
SERIAL_INT:
   JNB RI,SERIALD2    ; sai se n foi interrupcao de REC (Rx e Tx geral a mesma int serial)

SERIALD3:
   PUSH PSW
   PUSH ACC
   PUSH 00H

   CLR RI          ; deve ser resetado por software

   MOV A,SBUF
   MOV SAIDA,A      ;MOSTRA O CARACTER RECEBIDO NA SAÍDA
   POP 00H
   POP ACC
   POP PSW

SERIALD2:
   RETI

   END
ABRAÇOS!
--------------------
Canabrava
Avatar do usuário
Canabrava
Bit
 
Mensagens: 14
Registrado em: 18 Nov 2006 16:50

Mensagempor andre_luis » 05 Set 2012 07:37

Já fez o teste de loopback para saber se o erro pode estar realmente na transmisão ?

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor brasilma » 05 Set 2012 09:45

Faz o que o André sugeriu, após receber o caractere, manda ele de volta pela serial, isto vai fazer você vê-lo no hyperterminal e saber o que chegou.

Assim:

Após o MOV A,SBUF, insere uma outra linha MOV SBUF,A

Não esquecer que o fio Tx do MC deve estar conectado ao Rx do PC.
" A Teoria orienta e a Prática decide" ;-)
Avatar do usuário
brasilma
Dword
 
Mensagens: 3621
Registrado em: 11 Out 2006 15:39
Localização: Planeta Terra

Mensagempor Canabrava » 07 Set 2012 22:04

Simulei no Keil Uvision3 e funcionou como esperado ( Enviei e recebi os caracteres corretamente).
Tem algum problema com meu circuito que preciso localizar, vou fazer os testes num circuito diferente depois conto as novidades.
Obrigado a todos!
ABRAÇOS!
--------------------
Canabrava
Avatar do usuário
Canabrava
Bit
 
Mensagens: 14
Registrado em: 18 Nov 2006 16:50

Mensagempor Canabrava » 16 Set 2012 19:07

Pois bem! Descobri qual era o "BODE".

Minha placa de testes possui 02 cristais, sendo um usado com um 89C2051, que uso para fazero o download dos programas para a placa de teste com o ISP PROG V1.4, este cristal é o de 11.0592.

O segundo cristal, o do Microcontrolador que eu gravo para executar os testes era de 12000 (12 Mhz).
Custei a enxergar isso, pois o tempo todo via apenas o primeiro cristal.
Troquei o cristal de 12Mhz para 11.0592 e funcionou perfeito!

Obrigado a todos!
ABRAÇOS!
--------------------
Canabrava
Avatar do usuário
Canabrava
Bit
 
Mensagens: 14
Registrado em: 18 Nov 2006 16:50


Voltar para 8051

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x