DS1307 RTC: Forskelle mellem versioner

Fra HTX Arduino
Spring til navigation Spring til søgning
htx_>Bar
Ingen redigeringsopsummering
 
Omdirigering til Arduino DS1307 RTC oprettet
Tag: Ny omdirigering
 
(2 mellemliggende versioner af den samme bruger vises ikke)
Linje 1: Linje 1:
[[Image:DS1307RTC-modul.PNG|thumb|right|300px|Billede af DS1307 Real Time Clock modul]]
#redirect [[Arduino_DS1307_RTC]]
 
Et RTC modul indeholder en Real Time Clock, som er et ur med 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]].
 
==Hardware til DS1307 RTC==
Modulet er beskrevet under [[Arduino DS1307 RTC]] med link til leverandør og koden til Arduino.
 
Kredsen er dokumenteret i denne [[Media:DS1307.pdf|PDF-fil]] fra Maxim Integrated<ref>[http://datasheets.maximintegrated.com/en/ds/DS1307.pdf DS1307 datablad fra Maxim Integrated]</ref>.
 
Man kommunikerer med DS1307RTC ved hjælp af [[I2C Bus]] på adresse 0x68.
 
==Software modulet DS1307RTC.jal==
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:
 
<source lang="jal">
  include DS1307RTC.jal
</source>
 
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-fil]]en ligger sammen med et par eksempler inde i [[Fil:DS1307RTC_jal.zip|denne ZIP-fil]]
 
Testopstillingen ser ud som vist her:<br />
[[Fil:DS1307RTC_setup.jpg|600px|Testopstilling med PIC16F690, ALCD display og DS1307 Real Time Clock]]
 
DS1307RTC er testet på følgende kombinationer:
 
{| class="wikitable" border="1"
|-
!PIC!!pin
|-
|[[PIC16F684]]||
|-
|[[PIC16F690]]||b4 og b6
|}
 
===Interface fil til DS1307RTC===
Interface-filen angiver benforbindelser, bus-hastighed og adreseen på [[I2C Bus]]sen.
 
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.
 
<source lang="jal">
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
</source>
 
==Anvendelsen af DS1307RTC==
 
Læsningen af uret er ret simplet.
 
<source lang="jal">
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
</source>
 
{|class="wikitable"
|-
!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.
 
<source lang="jal">
  -- 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
</source>
 
===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:<br />
[[Fil:DS1307RTC-display.jpg|600px|Visning fra Demo-programmet]]<br />
 
==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:
 
<source lang="jal">
i2c_initialize()
</source>
 
===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.
 
<source lang="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
</source>
 
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==
<references />
 
{{moduler}}
 
[[Kategori:JAL-moduler]]
[[Kategori:PIC-moduler]]

Nuværende version fra 22. nov. 2022, 22:08

Omdiriger til: