Ds1307 és avr

Foglalkozunk BCD formátumban. BCD (Binary kódolt decimális) bináris decimális formátumban lehet csomagolni és a csomagolatlan. Az első kiviteli vesz egy tizedes számjegy byte hátránya a gazdaságtalan használata memóriát, mert magas majszol mindig egyenlő 0-val az az előnye, hogy nincs kétértelműség, azaz a jegyű hexadecimális egyenlő egy tizedes, és nincs szükség további műveleteket hajtson végre.

Második kiviteli alak csomagolt, és tárolására a tizedes használ tetrád (Nibble, tetrád), azaz négy bit. mert regisztrálja a memóriában korlátozott ebben az esetben a felső bájt a második emeleten egy decimális szám van tárolva. Így a „nézni” csak munka ez a verzió.

Ne feledje, hogy a belső számok ábrázolása a nyilvántartásokban - bináris. Ezért csomagolt BCD egyedülálló lehetőséget nyújt nem csak menteni bájt, hanem együtt kimeneti adatokat byte bit beállításával (ábra. Az alábbiakban), például egy korábbi cikkben (№29) a nyilvántartásban a 2. táblázatban -ik regiszter az óra terminál 6, és 5 bitet tartalmazó konfigurációs bitek. és csak 5 (beállításától függően 6), és 4. tartalmazzák a 2. és 1. tíz óráig, és a fennmaradó alsó 4 bitet - bináris egységek óra, így a BCD formátumban.

Azt is szeretném megjegyezni, hogy néhány mikroprocesszoros rendszerek különleges utasításokat a korrekció a méret, hanem a AVR. nincs ilyen utasításokat. De ez nem számít, akkor látni fogjuk, egy kis aritmetikai műveletek fogjuk, hogy könnyen konvertálni.

Tételezzük fel továbbá a műveletet a második kiviteli példa. Például a felvenni kívánt tizedes szám 37, BCD formátumban, akkor meg 11, 0111. Például a kalkulátor értelmezi a bináris kód, mint decimális vagy hexadecimális 55. 37 10 0101 Ezért, amint az alábbi műveletek elvégzéséhez szükséges.:

- 37 osztva 10, ennek eredményeként kapjuk értéke 3, az összes frakcionált dönthető kapjunk bináris 0000 0011;
- eltolja a kis részt nibble tartalmazó 3-4 bitet a bal oldalon. Már van egy forma 0011 0000;
- most alkalmazni modulo 10 (10%), azaz 37% a 10-es számú. Az eredmény egy 7, a pufferben van bináris kód 0000 0111;
- és egyben utolsó - egészíti ki a 0011 0000+ 0000 0111 = 11 0111;
- küldünk minden kódot az órát.

Az alábbi kódot átalakítani bináris számokat decimális formátumban:

idő = ((idő / 10)<<4) + time%10;
TWDR = idő;

amely be van dugva a felvételi funkció (mely még ma is az előző cikkben №29), mielőtt információt adatregiszterhez.

void write_DS1307 (uint8_t reg, uint8_t idő)
idő = (((idő 0xF0) >> 4) * 10) + (időt 0x0F);

Először válassza magas majszol át a junior. Megszorozzuk 10 és kap több tucat. Ezután válassza ki a fiatalabb része az egészet slazhivaem és kap az eredmény.

Relatív, hogy a korábbi cikkben (№29) van a könyvtárban hozzáadott hétszegmenses kijelzőn. És a fő funkciója, az olvasni és konvertálni az idő, óra, perc, lefordítani, és tegye meg a kijelzőn az alábbiak szerint:

m = read_DS1307 (0 × 01); // olvasni perc
_delay_ms (100); // késleltetés szükséges a szimulátor
h = read_DS1307 (0 × 02); // olvasni az órát
_delay_ms (100); // késés
i = h + (m * 0,01); / * Át az időt formátum jelző, ezt a pillanatot meg kell szorozni 0,01 és adjunk hozzá az órát, megkapjuk a következő formátumban hh mm * /
Display (i); // függvény kimeneti indikátor

Mint látható, semmi bonyolult. A forráskód és a projekt lefektetett a végén. Eredmények Az alábbiakban Proteus és a vas. Valószínűleg szükséges megjegyezni a különbség közöttük:

- egy indikátor egy Serratia késleltetés ki tranzisztorok 50 ms, 30 vas;

- lásd fent a két információ fogadására átviteli függvények késedelem Serratia meghatározott 100ms. A vas és nestavit.

Ds1307 és avr
Ds1307 és avr

A forráskód és a projekt

Ez minden. A következő cikkben is integrálni írt kód órajel vezérlő adatgyűjtési. Összefoglalni. Mi lesz a menetrend a maradék munkát, hogy a projekt befejezését. Próbáld, kísérlet. Bye mindenkinek.

Hello, van egy program a DS1302 és engedélyével a rendszergazda szeretne tegye meg itt, hasznos lehet valakinek. Nem mondom, hogy tökéletes, mert én vagyok az új programozási, azonban lehet, hogy valaki tapasztaltabb megmondja, hogyan kell optimalizálni. Fogom kezdeni egy leírást. Port D csatlakozik egy hétszegmenses kijelzőn keresztül ellenállások 330 ohm. PB6, PB7 - beállítás gombok óra és perc, PC1 - gomb megnyomásakor (tartani állandó) a program átvált a beállítást. Amikor ez megjelent az olvasó az idő. A gombok húzta pozitív ellenálláson keresztül 10 ohm. Azt hiszem, nem lehet beállítani, ha tartalmazzák felvonó a megfelelő portokat, de én annyira megbízható, azt hiszem. PB0, PB1, PB2, PB3 - portok, amelyek felelősek a felvételét a megfelelő számadatok szerepelnek a tranzisztorok én ezt KP505. Között a kikötő és a tranzisztor kapu helyezzük 3 kOhm ellenállások, a kapu és a 10K őrölt (bár ez szükségtelen). A forrás a földhöz kapcsolódik, a csatorna a megfelelő számot a kijelzőn. DS1302 csatlakoztatva alábbiak 5 - PC5 - RST, 6 - PC4 - I / O - adatok 7 - PC3 - sclk-t azaz - órát. Áramellátása a mikrokontroller és ds1302 standard.

Itt termel bizonyos portokat és hozzá változókat