Ligar 2 microcontroladores pela Serial

Software e Hardware para linha x51

Moderadores: 51, guest2003, Renie, gpenga

Ligar 2 microcontroladores pela Serial

Mensagempor j-menezes » 15 Jan 2007 10:35

Alguem aqui sabe como se Liga 2 microcontroladores pela Serial ?

eu Simplesmente liguei um ao outro pela TX e RX invertendo, e

nada de funcionar.


valeu


[]'s
Contra Fatos nao Ha' Argumentos
Allan Kardec
j-menezes
Bit
 
Mensagens: 33
Registrado em: 13 Nov 2006 07:36

Mensagempor rubenprom » 15 Jan 2007 10:40

Acho que não há necessecidade de somente ligar o RX/TX invertidos. Você pode usar os pinos de I/O para isto. Criar uma rotina na programação na ora de escrever e ler de um microcontrolador para outro, fazendo alguns tipo de protocolos. Mas para isso voce deve setar direito os comandos de programação no caso TMOD, SCON, e assim por diante, no caso do 8051
rubenprom
Byte
 
Mensagens: 222
Registrado em: 16 Out 2006 00:23
Localização: Porto Alegre - RS

Mensagempor brasilma » 15 Jan 2007 12:27

E as rotinas Ruben?
" 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 rubenprom » 15 Jan 2007 12:48

Pois ai que está, eu tou acostumado a fazer isso nos AVR, que a sintaxe de programação conheço. Sobre o 8051 sei o qeu s epode fazer, pois isso vi aqui na facultade, porem as rotinas, especialmente as configurações nao sei.
Posso ate dar um palpite, mas nao quero fazer errar o nosso amigo. Eu ja fiz esse procedimento, deu certo.

Aqui passo uma sintaxe do que pode ser feito:

Tanto seja no Microcontrolador Mestre e no Escravo

void escreve(unsigne int endereco, unsigned int dado)
{
unsigned char xdata *pointer;
pointer= (unsigned char xdata *)((unsigned int)(endereco&0xFFFF));
*pointer= dado;

//Aqui coloque a Rotina que manipula o envio do dado
//tamanho, caracteres e velocidade

}

void le(unsigned int endereco)
{
unsigned char xdata *pointer;
unsigned char dado= 0;

pointer= (unsigned char xdata *)((unsigned int)((endereco)&0xFFFF));

dado= *pointer;

return(dado);

//Aqui coloque a rotina que manipula o recebimento do dado
//tamanho, caracteres e velocidade

}


Espero que dê uma visão, porem nao sei o que voce quer escrever e ler no seus microcontroladores. Foi assim que eu fiz numa cadeira, deu certo, porem a gente teveproblemas, porque ambos processadores trabalhavam com velocidades diferentes.

Vou procurar nos meus arquivos e posto aqui. Se alguem souber um jeito mais facil, gostaria tb eu aprender
rubenprom
Byte
 
Mensagens: 222
Registrado em: 16 Out 2006 00:23
Localização: Porto Alegre - RS

Mensagempor j-menezes » 15 Jan 2007 14:05

Pois ai que está, eu tou acostumado a fazer isso nos AVR, que a sintaxe de programação conheço. Sobre o 8051 sei o qeu s epode fazer, pois isso vi aqui na facultade, porem as rotinas, especialmente as configurações nao sei.
Posso ate dar um palpite, mas nao quero fazer errar o nosso amigo. Eu ja fiz esse procedimento, deu certo.

Aqui passo uma sintaxe do que pode ser feito:

Tanto seja no Microcontrolador Mestre e no Escravo

void escreve(unsigne int endereco, unsigned int dado)
{
unsigned char xdata *pointer;
pointer= (unsigned char xdata *)((unsigned int)(endereco&0xFFFF));
*pointer= dado;

//Aqui coloque a Rotina que manipula o envio do dado
//tamanho, caracteres e velocidade

}

void le(unsigned int endereco)
{
unsigned char xdata *pointer;
unsigned char dado= 0;

pointer= (unsigned char xdata *)((unsigned int)((endereco)&0xFFFF));

dado= *pointer;

return(dado);

//Aqui coloque a rotina que manipula o recebimento do dado
//tamanho, caracteres e velocidade

}



Neste caso voce mandou em qtos Pinos ?

Eu tenho disponivel apenas os Pinos da Serial TX e RX
Contra Fatos nao Ha' Argumentos
Allan Kardec
j-menezes
Bit
 
Mensagens: 33
Registrado em: 13 Nov 2006 07:36

Mensagempor brasilma » 15 Jan 2007 15:35

Hum, fiz apenas algumas brincadeiras com C até agora, porem creio que estes trechos que colocou não manipulam a serial não.

Teria de ter uma secção de configuração, que em assembler seria assim (sei que a formatação vai ficar ruim, para melhorar, copie e cole num editor):

INITTIMER:

MOV TMOD,#21H ; Timer 1 (2=timer 8 bits auto-reload) e timer 0 (1=timer 16bits)

MOV TH1,#0E6H ; 2404 = ((2^SMOD)/32)*(OSC/(12*(256-230))) =
MOV TL1,TH1 ; = ((2^0)/32)*(24x10^6/(12*(52))) (E6H=230)

; 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
MOV PCON,#00H ; SMOD 0 - obs: registrador nao e bit enderessavel - 1200, 2400, 4800

; 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
ONTIMER: SETB TR1 ; Liga timer 1

Na sequencia viriam as rotinas (de preferência por interrupção) que enviam e recebem os dados pela seria, de uma forma bem elementar, seria assim:

(recepção)

SERIAL_INT: JB RECSTARTED,SERIAL_INTD1


MOV R0,RAMBUFIDX ; endereco base da RAM_LCD e STRING_BUFFER
MOV A,SBUF

SERIALD3: MOV @R0,A
INC R0
MOV A,R0
CJNE A,STRLENGHT,SERIALD1 ; recebidos 14 caracteres?
CLR ES
MOV R0,#RAMLCDSTRBUF ; Reposiciona ponteiro no inicio do Buffer LCD / Rec String


SERIALD1: MOV RAMLCDSTRBUFIDX,R0

SERIALD2: CLR RI
RETI

(transmissão)

ENVIASTRINGD1: MOV R0,#75H

ENVIASTRINGL1: MOV SBUF,@R0 ; escreve na serial o conteudo do acumulador
JNB TI,$
CLR TI
DEC R0
CJNE R0,#72H,ENVIASTRINGL1 ; enviados todos caracteres?

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 pomboeletronic » 15 Jan 2007 19:56

Ainda estou começando a programar em "c"....

vou montar um equema com 2 at89s8253 com as linhas de rx e tx cruzadas...

Depois tenho que configurar os 2 uc's para comunicação serial, vou usar uma taxa de 9600....

é facil de fazer, pois estou com um projeto que faço isso...

tenho uma placa que envia um dado que é gerado segundo uma funçao que escrevi... para outra placa que recebe este dado faz algumas contas e me retorna outro valor correspondende ao dado gerado pela 1ª placa...

pra saber se esta funcionado uso 2 programas tipo hipertetminal para monitorar as linhas de rx e tx...

por exemplo...

a 1ª placa envia o dado 23 53 42 30 30 31 23 53 42
e a 2ª placa responde 23 53 42 00 00 01 23 53 42
"Nós nos transformamos naquilo que praticamos com frequência.
A perfeição,portanto, não é um ato isolado. É um hábito".
Aristóteles
Avatar do usuário
pomboeletronic
Nibble
 
Mensagens: 67
Registrado em: 04 Dez 2006 14:44

Mensagempor rubenprom » 15 Jan 2007 20:02

J-menezes, os pinos que utilizei forma da porta 2 em ambos controladores.
P2.7 e P.2.6. Porem tinhamos de fazer que eles se comunicasem em forma FULL DUPLEX, apenas o teste qeu foi feito, foram ligar alguns leds na saida da porta3, mas a intenção era que o que fosse processador aparece-se no display LCD tb este ligada à porta 3 do microcontrolador. Detalhe: Os dados que mandavamos pelo LCD eram em nibble, ou seja usavamos 4 bits para mandar os dados. Sinceramente foi dificil, terminei rodando a cadeira, eu nao consegui, apenas algumas coisinhas, alguma ideia que poderia ai te ajudar

um abraço,
rubenprom
Byte
 
Mensagens: 222
Registrado em: 16 Out 2006 00:23
Localização: Porto Alegre - RS

Mensagempor rubenprom » 15 Jan 2007 20:05

Eu acho ainda, que se se quise-se pra um bom começo 2 portas serias em dois microcontroladores, deveria-se usar o modo HALF DUPLEX, pois ora, uma vez escreve, ora uma vez faz a leitura. Entao pode-se usar dois pinos, de cada microcontrolador, por exemplo mandar um byte o processador entenda que esta em modo de escrita e no mesmo pino mandar um byte dizendo que o microcontrolador esta em modo de leitura.
rubenprom
Byte
 
Mensagens: 222
Registrado em: 16 Out 2006 00:23
Localização: Porto Alegre - RS


Voltar para 8051

Quem está online

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

x