Musik spelas väckarklocka (13 / 24 steg)
Steg 13: DS1307 Realtidsklocka IC
http://www.Maxim-IC.com/Datasheet/index.MVP/ID/2688
Läst databladet, innehåller den kommandona för chip och andra detaljer. Måste du veta det här när du tittar på min källa koden så att du vet vad som pågår.
Vad gör det? Det spår tid, så din microcontroller inte behöver. Det kommer även spåra tid med hjälp av ett mynt cellsbatteri medan dess huvudsakliga strömmen är avstängd, så du inte får det klassiskt 12:00 blinkar som händer med gamla väckarklockor när strömmen går. Oh och det spår datum också.
Observera att det finns mycket bättre alternativ till DS1307 idag med bättre funktioner, men jag hittade detta chip i min samling av udda delar, så jag kommer att använda den.
Detta chip kräver följande saker runt det: en klocka kristall, en batteribackup (3V coin cell från dollar store kommer senaste 9 åren), en strömförsörjning och en frikoppling kondensator.
Mikrokontroller kommer att meddela DS1307 via I2C bussen (mellan integrerad krets). I2C bussen är även känd som TWI (två tråd gränssnitt, använder det bara två kablar). Den är utformad för kommunikation mellan flera integrerade kretsar. Se bilaga D vill veta mer om I2C och TWI.
Vad vi behöver göra med DS1307 är enkel, vi behöver bara ställa in tid och läsa tiden.
DS1307 håller sina data i flera register. Se datablad, tabell 2, sidan 8. Det visar informationen i binary coded decimal-format, som vår källkod kommer att koda och avkoda. Vi kommer att skriva till dessa register när vi ställa in tiden och läsa från samma register att hämta tiden.
En bra beskrivning av I2C bussen ges på sidan 10 i databladet. Avsnittet AC elektriska egenskaper i databladet säger vår I2C buss måste köra på 100 KHz eller lägre (detta är konfigurerbar inuti vår källkod), ha detta i åtanke. DS1307 adress är 1101000, kom ihåg att också.
Exempelvis vill vi ställa sekunderna, så registret är 0x00. Vi först skicka över I2C
0b11010000
Detta korrigerar DS1307 och säger att vi vill skriva
Vi skickar sedan
0x00
att ange registret 0x00
Vi skickar sedan numret vi vill ställa, kodad i binary coded decimal-format
Sedan, om vi vill läsa tillbaka sekunderna, registret är igen, 0x00, skickar vi först
0b11010000
Observera att adressen till den, men vi fortfarande ange att vi vill skriva
Varför anger "skriva" när vi vill läsa? Eftersom vi inte har berättat DS1307 där vi vill läsa från (ange registret adress inuti DS1307). Så skickar vi
0x00
då avslutar vi överföringen av uppgifter
Nästa, skicka
0b11010001
nu är vi att ta itu med DS1307 och som anger vi vill läsa
sedan kör vi klockan att läsa tillbaka data, som DS1307 placerar på data linjen för oss. Vi kan sedan avkoda data från binary coded decimal format.
Det är viktigt att förstå att eftersom vi använder våra AVR: s inbyggda TWI modul för I2C kommunikation, det vet att automatiskt frigöra SDA raden när vi anger "läsa" i den första byten som vi skickar. Maskin- och programvara (vi använder "twi.c" från "Wire" bibliotek för Arduino). ALLT är automatiserat, även bekräftelser.
För våra ändamål, kommer vi läsa och skriva alla tidsinställningar på en gång, för effektivitet. Detaljerna för hur detta fungerar är i databladet. Du kan också se min källa koden senare. Idén är densamma för singelregister, men vi gång på gång läsa/skriva utan att avsluta överföringen. Du får se hur detta fungerar genom databladet, min källa koden och min logik analyzer vågformer.
Bifogat är en demonstration av ett enkelt program som ställer in tiden och visar sedan tiden på din LCD. Det kommer att Visa använder TWI bussen ska utföra en/flera byte Skrivskydd (Visa den vågformer jag har förutsatt).
Lägg till DS1307 i din krets enligt min diagram först. En bild med högre upplösning är inom den. ZIP-paketet. Viktigaste är att DS1307 behöver 5V, och vi har ändrat det Teensy ++ att köra på 3.3V, diagrammet visar dig var du kan få 5V från Teensy ++.
Du behöver LCD fortfarande är ansluten om du vill se den klocka arbetande. Serial-uttaget vilja stilla utställning du felsöka meddelanden.
Jag har bifogat den logik analyzer vågformer så kan man tydligt se hur I2C ser ut, databladet för DS1307 visar också liknande vågformer, studera vågformer tillsammans medan undersöker också den data som utbyts (t.ex. vad kommandot skickas, vad var svaret), prova matchande händelserna till punkterna i källkoden.