Echte Tijd ☼ RTC

DeadOn RTC s een real-time klok op basis van de uiterst nauwkeurige DS3234 IC met SPI bus en een geïntegreerde temperatuur-gecompenseerde kristaloscillatorl.

Plaatje

solderen

aansluiten

GND ▬ GND
VCC ▬ 3.3 (of 5) Volt
SQW ▬ Square Wave signaal
CLK ▬ pin 13 (verplicht)
MISO ▬ pin 12 (veplicht)
MOSI ▬ pin 11 (Verplicht)
SS – pin 8 (of andere vrije pin)

 

Sketch

Die kun je HIER downloaden.

.

sketch output

waarom?

Tijd kan van belang zijn bij bijvoorbeeld data-logging of tijd gestuurde events. Een microcontroller als de Arduino kan je precies vertellen hoe lang hij aan staat. Maar omdat de begin-tijd onbekend is, kan een arduino zelfstandig nooit de ‘actuele datum en tijd’ aangeven. Dit break-out board van Sparkfun heeft een batterij houder voor een CR1220 lithium cell. Zo blijft de tijd jaren tikken met de ‘on-board’. oscillator.

 .

datasheet

Die kun je HIER  downloaden

 

wat leert de datasheet ons?

PPM & tijd ?
  • De nauwkeurigheid van een Crystal klok wordt uitgedrukt in Parts Per Million (PPM). Eén PPM is 1/1.000.000.
  • Een dag heeft 24 x 60 x 60  = 86.400 seconden. 1 ppm komt na een dag overeen met 86.400 / 1.000.000 = 0,0864 seconden afwijking naar boven of naar beneden.
  • Bij 1 ppm loop je na 1 / 0,0864 = 11,674 dagen maximaal een seconde uit de pas.
  • Digitaal horloge: 20 ppm
  • Rubidium (atoomklok): 0.000001ppm
twee alarmen en een blokgolf (SQW) output
  • Bijvoorbeeld de intervaluino aan en uitzetten om precies de zonsopgang te treffen.
  • Wakker worden.
  • Oven aan voor wakker worden.
  • Tijdbom
TCXO – Digital Temp Sensor Output: ±3°C Accuracy
  • TCXO = temperature-compensated crystal oscillator
  • De nauwkeurigheid van de chip wordt bereikt door rekening te houden met de temperatuur.
  • De nauwkeurigheid van 3 graden celcius klopt wel. Het getal van 2200  in het filmpje hierboven, is de temperatuur x 100. Dus 22,0 °C terwijl het 19,37 °C was volgens een andere sensor.
  • OCXO is trouwens iets anders. met deze oven controller crystal oscillator wordt een nauwkeurigheid bereikt van 0.001 ppm. Er wordt dan niet gecompenseerd voor temperatuur, maar de temperatuur wordt constant gehouden.
Low power consumption
  • 1,5 microAmpere
4MHz SPI Bus Supports Modes 1 and 3
  • Goed moment om SPI wat te verduidelijken

SPI

Alles wat je op een Arduino aansluit, gaat met in- en ouput gepaard. Zonder communicatie geen activiteit in de microprocessorwereld.

De belangrijkste manieren van communiceren met een arduino zijn:

  1. GPIO = General Purpuse In- and Output
    1.  pinnetje heeft 0 Volt (uit) of 5 Volt (aan).
    2. input: bv. drukknopje
    3. output: bv. relais switchen
  2. PWM = pulse wave modulation
    1. semi analoge output:
    2. bv. LED dimmen en weer langzaam helder laten branden.
    3. van 0 volt naar 5 Volt (of Vmax) in 256 stapjes ( 8-bit)
  3. ADC = Analoog naar digitaal converteren
    1. Dus Input:van bv. een eenvoudige lichtsensor.
    2. meet input voltage tussen 0 Volt en 5 Volt in 1024 niveaus (10-bit = 2 bit + 8 bit = 4 x 256.
  4. I2C = Inter-IC-bus = TWI
    1. Inter = tussen
    2. IC = Integrated Circuit = chip
    3. bus = de stroomdraad die uitgaat van éém arduino pinnetje.
    4. bus = lijn waar meerdere IC’s op zitten
    5. bus = protocol om alle verschillende IC’s uit elkaar te houden op dat ene pinnetje
    6. Eén bus. Dus: input en output over dezelfde bus / pin / lijn / protocol.
    7. Ook al loopt de communicatie over één lijn, een tweede lijn met een geklokt signaal is nodig om alle IC’s over dezelfde bus met de
    8. microcontroller / Arduino te laten communiceren.
    9. Arduino Uno pin 4 is de klok (SCL) en 5 de data lijn (SDA).
  5. SPI = Serial Peripheral Interface
    1. Meerdere IC’s op twee lijnen
    2. Input: via Arduino Uno pin 12: Om onduidelijkheden te voorkomen, heet deze lijn MISO: Master (=arduino)  Input – Slave (bv. temperatuur-IC) Output
    3. Output: via Arduino pin 11 MOSI: Master Output – Slave Input
    4. naast deze in- en ouput lijn, is er bij SPI ook altijd een
    5. Klok: via Arduino pin 13, en een
    6. CS of SS – lijn, die bepaald of een sensor op de SPI-bus zit (0) of niet (5 Volt), dus eigenlijk GPIO
I2C vs SPI

Bij het I2C-protocol wordt bij elke output van de microcontroller eerst een herkennings-byte gestuurd. Herkent een IC zijn herkennings-byte, dan zal hij het volgende commando uitvoeren. Omdat bij elke opdracht deze extra byte zit, is er nogal wat ‘overhead’ in het I2C protocol. Traag dus.

SPI is sneller, omdat naar elke IC die op in- en output lijnen zitten, een apart ‘GPIO’ lijntje loopt, die aangeeft met welke IC gepraat wordt. Vaak wordt deze extra lijn aangegeven met CS (Chip Select) en staat er een horizontale streep boven om aan te geven dat de Chip geselecteerd is als er 0 Volt op staat. Je zet een SPI – IC dus vaak uit door 5 Volt op de CS pin te zetten. Op het Breakboardje van Sparkfun met de RTC heet hij overigens SS.

SPI = meer lijnen, maar minder overhead dan I2C.

 Voor beter begip is het verstandig deze internetpagina helemaal door te lezen en op te merken wat je niet snapt.

hier een stuk eruit over alle pinnetjes: Groen is analoog (PWM en ADC). Blauw is digitale communicatie.

 

spi-code

Hier een stukje CODE uit bovenstaande Sketch die SPI in Action laat zien. Ik schreef dit om de temperatuursensor van de RTC-chip uit te kunnen lezen.

digitalWrite(cs, LOW);
SPI.transfer(0×11);
int temperature_MSB = SPI.transfer(0×00);
digitalWrite(cs, HIGH);
delay(10);

digitalWrite(cs, LOW);
SPI.transfer(0×12);
unsigned int temperature_LSB = SPI.transfer(0×00);
digitalWrite(cs, HIGH);
delay(10);

Om dit te snappen, hebben we opnieuw de datasheet van de RTC nodig. Hierin staat dit stukje:

Links staan de twee SPI adressen 11h & 12h. De ‘h’ is van hexadecimaal. In de arduino IDE schrijf je dit als 0×11 en 0×12 respectivelijk. NB: Decimaal is het 17 (16+1)  en 18  (16+2).

Dus op adres 17 en 18 in de RTC chip ligt de temperatuur opgeslagen. De acht bits van de byte op adres 17 begint met een sign (zie tabel  hierboven). Deze geeft plus of min temperatuur aan (0 of 1). Dan blijven er nog 7 bits over voor dit deel van de temperatuur.Op 17 het deel voor de komma, op adres 18 het deel achter de komma. De groene pijltjes wijzen op bits die niet gebruikt worden. Er zijn dus maar twee bits achter de komma.

bijvoorbeeld:

  • 1 000 0001,00    = -1,0 graad celcius
  • 1 000 0011,01    = -3,25 graad celcius
  • 0 001 1001,11   = +25,75 graad celcius

Door de temperatuur zo in 10 bits te stoppen, reikt de waarde van -127,75 tot +127,75 (binair 11111111,11 tot 011111111,11).

Nu de sketch regels:

  • digitalWrite(cs, LOW);
    • haalt 5 volt van de Chip Select pin af
    • de chip wordt dus geselecteerd en deze chip gaat vervolgens luisteren naar de MOSI lijn (Arduino uit, RTC in)
  • SPI.transfer(0×11);
    • stuur decimaal getal 17 op de SPI-bus (MOSI)
    • deze komt bij de RTC aan, die vervolgens de waarde op adres 17 klaarzet voor de MISO lijn (RTS uit, Arduino in).
  • int temperature_MSB = SPI.transfer(0×00);
    • maak getal met de naam temperature_MSB (mag ook PietjePuk zijn)
    • Pluk waarde uit MISO-lijn en ken deze aan temperatuur_MSB toe
  • digitalWrite(cs, HIGH);
    • Zet Chip Select weer op 5 Volt (of 3,3 Volt)
    • De RTC gaat rustig door met de tijd bijhouden, maar luisterd niet meer naar de SPI-bus.

Er valt overigens veel meer over SPI te vertellen, maar dat komt later.

Hier een tabel met alle geheugen adressen van de DC3234 RTC:

 

 

 

 

Belangrijk

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>