|
Svet elektronike Revija za prave elektronike
|
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
zuti Mojster
Pridružen/-a: Tor Jun 2004 15:56 Prispevkov: 44
|
Objavljeno: Sob Jun 05, 2004 11:29 am Naslov sporočila: Eeprom |
|
|
lep pozdrav!
Imam en problem, ki ga ne znam rešit. Potrebujem števec impulzov z 2051, kateri bi hranil podatke ob ob prekinitvi napajanja, ali ob ispadu el. energije v eeprom 2404.
V njega ne spravim večjega števila od 255, rabil bi pa sedem mestno število, torej 9.999.999. Mi lahko kdo pomaga prosim?
zuti _________________ L.P. |
|
Nazaj na vrh |
|
|
bferlic Začetnik
Pridružen/-a: Ned Apr 2004 10:36 Prispevkov: 11 Kraj: Brezula
|
Objavljeno: Sob Jun 05, 2004 11:41 pm Naslov sporočila: |
|
|
Zdravo
Kako pa imas v 2051 shranjeno tako veliko stevilo? Za taksno velikost mora zasedati vsaj 3 byte, tak da pac vse tri shranis. Kako pa se konkretno to naredi, pa ti ne morem pomagat. Upam da nisem zgresil z odgovorom. |
|
Nazaj na vrh |
|
|
vilko Profesionalec
Pridružen/-a: Pon Jan 2004 11:54 Prispevkov: 807 Kraj: Ljubljana
|
Objavljeno: Ned Jun 06, 2004 6:11 am Naslov sporočila: |
|
|
No, ja, 2051 zna šteti višje od 255, če mu pomagamo z Basic programom, kjer spremenljivko definiramo z Long ali Single.
dim x as long
Za tako definirano spremenljivko rezervira bascom 4 bajte. Kako sedaj to zapisati v eeprom, bajt po bajt, je tezje razloziti. Jaz bi to naredil tako;
Neposredno izpred definicije spremenljivke x bi definiral indeksirano spremenljivko y recimo tako:
dim y(1) as byte
dim x as long
Če sedaj v programu napišemo y(2), bo program obravnaval prvi bajt izza spremenljivke y(1), to pa je prvi od 4 bajtov spremenljivke x
tako bi morda zapisal x v eeprom tako:
for i = 2 to 5
gosub zapisi, ta podprogram zapiše bajt y(i) v eeprom in
next
ALi ve kdo enostavnejše? bil bi mu hvaležen.
Vilko _________________ Sliši se paradoksalno, a je vendarle res:
Nekateri ljudje imajo vedno vse prav. No, včasih. |
|
Nazaj na vrh |
|
|
zuti Mojster
Pridružen/-a: Tor Jun 2004 15:56 Prispevkov: 44
|
Objavljeno: Ned Jun 06, 2004 1:04 pm Naslov sporočila: |
|
|
Lep pozdrav!
Vilko, v prvi vrsti , hvala za odgovor, vendar moram na žalost povedati, da mi ni najbolj jasno, kaj bi moral narediti. Veš, spadam še med bolj sveže uporabnike bascoma, pa si moram še neke stvari razjasniti. Ni mi namreč jasno, kako vse skupaj napisati. Da vse skupaj poenostavim, bom dal en čisto kratek program, pa če ti je (ali komu drugemu) bi prosil, da pripišeš tisto, kar bi bilo potrebno. Vzamimo za primer, da števec šteje samo do 9999.
dim števec as integer, ee_adr as integer,ee_byte as integer
config sda=p1.5
config sc1=p1.2
ee_adr=255
gosub berieprom
do
gosub pisieprom
if p3.7=0 then incr stevec
if stevec>9999 then stevec=0
loop
pisieprom:
i2cstart
i2cwbyte &B10101110
i2cwbyte ee_adr
i2cwbyte ee_byte
i2cstop
waitms 10
return
berieprom:
i2cstart
i2cwbyte &B10101110
i2cwbyte ee_adr
i2cstart
i2cwbyte &B10101111
i2crbyte ee_byte,9
i2cstop
return
Mislim, da je nekako tako prav, le kje zdaj vstaviti, oziroma kako, tvojo zamisel?
Hvala - zuti _________________ L.P. |
|
Nazaj na vrh |
|
|
vilko Profesionalec
Pridružen/-a: Pon Jan 2004 11:54 Prispevkov: 807 Kraj: Ljubljana
|
Objavljeno: Ned Jun 06, 2004 1:55 pm Naslov sporočila: |
|
|
Zuti,
prvo: tvoji rutini pisieeprom in berieeprom sta napisani tako, da piseta ali bereta en sam bajt iz eeproma, in to ta, katerega naslov najdeta v ee_adr. In to piseta iz bajta rama definiranega kot ee_byte in bereta v ta bajt. Torej bo potrebno za pisanje/ branje stevca, ki sedi na vec bajtih ti rutini klicati 4 krat in pri tem povecevati naslov ee-adr.
drugo: V tvojem glavnem programu vidim neskoncno zanko, in rutine za branje sploh niso klicane, tvoj program samo steje, in pise v eeprom in nic drugega.
tretje: Tudi stetje ni prav posreceno. Tako kot si napisal, bi program z veliko hitrostjo stel cim bi malo pritisnil na tipko. Ti enostavno ne mores tako hitro pritisniti na tipko in potem spustiti, da bi program pristel samo enojko. V ta namen je v Bascomu ukaz Debounce.
Nadalje: eeprom ima omejeno število pisanj. Le to je sicer zelo veliko, toda pisanje v eeprom veckrat na sekundo pa bo vseeno hitro provedlo do konca življenske dobe eeproma.
Naredimo recimo tako:
Štejmo pritiske na tipko v števcu X definiranem kot Single, torej v 4 bajtih in stanje števca prikažimo na LCD prikazovalniku (displayu. Če ga nimaš, priporočam nakup, zelo olajša testiranje programov, ker ti program pokaže, kaj se z njim dogaja. Več o LCD displayu poglej v Help)
Vsakih 10 pritiskov na tipko, prenesimo stanje števca X v bajte od naslov 128 dalje.
dim pomozni(1) as byte
dim x as single
dim ee_byte as byte
dim ee_adr as byte
do
debounce p3.7 , 0 , tipka , sub
pomozni(1) = x mod 10 ' funkcija modul da ostaneg pri deljenju
if pomozni(1) = 0 then
ee_adr = 128 'kam v eeprom pisati
gosub pisieeprom4
incr x
' to pocecanje stevca x sicer pokvari stanje, a prepreci, da bi
' mikro kar naprej v hitri zanki pisal po epromu
' lahko bi dali tudi wait ali kako drugače mislili na življenje eeproma
end if
loop
' Tudi ta program nikdar ne pride v branje eeproma. Vendar nadaljujmo!
tipka:
' podprogram, ki ga klice debounce, ce je tipka pritisnjena
incr x
cls 'izbrisi LCD
lcd x 'Prikaži Števec
return;
' Bascom bo drugic prisel v to rutino sele, ko bos tipko spustil in jo spet
' pritisnil
Pisieeprom4:
' je napisana tako, da pise stiri bajte:
dim I as byte
for I = 2 to 5
ee_byte = pomozni(i)
gosub pisieeprom
' tvojo rutino torej klicemo 4 krat vsakokrat z raclino vsebino in
' razlicnim naslovom
incr ee_adr
next i
return
Program sem 'izssesal iz prsta'. Nisem testiral, tako približno bi moralo iti.
Pozdrav
Vilko _________________ Sliši se paradoksalno, a je vendarle res:
Nekateri ljudje imajo vedno vse prav. No, včasih. |
|
Nazaj na vrh |
|
|
Vlado Profesionalec
Pridružen/-a: Ned Jan 2004 16:11 Prispevkov: 556 Kraj: Ljubljana
|
Objavljeno: Ned Jun 06, 2004 2:28 pm Naslov sporočila: eeprom |
|
|
LP!
No malo več podatkov o hitrosti štetja nebi škodovalo.Poskusi napisati kaj bo štel ta števec,ali bo vsaka sprememba vpisana v eeprom?
Če bo vpis v eeprom samo ob izklopu je potrebno napajanje kontrolirati z enim pinom in imeti dovolj velek elektrolit ki bo omogočil procesorju da v prekinitveni rutini obstoječe stanje vpiše v eeprom.
V prvem postu si povedal da je max.število pulzov 9.999999, razlika je ali je 9mil. ali pa 9999 ker 9999 gre v word.
Lahko pa narediš tudi takole:
Dim števecbyte1 as byte,stevecbyte2 as byte,stevecbyte3 as byte
stejes impulze in ko bo stevecbyte1 > 255 povecas stevecbyte2 in postavis stevecbyte1 na 0 (itn)
V eeprom posebi shranis vsak bajt.
Od teh treh bajtov na koncu naredis eno stevilko ki bo kazala število pulzov.
Vlado |
|
Nazaj na vrh |
|
|
zuti Mojster
Pridružen/-a: Tor Jun 2004 15:56 Prispevkov: 44
|
Objavljeno: Ned Jun 06, 2004 9:10 pm Naslov sporočila: |
|
|
Lep pozdrav!
Fantje, hvala za izvirne odgovore, zdaj se mi že malo svita kako bi naj vsa stvar izgledala, čeprav bo potrebno še nekaj pisanja, da bom stvari prišel do dna. Zanke debounce in pisanje na LCD nisem uporabil v tem primeru zaradi pisanja (dolžine programa), drugače pa ta del obvladujem.
Vseeno hvala za opozorilo. Impulzi so različni (od 0 pa do 150 na minuto) in niso konstantni. To da bi shranil podatek samo ob ispadu el. energije pa ni slaba zamisel, ker če je količina vpisov v eeprom tako omejena, bi ga verjetno dokončno zakuril že v enem dnevu. Torej Vilko in Vlado še enkrat hvala za pomoč, če bom uspel - odlično - če pa ne, pa še bom prosil za nasvet.
zuti _________________ L.P. |
|
Nazaj na vrh |
|
|
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu You cannot attach files in this forum You cannot download files in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|