Hur använder man externt minne till en microcontroller?

Elektronikrelaterade (på komponentnivå) frågor och funderingar.
foal
Inlägg: 31
Blev medlem: 27 november 2012, 08:23:39

Hur använder man externt minne till en microcontroller?

Inlägg av foal »

Hej!

Har ett visst intresse av elektronik och har suttit en del med PIC processorer på min fritid. Jag är helt självlärd och har hela tiden försökt ta små steg framåt. Nu känner jag att jag skulle vilja lära mig hur man använder externa minnen i mina projekt för att kunna spara data. Har problem med att förstå vissa saker och har inte lyckas hitta någon basic information om hur det fungerar. Har sökt runt lite på nätet och tillslut hamnade jag på detta forumet och tänkte att jag kan slänga ut en fråga då här verkar finnas mycket kunnigt och trevligt folk.

Minnena ska inte vara flyktiga alltså är det FLASH, MRAM eller FRAM typ som gäller då dessa tillåter lite större storlekar än t.ex. EEPROM. Har förstått att det finns lite olika interface som SPI, I2C och parallella. Samtliga interface är väl hyfsat enkelt att implementera i microcontrollern med hjälp av tillgängliga periferienheter.

Nu till det jag inte alls förstår. Hur hanterar man minnet i mjukvaran? Hur adresserar jag minnet och hur håller jag koll på vilka filer som finns på minnet? Använder man sig av något slags filsystem eller hur gör man?

Om någon kan förklara detta elelr vet någon bra bok, e-sida eller applikations nöt där jag kan läsa mig till detta är jag jättetacksam.
Användarvisningsbild
Icecap
Inlägg: 26807
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Hur använder man externt minne till en microcontroller?

Inlägg av Icecap »

Steg 1 är att hitta ett lämpligt minne som man vill använda och då hämta databladet till detta.
Steg 2 är att lusläsa databladet.

Men i essens: det skiljer inte så värst mycket mellan seriella EEPROM och FLASH. Exakt vilket sätt kretsen sparar data på har mindre betydelse.
For att spara t.ex. i EEPROM ska man göra några steg:
1: Slå på "det är tillåtet att spara"-bit/funktion.
2: Skicka kommando med startadress. Detta kan vara fler bytes, typ "Här kommer startadress" + adressbyte + adressbyte (+ adressbyte).
3: Skicka kommando med data. Kan vara byte eller word.
4: Skicka ett "Skriv detta i minnet!"-kommando.
5: Vänta på att den blir klar med "bränningen".
6: Om fler data ska skrivas i minnet brukar minnen ha en automatisk inkrementerande adressräknare, alltså behöver man bara upprepa steg 3 och fram.

FLASH-minnen skiljer sig mest från EEPROM vid att man måste skicka kommandon för att radera en block eller hela kretsen.
Hur lång tid en "bränning" tar beror på kretsens lagringsmetod, t.ex. är FRAM mycket snabb.

Exakt hur man skickar data till och från minneskretsen beror på vilka funktioner µC'n har tillgängliga, en möjlighet kan vara att köra bit-bang av SPI-interfacen men vissa µC har inbyggd SPI-funktionalitet som kan användas.
Nerre
Inlägg: 27415
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Hur använder man externt minne till en microcontroller?

Inlägg av Nerre »

Ja det går ju att göra i princip "hur man vill".

En uC har ju inte bussen direkt tillgänglig så man måste ju i alla fall interfaca minnet via speciella funktioner. Och det är ju ungefär på samma sätt som man jobbar mot dess inbyggda EEPROM.

Det går ju alltså inte att "utöka" RAM utan storleken på RAM kan man inte påverka.

Vilken metod man använder beror ju mycket på vad det är som skall lagras och hur det externa minnet kan adresseras.

Man kan t.ex. köra nån form av "paging", man har ett utrymme, en buffert, i RAM som håller en kopia av ett "block" (i valfri storlek) av det externa minnet. Ska man komma åt en annan del av det externa minnet så får man läsa i den delen istället. Har man skrivit till RAM-bufferten bör den ju dock skrivas tillbaka först. Ett system som flaggar för om det har ändrats eller inte kan vara vettigt för att inte skriva i onödan.

Så jobbar man ju ofta även med filsystem, man läser in ett block i taget.

Vissa typer av minnen behöver kanske en adress för varje läsning, andra kanske går att läsa sekventiellt efter att ha satt en start-adress.
Användarvisningsbild
Wedge
Inlägg: 1026
Blev medlem: 8 juli 2012, 17:33:33

Re: Hur använder man externt minne till en microcontroller?

Inlägg av Wedge »

Generalisera aldrig, Nerre. :)
På exempelvis en ATmega2560 kan man offra I/O-pinnar till förmån för en "vanlig" buss, och utöka med externt (RAM-)minne. Det är alltså inbyggt stöd för externt minne, man behöver inte spela själv på I/O-pinnarna för att emulera en buss.
TS nämner PIC, och det vet jag inte om det finns nån som klarar externt minne på detta vis, men Atmegan är i alla fall en uC... :)
Nerre
Inlägg: 27415
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Hur använder man externt minne till en microcontroller?

Inlägg av Nerre »

Begreppet "microcontroller" är ju redan i sig en generalisering:)
foal
Inlägg: 31
Blev medlem: 27 november 2012, 08:23:39

Re: Hur använder man externt minne till en microcontroller?

Inlägg av foal »

Intressanta svar! Jag försöker skriva hur jag har uppfattat det så får ni hjälpa till att rätta det jag har missförstått.

En 16 bitars PIC har en adressbus som kan adressera 65000 adresser. Av dessa adresser används redan ett viss antal till de interna minnena, säg 33000(helt taget ur luften bara för exemplets skull). Det innebär då att jag har 32 000 adresser kvar som jag skulle kunna mappa till ett extern minne. Begränsningen i adresser gör att det största minnet jag kan utnyttja är 32k bytes?

För att ha koll på datat som jag lagrar i minnet får jag göra en stor array där jag lagrar information om på vilken adress varje data är lagrat och hur många byte det består av. När jag sedan vill läsa något data från minnet så tittar jag igenom min array efter rätt adress, lägger ut den till minnet och läser in datat därifrån?
sodjan
EF Sponsor
Inlägg: 43289
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hur använder man externt minne till en microcontroller?

Inlägg av sodjan »

> En 16 bitars PIC

Var gärna lite tydligare.
PIC18xxx har 16 bitars address.
PIC24/30/33 har 16 bitars data.

> Det innebär då att jag har 32 000 adresser kvar som jag skulle kunna mappa till ett extern minne.

Kanske, *OM* den aktuella modellen stöder det !!
Vissa PIC18 har möjlighet att lägga ut adresser på externa I/O pinnar, men
det är de med lite större kapsel och det är normalt inte de som hemapularne
använder. Men detta är ju fullständigt solklart i databladet...

Sen så behöver du fundera mer över hur dui ska använda det externa minnet.
Du talar om "filer" vilket sannolikt är helt galet (om det inte är minneskort
med filsystem som du funderar på, men då är det inte de typar du angav).

Hur du använder minnet är väldigt hårt kopplat till den aktuella applikationen,
det finns inget direkt generellt svar på det.

Du är ganska fel ute, du behöver backa några steg och tänka om.
Användarvisningsbild
Icecap
Inlägg: 26807
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Hur använder man externt minne till en microcontroller?

Inlägg av Icecap »

foal: "En 16 bitars PIC har en adressbus som kan adressera 65000 adresser."
Nej! Rätta talet är i övrigt 65536...

Om vi antar att en 16 bitars µC har extern minnesbuss betyder det inte att den externa adressbuss är på 16 bit, den kan mycket väl vara på 24, 32 eller ännu fler bitar! Detta har inget med PIC/Fujitsu/Renesas/AVR eller liknande att göra - fast olika tillverkare har olika preferenser.

Tar man t.ex. Fujitsu FFMC-16LX är det en 16 bit µC - med 24 bit adressbuss.

Men detta har inget att göra med en SPI-anslutet EEPROM/FLASH att göra!
foal
Inlägg: 31
Blev medlem: 27 november 2012, 08:23:39

Re: Hur använder man externt minne till en microcontroller?

Inlägg av foal »

Som sagt, jag har ju inte förstått den här biten och det är därför jag frågar här. All hjälp och förklaringar är guld värda! Orkar ni inte förklara men har något bra dokument där jag kan läsa så får ni gärna hänvisa till det istället.

Om jag ger förslag på två applikationer kanske ni kan ge förslag på lösningar hur ni skulle använda ett externt minne så kan vi diskutera vidare utifrån dom? Hur man adresserar datat och hur man i mjukvaran vet på vilka adresser datat ligger.
-Använda applikationen som temperaturavläsare där en temperatur ska läsas av 1 gång i minuten och loggas med temperatur och aktuell tid. Här behövs ett inte så stort minne.
-En applikation där bilder ska visas på en display. Bilderna i storleksordningen 200k byte ska lagras på det externa minnet. Här behövs alltså ett lite större minne.
sodjan
EF Sponsor
Inlägg: 43289
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hur använder man externt minne till en microcontroller?

Inlägg av sodjan »

> -Använda applikationen som temperaturavläsare...

Ganska små paket och en traditionell "loggnings" applikation.
Du får bestämma hur hur många mätpunkter du behöver (d.v.s minnesstorlek)
och om t.ex tid (och i så fall format) ska lagras tillsammans med tempen.
Sen är det bara att lagra dessa i minnet en efter en.

> -En applikation där bilder ska visas på en display.

Det är ju en helt annan sak!
Sannolikt talar vi inte heller om någon av de mindre PIC modellerna (?).
Kanske att du ska köra CF-kort (eller liknande) och ett FAT system.
Eller om alla "bilderna" har fasta format/storlekar så kan du även
dela upp ett vanligt EEPROM i lämpliga/jämna delar och köra utan
filsystem. Även här får du räkna på antalet önskade bilder o.s.v för
att dimensionera det hela...
Nerre
Inlägg: 27415
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Hur använder man externt minne till en microcontroller?

Inlägg av Nerre »

Läs Mikrodatorns ABC så får du lära dig hur bussar fungerar.
Användarvisningsbild
Wedge
Inlägg: 1026
Blev medlem: 8 juli 2012, 17:33:33

Re: Hur använder man externt minne till en microcontroller?

Inlägg av Wedge »

Om inte PIC är ett krav kan jag tipsa om Arduino, till vilken det finns ett SD-bibliotek. Om det skulle kunna vara ett alternativ att använda minneskort istället för kretsar, alltså. Då har du "på köpet" allt i ett filsystem som du kan flytta mellan vanlig PC och ditt projekt.
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4767
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Re: Hur använder man externt minne till en microcontroller?

Inlägg av Swech »

Jag har kört med ett 512kb externt minne till en AVR Mega128
Mega128 stödjer 64kb linjärt minne med överlapp med det interna minnet.
Det går alltså att läsa/skriva direkt till det externa minnet. Gränsen är dock 64kb.

Vad jag gjort då är att ta en port som går till de 3 högsta adressbitarna (värde 0-7)
Så får jag 8 st banker med 64kb i varje bank.

Adressrymden blir i koden 0-64kb men genom att välja rätt bank så accessar jag
8 st olika 64kb bankar.

Xmega processorerna är trevligare då de kan linjärt adressera 16Mb

Swech
sodjan
EF Sponsor
Inlägg: 43289
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hur använder man externt minne till en microcontroller?

Inlägg av sodjan »

Grejen är lite här att de två exempelapplikationer som vi har fått
är så pass skilda så det går inte utifrån dom två att tala om en
gemensam lösning som är optimal för (eller som passar) båda.
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4767
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Re: Hur använder man externt minne till en microcontroller?

Inlägg av Swech »

Exemplen var ju för att föra diskussionen framåt, då tråden har
en relativt "sur" karaktär....

Swech
Skriv svar