Sida 2 av 4

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

Postat: 27 november 2012, 13:33:27
av Icecap
Om man vill ha parallellt minne, alltså externa minneskretsar kan man göra just som Swech har gjort: Reservera ett visst minnesområde till detta och sedan bygga bankar på det område. Jag gjorde i sin tid exakt detta på en TRS80, där expanderade jag först RAM'en till 32kB, de första 15kB tog PROM'en och sedan var det 15kB till övers, där monterade jag 128kB SRAM med batteri back-up. Dessa 128kB var fördelat på 8 st banker och det fungerade riktigt bra.

Men detta sätt är inte effektivt om det rör sig om "låga" hastigheter! Bilder kan effektivt hämtas från ett seriellt (t.ex. SPI) minne, det kan vara en seriell FLASH eller ett SD-kort - men det sker ju inte med högsta hastighet, rörliga bilder blir en helt annan femma.

Loggning av datum/tid/temperatur osv. är en typisk uppgift för ett seriellt minne.

Så man väljer lagringssätt efter vad som behövs och hastigheten som informationen ska vara åtkomlig på.

Ett 128k*8 (t.ex. 73-824-44 till 7,63 + moms) SPI-minne tar 4 pinnar i beslag, en 128k*8 parallell FLASH (t.ex. 73-824-55 till 12,20 + moms) tar minst 26 pinnar i anspråk, även det en sak att ta med i beräkningarna.

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

Postat: 27 november 2012, 14:01:04
av Nerre
Swech skrev: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.
Ska jag vara ärlig så tror jag inte att TS fattar ett ord av det där:)

JAG fattar, men kunskapsnivån hos TS verkar vara alldeles för låg. Förstår man inte hur en adressbuss funkar så förstår man knappast heller bankswitchning.

Därav mitt tips att börja lära sig hur en mikroprocessor adresserar minne.

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

Postat: 27 november 2012, 14:21:15
av foal
Swech/ Precis. Jag har sagt att jag inte kan och att jag behöver lära mig det från grunden. Visste inte riktigt hur jag skulle ta diskussionen framåt och tänkte att något lite mer konkret exempel kunde hjälpa till. Dessutom var det en liten baktanke med en applikation som använder data i små paket och en applikation som använder större paket i form av en bild.

Nerre/ Både ja och nej. Hårdvarumässigt tror jag att jag förstår hyfsat. Den externa adressbussens bredd räcker inte till och då utökades adressen genom att använda några extra I/O-pinnar. Minnet delas upp i banker och bankselect kontrolleras med I/O-pinnarna.

Rent adressmässigt då. På vilka adresser når jag det externa minnet i exempelvis PIC24FJ128GA010? Hårdvarumässigt kan ju minnen anslutas seriellt med SPI och I2C samt parallellt med PMP men vilka adresser skulle dom få?

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

Postat: 27 november 2012, 14:48:21
av Nerre
Ansluter du minnet på det viset kommer det minnet att få egna adresser och du kommer behöva använda funktioner för att läsa in data från dem till RAM för att kunna jobba med det.

Jämför med t.ex. en hårddisk i datorn, vad ligger den på för adresser? Den har ingen adress i minnesrymden utan adresseras på sitt eget sätt.

Det är ju den här klassiska indelningen som man brukar köra med:

RAM = primärminne, det minne som processorn jobbar mot direkt
SD-kort, EEPROM etc = sekundärminne, processorn jobbar inte direkt mot det utan man använder speciella funktioner för att läsa och skriva

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

Postat: 27 november 2012, 14:48:47
av sodjan
> Hårdvarumässigt kan ju minnen anslutas seriellt med SPI och I2C samt parallellt med PMP men vilka adresser skulle dom få?

"Adresserna" som I2C eller SPI använder har ingenting med några andra adresser att göra.
T.ex de som det övriga minnet (flash eller RAM) i processorn använder. De har sina egna adresser.

> På vilka adresser når jag det externa minnet i exempelvis PIC24FJ128GA010?

Inga alls, den processorn har inte möjlighet att "mappa" minne till externa minnen.
Däremot kan de självklart använda minnen via I2C eller SPI bussarna, men det
är som sagt en helt annan sak och har ingenting med det interna minnet att göra
eller dess adresser.

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

Postat: 27 november 2012, 15:04:18
av foal
Sodjan/ Okej, hur hade jag gått tillväga om jag använt mig av I2C eller SPI och just den processorn då?

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

Postat: 27 november 2012, 15:08:18
av Nerre

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

Postat: 27 november 2012, 15:12:46
av sodjan
> Första google-träffen:

På vadå?

> Sodjan/ Okej, hur hade jag gått tillväga om jag använt mig av I2C eller SPI och just den processorn då?

Det är inget speciellt med just den processorn. I2C eller SPI fungerar i princip likadant
på alla processorer som har stöd för det. Du gör "som vanligt" när man använder I2C eller
SPI, kan man säga. Vad är frågan egentligen, är det hur I2C eller SPI i sig fungerar?

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

Postat: 27 november 2012, 15:25:52
av foal
Nerre/ Tack, jag ska läsa igenom länken lite senare!

Sodjan/ Nej SPI och I2C är inga problem att få igång. Frågan är hur jag i mjukvaran håller reda på vad som ligger på minnet. Ett exempel. Om jag vill använda mig av bilder som upptar 10 byte där bild1 börjar på minnesadress 10 och bild2 på 20 osv. Då måste jag alltså använda mig av en liten tabell lagrat på PICens interna FLASH som talar om att bild1 börjar på adress 10 och bild2 på adress 20?

När jag sedan vill hämta bild2 så tittar jag i min lilla tabell, hittar adress 20 som jag klockar ut till mitt SPI-minne och läser 10 bytes?

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

Postat: 27 november 2012, 15:27:06
av Nerre
Första google-träffen på "pic interface spi sd-card".

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

Postat: 27 november 2012, 15:38:20
av foal
Har för mig att microchip har färdiga bibliotek för att hantera SD-kort och filsystem på dem. Är ju ytterst smidigt om det är lite större saker man ska spara, t.ex. bilder men kanske lite overkill om man bara vill logga temperatur eller liknande data.

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

Postat: 27 november 2012, 15:45:34
av Icecap
foal: hur du håller reda på vad som ligger var i ett SPI-minne beror väl på hur du gör.

Om det är blockar av fast storlek brukar man räkna i dessa blockar men ett trick kan jag ge: när FLASH-minne är raderat innehåller varje cell 0xFF(FF), alltså alla bit satt. Om man då ska starta upp och inte har någon aning om var första fria plats i ett SPI-FLASH minne finns kan man leda igenom varje block fram till ett block bara innehåller 0xFF.

Om man t.ex. sparar datum kan man kolla årtalet, det är en bit kvar till år 65536 och när det årtal dyker upp har man hittat första tomma block.

Men hela din frågaställning är så fel den kan bli. Det finns inget entydigt standard sätt att lösa alla uppgifter på, varje sätt har sin lösning fast många är mycket lika.

SD-kort är helt OK, att ha filsystem på dom kan vara riktigt bra - men samtidig tar själva filsystemets behandling en hel del plats och därmed exekveringstid.

Men som sagt: använd rätt lösning till projektet, inte nödvändigtvis bara en standardlösning.

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

Postat: 27 november 2012, 15:57:55
av sodjan
> Då måste jag alltså använda mig av en liten tabell lagrat på PICens interna FLASH som
> talar om att bild1 börjar på adress 10 och bild2 på adress 20?

Nej du behover inte någon tabell. Du vet ju redan att bild X ligger på adress X*10.

> När jag sedan vill hämta bild2 så tittar jag i min lilla tabell,

Nej, du multiplicerar bildnumret med 10 och läser på den adressen.

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

Postat: 27 november 2012, 16:01:10
av foal
Icecap/ Tack, din första mening är precis vad jag behövde höra. Problemet låg från början i att jag trodde att man kunde mappa upp minnet och använda det på samma sätt som man använder processorns interna data minne. Men nu är ju det fallet utrett!

Det är ju inget specifikt projekt som jag funderar över utan generellt hur man använder externa minnen. Två svar har jag fått, SPI/I2C samt SD-kort, och har du fler varianter så får du jättegärna dela med dig.

Vad menar man när man pratar om att mappa upp ett minne? Menar man då att man ger minnet samma adresser som processorns FLASH eller RAM?

Går det att använda sig av samma adresser som till processorns FLASH eller RAM och i så fall vad krävs?

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

Postat: 27 november 2012, 16:14:04
av Icecap
"Vad menar man när man pratar om att mappa upp ett minne? Menar man då att man ger minnet samma adresser som processorns FLASH eller RAM?"
Ingen aning! Jag har aldrig hört detta uttryck i samband med SPI-minnen. Och här använder jag "SPI-minne" som en generell beteckning för seriella minnen.
Men om man använder parallella minnen som kopplas till adress & databussen är det egentligen bara en fråga om att man vet vilka adresser som minnet finns på och använder dessa värden i programmet. Detta har med hårdvaran att göra.

"Går det att använda sig av samma adresser som till processorns FLASH eller RAM och i så fall vad krävs?"
Såklart inte! Om man använder parallella minnen som kopplas till adress & databussen kan de INTE ha samma adresser som de inbyggda minnen, de platser är ju redan tagna eller hur?

Om vi tar ett 1kB SPI-minne (t.ex. EEPROM) finns minnesplatserna från adress 0x000 och 0x3FF. Nästan(?) alla SPI-minnen har automatisk uppräkning av adressräknaren inne i kretsen, ska man alltså skriva fler bytes gör man som följer:
1: Ger kommandon för att sätta rätt startadress.
2: Skriver en byte.
3: Väntar på att den blir klar (om det behövs).
4: Om det ska skrivas fler bytes gås det till punkt 3.

En skrivning eller läsning stegar alltså vidare till adressen efter när den är avklarat.

Jag tror mig ana en del av dina problem med att fatta hur det hela fungerar: Nej, man behöver inte formattera minnen innan man använder dom!