Arduino DS1307 RTC
RTC Clock er er Real Time Clock modul, der indeholder et ur, der stadig fungerer selvom strømmen er væk. Uret har timer, minutter og sekunder, foruden dato, år og dag på ugen.
Ideen med en Real Time Clock er at man kan stille uret en gang for alle, og så skulle det gerne gå ufortrødent så længe batteriet kan holde spændingen over 2V.
Ud over dette, så ligger der 56 byte RAM med samme batteri-backup, så man kan gemme værdier der - det understøtter modulet her ikke.
På Holstebro HTX er vi gået over til at anvende Prog Shield RTC DS3231.
Fra dx.com
De RTC vi har hjemme (februar 2014) er fra dx.com, og ser ud til at være udsolgt som RTC-modul fra dx.com.
Denne dokumentation tager udgangspunkt i dette modul
Kommentarer til RTC-modulet fra dx.com
For at hente koden til RTC skal man installere DS1307RTC fra Electronic Project Site
Modulet arbejder med Arduino Time modul[1].
I Arduino-programmet åbnes Fil - Eksempler - DS1307RTC - ReadTest, der kan læse tiden fra modulet.
Hvis DS1307-chippen ikke er stillet, så kan man i Arduino-programmet åbne Fil - Eksempler - DS1307RTC - SetTime, indstiller tiden i modulet til PC'ens tid på oversættelsestidspunktet.
Virkemåde
Modulet arbejder på en I2C Bus, hvor den har adresse 0x68.
Man kan skrive 7 byte til modulet, hvor det ligger kodet i BCD, så man kan ikke direkte regne med de tal man får ud.
Man kan også læse 7 byte i modulet på byte adresse 0, hvor man får de samme tal ud i BCD.
Tallene ligger som følger:
- 0 Sekunder
- 1 Minutter
- 2 Timer
- 3 Ugedag (0-6)
- 4 Dato i måneden (1 - 31)
- 5 Måned (1 - 12)
- 6 År (0 - 99)
Hardware
Forsyning, SCK og SDA forbindes.
Kredsen er dokumenteret i denne PDF-fil fra Maxim Integrated[2].
Man kommunikerer med DS1307RTC ved hjælp af I2C Bus på adresse 0x68.
PIC Anvendelse af DS1307 RTC
Softwaren er lavet til at kunne læse og skrive i DS1307 Real Time Clock, så man kan stille tiden hvis man ønsker det, og mest af alt at man kan læse tiden nede i uret.
Anvendelse af DS1307RTC.jal
Når man vil anvende DS1307RTC modulet, så skal man include DS1307RTC.jal som følger:
include DS1307RTC.jal
Hvis DS1307RTC.jal ligger i \lib inde i c:\jalpack så kan compileren finde modulet.
DS1307RTC anvender i2c_Software.jal og i2c_level1.jal, så de skal også ligge i \lib men det burde de gøre som standard.
JAL-filen ligger sammen med et par eksempler inde i Fil:DS1307RTC jal.zip
Testopstillingen ser ud som vist her:
DS1307RTC er testet på følgende kombinationer:
PIC | pin |
---|---|
PIC16F684 | |
PIC16F690 | b4 og b6 |
Interface fil til DS1307RTC
Interface-filen angiver benforbindelser, bus-hastighed og adreseen på I2C Bussen.
I DS1307RTC_def.jal kan man rette på nogle af disse opsætninger.
Benforbindelserne skulle man kunne vælge relativt frit, da man bruger software-modulet til at lave I2C kommunikation med, men i dette tilfælde er der bare valgt de to ben der alligevel er lavet til det hardware-mæssigt.
Bus-speed og level er det ikke tilrådeligt at ændre på, da de er lavet til kredsen (man kan måske prøve sig frem og kredsen kan kommunikere hurtigere).
Adressen er fastlagt hardware-mæssigt inde i DS1307 kredsen, så den skal man normalt heller ikke rette på, men mindre man får fat i kredse der arbejder på en anden adresse.
var volatile bit i2c_scl is pin_b6
var volatile bit i2c_scl_direction is pin_b6_direction
var volatile bit i2c_sda is pin_b4
var volatile bit i2c_sda_direction is pin_b4_direction
const word _i2c_bus_speed = 1 ; * 100kHz
const bit _i2c_level = true ; i2c levels (not SMB)
const byte DS1307RTC_Address = 0x68
Anvendelsen af DS1307RTC
Læsningen af uret er ret simplet.
include DS1307RTC
forever loop
if DS1307RTC_Read then
-- Her kan man anvende variablerne Read_Sec, Read_Min ... Read_Year
else
-- Her kan man angive at der er sket en læsefejl
end if
--
-- Her kan placeres anden kode i loopet, der skal lave andre ting
--
end loop
Funktion | Læse Variabel | Skrive Variabel | Format |
---|---|---|---|
Sekunder | Read_Sec | Write_Sec | BCD tal fra 00 til 59 |
Minutter | Read_Min | Write_Min | BCD tal fra 00 til 59 |
Timer | Read_Hour | Write_Hour | BCD tal fra 00 til 23 |
Ugedag | Read_DoW | Write_DoW | BCD tal fra 0 til 6 |
Dato | Read_Day | Write_Day | BCD tal fra 01 til 31 |
Måned | Read_Month | Write_Month | BCD tal fra 01 til 12 |
Årstal | Read_Year | Write_Year | BCD tal fra 00 til 99 |
Ønsker man et sted i softwaren at sætte uret til noget andet end det den står på nu, så skal man skrive alle 7 variabler ind med fornuftige værdier, og så kalde DS1307_Write for at skrive værdierne ned i uret.
-- Her skal alle 7 variabler Write_Sec, Write_Min ... Write_Year angives til noget validt, så uret kan fungere
if ! DS1307RTC_Write then
-- Her kan man angive at der er sket en skrivefejl
end if
Demo version af DS1307RTC
Inde i ZIP-filen ligger en DS1307RTC_demo.JAL, der illustrerer anvendelsen af modulet.
Ved test af modulet i den viste testopstilling kan man få en visning som følgende:
Forklaring af DS1307RTC software
Modulet er i høj grad baseret i2c_software.jal og i2c_level1.jal
Initialisering af softwaren
Initialiseringen sker inde i DS1307 ved følgende linje:
i2c_initialize()
Funktionsbeskrivelse
Kommunikationen sker ved at man starter i2c-kommunikationen og sender adressen og i samme byte om man vil læse eller skrive.
Ved læsning skriver man først hvilken adresse (når det er uret, så er det adresse 0 man starter ved) og derefter læser man de bytes man har behov for (i dette tilfælde 7).
Ved skrivning angiver man ligeledes hvilken adresse man vil skrive til, og derefter skriver man det antal bytes (her igen 7) man vil skrive.
Både læsning og skrivning afsluttes ved at man stopper i2c-kommunikationen.
Koden inde i funktionen DS1307RTC
De to funktioner er opbytte som følger og er i høj grad baseret på funktionaliteten i i2c_level1.jal.
function DS1307RTC_read () return bit is
i2c_tx_buffer[0] = 0
return i2c_send_receive(DS1307RTC_Address * 2, 1, 7)
end function
function DS1307RTC_write () return bit is
i2c_tx_buffer[0] = 0
return i2c_send_receive(DS1307RTC_Address * 2, 8, 0)
end function
Som det kan ses er det samme funktion der kaldes, hvor læsningen foregår ved at skrive en byte (i2c_tx_buffer[0] der er sat til 0 for adresse 0) og derefter læse 7 bytes. Skrivningen sker ved at de 7 bytes i arrayet i2c_tx_buffer[1] - i2c_tx_buffer[7] er skrevet i forvejen, og der angives at i2c_tx_buffer[0] skal være nul, så skrivningen starter i adresse 0, hvorefter der skrives de 8 byte og modtages ingenting.
Referencer