Mega128 med externt SRAM, funderingar & frågor

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Mega128 med externt SRAM, funderingar & frågor

Inlägg av Korken »

Godagens!

Nu när jag har kommit in lite på det "större" AVRerna, AVR32, och började läsa om minnena så slog det mig, jag kan näst intill inget om hur RAM fungerar tillsammans med en mikroprocessor/MCU.
Så jag tänkte testa det, i ett lite större projekt, med en Mega128 då den har interface för externt SRAM (vet att 64an och 8515 också har det, men hade 128an liggandes).

Men, till frågorna.
Jag läste om roliga projekt om vad man kan göra och snubblade över denna: Länk
Han har gjort en ATA-kontroller och använder SRAMet som en buffer för skriv och läsningar.
Detta ser ut att vara ett roligt och spännande projekt som kan ta lite tid och funderande så jag tänkte göra något liknande,
alternativ att man går ner till minneskort men ändå försöker sig på FAT32 (så man kanske skulle kunna få det att fungera som ett USB-minne) som nog är den stora boven (svårigheten).

Men, till funderingen; han använder ett 64kx16bit SRAM (K6R1016C1C) och vad jag förstod från databladet så kan man max ha 64kB SRAM, men han har 128kB.
1. Och min fråga är då, varför har han 128kB när man bara kan använda hälften?
Är det bara för att han vill använda den extra bandbredden (16-bit i stellet för 8-bit) eller hur är det tänkt?

Sedan så letade jag efter gamla trådar om minneskort och liknande projekt men jag tror att forumet hatar mig då när jag söker på minneskort eller FAT32 så får jag inga träffar, men jag kommer ihåg att jag har sätt projekt om det flertalet gånger.
2. Är det någon som råkar ha någon sådan tråd sparad?
Det skulle underlätta mitt arbete mycket!

3. Är det någon som råkar sitta på en länk till ett projekt där externt SRAM används som man kan lära sig av?
Det spelar inge större roll om det är för Mega64, 128 eller 8515 då alla fungerar _ungefär_ likadant.
Jag börjar få ett litet grepp om hur det ska vara men mer exempel skulle hjälpa till avsevärt!

4. Vet någon vart man kan få tag på minnet som han använder eller minnen av samma typ?
Sökte runt lite men hittade bara på Digikey och att köpa ett minne och sedan betala 10x i frakt känns lite onödigt.

Puuhhh! :humf: Det vart mycket text och frågor.
Hoppas någon kan hjälpa mig och tack på förhand!

Jag hoppas att detta blir ett lyckat och roligt projekt! :D
Då det är tid för min del att ta ett ordentligt projekt efter att ha gjort så många småttingar.

//Emil
Luleå
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Sannolikt kan man adressera 64K adresser, men genom att köra ett
16-bit minne så kan man hantera totalt 128 kbytes...
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Inlägg av Micke_s »

Du kan addressera 64k direkt, sedan kan du ha hur många "pages" av 64k block som helst, bara att du själv får hålla koll på vilken bank de ligger och dra i i/o linor själv.
Användarvisningsbild
Henrik
Inlägg: 661
Blev medlem: 26 maj 2003, 23:39:14
Ort: Göteborg
Kontakt:

Inlägg av Henrik »

What every programmer should know about memory är en jättebra artikel om minnen, från det triviala till mer komplexa saker (men förklarat på ett enkelt sätt)
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4750
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Inlägg av Swech »

Man kan ansluta 64K externt minne direkt till AVR
Av dessa kan man använda
64K - (storleken på interna ram minnet + interna register)
På mega 128 blir det alltså ca 60k
Minnet är Byte orienterat externt. Minnet blir dock helt transparent,
Du accessar minnet på samma sätt som interna. Skillnaden är att
det är långsammare. Man bör därför inte lägga stacken externt.

Vill man ha mer minne så använder man några lediga port pinnar för
att ställa önskad Ram bank. Dessa ansluts till de adresspinnar som inte
nås av externa minnes interfacet.

Det som är lite bakvänt är att det interna minnet alltid dyker upp i
varje bank. På en Mega128 tappar du alltså 4K i varje 64K segment. Detta går att fixa också men det är lite besvärligt.

Satte ihop en liten Mega128 i somras med 512K externt ram.
Bankval löste jag externt i en ALTERA FPGA. Valde 32K Pages så att
det inte blev några 4K luckor. Hade alltså 16 banker a 32K

Som svar på dina frågor 1 och 4
extra bandbredd får du inte, du kan inte accessa 16 bitar.
Du kan däremot få mer minne med rambank

Minne , ett ISSI skaffade jag på Farnell, men de säljer väl bara till företag


Swech
Användarvisningsbild
Illuwatar
Inlägg: 2256
Blev medlem: 10 november 2003, 14:44:27
Skype: illuwatar70
Ort: Haninge
Kontakt:

Inlägg av Illuwatar »

För nummer 3, kolla min hemsida "ATmega128 Board".

Nummer 4 hittar du annars i gammal utrustning. Jag har sådana jag har lött av från skrotad Ericsson-utrustning om det är av intresse. Jag kan titta i mina gömmor om du vill.
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Inlägg av Korken »

Tackar för informationen! :D

Nu har jag mycket mer att gå på så nu ska det börja ritas kretskort och se vad man får.
Men, om man har flera minnesbanker, alternativt en 64Kx16bit bank, är det då så att man själv får hålla reda på vart allt, man lägger in på dem, ligger?
Låt oss säga att jag buffrar 100Kb med data över två banker och sedan vill skicka det vidare, måste jag då hålla reda på när man ska byta banker för att det inte ska gå fel eller säger µCn till att man är vid slutet på RAMet?
Alltså så om den säger till så man man byta det när man når "RAM END".

Och tack igen!

//Emil
Luleå

Edit: Illuwatar, om du vill så får du gärna leta fram några. :)
Edit2: Jag fick en idé här i natten som ni kanske kan berätta om det går eller inte.

Och jag vänder AVRens RAM som en buffer för 1 page (256 words = 512byte) och sedan skriver det till det externa RAMet mauellt och gör likadant när jag läser, då borde jag hela tiden veta vart allt som jag vill ha finns samt att jag kan använda 16-bitars bandbredden då jag skriver till RAMet manuellt.

Eller är jag för trött för att förstå mina egna tankar? :humf:
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4750
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Inlägg av Swech »

Det här med 16 bitars bandbredd... du menar att du vill skriva
16 bitar åt gången? Det externa minnesinterfacet på AVR stödjer
inte 16 bitar, endast 8 bitar. Det går naturligtvis ganska lätt att
fixa externt så att AVR lägsta adress bit styr via några latchar vilka
av de 2x8 databitarna som skall adresseras på det externa ramet.

Det finns inget inbyggt som talar om automatiskt om du ramlar
utanför din 64K buffert. Det får du sköta med mjukvara själv.

Lägger du en rambuffert internt så kommer det att gå ganska långsamt


Swech
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Inlägg av Korken »

Hmm, tror jag ska förklara lite bättre hur jag tänkte.
Klockan var runt 5 på morgonen och inte sovit på ca 40h så va ganska oklar. :)

Idén jag fick var, då jag ska läsa från en ATA HDD samtidigt så varför inte ha 16-bitars bredd på minnet (som personen i länken gjorde)?
Då kan jag länka ATA HDDns bus direkt till minnet och bara skicka skriv-/läskommandon från µCn.
Och sedan skicka data som behövs till µCn för bearbetning, tex skicka det till ett MP3 chip om det är en MP3 spelare.
Detta borde gå ganska så fort då jag har 2 portar som kan ta in datat och sedan bara en loop som går 256 ggr för att ta in en sektor med data och lägga det i internminnet.
Jag själv tycker att det borde vara det bästa då jag hela tiden kan buffra 128kB med data (256 sektorer) i RAMet och att sedan använda det där ifrån tycks inte vara några större problem heller.

Men då jag kan direkt koppla HDDn till RAMet är den största anledningen varför jag vill göra som jag vill.
Men det kanske är effektivare att göra på något annat sätt?
Berätta gärna om du vet!

Och, Swech, vad menar du med "Lägger du en rambuffert internt så kommer det att gå ganska långsamt", jag förstår inte riktigt vad du menar.

//Emil
Luleå

Edit:
En sak som slog mig, då jag gör detta för att lära mig AVR med RAM varför går jag då inte direkt på UC3A serien som har SDRAM och DMA?
Då jag kan koppla HDDn direkt via DMA.
Det kanske är en bättre idé än att slåss med AVR 8-bit?
Men kan ju lika gärna göra det här också då det är bra att lära sig. :)
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4750
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Inlägg av Swech »

Effektivast utan tvekan - använd en FPGA Altera/Xilinx eller liknande.


Du vill koppla ihop HDD + Ram externt. Alltså bunta ihop dessa
och låta HDD skriva rätt in i Ram,
Din AVR måste väl då tala om för RAM vilken adress som data skall
placeras I, och AVR måste toggla med lite bitar för att läsa/skriva
Det är fullt möjligt, men det är egentligen ett toppjob för en FPGA

Swech
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Inlägg av Korken »

Okej, då va min idé inte helt galen iaf. :)
Då jag inte kan FPGA och att jag gör detta för att bara testa med AVR och lära mig hur det fungerar så behöver det inte gå mega snabbt.
När det väl fungerar så ska jag nog testa det på AVR32 UC3 då de både har SDRAM kontroller och DMA, vilket kommer gasa på det betydligt, men man måste ta ett steg i taget. :)

Och, tack för informationen!
Den här dimman börjar nu lätt för mig.

//Emil
Luleå
Skriv svar