Entrar    Registrar

tem como acessar memoria ram externa em C?

Software e Hardware para linha x51

Moderadores: guest2003, 51, Renie, gpenga

  • Autor
    Mensagem

tem como acessar memoria ram externa em C?

Mensagempor renan-papaco » 23 Fev 2013 21:20

comprei um gravador de eprom e adaptei um codigo meu bem simples q conta binario de 0 a 255 na porta P1... e funcionou de boa num circuito q fiz com um 8032 usando uma eprom 27C64... mas pretendo fazer uma placa melhor colocando portas de entrada e saida usando o proprio barramento de dados do circuito. mas tem como fazer essas instruções em C ou só em assembler?
Avatar do usuário
renan-papaco
Byte
 
Mensagens: 292
Registrado em: 17 Jun 2012 15:56

Mensagempor Aquino » 23 Fev 2013 23:17

Tem sim, tens que olhar a documentação do teu compilador. No caso do Keil, era uma diretiva do tipo XDATA, não lembro bem da sintaxe, mas esse é o caminho das pedras.
Avatar do usuário
Aquino
Dword
 
Mensagens: 1827
Registrado em: 12 Out 2006 22:24

Mensagempor lopesjm » 24 Fev 2013 11:48

Olá Renan,

Veja se este exemplo te ajuda.

Código: Selecionar todos
/* ACESSANDO RAM EXTERNA NO 8051 USANDO O SDCC*/

#include <at89x52.h>

xdata unsigned char tmp;
xdata unsigned int tmp2;
xdata unsigned char vetor[256];
xdata unsigned long SuperVar;
xdata float OutraVar;
xdata at 0x2000 unsigned char tmp3;     // colocando em uma posição específica da memória externa
xdata at 0x8000 unsigned char teclado;

void main(void)
{
 
  tmp2=1000;              // escreve em variavel da memoria externa
  vetor[0]=13;
  SuperVar=1234567890;
 
  tmp=teclado;            // le posição externa (memoria ou periférico mapeado)
 
}


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

Re:

Mensagempor renan-papaco » 23 Mar 2013 21:29

bem...dá pra usar essa série de comandos pra gravar em algum periferico(leia-se latch 74LS374) e como faço pra ler buffer como entrada?
Sabe quem mais programa um 8051 com ROM externa? MINHA MÃE! HOOOOOOOOOOOOOOOOOO
Avatar do usuário
renan-papaco
Byte
 
Mensagens: 292
Registrado em: 17 Jun 2012 15:56

Re: tem como acessar memoria ram externa em C?

Mensagempor lopesjm » 01 Abr 2013 16:45

Olá Renan,

Sim, são esses comandos que são usados para escrever ou ler uma determinada posição de memória ou I/O mapeada em memória. Você deve ter um detector de endereços para poder acessar uma determinada posição. Procure por I/O Mapeada para mais detalhes.
Jorge
lopesjm
Byte
 
Mensagens: 133
Registrado em: 26 Out 2006 12:40

Re: tem como acessar memoria ram externa em C?

Mensagempor tcpipchip » 02 Abr 2013 14:31

Senao voce usa MOVX
------------------------------------------
http://www.youtube.com/tcpipchip
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 5794
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Re: tem como acessar memoria ram externa em C?

Mensagempor ze » 02 Abr 2013 16:48

sim voce pode fazer o MC pensar que periféricos são memória externa. Pra isso voce deve lançar mão dos sinais RD e WR do MC. Essencialmente voce deve combinar algumas linhas de endereço com eles para formar seu prefiférico/memória. P.ex. pra usar o 374 cujas saídas estejam no barramento de dados, voce deve combinar os sinais, ligue o pino RD no OE e faça uma leitura de um dado externo qualquer.ex
#define i XBYTE [0xc000]
ao fazer a=i o compilador vai transformar em movx @ dptr que libera o sinal RD
voce pode (e deve) usar um decodificador qualquer tipo hc139 e usar linhas de endereço, psen wr, rd para "posicionar" corretamente na "ram externa" suas variáveis periféricas. Mas infelizmente o sistema é indescritível textualmente. voce não deve ter dificuldades para localizar isso na net como disse o amigo anterior
b.s.
Avatar do usuário
ze
Dword
 
Mensagens: 1547
Registrado em: 05 Jun 2007 14:32

Re: tem como acessar memoria ram externa em C?

Mensagempor renan-papaco » 02 Abr 2013 22:02

pra fazer essas operações eu precisaria usar ram externa?

e sei q precisarei usar um demux 74LS/HC138 ou 139, ou ate um 74LS154 se for por muito periferico...depende, mas posso combinar os sinais da seguinte forma?


periferico de saida: 74LS374: pra gerar o Clk q ira gravar nele, eu poderia combinar WR mais a saida barrada do demux q corresponde ao endereço desse periferico?

periferico de entrada: pra ler um valor nele e armazena-lo numa variavel eu posso habilitar um 74HC244 com endereçamento pelo demux, e o sinal de leitura poderia vir direto do pino RD do 8052?
Sabe quem mais programa um 8051 com ROM externa? MINHA MÃE! HOOOOOOOOOOOOOOOOOO
Avatar do usuário
renan-papaco
Byte
 
Mensagens: 292
Registrado em: 17 Jun 2012 15:56

Re: tem como acessar memoria ram externa em C?

Mensagempor lopesjm » 03 Abr 2013 09:02

Caro Renan,

Para acessar uma RAM Externa você vai precisar sim de uma RAM Externa!

Imagine o seguinte. A linhas de endereços menos significativas são A0 até A7 (Port0) depois de um latch 74XX373. Por que 74xx373 ? Porque o enable é por nível, enquanto o 374 é por borda. Pode até funcionar com 374, não cheguei a trabalhar com ele. Sempre usei o 373.

A parte mais significativa de endereços fica no P2 (A8 até A15) sem um latch. Se você pegar o A15 que fica em nivel Hi a partir da posição 0x8000 (10000000 00000000b) você já terá um simples decodificador ou detector de endereços que pode ser usado para diferenciar memoria externa de I/O mapeado em memória.

Por exemplo, suponha que como memória externa você tenha uma RAM estática 62256, com 32.768 posições.(32Kbytes) E você coloque essa RAM onde o /CS (Chip Select) da RAM seja acionado quando o A15 tiver nível LO (Zero). O OE (Output Enable) deve ligar o /RD e o WE (Write Enable) deve ligar o /WR. Pronto, você já tem uma memória externa e pode acessá-la definindo as variáveis conforme explicado lá no começo. O limite de sua RAM seria 32.768 posições, que equivalem aos endereços de 0x0000 até 0x7FFF (00000000 00000000 até 011111111 11111111). Note que a A15 é zero enquanto está na faixa de endereços da RAM. Assim que mudar para UM, ele passaria a LER ou ESCREVER em uma posição de I/O Mapeada em RAM. O que ficou faltando é associar o RD e o WR para posições acima de 0x7FFF. Isso pode ser feito usando lógica combinacional com portas AND, OR, NOT, NAND, etc.

Como o decodificador de endereços é muito simples, qualquer posição acima de 0x8000 será identificada como I/O Mapeado. Quanto a precisar de um 74xx138, isso é pra especificar uma faixa de endereços de I/O mapeada. Use o 138 que lhe dará mais flexibilidade. Poderá ter 8 posições de escrita ou leitura ou uma combinação das duas. Por exemplo, você poderá ter endereços de I/O mapeada entre 0x8000 até 0x8007, para ler ou escrever. Aí além de detectar o A15, você deverá ligar o A0, A1 e A2 no 74xx138 para obter os endereços 0x8000 a 0x8007, além do /RD e /WR.

Sugiro que domine primeiro o acesso a RAM externa e depois a parte de I/O Mapeada. Depois pode usar o 244, se precisar. Eu nem sei pra que você precisa de um 244 ou 154. Quando coloca muito componente, a coisa fica confusa e não dá pra dominar o conceito.

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

Re: tem como acessar memoria ram externa em C?

Mensagempor ze » 03 Abr 2013 13:19

pra fazer "aquelas" operações de io voce não precisa necessariamente de uma ram externa
veja como tratei (na década passada) com keil c um display lcd com sinais como descrito acima e A0 em rs e A1 em wr (do display) com RD e WR no mc numa and cuja saída está numa nor e aplicada ao en do display e ... ufa.. esquece. mas é +- isso mesmo . rs

cpp code
#define LCD_COM XBYTE [0xA000]	//lcd como mem externa [endereço] A0=0 -> comando
#define LCD_DATA XBYTE [0xA001] //lcd como mem externa escrita [endereço] A0=1 -> dado
#define LCD_BUSY ((XBYTE [0xA002])&0x80) //lcd busy bit7

//***************************************************************
/* initialize the LCD */
void lcd_init(void)
{
LCD_COM = 0x3f; //8 bits
delay(10000);
LCD_COM = 0x3f;
delay(10000);
LCD_COM=0x38; //8 bits
delay(10000);
LCD_COM=0x1; //Display Clear
delay(10000);
LCD_COM=0x6; //Entry Mode
delay(10000);
LCD_COM=0xc; //sem cursor
//LCD_COM=0xF; //Display On, Cursor On, Cursor Blink
delay(10000);
}
//***************************************************************
void print_lcd(unsigned char l, unsigned char c,const char *s)
{
LCD_COM=l+c; //posiciona cursor
while(LCD_BUSY);
while(*s)
{LCD_DATA=*s++;while(LCD_BUSY);}
}

Concordo que com eeprom e ram e etc seus programas podem ser maiores. Mas note que realmente o hw se torna + complexo. Para inicio de carreira, sugiro que use os at89xx flash da vida
abç
Avatar do usuário
ze
Dword
 
Mensagens: 1547
Registrado em: 05 Jun 2007 14:32

Re: tem como acessar memoria ram externa em C?

Mensagempor renan-papaco » 03 Abr 2013 13:40

lopesjm escreveu:Caro Renan,

Para acessar uma RAM Externa você vai precisar sim de uma RAM Externa!

Imagine o seguinte. A linhas de endereços menos significativas são A0 até A7 (Port0) depois de um latch 74XX373. Por que 74xx373 ? Porque o enable é por nível, enquanto o 374 é por borda. Pode até funcionar com 374, não cheguei a trabalhar com ele. Sempre usei o 373.

A parte mais significativa de endereços fica no P2 (A8 até A15) sem um latch. Se você pegar o A15 que fica em nivel Hi a partir da posição 0x8000 (10000000 00000000b) você já terá um simples decodificador ou detector de endereços que pode ser usado para diferenciar memoria externa de I/O mapeado em memória.

Por exemplo, suponha que como memória externa você tenha uma RAM estática 62256, com 32.768 posições.(32Kbytes) E você coloque essa RAM onde o /CS (Chip Select) da RAM seja acionado quando o A15 tiver nível LO (Zero). O OE (Output Enable) deve ligar o /RD e o WE (Write Enable) deve ligar o /WR. Pronto, você já tem uma memória externa e pode acessá-la definindo as variáveis conforme explicado lá no começo. O limite de sua RAM seria 32.768 posições, que equivalem aos endereços de 0x0000 até 0x7FFF (00000000 00000000 até 011111111 11111111). Note que a A15 é zero enquanto está na faixa de endereços da RAM. Assim que mudar para UM, ele passaria a LER ou ESCREVER em uma posição de I/O Mapeada em RAM. O que ficou faltando é associar o RD e o WR para posições acima de 0x7FFF. Isso pode ser feito usando lógica combinacional com portas AND, OR, NOT, NAND, etc.

Como o decodificador de endereços é muito simples, qualquer posição acima de 0x8000 será identificada como I/O Mapeado. Quanto a precisar de um 74xx138, isso é pra especificar uma faixa de endereços de I/O mapeada. Use o 138 que lhe dará mais flexibilidade. Poderá ter 8 posições de escrita ou leitura ou uma combinação das duas. Por exemplo, você poderá ter endereços de I/O mapeada entre 0x8000 até 0x8007, para ler ou escrever. Aí além de detectar o A15, você deverá ligar o A0, A1 e A2 no 74xx138 para obter os endereços 0x8000 a 0x8007, além do /RD e /WR.

Sugiro que domine primeiro o acesso a RAM externa e depois a parte de I/O Mapeada. Depois pode usar o 244, se precisar. Eu nem sei pra que você precisa de um 244 ou 154. Quando coloca muito componente, a coisa fica confusa e não dá pra dominar o conceito.

[]s
Jorge




eu não mencionei q quero usar um374 pra fazer a comutação de endereços/dados no 8032... e sim de usar ele numa porta de saída, como uma expansão, entende? além do mais...não pretendo usar uma ram externa por enquanto... apesar de eu saber como elas funcionam...minha intenção é usar meus microcontroladores sem rom interna e expandir suas portas de entrada e saída, sem ram externa, ate pq geralmente esses microcontroladores não precisam de ram externa, a menos q rodem algo grande como gerar video por exemplo. quero apenas criar um circuito pra gravar ou ler portas de saida e entrada.
Sabe quem mais programa um 8051 com ROM externa? MINHA MÃE! HOOOOOOOOOOOOOOOOOO
Avatar do usuário
renan-papaco
Byte
 
Mensagens: 292
Registrado em: 17 Jun 2012 15:56

Re: tem como acessar memoria ram externa em C?

Mensagempor lopesjm » 04 Abr 2013 12:37

Caro Renan,

Quando se utiliza um 8032, ou seja, um 8051 sem ROM interna, diversos pinos de I/O do microcontrolador ficam comprometidos para usar uma memória externa, seja ela qual for (EPROM, E2PROM, FLASH, RAM, etc) Um EPROM de 8 kBytes vai exigir o P0 inteiro com um latch 373, mais parte do P2 (8.192 = 2 elevado a 13, ou seja, são 13 bits para acessar essa EPROM de 8k. Então a faixa de endereços vai de 0x0000 até 0x1FFF.
Abaixo tem um circuito genérico com um 8032, EPROM, RAM E I/O MAPEADO.


Note que para usar um 8051 SEM ROM interna, é obrigatório usar um latch, pois o ciclo de busca de instrução é todo controlado pelo micro através do PSEN (Program Storage Enable) e do ALE (Address Latch Enable). Como é que a instrução sai da EPROM e vai para o micro para ser executada ? Através desse ciclo de busca. Por onde passa ? Primeiro o micro coloca no barramento o endereço combinando P0 e P2, conforme explicado acima. No P0 agora vão passar três tipos diferentes de informação: Endereços, Instruções e Dados. Então depois que o micro colocou o endereço no barramento, ele vai pulsar o ALE para que o endereço seja transferido para os pinos da EPROM. depois ele coloca em HI esse pino e pulsa o PSEN, então a instrução é colocada no barramento para o micro executar.

Inicialmente eu me foquei no título do tópico que é acessar memória RAM externa, agora você diz que não quer usar RAM externa. Ficou confuso.

Também há um forma mais simples de aumentar os I/Os, mas como muitos pinos estão comprometidos com o acesso à memória externa (EPROM), o melhor mesmo seria o uso de I/O Mapeado.

Usando o circuito básico 8032 + latch + EPROM, voce pode colocar latchs no P1 e controlar a escrita ou leitura através de alguns pinos do P3. O P0 e o P2 devem ser esquecidos, pois estarão sendo usados para acessar memória externa.

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

Re: tem como acessar memoria ram externa em C?

Mensagempor tcpipchip » 04 Abr 2013 12:43

o PROTEUS tem um exemplo legal utilizando o ADDRESS/DATA BUS para acessar uma RAM de 8K e um ROM de 8K
Na minha defesa de mestrado eu fiz uma placa utilizando software no MCS51, tanto na memoria interna como externa.
http://www.inf.furb.br/~maw/dissertacao/
TCPIPCHIP
------------------------------------------
http://www.youtube.com/tcpipchip
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 5794
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Re: tem como acessar memoria ram externa em C?

Mensagempor renan-papaco » 04 Abr 2013 22:54

lopesjm escreveu:Caro Renan,

Quando se utiliza um 8032, ou seja, um 8051 sem ROM interna, diversos pinos de I/O do microcontrolador ficam comprometidos para usar uma memória externa, seja ela qual for (EPROM, E2PROM, FLASH, RAM, etc) Um EPROM de 8 kBytes vai exigir o P0 inteiro com um latch 373, mais parte do P2 (8.192 = 2 elevado a 13, ou seja, são 13 bits para acessar essa EPROM de 8k. Então a faixa de endereços vai de 0x0000 até 0x1FFF.
Abaixo tem um circuito genérico com um 8032, EPROM, RAM E I/O MAPEADO.


Note que para usar um 8051 SEM ROM interna, é obrigatório usar um latch, pois o ciclo de busca de instrução é todo controlado pelo micro através do PSEN (Program Storage Enable) e do ALE (Address Latch Enable). Como é que a instrução sai da EPROM e vai para o micro para ser executada ? Através desse ciclo de busca. Por onde passa ? Primeiro o micro coloca no barramento o endereço combinando P0 e P2, conforme explicado acima. No P0 agora vão passar três tipos diferentes de informação: Endereços, Instruções e Dados. Então depois que o micro colocou o endereço no barramento, ele vai pulsar o ALE para que o endereço seja transferido para os pinos da EPROM. depois ele coloca em HI esse pino e pulsa o PSEN, então a instrução é colocada no barramento para o micro executar.

Inicialmente eu me foquei no título do tópico que é acessar memória RAM externa, agora você diz que não quer usar RAM externa. Ficou confuso.

Também há um forma mais simples de aumentar os I/Os, mas como muitos pinos estão comprometidos com o acesso à memória externa (EPROM), o melhor mesmo seria o uso de I/O Mapeado.

Usando o circuito básico 8032 + latch + EPROM, voce pode colocar latchs no P1 e controlar a escrita ou leitura através de alguns pinos do P3. O P0 e o P2 devem ser esquecidos, pois estarão sendo usados para acessar memória externa.

[]s
Jorge


bem...primeiramente peço desculpas por ter me confundido...não queria usar ram externa por enquanto... mas ainda sim quero usar IO mapeado. , ja q sobram 4 vias de endereço da porta P2, poderia usa-las em um 74LS138(3 pra selecionar endereço e 1 pra habilitar esse demux) além de combinar os sinais de RD e WR pra gravar e ler nas portas adcionais?
Sabe quem mais programa um 8051 com ROM externa? MINHA MÃE! HOOOOOOOOOOOOOOOOOO
Avatar do usuário
renan-papaco
Byte
 
Mensagens: 292
Registrado em: 17 Jun 2012 15:56

Re: tem como acessar memoria ram externa em C?

Mensagempor lopesjm » 06 Abr 2013 11:31

Olá Renan,

Sim, sua idéia é válida e pode funcionar. Ligando o P2.7 no 138 e fazendo um AND com /RD e /WR e ligando no 138, voce teria sim 8 expansões de I/O mapeado, mas tem um detalhe. Veja abaixo.

A tabela verdade ficaria assim:
P2.7|P2.6|P2.5|P2.4|ENDEREÇO
0 | x | x | x | nao acessa I/O
1 | 0 | 0 | 0 | 0x8000 (1000 0000 0000 0000)
1 | 0 | 0 | 1 | 0x9000 (1001 0000 0000 0000)
1 | 0 | 1 | 0 | 0xA000 (1010 0000 0000 0000)
1 | 0 | 1 | 1 | 0xB000 (1011 0000 0000 0000)
1 | 1 | 0 | 0 | 0xC000 (1100 0000 0000 0000)
1 | 1 | 0 | 1 | 0xD000 (1101 0000 0000 0000)
1 | 1 | 1 | 0 | 0xE000 (1110 0000 0000 0000)
1 | 1 | 1 | 1 | 0xF000 (1111 0000 0000 0000)

Inicialmente estes endereços acionam cada saída do 138. Note que não é uma sequencia contínua como 0x8000, 0x8001, 0x8002, etc. Até aí, não tem problema.
O problema é que essa lógica permite que outros endereços também acionem o latch. Por exemplo:

Toda esta faixa de 0x8001 até 0x8FFF poderia acionar a mesma posição que o endereço 0x8000 aciona. Por que ? Vejamos a tabela verdade:

P2.7|P2.6|P2.5|P2.4|P2.3|P2.2|P2.1|P2.0 (ADDR7 ~ ADDR0)
0 | x | x | x | x | x | x | x | nao acessa I/O
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |0x8000 (1000 0000 0000 0000)
1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |0x8001 (1000 0000 0000 0001)
1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 |0x8FFF (1000 1111 1111 1111)

Note que o P2.7 é nivel UM e portanto acionará o 138 também. Para as outras posições de I/O mapeado, o raciocínio é o mesmo.

Se você estiver ciente disso, pode usar normalmente.

O certo seria usar o ADDR0, ADDR1 e ADDR2 que estão no latch que vai para a parte baixa de endereços da EPROM para selecionar os endereços. Assim você poderia ter uma sequencia contínua de endereços e se precisar, poderia até expandir, usando uma lógica combinacional com essas 4 linhas de endereços do P2 mais o P0.

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

Próximo

Voltar para 8051

Quem está online

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