memoria ram externa

Software e Hardware para linha x51

Moderadores: 51, guest2003, Renie, gpenga

memoria ram externa

Mensagempor deniro » 18 Dez 2007 10:32

Olá galéra
Como faço para enviar dados para uma memoria ram externa utilizando o compilador Keil linguagem C.
Avatar do usuário
deniro
Byte
 
Mensagens: 135
Registrado em: 19 Out 2006 20:18
Localização: Rio de Janeiro

Mensagempor Maurício » 18 Dez 2007 11:00

É só definir a variável na área de memória externa:

Código: Selecionar todos
unsigned int xdata var;


[]'s
"Não leve a vida tão à sério, afinal, nenhum de nós sairá vivo, dela!"
Avatar do usuário
Maurício
Word
 
Mensagens: 678
Registrado em: 14 Out 2006 17:23
Localização: São Paulo - SP

Mensagempor deniro » 18 Dez 2007 15:33

Puxa ainda não entedi, vou deixar um exemplo em assemble de parte do código que eu desejo em C.

mov R0, #07h
mov A, #31h
movx @R0, A
Avatar do usuário
deniro
Byte
 
Mensagens: 135
Registrado em: 19 Out 2006 20:18
Localização: Rio de Janeiro

Mensagempor Maurício » 18 Dez 2007 17:33

Olá, deniro.

Não dá pra comparar ASM e C.
As filosofias de programação são totalmente diferentes.
C é linguagem de alto nível, vc não se preocupa com endereços de registradores.
A forma de acessar memória RAM paralela de 8 bits externa, é como eu citei na minha mensagem anterior.
Basta vc declarar sua variável usando o especificador de área XDATA.

Recomendo meu livro:
http://www.editoraerica.com.br/buscafinal.asp?cod=0778

[]'s
"Não leve a vida tão à sério, afinal, nenhum de nós sairá vivo, dela!"
Avatar do usuário
Maurício
Word
 
Mensagens: 678
Registrado em: 14 Out 2006 17:23
Localização: São Paulo - SP

Mensagempor lopesjm » 18 Dez 2007 18:10

Caro Deniro,

Sua dúvida é sobre como manipular memória externa ou sobre o código que o compilador gerou ?

Declarando a variável como xdata, você já diz para o compilador que a variável é de memória externa. Pode ser de qualquer tipo: char, unsigned char, int, unsigned int, etc.

Se for fazer em assembly, precisa carregar o registrador de 16 bits DPTR com o endereço da memória externa.Por ex.

mov dptr, #0000h ; carrega ponteiro de 16 bits
movx a, @dptr ; lê conteúdo da posição 0000h
movx @dptr, a ; escreve na posição 0000h

Quando você declara em C uma variável como xdata, sem especificar um endereço, o compilador assume que é o endereço 0000h.

Essa instrução que você escreveu só tem alcance de 256 bytes. (8 bits) Eu, particularmente, nunca usei esse tipo de instrução. Creio que depende das configurações de otimização do compilador.

Jorge
lopesjm
Byte
 
Mensagens: 133
Registrado em: 26 Out 2006 12:40

Mensagempor Maurício » 18 Dez 2007 23:49

deniro escreveu:Puxa ainda não entedi, vou deixar um exemplo em assemble de parte do código que eu desejo em C.

mov R0, #07h
mov A, #31h
movx @R0, A


E este é um exemplo de leitura e escrita em memória RAM externa, em linguagem C, usando o Keil.

Código: Selecionar todos
#include <reg51.h>

unsigned char xdata var_externa = 0x00;     // declara e inicializa a variável externa
unsigned char var_interna = 0x00;    //declara e inicializa a variável interna

void main ( void )
{
    var_externa = 0xFF;    //escreve FFh em var_externa, na memória externa
    var_interna = var_externa;    //copia FFh da RAM externa, para var_interna; na RAM interna
    var_interna = 0xAA;    // escreve AAh na variável interna
    var_externa = var_interna;    // copia o valor armazenado em var_interna, para a variável var_externa
    while ( 1 );    // paralisa a execução do programa
}


Sacou?
Não precisa se preocupar ONDE o compilador vai alocar as variáveis, desde que, ele armazene e recupere os valores corretos.
A tarefa braçal, fica por conta do compilador!!

[]'s
"Não leve a vida tão à sério, afinal, nenhum de nós sairá vivo, dela!"
Avatar do usuário
Maurício
Word
 
Mensagens: 678
Registrado em: 14 Out 2006 17:23
Localização: São Paulo - SP

Mensagempor deniro » 19 Dez 2007 08:35

Caros amigos,
Eu pesquisei na internet e consegui achar a solução do meu problema.
xdata trabalha com o registrador DPTR, pdata trabalha com o registrador R0 , que é ultilizado para ler e escrever memorias RAM e Flash externa. O meu código ficou assim

#include <reg52.h>

unsigned char pdata *variavel;
unsigned char dado;

void main()
{
variavel = 0x10; //endereço da memoria externa
dado =*variavel; //dado lido da memoria externa

}
Avatar do usuário
deniro
Byte
 
Mensagens: 135
Registrado em: 19 Out 2006 20:18
Localização: Rio de Janeiro

Mensagempor barboza » 19 Dez 2007 12:46

Se o seu problema é uma variavel com posição fixa na memoria externa, como por exemplo um dispositivo como display e/ou teclado mapeado em memoria, você pode acessar com a definição _at_;


unsigned char xdata hw_key _at_ 0x8000;

unsigned char espelho_key;


espelho_key = hw_key;


Entendeu?

É o mesmo que!

unsigned char pdata *hw_key;
unsigned char espelho_key;

void main()
{
hw_key = 0x8000; //endereço da memoria externa
espelho_key=*variavel; //dado lido da memoria externa

}
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 948
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar


Voltar para 8051

Quem está online

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

x