Serial no AT89S8253

Software e Hardware para linha x51

Moderadores: 51, guest2003, Renie, gpenga

Serial no AT89S8253

Mensagempor Maia » 28 Nov 2006 14:03

Olá Todos.
Estou tentando fazer a serial de um AT89S8253 funcionar mas não estou conseguindo. Parece que eu mando o dado em 1200 e ele responde numa taxa bem mais baixa. Estou usando o Keil e a configuração é essa:

SCON = 0x50; // modo da serial
T2CON &= 0xF0; // EXEN2=0; TR2=0; C/T2#=0; CP/RL2#=0;
T2CON |= 0x30; // RCLK = 1; TCLK=1;
PCON = 0x00; // SMOD = 0
T2MOD = 0x00; // modo auto-reload
RCAP2H = 0xFD; RCAP2L = 0x8E; // 1200 baud para 24.0000
T2CON = 0x34; // dispara Timer 2 - baud
TR2 = 1; // Timer 2 run

Alguém pode me ajudar a resolver esse problema?
Abraços,
Maia
Avatar do usuário
Maia
Byte
 
Mensagens: 348
Registrado em: 15 Out 2006 16:25
Localização: Rio de Janeiro

Mensagempor Maia » 30 Nov 2006 07:55

Nem uma ajudinha????????? :cry:

Abraços,
Maia
Avatar do usuário
Maia
Byte
 
Mensagens: 348
Registrado em: 15 Out 2006 16:25
Localização: Rio de Janeiro

Mensagempor brasilma » 30 Nov 2006 11:14

Olá Maia,

Movi o tópico para a familia '51, pois é a ela que pertence, assim consegue mais ajuda.

Abraços,
MArcos.
" 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 brasilma » 30 Nov 2006 14:34

Olá Maia,

Não tenho muita experiência em C, porem vamos lá.

Não entendi porque programa o T2CON com vários valores, e não vi a habilitação de interrupção.

Em uma rotina C de um programa meu que usa serial e funciona, foi configurado assim:

TMOD = 0x21; // Timer 1 (2=timer 8 bits auto-reload) e timer 0 (1=timer 16bits)
TH0 = 0xE0; // 24MHz/12=2MHz/8192=244Hz (65535-8192=E000H)
TL0 = 0;
TR0 = 1;
ET0 = 1;
EA = 1; // Seta EA - Enable All Interrupt
" 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 Maia » 30 Nov 2006 17:17

Obrigado Brasilma pela ajuda, mas preciso usar o TIMER2 pra gerar o baudrate já que o TIMER1 é usado pra outra coisa. No exemplo eu faço T2CON &= 0xf0 pra zerar os bits 0 a 3 e T2CON |= 0x30 pra levantar os bits 4 e 5. Não uso interrupção, fico lento o RI direto.
Abraços,
Maia
Avatar do usuário
Maia
Byte
 
Mensagens: 348
Registrado em: 15 Out 2006 16:25
Localização: Rio de Janeiro

Mensagempor pomboeletronic » 04 Dez 2006 19:47

estou enviando um codigo em asm....



#include <89s8252.inc>

en bit p1.6;p3.6
rs bit p1.5;p3.7
DI BIT P1.5
dado equ p0
DISPLAY EQU P0

org 0000h ; RESET
ljmp inicio

org 0003h ; INT0
reti

org 000bh ; TIMER0
reti

org 0013h ; INT1
reti

org 001bh ; TIMER1
reti

org 0023h ; SERIAL
reti

inicio:

clr DI
clr EN
lcall clear
lcall escreve
;*****************************************************************************

CLR A
MOV SBUF,#0
MOV DPTR,#0
LCALL CONFIG_SERIAL
LCALL ENVIA



lcall delay1s

lcall delay1s

ljmp inicio
escreve:
mov a,#0
mov dptr,#mensagem1
;------------
escreve2:
movc a,@a+dptr
setb di
lcall write
cjne a,#'$',desvio
ret
;-----------
desvio:
inc dptr
mov a,#0
ljmp escreve2
;-----------

clear:
clr rs
mov a,#38H ;caracter 5x7
lcall write
lcall write
mov a,#0cH ;cursor off, blink off
lcall write
mov a,#01H ;coloca o cursor na linha 1 coluna 1
lcall write
ret
;-------------
write:
setb en
mov display,a
lcall delay1ms
lcall delay1ms
lcall delay1ms
lcall delay1ms
clr en
ret
;***************************************************
; Rotinas de Delay
;***************************************************
delay1ms: push 05h
mov r5,#255
djnz r5,$
mov r5,#255 ; 12
djnz r5,$ ; 1842 x -----------
mov r5,#255 ; Freq. Clock
djnz r5,$
mov r5,#150
djnz r5,$
pop 05h
ret;
delay10m: push 06h
mov r6,#10
loop10ms: lcall delay1ms
djnz r6,loop10ms
pop 06h
ret
delay50m: mov r7,#5
ldely50m: lcall delay10m
djnz r7,ldely50m
ret
delay200: mov r7,#20
loop200m: lcall delay10m
djnz r7,loop200m
ret
delay1s: mov r7,#100
ldelay1s: lcall delay10m
djnz r7,ldelay1s
ret



CONFIG_SERIAL: mov scon, #50h ; 01010000 (modo 1 e habilita recepção)
mov tmod, #20h ; timer 1 - 8 bits com re-load
mov th1, #0FDh ; constante a ser carregado no TH1 (9600 bps)
mov tl1, th1 ; cópia do valor de TH1 em TL1
setb tr1 ; liga o timer 1
RET

ENVIA: MOV DPTR, #MSG3
PROX_CHAR: MOVC A, @A+DPTR
CJNE A, #0FFH, TRANSMITE
RET

TRANSMITE: MOV SBUF, A
loop_envia: jnb ti, loop_envia
clr ti
INC DPTR
MOV A, #0
LJMP PROX_CHAR

delay: mov r0, #21 ; (1c) rotina de delay de 1 segundo => q = 21
loop0: mov r1, #255 ; (1c) => m = 255
loop1: mov r2, #255 ; (1c) => n = 255
loop2: djnz r2, loop2 ; (2c)
djnz r1, loop1 ; (2c)
djnz r0, loop0 ; (2c)
ret ; (2c) retorno da rotina delay

; 1 ciclo de maquinta => 1c = 4*T
; T = 1 / 11,0592MHz = 90,4224537037ns
; 1c = 4*T = 361,689814815ns
; Tempo de 1 segundo equivale a 1s/361,689814815ns = 2764800 ciclos de máquina
; # ciclos = 1c + { 1c + [ 1c + ( 2c ) * n + 2c ] * m + 2c } * q + 2c
; n = m = 255
; calculando q temos = 21,13 => 21

mensagem1: db " ENVIANDO-DADO. $"
MSG3: DB "_TESTANDO O ENVIO DE CARACTERES DO uC8051 PARA O PC VIA SERIAL ", 00DH, 0FFH

END
Avatar do usuário
pomboeletronic
Nibble
 
Mensagens: 67
Registrado em: 04 Dez 2006 14:44

Mensagempor jrgabbardo » 04 Dez 2006 19:51

Olá Maia,

agradeço imensamente por teres enviado a dica a respeito do watchdog do 89S8253. Como sou professor, os fins de semestre me monopolizam totalmente e assim infelizmente sequer tive tempo de testar para ver se funciona, mas pelos valores programados só é possível ativar/desativar o WD através da seqüência 1E/E1H no WDTRST. Quanto a tua questão em relação a serial, era muito mais fácil com o 8051 tradicional programando os registros SCON, TCON, TMOD e PCON. Tenho que ler com calma o datasheet do 89S8252 para ver como se usa o TIMER2 para gerar o baudrate e assim poder lhe ajudar.

Um forte abraço,

João Roberto Gabbardo
jrgabbardo
 
Mensagens: 4
Registrado em: 30 Nov 2006 17:51

Mensagempor Maia » 04 Dez 2006 20:49

Obrigado Pombo e João, mas já consegui fazer o mesmo funcionar. Não sei se é bug do 8253 ou se é alguma falha do programa, mas a serial só funcionou até 16MHz. Com os 24MHz que estava, não funcionou de jeito nenhum.
De qualquer forma, obrigado.
Abraços,
Maia
Avatar do usuário
Maia
Byte
 
Mensagens: 348
Registrado em: 15 Out 2006 16:25
Localização: Rio de Janeiro

Mensagempor brasilma » 04 Dez 2006 21:20

Olá Maia,

Tanto faz o timer que esteja usando, basta trocar o "0" por "2", a intenção foi apenas dar um exemplo que funciona.

Qto a "levantar" e zerar bits, isso pode ser feito em uma única operação, por isso estranhei o modo que fez.

Abraços,
MArcos.
" 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 jrgabbardo » 05 Dez 2006 16:56

Olá Maia,
Felizmente conseguiste fazer a serial funcionar, no entanto é estranho que tenha se recusado a operar com fclock = 24MHz. Assim lhe pergunto se usou capacitores de 5pF no oscilador do 89S8253? Se os valores empregados forem maiores vai carregar o circuito de clock e ele pode funcionar erraticamente ou até parar de oscilar.

Sds,

João Roberto Gabbardo
jrgabbardo
 
Mensagens: 4
Registrado em: 30 Nov 2006 17:51

Mensagempor jrgabbardo » 05 Dez 2006 18:12

Olá Maia,

esqueci de lhe perguntar algo fundamental e que pode ser uma das razões do porquê o Watchdog não opera stisfatoriamente. Qual é o programador que estás usando para gravar o programa no 89S8253? Se o programador não funcionar adequadamente, isto é, programando incorretamente o uC evidentemente que não vai rodar nenhum programa! E uma segunada pergunta: Já tentou usar o WD funcionando no modo de habilitação/desabilitação via bit WDTEN do registro WDTCON?

Um forte abraço,

João Roberto Gabbardo
jrgabbardo
 
Mensagens: 4
Registrado em: 30 Nov 2006 17:51

Mensagempor Silvio51 » 14 Fev 2007 00:26

Não sei se ainda estás com o problema...porém tive a mesma dificuldade, que foi solucionada com o uso de cristais múltiplos da freqência 11.0592Mhz. Pois é...o pessoal fala isso por aí direto e agente não leva a sério até acontecer conosco. Serial só com esses valores...até com baud-rate baixo como 1200 dava bronca.
Silvio51
Byte
 
Mensagens: 383
Registrado em: 02 Nov 2006 14:04
Localização: Brasil

Mensagempor Maia » 14 Fev 2007 09:10

Olá Silvio,
Valeu a dica mas no meu caso tava menos crítico. Não consegui a comunicação com o cristal de 24 MHz, mas com o de 16 funcionou direitinho.
Abraços,
Maia
Avatar do usuário
Maia
Byte
 
Mensagens: 348
Registrado em: 15 Out 2006 16:25
Localização: Rio de Janeiro

Mensagempor brasilma » 14 Fev 2007 09:18

Parece que o '8253 tem várias particularidades, e isto é muito interessante e importante saber, mesmo para quem não está usando no momento, mas pode precisar usar algum dia.

Com relação aos problemas citados para este componente, nunca tive nenhum com com o '8252 ou com o '52.

Simpatizo com o '8253 pela questão do tamanho da Flash, porem não seria nada mal se tivesse um pouco mais de RAM.

Ficam ai as dicas.

Abraços,
MArcos.
" 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


Voltar para 8051

Quem está online

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

x