Sida 2 av 4

Re: Separera en Integer till två Byte(C)

Postat: 31 augusti 2009, 19:36:10
av TomasL
Man kan ju använda FRAMar, då är det problemet ur världen.

Re: Separera en Integer till två Byte(C)

Postat: 31 augusti 2009, 19:48:49
av bearing
Ja, kanske, beror på hur stor en frame är. Jag räknade fel i förra inlägget, 1M skrivningar ger 12 dagars livslängd, inte 10 månader. Om en frame är 32 byte håller minnet ett år, vilket väl är för kort. Men om en frame är 512 byte håller minnet antagligen tillräckligt länge.

Re: Separera en Integer till två Byte(C)

Postat: 31 augusti 2009, 19:51:45
av eqlazer
bearing: TomasL pratar om FRAM iställer för EEPROM, inte frames.

Re: Separera en Integer till två Byte(C)

Postat: 31 augusti 2009, 19:53:07
av TomasL
He he just det, två helt skilda saker.

Re: Separera en Integer till två Byte(C)

Postat: 31 augusti 2009, 20:09:43
av bearing
Hehe, jaha... =) ganska kul.

Re: Separera en Integer till två Byte(C)

Postat: 31 augusti 2009, 20:15:21
av bubz
Håller oxå på med ett projekt som involverar loggning och arduino.
Jag har valt att använda atmels dataflash kretsar AT45DBXXX. De verkar ruskigt smidiga att jobba med.

Re: Separera en Integer till två Byte(C)

Postat: 31 augusti 2009, 20:20:47
av TomasL
Problemet med alla FLASH kretsar är den begränsade livslängden, men eftersom FRAMar i regel är pinkompatibla och kodkompatibla kan man problemfritt ersätta FLASHarna.
En annan fördel med FRAM är att det finns ingen skrivfördröjning, vilket gör att man kan elda på i princip så fort som bussen klarar av, till skillnad från FLASHar.

Re: Separera en Integer till två Byte(C)

Postat: 31 augusti 2009, 20:36:13
av bos
Ranstam skrev:Jag har en funktion som heter i2c_eeprom_write_byte(i2cadress, minnesplats, värde som ska sparas); Eftersom denna funktion sparar en "byte" och jag vill spara en INT "2-byte", så vill jag kunna göra om en INT till 2st BYTE, och lägga på 2st olika platser i minnet, för att sedan kunna sätta ihop dom igen, och presentera dom i datorn.
Då torde den enklaste lösningen vara att skriva en wrapper till den funktionen, som tar en integer och anropar i2c_eeprom_write_byte() två gånger på efterföljande adress. Därefter behöver du inte bekymra dig på byte-nivå.

Andra personer har lyft fram andra problem du kanske ska oroa dig för.

Re: Separera en Integer till två Byte(C)

Postat: 31 augusti 2009, 20:43:47
av bubz
Ärligt talat så hade jag inte koll på FRAM tidigare och det verkar smutt. Men ångrar inte att jag tjackade dataflash ändå... Nu kanske det finns större kretsar, men att döma av dem som finns på ELFA så hade jag behövt en handfull av FRAM kretsar. Och billiga var de inte. För min egen del är inte hastigheten ett problem och med minst 100 000 write cycles kommer de att räcka länge. Det beror väl helt enkelt på vad man ska ha grejerna till.

Men jag ska lägga det på minnet. Blir dom större och billigare går det som sagt rätt lätt att byta ut :)

Re: Separera en Integer till två Byte(C)

Postat: 31 augusti 2009, 20:46:03
av Anonym2
Hej!

Det är denna minneskrets jag använder. http://www.electrokit.se/download/21189L.pdf. Kretsen stödjer 32bytes "pagewrite", kanske skulle testa detta för att inte slita onödigt mycket på livslängden.



//Alexander

Re: Separera en Integer till två Byte(C)

Postat: 31 augusti 2009, 20:50:13
av TomasL
Nej det är inte samma sak, Pagewrite innebär att du anger startadressen och antal bytes som skall skrivas, det blir dock lika många fysiska skrivningar till minnescellerna, dock lite mindre data att skicka, eftersom varje data byte skickas direkt efter varje ack, man skickar alltså inga adresser för efterföljande byte.
Slitaget blir dock densamma.
Det finns rätt stora FRAMar nu, och int är de så dyra.

Re: Separera en Integer till två Byte(C)

Postat: 31 augusti 2009, 21:16:54
av bearing
Är du säker?

Kretsen klarar 1 miljon skrivcykler. Jag tolkar databladet som att en skrivcykel definieras som skrivning av enskild byte eller skrivning av hel sida. Kretsen har en buffer som sparar 32 bytes och sedan skriver alla dem i ett helt svep. Jag tolkar därför detta till att kretsen klarar 1 miljon sidor. Sidskrivning borde alltså förlänga livslängden med faktorn 32.

Kod: Markera allt

Characteristic								Min.	Max.	Units
TWC Write cycle time (byte or page)	—		5		ms
Endurance								1,000,000	—		cycles
Ett år är ändå ganska kort livslängd.

Re: Separera en Integer till två Byte(C)

Postat: 31 augusti 2009, 21:44:17
av TomasL
Jupp, är rätt säker, det är skrivningen till varje enskilld cell som påverkar, och då har det ingen betydelse om du skriver dem en och en, eller flera samtidigt, antalet skrivningar per cell blir lika många oavsett, däremot går det betydligt snabbare att skriva via en intern buffer, eftersom man sparar in 32 ACKar med tillhörande dataöverföring.

Re: Separera en Integer till två Byte(C)

Postat: 31 augusti 2009, 21:50:41
av danielr112
Även om du skriver till 2 bytes direkt eller 1 så blir det ju lika många skrivnignar per byte eller hur? :)


edit: jag var visst lite sen

Re: Separera en Integer till två Byte(C)

Postat: 31 augusti 2009, 22:23:28
av bearing
Ja, fast jag fick alltså intrycket att det var antalet totala skrivcykler, inte antalet skrivningar per minnescell, som var begränsningen. Inser nu att jag har fel.

Det är ju bra att jag har fel. Med ändring av Ranstams mjukvara kan livslängden nämligen förlängas betydligt.

Ifall minnet skrivs sekvensiellt i ring blir livslängden är 8000 miljoner sekunder och inte 1 miljon sekunder. Räknaren måste då sparas i ett minne som inte har begränsad livslängd.

En annan idé är att räknaren sparas i EEPROM, fast på ny minnesplats vid varje skrivning. T.ex. kan räknaren ta upp en/två platser i varje 32-bytes sida. Ifall räknaren räknar antalet sidor istället för antalet sekunder kommer en byte räcka för alla 8k. EDIT: å andra sidan är 30 sekunder en lämplig tidsmängd att spara per sida, så två bytes är tillgängliga för overhead.