Fórum témák

» Több friss téma
Fórum » AVR - Miértek hogyanok
 
Témaindító: pakibec, idő: Márc 11, 2006
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
Lapozás: OK   680 / 680
(#) Vacok válasza kapu48 hozzászólására (») Vas, 10:46 /
 
Végül is lehet, hogy nincs is szükség semmilyen módosításra, mert nekem ezekből a sorokból az derül ki, hogy az óra és a perc közti két pont folyamatosan világít:

#define COLON 13
pinMode(COLON, OUTPUT);
digitalWrite(COLON, LOW);

A programban később ez a kimenet nem vesz fel más értéket.
(#) kapu48 válasza kapu48 hozzászólására (») Vas, 11:11 /
 
De azt tudod, hogy ez így nagyon pontatlan óra lesz?!

Lehet Óra modulokat kapni, amikbe direkt óra kristályok vannak beépítve.
Amik valamivel pontosabbak.

Keres inkább olyan projektet!
(#) csatti2 válasza kapu48 hozzászólására (») Vas, 11:58 /
 
Meg lehet oldani külön modul nélkül is, csak épp ahhoz át kell alakítani ezt az áramkört. A kristály kicserélhető egy 32,768kHz-es órakristályra (a progi futhat a belső 8MHz-es RC oszcillátorról, a timer 2 pedig asszinkron módban az órakristályról számolhatja az időt). A gond, hogy ez az áramkör valami arduino alapú csoda lehet bootloader-rel és rendes programozó port nélkül (a serial port néz ki a "programozó" portnak) és a belső oszcillátor nem elég pontos a soros port működtetésére (ezért használ 16MHz-es kristályt). Ha az áramkört átalakítaná a szokásos ICSP csatlakozósra, akkor mindjárt nem lenne érdekes a soros port (másra úgysem kell, ...mondjuk meg lehetne csinálni internetesre az órát ESP modullal, akkor persze meg a pontos órakristály nem kellene ).
(#) Kovidivi válasza csatti2 hozzászólására (») Vas, 12:26 /
 
Szia.
Nekem pont most van egy Atmega328-am, belső 8MHz oszcillátorral, Timer2-re 32768Hz-es kristály kötve, és az Arduino-ban megtalálható Arduino mini pro 8MHz 3.3V-os bootloaderrel tökéletesen megy a feltöltés.
(#) Vacok válasza csatti2 hozzászólására (») Vas, 13:01 /
 
Hűha... ez a beszélgetés már kezdi meghaladni a képességeimet. Nagyon nem szeretnék hozzányúlni sem a programhoz, sem a kapcsoláshoz. Ez a kapcsolás a nootropic design féle defusable bomb clock. Félek, hogy bármi módosítás a "különleges" funkciók kiesését vonná maga után.
Az AVR programozását az áramkörből kivéve ICSP-n keresztül szeretném megvalósítani, ezt így meg lehet oldani? Látom, hogy itt soros portról is van szó.
De miért is lenne pontatlan az óra? Gondolom a tervezője úgy alkotta meg, hogy pontos legyen. Vagy a benne lévő kvarc frekvenciája és az osztásból származó órajeltől pontatlan?
(#) kapu48 válasza Vacok hozzászólására (») Vas, 13:09 /
 
Gondolom, hogy egy Bomba nem olyan hosszú életre van tervezve, mint egy Óra.
Ezért a kvarc pontatlansága elhanyagolható probléma volt a tervezőnek.
(#) Kovidivi válasza Vacok hozzászólására (») Vas, 13:09 /
 
Én inkább úgy mondanám: nem lesz annyira pontos, mint egy órakvarcról használva. De ki kell próbálni, a Timer2-t amúgy is lehet pontosítani, csak ehhez mindig várnod kell 4-8órát, megnézni, hogy siet, vagy késik, mennyit, és ez alapján újra be kell égetni a már pontosított programot. Azt viszont nem értem, hogy miért jobb a túlcsordulást használni, és kezdőértéket adni a Timer-nek, mikor ott van a CTC üzemmód, ami lenullázza a Timer-t, amikor eljut a Compare értékig.
(#) zombee válasza Ricsi89 hozzászólására (») Vas, 17:05 /
 
Ha "wear leveling" (terheléselosztás) módszert választasz akkor elég sokáig ki fog tartani az EEPROM.Lényege, hogy a kevés bájtból álló információt "szétkened" a teljes EEPROM területére.Kicsit számításigényesebb a feladat, de 100% működik. A megtett utat gondolom 0.1km-ben,a fogyasztást centiliterben érdemes tárolni, egyébként így a két információ kb. azonos nagyságrendű.

Kódolás:
1 millió kilométeres tartomány talán elég lesz, akkor 10 millió a kilométerszámláló maximuma.
Ezt 3 bájton kódolva 16.77 millió lehet, ennyit nem sok autó megy el egyazon kilométerórával. A fogyasztás is kódolható 3 bájton az azonos nagyságrend miatt. Ha egy 10 literes fogyasztású kályhacsöved van akkor 1.677 millió km után ez is betelik...

Algoritmus:
Ezt a 2x3 bájt infót kiegészíted egy negyedikkel (aminek más lesz a funkciója), és kiosztasz
nekik egyenként 256 bájt EEPROM területet. Mostantól a leírás csak egyetlen 3+1 bájtos információrólfog szólni. Tegyük fel hogy már működik a cucc, van érvényes infó az EPROM-ban. A kérdéses 4 bájtot egy 256 bájtos szegmensből úgy kapod meg, hogy 4 bájtonként kiolvasod mind a 256 bájtot és ezeket valamilyen művelettel(XOR) összeadod egy ciklusban. Ha bekapcsoláskor beolvastatod a 256 bájtot és a RAM-ban tárolod úgy gyorsabb lesz a dolog, mert csak íráskor fogsz az EEPROM-hoz nyúlni, ott is csak 4 bájtot kell írnod egyszerre.
Most jön a 4. bájt: azt tárolja, hogy a 256 bájtból legutoljára melyik 4 bájtos rekeszt írtad.
Ezt minden írásnál 1-el növeled, hozzácsapod az információt tartalmazó 3 bájtot, majd úgy
írsz a soron lévő rekeszbe hogy a XOR művelet a hasznos információt adja vissza. Ez nem nehéz, mivel a "maradék" terület XOR-összegét kell az információhoz adni és olvasáskor az lesz az eredmény.

Első hallásra nem tűnik olyan nagyon egyszerűnek, pedig a kód írással-olvasással és inicializálással kb. 60 sornyi kód C-ben. Azért látszik hogy egy kicsit sajnos dolgoznia kell a procinak is, meg a tárolt információ is sokkal nagyobb helyet foglal, de az a pár bájt tényleg megéri. Ha az EEPROM egyetlen bájtja 100000 írási ciklust visel el, akkor a 3 bájtos számláló
4-szer előbb betelik mint hogy elérné a 100000 írást...
A hozzászólás módosítva: Vas, 17:06
(#) zombee válasza zombee hozzászólására (») 3:49 /
 
Ez egy kicsit hosszú volt, a wear leveling természetesen egyszerűbben is megoldható. A számláló módszer annyiban tér el a fentitől, hogy minden (3 vagy 4 bájtos) rekesz értelmes információt hordoz. A 256 bájtos memóriaméret se szentírás, a fentiek alapján 48 bájt is elég, és ezzel a számláló kb. akkor telik be amikor "elromlik" az EEPROM.

Az egyszerűbb (számláló) módszer azért működik, mert a beírandó érték folyamatosan növekszik. Azaz a 48 bájtból az a 3 bájtos rekesz érvényes, amelyik a legnagyobb értéket hordozza(a 0xFFFFFF értéket viszont ignorálni kell, mert "gyárilag" ez az EEPROM tartalma). Innentől kezdve csak át kell pásztázni a területet a 3 bájtos infókért, és a legnagyobb érték lesz az érvényes. A módszer hibadetektálásra is használható, elég csak azt figyelni hogy mindig a rákövetkező érték a nagyobb, és csak 1-el lehet nagyobb. Ha hibás az adat, vissza lehet lépni az előzőhöz, 100 méter vagy 1cl tévedés még mindig jobb mintha megbolondulna a kilométerszámlálód. Természetesen az egyszerűbb módszernél is igaz hogy érdemes az EEPROM területet gyorsítótárazni, és csak íráskor kiírni a megfelelő 3 bájtot.
(#) ativagyok hozzászólása 14:25 /
 
Sziasztok!

Szükségem lenne egy Atmel mikrovezérlőkben nagyon jártas személy segítségére egy projektben.
Privát üzenetben tudok részleteket mondani.
Üdv,
Attila
Következő: »»   680 / 680
Bejelentkezés

Belépés

Hirdetés
Frissek
2015. Júl, 06. Hé
19:54:35
Jelenleg 557 fő olvassa az oldalt
Online tagok:
Lapoda.hu     XDT.hu     HEStore.hu