SD kártyára mentés és LCD-re kiírás egyben
SD kártyára mentés és LCD-re kiírás egyben
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
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
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.
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.
A hozzászólást 1 alkalommal szerkesztették, utoljára kapu48 2012. szeptember 24. hétfő, 12:43-kor.
Re: SD kártyára mentés és LCD-re kiírás egyben
Egy kis segítség található itt: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 ...
http://www.openenergymonitor.org/emon/node/167
Igen, ATMega328P.kapu48 írta:Milyen mega (ATMega328?)?
Esetleg ha látnánk a kérdéses programot?!
Kevés a megadott infó!
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.
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...
Arduino-ban így:
noInterrupts();
// critical, time-sensitive code here
interrupts();
Lehet nem fog beválni de hátha igen...
Re: SD kártyára mentés és LCD-re kiírás egyben
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.szegoj írta:Egy kis segítség található itt: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 ...
http://www.openenergymonitor.org/emon/node/167
É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...
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...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...
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?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!
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...
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...
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.
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.
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?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.
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.
-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.
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.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.
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)