Página 1 de 1
memoria ram externa

Enviado:
18 Dez 2007 10:32
por deniro
Olá galéra
Como faço para enviar dados para uma memoria ram externa utilizando o compilador Keil linguagem C.

Enviado:
18 Dez 2007 11:00
por Maurício
É só definir a variável na área de memória externa:
- Código: Selecionar todos
unsigned int xdata var;
[]'s

Enviado:
18 Dez 2007 15:33
por deniro
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

Enviado:
18 Dez 2007 17:33
por Maurício
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

Enviado:
18 Dez 2007 18:10
por lopesjm
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

Enviado:
18 Dez 2007 23:49
por Maurício
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

Enviado:
19 Dez 2007 08:35
por deniro
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
}

Enviado:
19 Dez 2007 12:46
por barboza
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
}