#Real Time Clock PCF8523 su CM3 Panel <abstract> Appunti collegamento modulo Real Time Clock (PCF8523) su CM3 Panel Acme Systems </abstract> ### Testato su Raspbian GNU/Linux 9.4 (stretch) Kernel 4.14.34-v7+ Installazione dei pacchetti necessari: <pre class="terminal"> $ sudo apt-get install python-smbus i2c-tools </pre> Modificare il file config.txt : <pre class="terminal"> $ sudo nano /boot/config.txt </pre> Aggiungere alla fine del file: <pre class="terminal"> # RTC PCF8523 GPIO 28 - GPIO 29 (i2c1 utilizzato dal touch screen) dtoverlay=i2c0-bcm2708,sda0_pin=28,scl0_pin=29,pin_func=6 dtoverlay=i2c0-rtc,pcf8523 </pre> Lanciare in sequenza i seguenti comandi <pre class="terminal"> $ sudo apt-get -y remove fake-hwclock $ sudo update-rc.d -f fake-hwclock remove $ sudo systemctl disable fake-hwclock </pre> Editare il file /lib/udev/hwclock-set e commentare le linee seguenti: <pre class="terminal"> $ sudo nano /lib/udev/hwclock-set </pre> <pre class="terminal"> #if [ -e /run/systemd/system ] ; then # exit 0 #fi </pre> Modificare il file /etc/modules: <pre class="terminal"> $ sudo nano /etc/modules </pre> <pre class="terminal"> # /etc/modules: kernel modules to load at boot time. # This file contains the names of kernel modules that should be loaded # at boot time, one per line. Lines beginning with "#" are ignored. snd-bcm2835 spi-bcm2708 i2c-bcm2708 i2c-dev rtc-8523 </pre> Modificare il file /etc/rc.local ed inserire prima della riga dove scritto exit 0 le seguenti istruzioni: <pre class="terminal"> $ sudo nano /etc/rc.local </pre> <pre class="terminal"> # PCF8523 echo pcf8523 0x68 > /sys/class/i2c-adapter/i2c-0/new_device exit 0 </pre> Effettuare il reboot della scheda. <pre class="terminal"> $ sudo reboot </pre> Dopo il reboot lanciare il comando : <pre class="terminal"> sudo i2cdetect -y 0 </pre> Sotto il risultato da ottenere, significa che l'indirizzo corrispondente è 0x68, esattamente quello che abbiamo inserito in precedenza nel file /etc/rc.local <pre class="terminal"> 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- -- </pre> Il comando seguente permette di vedere l'indirizzo utilizzato dal touch screen (i2c-1), ecco il motivo delle modifiche eseguite rispetto alla procedura trovata sul sito. <pre class="terminal"> sudo i2cdetect -y 1 </pre> Ora lanciare il comando seguente: <pre class="terminal"> sudo hwclock -D -r </pre> Verifica con comando dmesg, devono risultare le righe indicate di seguito. <pre class="terminal"> dmesg [ 12.149577] i2c i2c-0: new_device: Instantiated device pcf8523 at 0x68 [ 12.177994] rtc-pcf8523 0-0068: rtc core: registered rtc-pcf8523 as rtc0 </pre> ### Questa la parte dei collegamenti tra il modulo RTC e la scheda Acme CM3 Panel: Connettore espansione EXP2 <img src="./EXP2b.jpg" class="img-responsive left-block" width="30%" /> Connettore PCF8523 <img src="./RTC8523.jpg" class="img-responsive left-block" width="20%" /> Tabella riepilogativa collegamenti tra i pin del modulo RTC e quelli del connettore EXP2 della CM3 Panel. <img src="./Connessioni.jpg" class="img-responsive left-block" /> <div class="alert alert-warning"> <strong>Attenzione !</strong><br> <font color="red"> Ora faccio un test sullo scarto di precisione del modulo RTC, ho una CM3 Panel-U collegata alla rete internet ed un altra CM3 Panel-W alla quale è collegato il modulo RTC. La CM3 Panel-W è stata spenta dalle ore 18:00 del giorno precedente e riaccesa il giorno successivo alle ore 08:00 senza connessione alla rete internet. Verificando attraverso il sito: http://www.oraesattaitalia.it/ c'è uno scarto di +2 secondi, viene effettuato lo stesso test sulla CM3 Panel-U, in questo caso lo scarto è di +1 secondo. </font> </div> Sulla CM3 Panel-U lancio il seguente comando: <pre class="terminal"> $ sudo ntpdate ntp1.inrim.it 16 May 08:14:44 ntpdate[1575]: adjust time server 193.204.114.232 offset -0.000823 sec </pre> <div align="justify"> Provo a rifare lo stesso test sulla CM3 Panel-W, questa volta collegata alla rete WiFi, ma all'accensione mi accorgo che il clock è sincronizzato. Occorre che ripeto il test perchè avevo dimenticato che all'accensione la scheda c'è impostato il cron per la sincronizzazione dell'orario. </div> <pre class="terminal"> # Cronjob @reboot sudo ntpdate ntp1.inrim.it </pre> Lanciando il comando sulla scheda con RTC ottengo: <pre class="terminal"> $ sudo hwclock -D -r hwclock from util-linux 2.29.2 Using the /dev interface to the clock. Assuming hardware clock is kept in UTC time. Waiting for clock tick... /dev/rtc does not have interrupt functions. Waiting in loop for time from /dev/rtc to change ...got clock tick Time read from Hardware Clock: 2019/05/16 06:38:53 Hw clock time : 2019/05/16 06:38:53 = 1557988733 seconds since 1969 Time since last adjustment is 1557988733 seconds Calculated Hardware Clock drift is 0.000000 seconds 2019-05-16 08:38:52.386158+0200 </pre> <div align="justify"><font color="blue"> Ora sulla CM3 Panel-W con modulo RTC disattivo l'aggiornamento dell'orario al reboot e procedo alla sincronizzazione dell'orario di sistema (NTP server Italiano ntp1.inrim.it) attraverso il comando seguente: </font></div> <pre class="terminal"> $ sudo ntpdate ntp1.inrim.it </pre> <div align="justify"><font color="blue"> Ora scrivo l'orario di sistema su quello hardware. </font></div> <pre class="terminal"> $ sudo hwclock -w # Set the hardware clock from the current system time </pre> <div align="justify"><font color="blue"> Esempi. </font></div> <pre class="terminal"> $ sudo hwclock -r # Read hardware clock and print result $ date # Read system clock and print result </pre> ### Esito test di verifica sulla scheda con modulo RTC La scheda è stata spenta alle ore 10:00 il giorno precedente e riaccesa alle ore 11:30 del giorno successivo. La stessa una a volta avviata non ha effettuato <b>volutamente</b> nessuna sincronizzazione tramite server NTP server italiano. Una volta lanciato il comando seguente di sincronizzazione con lo stesso server NTP, il risultato è il seguente (offset 0.000914 sec). <pre class="terminal"> $ sudo ntpdate ntp1.inrim.it # Risultato 17 May 11:39:35 ntpdate[1301]: adjust time server 193.204.114.232 offset 0.000914 sec </pre> ### Datasheet <a href="./PCF8523.pdf">Modulo RTC PCF 8523</a> ### Links * CM3-PANEL - Panel PC based on Raspberry Compute Module 3 lite <https://www.acmesystems.it/CM3-PANEL> * Set Up & Test I2C | Adding a Real Time Clock to Raspberry Pi | Adafruit Learning System <https://learn.adafruit.com/adding-a-real-time-clock-to-raspberry-pi/set-up-and-test-i2c> @include='bio_mauro_tocci'
2018 Ⓒ TanzoLab