SD kártyára mentés és LCD-re kiírás egyben

Avatar
yflk32
DrótVégénSzéndarab
Hozzászólások: 27
Csatlakozott: 2012. január 6. péntek, 7:00

SD kártyára mentés és LCD-re kiírás egyben

Hozzászólás Szerző: yflk32 »

Sziasztok!
Pár napja már küzdök azzal a problémával, hogy nem sikerül egy programon belül együttműködésre bírni az SD kártya kezelését és az LCD-re kiírást.
Az alapfelállás szerint van egy RTC modul (DS1307), ebből olvastatom ki másodpercenként az időt és dátumot, majd ezt kijeleztetem a 4bit-es módban vezérelt 16x2-es kijelzőn. Ugyanakkor szeretném kiírni SD kártyára is az időt, a dátumot és egy millis-ből generált számot 10 másodpercenként.
Külön-külön minden jól működik: RTC-LCD vagy RTC-SD párosításban, de a fent leírt módon nem hajlandó, mert vagy az LCD keveredik meg (azonosíthatatlan karakterek vagy semmi) vagy az SD kártyára írás áll le azon a ponton, amikor írás előtt ellenőrzi a fájl meglétét.

A programkódokban egyelőre nincs semmi speciális, példaprogramokból van összeollózva.
Nincs lábütközés sem. LCD a D2,D3,D4,D5,D6,D7-en, SD-re írás visszajelzésére egy LED a D9-en, SD kártya modul a D10, D11, D12, D13-on, az RTC AN4, AN5-ön. Van még az AN0-n egy gombmátrix is, de ezzel a résszel nincs gond, nem változtat a hibajelenségen, ha használom vagy sem.

Több különféle kártyával volt próbálva, többféle módon leformázott kártyával, nem volt változás.
Nem teljesen rossz a működése, néhány adatot rendesen lement a kártyára, aztán vagy "lefagy" vagy csak nem íródik semmi a kártyára, de olyan is van, hogy újraindul az Arduino.

Arduino UNO- próbáltam, Arduino IDE 1.0.1-el fordítva a programkódot, Liquidcrystal.h és SD.h header fájlokat használtam.

Én arra gyanakszom, hogy valamiféle memóriaütközés van, esetleg elfogy a flash. Próbáltam hasonló problémáról leírást, illetve megoldást keresni külföldi oldalakon, de nem is igazán látok olyat, hogy SD és LCD lenne egy áramkörben működtetve, legalábbis Arduino esetében.
Arra vonatkozóan sem találtam semmit, hogy esetleg valami közös memóriaterületre dolgozhat-e a két periféria vagy hogy melyik mennyi memóriát igényel. Esetleg a kártya header (SD.h) fájl helyett kellene pl. SdFat.h-t használni és ehhez igazítani a programot is. Jelenleg nem tudok más irányba továbbmenni, ezt próbálom meg.

De mindenekelőtt a segítségeteket kérem, mi lehet a gond?

Köszi!
Üdv.:yflk32
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Milyen mega (ATMega328?)?

A hiba Verem túlcsordulásra utal!
Persze Arduino IDE-ben nincsen verem piszkálás.

Erről talán Robert többet tud?

Esetleg ha látnánk a kérdéses programot?!
Kevés a megadott infó!

Valahol olvastam: kell egy IC (ebbol tobbnyire eleg a Mega8-as)!
Ezt már kinőtted! Új cipő kel a Projektnek.
:wink:
A hozzászólást 1 alkalommal szerkesztették, utoljára kapu48 2012. szeptember 24. hétfő, 12:43-kor.
Avatar
szegoj
SzínkódFestő
Hozzászólások: 92
Csatlakozott: 2010. február 4. csütörtök, 7:00

Re: SD kártyára mentés és LCD-re kiírás egyben

Hozzászólás Szerző: szegoj »

yflk32 írta:Sziasztok!
Pár napja már küzdök azzal a problémával, hogy nem sikerül egy programon belül együttműködésre bírni az SD kártya kezelését és az LCD-re kiírást ...
Egy kis segítség található itt:
http://www.openenergymonitor.org/emon/node/167
Avatar
yflk32
DrótVégénSzéndarab
Hozzászólások: 27
Csatlakozott: 2012. január 6. péntek, 7:00

Hozzászólás Szerző: yflk32 »

kapu48 írta:Milyen mega (ATMega328?)?


Esetleg ha látnánk a kérdéses programot?!
Kevés a megadott infó!
Igen, ATMega328P.

A programkódban tényleg nincs semmi extra, most még csak éppen belekezdtem és az SD kártyára írt adatokat akartam LCD-n is megjeleníteni. A program az otthoni gépemen van, most nem tudom feltölteni.
A későbbiekben (ha ez a része stabilan menne) akkor egy villanyboylerhez lenne fűtésvezérlő termosztát, ami SD kártyára mentené a fűtési időket a hőfokokkal együtt. Emellett persze a kijelzőről is le lehetne olvasni az aktuális adatokat.
Avatar
GPeti
Bitmanipulátor
Hozzászólások: 131
Csatlakozott: 2011. március 3. csütörtök, 7:00

Hozzászólás Szerző: GPeti »

Nekem igaz a Bascom-nál fordul elő hogy az lcd írás elé be kell írnom a disable interrupt a végére meg az enable interrupt sort, mármint ha a programban használva van valamilyen megszakítás ellenben gyakran lefagy a kijelző vagy nem jól ír ki.

Arduino-ban így:

noInterrupts();
// critical, time-sensitive code here
interrupts();

Lehet nem fog beválni de hátha igen...
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

NE!
Az LCD kezelés használ delayMicroseconds() illetve delay() sorokat. Ezek meg INT alapon mennek!
Ezért letiltott INT esetén (leáll a TIMER is) nem működik úgy ahogyan szeretnéd!
Avatar
yflk32
DrótVégénSzéndarab
Hozzászólások: 27
Csatlakozott: 2012. január 6. péntek, 7:00

Re: SD kártyára mentés és LCD-re kiírás egyben

Hozzászólás Szerző: yflk32 »

szegoj írta:
yflk32 írta:Sziasztok!
Pár napja már küzdök azzal a problémával, hogy nem sikerül egy programon belül együttműködésre bírni az SD kártya kezelését és az LCD-re kiírást ...
Egy kis segítség található itt:
http://www.openenergymonitor.org/emon/node/167
Köszönöm, megnéztem. Ennél Nokia kijelzővel működik az Energy Monitor. Főleg az érdekelt, hogy itt a kijelző is és az SD kártya is SPI-n kommunikál és a CS határozza meg, hogy mikor melyiket szólítjuk meg.
Éppen tegnap jött meg az EBay-ről rendelt Nokia5110 kijelzőm, így elmentem most ebbe irányba, mert a kisebb méret nem számít viszont a grafikus megjelenítés és a nagyobb karakterszám megjelenítése jól jöhet.

Az még kérdés számomra, hogy bár ez SPI-nek tűnik, nem a hardveres kiosztás szerint működik a kijelző vezérlés, azaz nem szükséges a harveres 11, 12, 13-as ki/bemenet használata.
Ezen az oldalon található leírás és library alapján üzemeltem be: http://www.henningkarlsen.com/electroni ... .php?id=47

Tegnap már nem foglalkoztam az SD piszkálásával, majd ma este...
Avatar
yflk32
DrótVégénSzéndarab
Hozzászólások: 27
Csatlakozott: 2012. január 6. péntek, 7:00

Hozzászólás Szerző: yflk32 »

GPeti írta:Nekem igaz a Bascom-nál fordul elő hogy az lcd írás elé be kell írnom a disable interrupt a végére meg az enable interrupt sort, mármint ha a programban használva van valamilyen megszakítás ellenben gyakran lefagy a kijelző vagy nem jól ír ki.

Arduino-ban így:

noInterrupts();
// critical, time-sensitive code here
interrupts();

Lehet nem fog beválni de hátha igen...
Ezt úgy kell érteni, hogy akkor is írjam be, ha egyébként nem használok timer-t vagy egyéb interrupt-ot? Mert ha Neked bevált, egy próbát megér...
Avatar
yflk32
DrótVégénSzéndarab
Hozzászólások: 27
Csatlakozott: 2012. január 6. péntek, 7:00

Hozzászólás Szerző: yflk32 »

Robert írta:NE!
Az LCD kezelés használ delayMicroseconds() illetve delay() sorokat. Ezek meg INT alapon mennek!
Ezért letiltott INT esetén (leáll a TIMER is) nem működik úgy ahogyan szeretnéd!
A Bascom-ot nem ismerem (még), ezért kérdezem, hogy amit itt írtál az csak az Arduino-ra értendő? Mert GPeti-nek Bascom-nál működik, ha már egyszer ezt tanácsolta... de Arduino-nál nem érdemes megpróbálni?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Bascom-AVR korrekt. A késlelteés/időzítés nem timer alapon megy, hanem sima ciklussal.

Az Arduino alatt TIMER és megszakítás alapú. A delaymicrosecundum ()ezért nem jó megoldás -> az AVR erőforrások ~10%-át elviszi!
És ugye INT alapú, ami sok esetben igencsak hátrány bír lenni:( Például precíz ídőzítést kívánó szoftveres megoldások esetén (pl. 1-Wire/Dallas busz). :(

Arduino - > kezdőkek, egyszerű szoftverekhez.
Bascom-AVR -> középkezdőknek, előzetes ismeretekkel: svájcibicska
GCC/WinAVR -> haladóknak, de a szerszámoskészletet ne hagyd otthon!
ASM -> haladó/megszállott/bitbűvölő, de itt a reszelő, kockás papír, rajzábla is kell!
MicroPascal -> csak az egzotikumot kedvelőknek...
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Tévúton jársz! Nem az a megoldás, hogy kikapcsoljuk, ha nem működik.

Inkább meg kellene keresni a hiba okát.

Az LCD lassú jószág a megához képest. És csapatmunkában mindig meg kel várni a legkisebbet.

Van 2 féle várakozás. Szoftveres ciklus vagy, Hardveres számláló.
A másodiknál, ha lekapcsolod a megszakítás, leáll a programod.

A hibakeresést inkább a memória kezelésed irányába folytasd.
Valahol túlfutsz a megadott méret határon, és felül iroda a másik változó területét.
Minél nagyobb, összetettebb a programod, annál jobban odakel figyelni a kevéske memória beosztására.

8)
Avatar
yflk32
DrótVégénSzéndarab
Hozzászólások: 27
Csatlakozott: 2012. január 6. péntek, 7:00

Hozzászólás Szerző: yflk32 »

kapu48 írta:Tévúton jársz! Nem az a megoldás, hogy kikapcsoljuk, ha nem működik.

Inkább meg kellene keresni a hiba okát.

Az LCD lassú jószág a megához képest. És csapatmunkában mindig meg kel várni a legkisebbet.

Van 2 féle várakozás. Szoftveres ciklus vagy, Hardveres számláló.
A másodiknál, ha lekapcsolod a megszakítás, leáll a programod.

A hibakeresést inkább a memória kezelésed irányába folytasd.
Valahol túlfutsz a megadott méret határon, és felül iroda a másik változó területét.
Minél nagyobb, összetettebb a programod, annál jobban odakel figyelni a kevéske memória beosztására.

8)
A memóriaterület-használat miatti ütközésre gondoltam már én is, de nem tudom merre induljak... A library-k használata miatt eddig ezzel nem kellett foglalkoznom. Kicsit mögé kell már nézni a dolgoknak, de merre kezdjem, ha azt akarom tudni, hogy melyik vagy mekkora memóriaterület az amit az LCD használ?
Ráadásul hiába próbáltam úgy elosztani a feladatokat, hogy ne legyen LCD-re írás, amíg a kártyára írás le nem záródik ez nem vezetett sehova.

A memóriahasználat akkor lett gyanús, amikor kivettem azokat a sorokat, ahol még úgy volt megadva, hogy a nap száma alapján vegye ki egy tömbből a szöveges nap megnevezést (3 -> szerda) és ezek után már működött csak nem stabilan.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

-nincs esetleg a tömbben túlírás?
definiált tömb 6 elemú és a 7.re írsz?
- egy változód int és byte-ba tuszkolod bele?
- minden változó csak akkora, amekkorát tényleg kíván (integer / char)?
- kipróbálásként a soros buffer méretet 32-ről vedd lejjebb, mondjuk 8-ra. Így nyersz pár byte-t.
- LCD kiírásnál bontsd meg a hosszú karakterláncot
- Pointer került haszálatra? A definíciójában igaz nem char szerepel (SRAM >256 byte)!
- memfree() függvény mond valamit a memóriafoglalásról? Ez persze szubrutinokban is legyen benne!
- Igaz nem M328-ban vagy benne? Csak az SD elvisz ~1 k SRAM-ot. Az SD esetén nincs olyan trükk hogy elsőször adatírás, utána FAT? Így nyernél 512 byte-t.
Avatar
yflk32
DrótVégénSzéndarab
Hozzászólások: 27
Csatlakozott: 2012. január 6. péntek, 7:00

Hozzászólás Szerző: yflk32 »

Robert írta:-nincs esetleg a tömbben túlírás?
definiált tömb 6 elemú és a 7.re írsz?
- egy változód int és byte-ba tuszkolod bele?
- minden változó csak akkora, amekkorát tényleg kíván (integer / char)?
- kipróbálásként a soros buffer méretet 32-ről vedd lejjebb, mondjuk 8-ra. Így nyersz pár byte-t.
- LCD kiírásnál bontsd meg a hosszú karakterláncot
- Pointer került haszálatra? A definíciójában igaz nem char szerepel (SRAM >256 byte)!
- memfree() függvény mond valamit a memóriafoglalásról? Ez persze szubrutinokban is legyen benne!
- Igaz nem M328-ban vagy benne? Csak az SD elvisz ~1 k SRAM-ot. Az SD esetén nincs olyan trükk hogy elsőször adatírás, utána FAT? Így nyernél 512 byte-t.
Köszönöm a javaslatokat, végignézem majd, csak tegnap este már csak Nokia kijelzőt élesztettem, mással nem foglalkoztam. De ha már ennyien segítetek, ne hagyjuk parlagon ezt a témát, még másnak is segíthet ha megvan a megoldás.

Ha nem találom meg a konkrét megoldást a javaslatok alapján, akkor feltöltöm ide a kódot. Csak nem ezzel akartam kezdeni, mert az esetleg úgy tűnhet, mintha nem magam akarnám megtalálni a hibát, hanem "csak" bedobom ide, majd valaki más átrágja magát rajta és megmondja mi a gond.

Ami még eszembe jutott, de nem tudom járható út-e?: külső EEPROM-ba kiírás, majd onnan mentés SD kártyára, ha esetleg ezzel tehermentesíteni lehetne a belső memóriát.
A másik, hogy kipróbálom a http://arduino-info.wikispaces.com/SD-Cards oldalon közzétett 'fat16lib'-et . (letöltési oldal: http://code.google.com/p/fat16lib/downloads/list)
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Nokia kijelző? Ugyanebben a projektben???
Ajaj. Memória NINCS elég a chipben!
Arduino MEGA talán lehet. Ott a lábak össze-vissza vannak, így az okoz problémát :P.

Szóval az élet a fenék és a tejfel esete - valami Macskafogó....
Válasz küldése