Separera en Integer till två Byte(C)
Re: Separera en Integer till två Byte(C)
Man kan ju använda FRAMar, då är det problemet ur världen.
Re: Separera en Integer till två Byte(C)
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)
bearing: TomasL pratar om FRAM iställer för EEPROM, inte frames.
Re: Separera en Integer till två Byte(C)
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.
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)
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.
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)
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å.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.
Andra personer har lyft fram andra problem du kanske ska oroa dig för.
Re: Separera en Integer till två Byte(C)
Ä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
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)
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
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)
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.
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)
Ä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.
Ett år är ändå ganska kort livslängd.
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
Re: Separera en Integer till två Byte(C)
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.
-
- Inlägg: 8092
- Blev medlem: 18 januari 2009, 00:48:24
- Ort: Alvesta, Småland
Re: Separera en Integer till två Byte(C)
Ä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

edit: jag var visst lite sen
Re: Separera en Integer till två Byte(C)
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.
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.
Senast redigerad av bearing 31 augusti 2009, 22:31:32, redigerad totalt 1 gång.