Moderadores: 51, guest2003, Renie, gpenga
/* 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)
}
#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);}
}
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
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
Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante