Hodiny RTC s kalendárom pomocou PCF8583
Zo stránky SensorWiki
Autori: | Győző Katona, Robert Nehánszki | |
Študijný odbor: | Aplikovaná mechatronika | 2. Ing. (2014/2015) |
Zadanie
- Popíšte ako funguje samotný senzor, ako sa pripojí k mikropočítaču.
- Zobrazte na LCD displeji a cez terminál reálny čas, deň a rok z obvodu PCF8583.
- Vyriešte naprogramovanie alarmu (denný, dňový alebo mesačný), alarmový stav zobrazte napríklad pomocou LED diódy.
Literatúra:
- Zoznam použitej literatúry, vrátane katalógových údajov (datasheet), internetových odkazov a pod.:
Odkazy produktu:
Ďalšie užitočné odkazy:
Analýza
Ako už bolo spomenuté, našou úlohou je vytvoriť hodiny reálneho času pomocou čipu PCF 8583. PCF 8583 je hodinovo-kalendárový čip. Adresy a dáta sú prenášané sériovo po zbernici i2c. Adresa zabudovaných registrov je inkrementovaná automaticky po každom zápise alebo čítaní jedného bajtu. Adresný pin A0 slúži na naprogramovanie adresy čipu, a dovoľuje nám zapojiť dva rovnaké čipy na tú istú zbernicu bez pridania ďalšieho hardware-u. Ako mikroprocesor sme použili Atmegu 328P, ktorá je nasadená na vývojovej doske Acrob.
Kľúčové vlastnosti čipu PCF8583:
- napájacie napätie i2c zbernice 2,5 V až 6 V
- 240 x 8 bitová nízko-napäťová pamäť
- operačný prúd (pri f(scl)=0 Hz) maximálne 50 uA
- funkcia hodín so štvorročným kalendárom
- časovač s alarmom, indikácia pretečenia
- 12 alebo 24 hodinový formát času
- potreba 32,768 kHz kryštálu
- dvojvodičová zbernica i2c
- automatická inkrementácia adresy po zápise/čítaní
- programovateľný alarm, časovač a prerušovacie funkcie
- adresa slave-u A1h alebo A3h pre čítanie, A0h alebo A2h pre zápis (podľa stavu pinu A0)+
Rozloženie pinov
Popis pinov PCF 8583
PIN | Skratka-označenie | Krátky popis | I/O |
---|---|---|---|
1 | OSCI | Vstupný pin pre kryštál | Vstup |
2 | OSCO | Výstupný pin oscilátora | Výstup |
3 | A0 | Pin pre voľbu adresy | Vstup |
4 | Vss | Napájacie napätie | Napájanie |
5 | SDA | Linka serial data | Vstup/výstup |
6 | SCL | Linka serial clock | Vstup |
7 | INT | Open-drain výstup prerušenia (aktívne LOW) | Výstup |
8 | Vdd | Napájacie napätie | Napájanie |
Zbernica i2c
I2c zbernica je skratka ktorá vznikla z názvu IIC zbernica, teda Internal-Integrated-Circuit Bus. Z názvu je hneď jasné, že sa jedná o internú dátovú zbernicu, ktorá slúži na komunikáciu a prenos dát medzi jednotlivými integrovanými obvodmi, väčšinou v rámci jedného zariadenia. Túto zbernicu vyvinula spoločnosť Philips približne pred 30 rokmi a od tej doby prešla niekoľkými vylepšeniami. V dnešnej dobe tento spôsob komunikácie podporuje celá rada integrovaných obvodov nielen firmy Philips. V prvom rade sa jedná o mikropočítače, sériové pamäte, inteligentné LCD obrazovky, a/d a d/a prevodníky, atď. Hlavnou výhodou je, že obojstranná komunikácia prebieha len po dvoch vodičoch SDA data a SCL hodiny, a tým pádom sa zjednoduší výsledné zapojenie celého obvodu. Na jednu zbernicu môžeme pripojiť viac integrovaných obvodov.
Spôsob adresovania:
- 7 bitové adresovanie - 128 čipov na tej istej zbernici
- 10 bitové adresovanie - 1024 čipov na tej istej zbernici
- na pevno (určené výrobcom čipu)
Prenosová rýchlosť je pre väčšinu aplikácií dostatočná už v základnej verzií, avšak zbernica prešla určitými vylepšeniami a tým pádom máme dnes rôzne prenosové rýchlosti. Rýchlosť prenosu však musí byť prispôsobená najpomalšiemu čipu na zbernici. Oba vodiče (SDA a SCL) musia byť v logickej jednotke, a to je zaistené pomocou pull-up odporov. čím je vyššia komunikačná rýchlosť, tým musia byť pull-up odpory menšie. Pre základnú rýchlosť 100 kHz postačujú odpory 4k7.
Rýchlosť zbernice i2c:
- základná - 100 kHz
- vylepšená - 400 kHz
- najrýchlejšia - až 1 MHz
Príklad zapojenia viacerých čipov na rovnakú zbernicu:
Princíp prenosu prostredníctvom i2c
Mikroprocesor sa považuje za MASTER a všetky ostatné obvody sú SLAVE. MASTER pri akomkoľvek prenosu generuje hodinový signál na vodiči SCL. Keď jeden čip vysiela, prijímajú všetky ostatné čipy na zbernici ale údaje spracuje len čip, ktorému boli dáta určené. Čip, ktorý chce dáta vyslať alebo prijať musí vždy najprv zadefinovať adresu čipu s ktorým chce nadviazať komunikáciu, a musí tiež určiť, či chce vysielať alebo čítať. To určuje bit R/W, ktorý je súčasťou adresy.
Prenos prebieha kombináciou nasledujúcich celkov:
- stav kludu - Tento stav je zaistený logickými jednotkami na oboch vodičoch, tj. MASTER negeneruje žiadny hodinový signál a neprebieha žiadny prenos. Logické jednotky sú zabezpečené pomocou pull-up odporov. Pull-up odpor je odpor medzi vodičom a napájacím napätím.
- start bit - Zahajuje prenos, alebo jeho ďalšiu časť. Je vygenerovaný tak, že sa zmení úroveň SDA z 1 na 0, zatiaľčo SCL = 1
- stop bit - Ukončuje prenos. Je generovaný podobne ako start bit. Úroveň SDA sa zmení z 0 na 1, zatiaľčo SCL = 1
- prenos dát - Všetky dáta sú prenášané po 1 bajt, teda 8 po sebe idúcich bitov od najvyššieho po najnižší. Pri prenose dát sa môže logická úroveň na SDA meniť len keď SCL = 0.
- ACK - tento bit slúži k potvrdeniu správneho prijatia dát. Odosiela sa rovnakým spôsobom, ako keby sa odosielal deviaty bit dát, ale s tým rozdielom, že ho generuje čip ktorý prijímal dáta a nie ten ktorý ho odosielal. Pokial prenos prebehol v poriadku, tak odošle logickú 0. Pokiaľ prenos zlyhal odošle sa logická 1. Pokiaľ má dojsť k ukončeniu prenosu, tak sa neodošle ACK.
Popis riešenia
Použitý RTC čip je štandartne pripojený k mikroprocesoru Atmega 328P pomocou dvoch vodičov SDA a SCL. V našom prípade však využívame aj dodatočné funkcie čipu PCF8583, a práve preto pripájame k mikroprocesoru aj tretí vodič. Spomenutou funkciou je zabudovaný alarm, ktorý v určitých časových intervaloch (aké si nastaví užívateľ), spustí alarmový stav, tj. niečo sa udeje, napríklad sa spustí siréna, spustí sa určité svetelné výstražné značenie alebo zapne sa motor, atď. Všetky tri vodiče musia byť pripojené na napájacie napätie (+5 V) pomocou pull-up odporov. Tie nám zabezpečia, že v kľudovom stave bude na všetkých troch zapojených pinoch logický stav 1. Taktiež sme využili 20 pinový konektor X1 vývojovej dosky Acrob na pripojenie LCD displeja.
Schéma zapojenia snímača PCF8583 k vývojovej doske Acrob
Algoritmus a program
Algoritmus je napísaný v programovacom prostredí AVR studio 4. Jednotlivé časti kódu budú vysvetlené nižšie. Pre jednoduchšie pochopenie programu nám poslúži vývojový diagram, v ktorom sú veľmi stručne opísané jednotlivé deje, ktoré sa udejú pri chodu programu. Aktuálny čas máme možnosť zobraziť na LCD displeji, alebo použijeme sériovú komunikáciu USART, a dáta vypíšeme napríklad pomocou programu Terminal
Vývojový diagram
Prvý krokom je zadefinovanie všetkých použitých knižníc. Knižnice slúžia na správnu funkciu a ovládanie všetkých použitých periférnych častí procesora. Niektoré sa použijú pri sériovej komunikácií cez USART, niektoré pri i2c komunikácií alebo pri operáciách s LCD displejom. V našom prípade sme použili 12 knižníc, a sú nasledovné:
#include <inttypes.h>
#include <compat/twi.h>
#include "serial.h"
#include "i2cmaster.h"
#include <avr/interrupt.h>
#include <stdlib.h>
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "lcd.h"
Ďalším krokom bolo definovať rýchlosť nielen procesora ale aj rýchlosť komunikácie prostredníctvom i2c zbernice. V našom prípade procesor je taktovaný na frekvenciu 16 Mhz, rýchlosť komunikácie zbernice i2c je 100 kHz. Pre danú operáciu táto rýchlosť plne postačuje.
V main funkcií najprv prebieha inicializácia pripojeného LCD displeja, nastavenie jednotlivých portov a povolenie prerušenia (v prípade, že chceme túto možnosť využiť)
lcdInit4(); // inicializácia v 4-bitovom režime
lcdControlWrite(1<<LCD_CLR); // zmazanie displeja
lcdControlWrite(0x40); // nastavenie pozície 0,0, tj. ľavý horný roh
DDRB &= ~(1<<PCINT0); // nastavenie PB0 ako vstup
PORTB |= (1<<PCINT0); // aktivácia pull-up rezistorov
PCMSK0 |= (1 << PCINT0); // aktivácia PCINT0
PCICR |= (1 << PCIE0); // aktivácia prerušenia na aktivovanom PCINT0
sei (); // povolí prerušenie
DDRB=0x20; // PB5 - výstup na žltú LED diódu
PORTB = 0x00; // logický stav PORTB = 0, tj. LED nesvieti
/* A nezabudnite zdroják hojne komentovať */
int main(void) {
printf("Hello, World!\n");
return(0);
Nezabudnite však nahrať aj kompletné zdrojové kódy vášho programu!
Zdrojový kód: serial.h a main.c
Overenie
Nezabudnite napísať čosi ako užívateľský návod. Z neho by malo byť jasné čo program robí, ako sa prejavuje a aké má užívateľské rozhranie (čo treba stlačiť, čo sa kde zobrazuje). Ak ste namerali nejaké signály, sem s nimi. Ak je výsledkom nejaký údaj na displeji, odfotografujte ho.
Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.