Fórum témák
» Több friss téma |
WinAVR / GCC alapszabályok: 1. Ha ISR-ben használsz globális változót, az legyen "volatile" 2. Soha ne érjen véget a main() függvény 3. UART/USART hibák 99,9% a rossz órajel miatt van 4. Kerüld el a -O0 optimalizációs beállítást minden áron 5. Ha nem jó a _delay időzítése, akkor túllépted a 65ms-et, vagy rossz az optimalizációs beállítás 6. Ha a PORTC-n nem működik valami, kapcsold ki a JTAG-et Bővebben: AVR-libc FAQ
Szerintem ha a szimulátor nem kezeli, akkor az azt jelenti, hogy amit oda írsz, akkor az nem tárolódik sehol. Ha később arról a címről kiolvasol valamit, akkor vagy valami előre definiált értéket kapsz vissza, pl. amit valóságban is kapnál ha nincs illesztve külső memória, vagy valami random értéket. Ha még nem tetted, akkor szerintem próbáld ki.
Igazad van, Köszi!
Kipróbáltam mindig FFh-t kapok vissza. Egyébként nem értem miért nem támogatja a szimulátor.
Gondolom,mert a szimulátor nem tudhatja,hogy mit tettél az interface-re.Tehetsz például LCD-t is.
A 6.2-ben már próbálkoztam a stimulival, de az még ott nekem elég kezdetlegesnek tűnt. A 7.0-ban még nem néztem milyen, de ha arra ráfeküdnének a fejlesztők, akkor azzal nagyon szépen lehetne külső eszközök illesztését emulálni.
Sziasztok!
Egy projektemben szeretnék üzemórát számlálni. Az eszköz 0-24H-ig áram alatt van. Két megoldást találtam: - olyan memória ami akármennyiszer írható - EEPROM és pl naponta elmenti az üzemórát, ha érzékeli, hogy a tápfesz bizonyos szint alá csökkent (elment az áram), akkor azonnal ment és a mikrokontroller tápja jól meg van pufferelve Azzal számolok, hogy 100 bájt tárolására van szükség. A tervezett élettartam minimum 25 év, ennek elteltével nem baj ha ledöglik a memória chip. Van valami jobb ötletetek rá? Milyen ipari megoldás létezik erre, ami nemmechanikus számláló?
Rakj be több EEPROM-ot, és használd mindet. Ezzel többszöröződik az élettartam, vagy használd őket mint biztonsági tároló. Ha 4 EEPROM-od van, simán kieshet egy, a maradék dolgozik tovább, és adatot sem vesztesz. Egy EPPROM manapság filléres tétel.
Esetleg használhatsz pl. DS1307 chipeket. Ezeknek van általánosan felhasználható memóriájuk is. Tetszőleges számban írható, és egy kis 3V-os elem tartja benne az életet áramszünet esetén. Igaz ha jól emlékszem egy ilyen chipnek csak 56 bájt memóriája van de be lehet kötni többet is egy I2C portra.
Miért kell 100 bájt? 4 bájton elfér több mint 120 évnyi üzemóra - másodperces felbontással.
Ezt, ahogy gabi20 is írta, tárolhatod mondjuk egy DS1307 RAM-jában, akár másodpercenként frissítve. És ezt mondjuk kiírod naponta 1x EEPROM-ba, így elmegy minimum 300 évet.
Ez jó ötlet, eddig ez a legszimpatikusabb, mivel RTC úgyis lesz benne. Napi egyszer meg eepromba kimentem. Az 56 bájt talán elég lesz. Át kell néznem pontosan miket kell elmentenem.
Igazából ez lenne a legjobb megoldás. Jobb lenne ha 5V-ról menne, de tudok adni neku külön tápot.
Ez nem felejt ha a tápot leszedem ugye, jól értelmezem? Az kicsit hihetetlen, higy 10^14-enszer lehet írni. Így ha percenként írnám akkor is több száz évig jó. Ezt jól értelmeztem?
Üdv!
Az AVR(atmega1284p) RTC-je mitől adhatja be a kulcsot? Szituáció: Próbapanelen fut a kódom, már egy hónapja gond nélkül. (Igazából 3-4 hónapja - nem részletezném) A fő program most is fut, csak az RTC hiánya miatt bizonyos sorok nem futnak le. A gond az orrom alatt történt. Hazajöttem, láttam, hogy minden megy (indikátor ledek villogtak). PC-met bekapcsoltam (ami USB-Sorossal kapcsolódik a próbapanelhez), böngészgettem a neten... stb. majd egy pillantást vetettem a panelre. Ekkor vettem észre, hogy az óra indikátor ledjei nem villognak. Gondoltam az egész kód lefagyott, pl BAD Interrupt Vector vagy a feszültség esett le egy pillanatra vagy valami. Ekkor vettem észre, hogy a fő program indikátor ledje viszont villog. Így kipróbáltam egy resetet, meg még vagy hármat. Semmi változás, az óra nem indult újra. Van a panelen egy külső RTC is, amiből reset esetén olvassa be a "pontos" időt. Ez is jól működik. Eddig csak a kristályt(32,768Hz) cseréltem ki, hátha.... de nem segített. A panel egy 2A-es USBről kapja az energiát, amit egy MCP1827S-3302EAB szabályoz le 3,3V-ra (3,1V-ot mérek). A TOSC1/2-n csak a 32,768Hz-es kristály van, nincs se kondi se ellenállás rajta.
Ha maradsz AVR-nél akkor ott a wear leveling amit az SSD-k is használnak - igaz, kicsit másképp. Az eljárás lényege, hogy az írásigényt elosztod egy nagyobb memóriaterületre. Sokkal több EEPROM tárterületet használsz mint amire szükség van(3-4 bájt), de az írási műveletet szétosztod.
Rengeteg dolgot fog csinálni a mikrokontroller, ez már nem fér bele. Az FRAM-ot szeretném használni. Ha valakinek lenne még tapasztalata az jó lenne.
Én fogok vele csinálni egy tesztet, amiben több milliószor újraírom és kiolvasom amit beleírok. Olyan gyorsan fogom csinálni (stresszelni) amennyit az az i2c csak tud.
Elnézést egy fontos információ kimaradt.
A hónap elején már volt egy RTC hiba. Nem értettem mi is történt. Amikor megnéztem a panel órabeállítását, akkor az év, hónap, nap és a hét napja mind rendben voltak, de az idő kb 7 órával le volt maradva az aktuális időtől. Mivel az RTC akkor ment, csak újra beállítottam az időt és kész. Ma reggel az RTC még nem ment, de kb fél órája gondolt egyet és elindult magától. Nem volt reset és az RTC-t a kódban csak a fő ciklus előtt inicializálom. A jelenséggel azonban, új megvilágításba került a probléma. Az RTC nem adta be a kulcsot (szerencsére), de valamiért néha kihagyni. Valakinek valami ötlete?
Nem változtattál mostanában valamit a kódon? Nem változott semmi olyan külső körülmény mostanában, ami miatt eddig esetleg nem sűrűn használt ágakra is eljut a program? Én pl. mai futottam bele olyan hibába, hogy lds helyett ldi utasítást írtam (de in helyett írtam már ldi-t), amit a fordító lefordít, és ha olyan helyen van nem mindig tűnik fel azonnal, hogy valami nem ok.
Már egy jó ideje nem változtattam rajta, vagy 2 hónapja. Eddig a legnagyobb fejtörést az AVR reset lábára kötött felhúzó ellenállás okozta, ami nem volt a panelba rendesen bedugva. Illetve régebben a kódban maradt véletlenül az UART-hoz a RXCIE bit is, miközben nem volt hozzá ISR definiálva. Ezek ki lettek javítva.
Kerestem eddig még nem használt ágakat, de nem találtam. Ill még cli() parancsot is kerestem, hátha valahol ez állítja le az órát, de ilyen sincs a kódban. Dél óta viszont ismét megy magától, úgy hogy nem nyúltam hozzá.
Lehet hülyeséget kérdezek, de a 32K-s kristályról az egész proci megy, vagy csak az RTC? Ha az utóbbi, akkor annak a kontakt hibája nem lehet? Annak a működését még kívül tudod valahogy ellenőrizni?
Milyen messze van a kvarcoszcillátor a mikrokontroller lábaitól?
(Max 5mm-re szokták tenni de ezt a picit 2-3mm-re is lehet és fektetve. A kis oszcillátor alá pedig gnd-ből szoktak fóliát kialakítani. Nagyon óvatosan nem árt odapöttyinteni hozzá egy kis ónnal, hogy a ház gnd-n legyen.) A mikrokontroller tokban van? Szerk.: Itt van egy jó példa a 7. Oldalon. A hozzászólás módosítva: Jún 5, 2016
Az AVR belső 8Mhz-ről megy. Csak az RTC kapja a 32KHz-es órajelet.
Kontakt hiba nem kizárhatatlan, de kicsi esélyt látok rá. Megmozgattam a kristályt, semmi sem változott. Ki is cseréltem a kristályt, utána sem indult. Aztán puff gondolt egyet és beindult. Ezt a hibát másodszor produkálja. Jelen pillanatban kipróbáltam két kristállyal is és mindkettővel működik.
Próbáld meg a kristállyal párhuzamos kondikat berakni, kivenni, értékét variálni. A kristály lábai között ne legyen se gyanta, se semmi. Legyen jó a kontaktus is, elég érzékeny a zajokra is ez a rész.
Mármint kondit tegyek a TOSC1 és TOSC2 lábak közé?
Vagy TOSC1/2 és GND közé, úgy mint az XTAL1/2 esetében? Droot: A kvarc <1cm-re van a vezérlőtől. Pontosan 3x0,1" azaz 7,62mm-re. Mindenesetre átraktam a lábakhoz legközelebb. A NYÁk terveket már kb. úgy rajzoltam ahogy a ds1307 7. oldalán is szerepel. Mindenesetre beillesztek még pár sor UART teszt funkciót a kódomba, ha újra előjönne a hiba ki tudjam olvasni.
Alatta van gnd?
Nekem kezd gyanús lenni, hogy az rtcc beállításával is lehet gond.
Próbapanel alatt? Tudomásom szerint nincs. Egy ilyenen van összekötve a kapcsolás.
Ha kontakt hiba vagy zaj lenne a ludas, akkor nem a frekvencia instabilitása lenne a jellemző? Ez alatt azt értem, hogy csak pár impulzus maradna ki vagy lassulna (talán gyorsulna) az órajel, ill. az órajel kitöltése ingadozna. Ezekkel a beállításokkal használom:
Én összeraknám nyákra. De forraszd rá direktbe az ic lábára a kvarcot felülről és úgy dugd be az ict. Én is ilyenen rakom össze a legelső prototípust pl amíg a panel gyártás alatt van. Szivatott már meg hasonló hibával.
CTC/1024 miért kell ? Normál mód nem jó 128-as osztással? Wait-t is ajánlott az init kódba.
Sziasztok!
Van ez a program: LabVIEW , amivel ismerkedem . Ha jól értem ez egy szoftveres modellezőprogram, amihez kellenének saját hardverek? Például: Eddig a hőmérsékletmérést RealTerm-el fogadtam PC-én. Lehetséges-e, hogy hőmérsékletmérést jelenítsek meg LabVIEW-ben grafikusan (hőmérő formájában, vagy diagramon), ekkor UART adapterrel USB-n küldeném a hőmérséklet adatokat valamilyen protokoll szerint?
Szia!
A LabVIEW egy grafikus fejlesztői környezet. Modellezésre, mérésre, adatgyűjtsére, gyakorlatilag bármire használhatod, de kellhet hozzá extra toolkit, hardver. Az NI gyárt hozzá különféle hardvereket, persze Te is elkészítheted a sajátjaidat. A soros kommunikációhoz szükséged lesz a VISA toolkit-re, ez ingyenes. Én tanultam LabVIEW-t programozni, szerintem nagyon jó, sokmindent egyszerűbb megoldani, mint szövegesen kódolni. Viszont van egy nagy hátránya, iszonyú drága a program, és a legtöbb toolkit-ért is komoly összeget kérnek. Szerencsére mi kaptunk teljes diákverziót, de toolkit-ek nincsenek.
Csak megértettem mire is célzol. Majd azt a módot is kipróbálom. Bár van ennek valami jelentősége?
Minden esetre úgy néz ki, hogy sikerült egy UART-os debug kódot beillesztenem. (Nincs JTAG debuggerem) Ha előjönne megint a hiba, akkor meg tudom nézni a regiszterek állapotát.
Sikerült a debug kódommal kiolvasnom a Timer2 regiszterek értékeit a hiba megléte során.
Reméltem, hogy csak valami kódhiba lesz, ami átír benne valamit, de nem. Minden érték az általam megadott maradt. Még azt is kipróbáltam, hogy mi lesz, ha átállítom (a debug kódon keresztül) aszinkronról szinkronra. Ekkor az óra elindult, persze a sokkal nagyobb sebességgel. Majd visszaállítottam aszinkron módra. Ekkor még nem indult el. Most, miközben írom, indult el magától. Az indulás döcögős, az indikátor led (másodperc villogó) elsőre csak 4mp-ként villant egyet, aztán már 2mp-ként, majd elérte az "üzeli" tempót. A TCNT2 értéke 8-nál állt meg. Ebből is arra következtetek, hogy valóban az oszcilláció áll le valamiért. Most ezen ragadt meg a tekintetem: Idézet: „Crystals specifying load capacitance (CL) higher than 8.0 pF, require external capacitors applied as described in Figure 7-2 on page 29.” A HS-bn én ilyen kristályokat vettem anno, aminek ez a bizonyos Load Capacitance értéke 12,5pF, az adatlap szerint. Jól értem, hogy ezek alapján valóban kellene két kondi a TOSC1/2 és a GND közé? Mekkora is kellene oda? (Van az adatlapban egy képlet, de ezen nem igazodok ki.) |
Bejelentkezés
Hirdetés |