Separera en Integer till två Byte(C)

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 47010
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

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

Inlägg av TomasL »

Man kan ju använda FRAMar, då är det problemet ur världen.
bearing
Inlägg: 11676
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

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

Inlägg 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.
eqlazer
Inlägg: 923
Blev medlem: 22 september 2007, 13:53:45
Ort: Göteborg

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

Inlägg av eqlazer »

bearing: TomasL pratar om FRAM iställer för EEPROM, inte frames.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 47010
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

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

Inlägg av TomasL »

He he just det, två helt skilda saker.
bearing
Inlägg: 11676
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

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

Inlägg av bearing »

Hehe, jaha... =) ganska kul.
bubz
Inlägg: 2
Blev medlem: 26 november 2008, 08:08:37
Ort: Östersund

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

Inlägg 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.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 47010
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

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

Inlägg 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.
bos
Inlägg: 2314
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

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

Inlägg 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.
bubz
Inlägg: 2
Blev medlem: 26 november 2008, 08:08:37
Ort: Östersund

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

Inlägg 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 :)
Anonym2
Inlägg: 456
Blev medlem: 17 november 2007, 21:20:16

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

Inlägg 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
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 47010
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

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

Inlägg 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.
bearing
Inlägg: 11676
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

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

Inlägg 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.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 47010
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

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

Inlägg 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.
danielr112
Inlägg: 8092
Blev medlem: 18 januari 2009, 00:48:24
Ort: Alvesta, Småland

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

Inlägg 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
bearing
Inlägg: 11676
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

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

Inlägg 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.
Senast redigerad av bearing 31 augusti 2009, 22:31:32, redigerad totalt 1 gång.
Skriv svar