Arduino DS1307 RTC

Fra HTX Arduino
Spring til navigation Spring til søgning

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.

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.

RTC modulet 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:
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


Atmel Microcontroller
Atmel udviklingsmiljø AVR Compiler - AVR Makefile - AVR udviklingsboard - AVR-batch - AVR-programmer Shield - WinAVR
Atmel-type Udviklingsboard - ATMega328 - ATTiny2313A - ATTiny24A - ATTiny45 - ATTiny461 - ATTiny48
I2C Moduler Arduino Display - Arduino DS1307 RTC - Arduino IO Expander - Arduino magnetisk kompas - Frekvensmodul - I2C barometer - I2C Display - I2C Lommeregner - I2C strain gauge - I2C tastatur - I2C-RF-modtager - IR Fjernbetjening - Mikrofon som Undervisningsudstyr


Arduino-Modul-Oversigt
Arduino Generelt: Biblioteker - Board - Driver - Shield - Arduino Analog - Arduino Seriel

Arduino-typer: Arduino UNO - Arduino Nano - Arduino Pro Mini - Arduino MEGA 2560 - LiliyPad Mikrocontroller - Arduino DUE - WeMOS

Input-moduler Trådløse: Bluetooth - Transceiver modul - WiFi Modul - SMS Modul - I2C-RF-modtager - RF Link - GPRS/GSM - GSM_Modul

Sensorer: GPS - Strøm-sensor - I2C Humidity - Lys og Nærhed - Magnetisk Kompas - I2C barometer - Farvegenkendelsesmodul - Alkoholsensor - Accelerometer - I2C Accelerometer - I2C Gyroskop - Vejecelleforstærker - IR Distance - AC Strømsensor - Afstand - XY Joystick - Humidity - Tryksensor - Vindhastighedsmåler
Photo og IR: IR Fjernbetjening - Photo Interrupter - IR Modtager - Bevægelsescensor - Photo Refleks Sensor - VGA Kamera
Power: Power Adapter - Lithium Batteri
Lager: SD Kort
Konvertere: I2C AD-konverter
Funktionsmoduler: RFID-modul - Matrix tastatur - DS1307 RTC - ENC28J60 Ethernet - IO Expander
Touch Display: Touch Display

Output-moduler Trådløse: Bluetooth - RF Link - GPRS/GSM - Transceiver modul - WiFi Modul - SMS Modul

Display: Display Shield - Touch Display - Arduino Display - Nokia 5110 Display - Dot-Matrix - Lys-avis - I2C Display
Funktionsmoduler: Lydgiver - Lydmodul - Relæ modul - Audio Power Forstærker - ENC28J60 Ethernet - Peltier Element - IO Expander
Hukommelse: SD Kort
Motorer: Stepper Motor Driver - Stepper med Accelleration - Servo

I2C-Moduler Funktionsmoduler: DS1307 RTC - I2C-RF-modtager - I2C tastatur

Sensorer: I2C Humidity - Magnetisk Kompas - I2C barometer - I2C Accelerometer - I2C Gyroskop
Konvertere: I2C AD-konverter
Display: I2C Display