20X2 a EEPROM
-
- Příspěvky: 85
- Registrován: 02 úno 2014, 02:12
20X2 a EEPROM
Zdravím všechny.
Mám PICAXE 20X2 a potřebuju zapisovat/číst cca 16 proměnných (např. b10 až b25).
Zápis by měl proběhnout při výpadku napájení.
Hardware mám udělaný tak, že všechny periferie mají oddělené napájení (přes diodu), napájení procesoru je taky přes diodu a elektrolyt. kondenzátor.
Moje vize je taková:
Na vstupu C.1 (přes R dělič) budu číst ADC. Pokud klesne na úroveň xxx dojde k zápisu do EEPROM.
Moje otázka je tato: jak dlouhý čas potřebuje procesor na zapsání do paměti?... Z toho vyplývá další... Jak velký elektrolyt tam cca vyjde?
Dále nějak nerozumím tomu zápisu...
Pokud budu chtít uložit do EEPROM např. hodnotu b10, tak můžu napsat jen: write b10,b10 ?
A čtení zase: read b10,b10 ? Nebo to chápu blbě?
Jestli jsem to napsal nesrozumitelně, tak mne hned nebijte
Díky předem všem za odpovědi
Mám PICAXE 20X2 a potřebuju zapisovat/číst cca 16 proměnných (např. b10 až b25).
Zápis by měl proběhnout při výpadku napájení.
Hardware mám udělaný tak, že všechny periferie mají oddělené napájení (přes diodu), napájení procesoru je taky přes diodu a elektrolyt. kondenzátor.
Moje vize je taková:
Na vstupu C.1 (přes R dělič) budu číst ADC. Pokud klesne na úroveň xxx dojde k zápisu do EEPROM.
Moje otázka je tato: jak dlouhý čas potřebuje procesor na zapsání do paměti?... Z toho vyplývá další... Jak velký elektrolyt tam cca vyjde?
Dále nějak nerozumím tomu zápisu...
Pokud budu chtít uložit do EEPROM např. hodnotu b10, tak můžu napsat jen: write b10,b10 ?
A čtení zase: read b10,b10 ? Nebo to chápu blbě?
Jestli jsem to napsal nesrozumitelně, tak mne hned nebijte
Díky předem všem za odpovědi
Re: 20X2 a EEPROM
Zápis bude například v podobě write 0, b1 to znamená, do paměťové buňky 0 se zapíše hodnota proměnné b10. Pokud chceš číst, opět mu řekneš z které paměťové buňkychceš číst: read 0, a do jaké proměnné to číslo uloží: b10.
Pozor! Pokud budeš chtít zapisovat proměnnou word, musíš pro ten zápis a čtení použít dvě paměťové buňky, respektive označíš první buňku a druhou následující, už nesmíš použít pro jiný zápis!
Zápis pak bude vypadat třeba: write 10, word w0 čtení pak: read 10, word w0 . Tím zápisem se obsadí paměťové buňky 10 a 11, takže další volná paměťová buňka je až 12!
Jak rychle procesor zapisuje netuším, určitě by to stihnul (viz dále), ale u tebe asi bude problém jinde. Aby to tak jak popisuješ fungovalo, musel by program neustále zjišťovat stav na tom vstupu C.1. To znamená v každém cyklu běhu celého tvého programu tu hodnotu testovat a ten cyklus musí být rychlejší, než se to uloží a poklesne napětí. Možná by se to dalo řešit několika odkazy gosub různě umístěnými v programu, ale počítej s tím, že každý příkaz pause, nebo jiná déle trvající procedura, zamezí tomu testování vstupu C.1
Podle mě by se to asi dalo řešit pomocí přerušení, které reaguje okamžitě, při běhu v libovolné části programu, ale přerušení reaguje pouze na stav 1/0, takže to vyhodnocení podle velikosti napětí, by musel řešit jiný obvod a převést to na ten stav logické 0 nebo 1.
Hodně samozřejmě záleží na tom, jak máš ten program sestavený. Tak jak to popisuješ, to já využívám v programu na věžní hodiny. Konkrétně pro záznam toho, kolik kroků vykonal krokový motor při pootáčení rafikou. Abych s ní pohnul o 1 minutu, potřebuju poslat do motoru 3200 kroků, takže po každém tom kroku otestuji napájecí napětí a pokud je nízké, počet vykonaných kroků uložím do paměti. Procesor je napájen přes diodu, kapacitu tam mám 1000uF a v pohodě to funguje. Když se napětí obnoví, vytáhnu ten počet kroků z paměti a „odcouvám“ motorem ty kroky zpět, abych byl zase ve výchozí pozici. Čas výpadku, řeším tak, že zaznamenávám do RAM paměti RTC obvodu aktuální čas, po každém vykonaném minutovém kroku. RAM je zálohovaná vlastní baterii a tak po obnovení napájení, vytáhnu ten uložený čas, porovnám s časem aktuálním a hodiny odkrokují dopředu, nebo dozadu potřebný počet minut toho rozdílu. Díky tomu, jsou ty mé věžní hodiny asi jediný v republice, které v určitém okamžiku i couvají
Pozor! Pokud budeš chtít zapisovat proměnnou word, musíš pro ten zápis a čtení použít dvě paměťové buňky, respektive označíš první buňku a druhou následující, už nesmíš použít pro jiný zápis!
Zápis pak bude vypadat třeba: write 10, word w0 čtení pak: read 10, word w0 . Tím zápisem se obsadí paměťové buňky 10 a 11, takže další volná paměťová buňka je až 12!
Jak rychle procesor zapisuje netuším, určitě by to stihnul (viz dále), ale u tebe asi bude problém jinde. Aby to tak jak popisuješ fungovalo, musel by program neustále zjišťovat stav na tom vstupu C.1. To znamená v každém cyklu běhu celého tvého programu tu hodnotu testovat a ten cyklus musí být rychlejší, než se to uloží a poklesne napětí. Možná by se to dalo řešit několika odkazy gosub různě umístěnými v programu, ale počítej s tím, že každý příkaz pause, nebo jiná déle trvající procedura, zamezí tomu testování vstupu C.1
Podle mě by se to asi dalo řešit pomocí přerušení, které reaguje okamžitě, při běhu v libovolné části programu, ale přerušení reaguje pouze na stav 1/0, takže to vyhodnocení podle velikosti napětí, by musel řešit jiný obvod a převést to na ten stav logické 0 nebo 1.
Hodně samozřejmě záleží na tom, jak máš ten program sestavený. Tak jak to popisuješ, to já využívám v programu na věžní hodiny. Konkrétně pro záznam toho, kolik kroků vykonal krokový motor při pootáčení rafikou. Abych s ní pohnul o 1 minutu, potřebuju poslat do motoru 3200 kroků, takže po každém tom kroku otestuji napájecí napětí a pokud je nízké, počet vykonaných kroků uložím do paměti. Procesor je napájen přes diodu, kapacitu tam mám 1000uF a v pohodě to funguje. Když se napětí obnoví, vytáhnu ten počet kroků z paměti a „odcouvám“ motorem ty kroky zpět, abych byl zase ve výchozí pozici. Čas výpadku, řeším tak, že zaznamenávám do RAM paměti RTC obvodu aktuální čas, po každém vykonaném minutovém kroku. RAM je zálohovaná vlastní baterii a tak po obnovení napájení, vytáhnu ten uložený čas, porovnám s časem aktuálním a hodiny odkrokují dopředu, nebo dozadu potřebný počet minut toho rozdílu. Díky tomu, jsou ty mé věžní hodiny asi jediný v republice, které v určitém okamžiku i couvají
Naposledy upravil(a) jova dne 02 kvě 2021, 14:48, celkem upraveno 2 x.
Re: 20X2 a EEPROM
Předpokládám, že nechceš slyšet "na tohle se Picaxe taky nehodí" a že máš svůj důvod, proč to s ním dělat
Jeden zápis do EEPROM trvá na PIC18F14K22, který je uvnitř Picaxe 20X2, max 4ms, ALE to je na té nejnižší úrovni, kdy se ten zápis skutečně zahájí na úrovni strojového kódu. Z pohledu psaní programu v Picaxe Basicu musíš připočíst ještě nastavení registrů toho PICu (to nebude moc) a hlavně dobu strávenou interpreterem Picaxe na vyřízení příkazu write (to může být hodně). Přesněji si to netroufám odhadnout, nicméně dalo by se to hrubě změřit tak, že si napíšeš cyklus třeba 1000x write a stopkama změříš.
Co se spotřeby týče, tak samotný PIC s interníma RC hodinama na 8MHz bude brát kolem 3-4mA (to je odhad - naplno při 16MHz a 5V má v datasheetu napsáno max 4.7mA)
Příkaz
Jeden zápis do EEPROM trvá na PIC18F14K22, který je uvnitř Picaxe 20X2, max 4ms, ALE to je na té nejnižší úrovni, kdy se ten zápis skutečně zahájí na úrovni strojového kódu. Z pohledu psaní programu v Picaxe Basicu musíš připočíst ještě nastavení registrů toho PICu (to nebude moc) a hlavně dobu strávenou interpreterem Picaxe na vyřízení příkazu write (to může být hodně). Přesněji si to netroufám odhadnout, nicméně dalo by se to hrubě změřit tak, že si napíšeš cyklus třeba 1000x write a stopkama změříš.
Co se spotřeby týče, tak samotný PIC s interníma RC hodinama na 8MHz bude brát kolem 3-4mA (to je odhad - naplno při 16MHz a 5V má v datasheetu napsáno max 4.7mA)
Příkaz
write
pro zápis do eeprom má dva nebo více parametrů, první je adresa, všechny ostatní obsah, uloží to obsah od dané adresy dále (read obdobně, opačným směrem). write b10,b10
by ti zapsalo na adresu uloženou v b10 obsah b10, to jsi asi přesně takhle nechtěl, spíš něco jako write 0,b0
write 1,b1
aby to zapisovalo na adresu 0, 1 atd. a jak píše Jova, bacha na wordy. Já přidám ještě upozornění na počet zápisů, protože EEPROM má deklarovanou životnost "up to 100K" zápisů, čili při zápisu každou vteřinu na jedno místo by to bylo nějakých 27:47h (a proto to zřejmě chceš ukládat až při potížích).Nikoho plánovaně neurážím. Jestli se Vám nelíbí co píšu, tak to nečtěte. A ostatně, třeba za to nemůžu - Researchers believe that dark humor can be a significant symptom of dementia.
Re: 20X2 a EEPROM
Něco praktického - David Matoušek říkal - vraž tam 1000μF, to musí stačit.
ALE - bylo to v nativním kódu a hlavně ta detekce ne-napájení byla udělaná trochu rychleji.
Na druhou stranu celkem snadno koupíš 15× větší kapacitu, a pokud by to nestačilo, tak klidně i 220× větší. U toho už snad stihneš i odeslat mail adminovi, že mu to upadlo.
P.S. Pro pobavení - TADY je jeden velice starý projekt, co jsme dělali s Džinem a tam při 0,1F byla data spolehlivě ještě po dvaceti hodinách. Ale tam se s tím pracovalo trochu citlivěji.
Tak a teď k té detekci ne-napájení. Pokud ti mohu poradit, tak si detekuj napětí "před" tou diodou (to máš asi v plánu), ale nečti ho pomocí ADC, ale rovnou digitálně a navíc si z něj rovnou dělej přerušení, které ti uloží data do té EEPROM. Schéma zhruba takto:
Pokud potřebuješ zapsat víc proměnných, používej jeden příkaz write pro všechny
ALE - bylo to v nativním kódu a hlavně ta detekce ne-napájení byla udělaná trochu rychleji.
Na druhou stranu celkem snadno koupíš 15× větší kapacitu, a pokud by to nestačilo, tak klidně i 220× větší. U toho už snad stihneš i odeslat mail adminovi, že mu to upadlo.
P.S. Pro pobavení - TADY je jeden velice starý projekt, co jsme dělali s Džinem a tam při 0,1F byla data spolehlivě ještě po dvaceti hodinách. Ale tam se s tím pracovalo trochu citlivěji.
Tak a teď k té detekci ne-napájení. Pokud ti mohu poradit, tak si detekuj napětí "před" tou diodou (to máš asi v plánu), ale nečti ho pomocí ADC, ale rovnou digitálně a navíc si z něj rovnou dělej přerušení, které ti uloží data do té EEPROM. Schéma zhruba takto:
Kód: Vybrat vše
┌────┐
+9V>───┤7805├───┬─►├─────────> napájení periférií
└──┬─┘ │
│ │
│ ├─►──┬───────> napájení procesoru
▼ │ │
┬ │ ═╪═ C
│ │ │
│ │ ▀▀▀
│ │ ┌───┐
│ └─►├─┬─┤ ├─> vstup přerušení
│ │ └───┘
│ ┌┴┐ 51Ω
│ │ │47kΩ
│ └┬┘
│ │
▀▀▀ ▀▀▀
write 0,b1,b7.b3
Za pravopisné chyby v této zprávě může moje učitelka češtiny.
-
- Příspěvky: 85
- Registrován: 02 úno 2014, 02:12
Re: 20X2 a EEPROM
Díky chlapi za reakce.
Já to rozepíšu trochu víc. Hraju si s DFplayerem mini. Je to taková MP troska do auta.
Je to poměrně mrňavý a právě nevim, jak velkej kondík bude potřeba, aby se mi tam vešel
Potřebuju zapsat 16 proměnných (b10 až b25, hodnoty 0-127), žádné wordy tam nebudou.
A 100K zápisů Když budu počítat, že bych startoval 10x denně, což dělám hodně málokdy, tak mi vychází 27 let...?
To určitě buď já, nebo auto nevydržíme...
Takže ten zápis by měl vypadat takhle?
write 0, b10
write 1, b11
...............
write 15, b25
Já to rozepíšu trochu víc. Hraju si s DFplayerem mini. Je to taková MP troska do auta.
Je to poměrně mrňavý a právě nevim, jak velkej kondík bude potřeba, aby se mi tam vešel
Potřebuju zapsat 16 proměnných (b10 až b25, hodnoty 0-127), žádné wordy tam nebudou.
A 100K zápisů Když budu počítat, že bych startoval 10x denně, což dělám hodně málokdy, tak mi vychází 27 let...?
To určitě buď já, nebo auto nevydržíme...
Takže ten zápis by měl vypadat takhle?
write 0, b10
write 1, b11
...............
write 15, b25
-
- Příspěvky: 85
- Registrován: 02 úno 2014, 02:12
Re: 20X2 a EEPROM
Tak mezitím tady přibyl příspěvek od Fuldy...
Nerozumím tomu:
Pokud potřebuješ zapsat víc proměnných, používej jeden příkaz write pro všechny write 0,b1,b7.b3 ?
Takže by to bylo: write 0,b10,b11,b12,....b25 ???
Jo kdyby se tam vešlo 1000μF...
Nerozumím tomu:
Pokud potřebuješ zapsat víc proměnných, používej jeden příkaz write pro všechny write 0,b1,b7.b3 ?
Takže by to bylo: write 0,b10,b11,b12,....b25 ???
Jo kdyby se tam vešlo 1000μF...
Re: 20X2 a EEPROM
Ano, v picaxe interpretaci to myslím bylo rychlejší.Pepa z depa píše: ↑02 kvě 2021, 18:21 Tak mezitím tady přibyl příspěvek od Fuldy...
Nerozumím tomu:
Pokud potřebuješ zapsat víc proměnných, používej jeden příkaz write pro všechny write 0,b1,b7.b3 ?
Takže by to bylo: write 0,b10,b11,b12,....b25 ???
Do auta se ti nevejde kondenzátor Ø8 × 12 mm??? Nebo Ø8 × 12 mm? nebo Ø13 × 21 mm? co je to za auto?
Za pravopisné chyby v této zprávě může moje učitelka češtiny.
-
- Příspěvky: 85
- Registrován: 02 úno 2014, 02:12
Re: 20X2 a EEPROM
Co je to za auto není důležitý. Já jsem si vymyslel mptrosku zabudovat do popelníku (bejvalýho) a max průměr kondíku se tam vejde 5mm... Celá pixla je velká 75x30x10 (venkovní rozměry).Chtěl jsem se vyhnout nějakýmu superkondíku na kablíkách, ale asi to tak dopadnefulda píše: ↑02 kvě 2021, 20:10
Jo kdyby se tam vešlo 1000μF...
Do auta se ti nevejde kondenzátor Ø8 × 12 mm??? Nebo Ø8 × 12 mm? nebo Ø13 × 21 mm? co je to za auto?
Re: 20X2 a EEPROM
Tak když si vytváříš taková omezení, tak se holt musíš připravit na pořádné výzvy. Na obrázku dole je dekodér co jsem dělal a ty dva stříbrné obdélníčky jsou 11mF ve velikosti 3,2 × 2,5 × 0,9 mm. To považuji za vhodné pro moje pidi vláčky. Pozor na pracovní napětí. Trochu praktičtější jsou diskové kondenzátory (220mF na vejšku 2,1 a průměr 6,8 mm.
Možná, pokud ubereš pár desetin z krabky, tak se ti tam vejde 100mF, kterej má na vejšku 5,5mm a průměr 10.8mm.
(a mimochodem TENHLE má vejšku 7,5 mm)
Prostě stačí se nad tím trochu zamyslet.
Možná, pokud ubereš pár desetin z krabky, tak se ti tam vejde 100mF, kterej má na vejšku 5,5mm a průměr 10.8mm.
(a mimochodem TENHLE má vejšku 7,5 mm)
Prostě stačí se nad tím trochu zamyslet.
Za pravopisné chyby v této zprávě může moje učitelka češtiny.
-
- Příspěvky: 85
- Registrován: 02 úno 2014, 02:12
Re: 20X2 a EEPROM
Ještě se chci zeptat na ten zápis.
Mám tam nakonec to ADC pro sledování napájení. Při vypnutí napájení to skočí na zápis.
Může ten program končit v takovéhle nekonečné smyčce (blik), nebo je nějaký hezčí řešení?
To že ta LEDka bliká až do poklesu napájení pod provozní mez mi nevadí, naopak.
P.S. nakonec jsem vyhrabal superkondík 0,1F/5,5V kterej je vysokej 5,5mm, tak ho tam nějak nacpu.
Akorát teda tu dobu na zápis mám "jenom" 90 sekund i s blikající ledkou.
A ještě řeším jednu věc... Jelikož je ta mptroska napájená v podstatě ze zapalovače, tak tam vidim problémek:
Když zapnu klíček na 1, zapne i napětí do zapalovače (mám dehťáka takže v zimě třeba 10 vteřin), pak startuju, takže to vypne všechno mimo startéru. Po nastartování se zase zapne napětí do zapalovače. Takže pokud bych to nechal takhle, tak mi to na jedničku nabije superkondík, nastatuju a pokud to stihne za těch pár vteřin zapsat, tak mi to skončí v tý nekonečný smyčce... Takže asi ještě nějakou čekačku při zapnutí, aby to nezapisovalo...
Mám tam nakonec to ADC pro sledování napájení. Při vypnutí napájení to skočí na zápis.
Může ten program končit v takovéhle nekonečné smyčce (blik), nebo je nějaký hezčí řešení?
To že ta LEDka bliká až do poklesu napájení pod provozní mez mi nevadí, naopak.
P.S. nakonec jsem vyhrabal superkondík 0,1F/5,5V kterej je vysokej 5,5mm, tak ho tam nějak nacpu.
Akorát teda tu dobu na zápis mám "jenom" 90 sekund i s blikající ledkou.
A ještě řeším jednu věc... Jelikož je ta mptroska napájená v podstatě ze zapalovače, tak tam vidim problémek:
Když zapnu klíček na 1, zapne i napětí do zapalovače (mám dehťáka takže v zimě třeba 10 vteřin), pak startuju, takže to vypne všechno mimo startéru. Po nastartování se zase zapne napětí do zapalovače. Takže pokud bych to nechal takhle, tak mi to na jedničku nabije superkondík, nastatuju a pokud to stihne za těch pár vteřin zapsat, tak mi to skončí v tý nekonečný smyčce... Takže asi ještě nějakou čekačku při zapnutí, aby to nezapisovalo...
Kód: Vybrat vše
zapis:
low B.0
low B.1
pause 200
high B.1 ; rozsviti LED na B.1
pause 400
low B.1 ; zhasne LED na B.1
pause 400
write 0,b6,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25
pause 5000
high B.0 ; rozsviti LED na B.0
pause 400
low B.0 ; zhasne LED na B.0
pause 400
blik:
pause 50
high B.1 ; rozsviti LED na B.1
pause 50
low B.1 ; zhasne LED na B.1
pause 50
goto blik