DS1307 RTC

Fra Kommunikation-IT Holstebro HTX
Skift til: navigering, søgning
Billede af DS1307 Real Time Clock modul

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.

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 PDF-fil fra Maxim Integrated[1].

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:

   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:
Testopstilling med PIC16F690, ALCD display og DS1307 Real Time Clock

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:
Visning fra Demo-programmet

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

  1. DS1307 datablad fra Maxim Integrated
Moduler på Holstebro HTX
Tastaturer Displays AD-konvertering I/O-ekspander Serielt Interface Færdige Andre
RC-tast - AD-tast - M_tast ALCD - LCD ADC_holst - ADC
mcp3201 - mcp3208
input - output Seriel_holst - Serial hardware
Serial hw int cts - Serial software
Stepmotor - RFID
RGB - RF-link - Afstand
Humidity - Analog temp - Dig temp
Accelerometer
Rotary Encoder

Oversigt over Hardware Moduler på Holstebro HTX