Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Déclaration de l'i2c n°2
18-11-2017, 11:07 AM,
#1
Déclaration de l'i2c n°2
Bonjour,
Je tente de développer un horloge basée sur ma carte perso 32MX250.
Comme indiqué sur le schéma de mon post le module DS3231 est connecté sur l'i2c n°1 (donc SDA sur D3 et SCL sur D4 ce qui correspond au port i2c n°1 du 32MX250).
Tout fonctionne en utilisant l'afficheur LCD (branché sur D6, D7, D8, D9, D10 et D11).
Je souhaiterai utiliser l'afficheur ST7735, cependant il utilise la broche D3 et D4 sur lesquelles je branche normalement le DS3231.
En vérifiant le tableau des "pinouts" du 32MX250, je constate que ce circuit dispose d'un second port i2c (i2c n°2) avec les broches SDA2 sur D10 et SCL2 sur D9.
Je vais donc installer le DS3231 sur les broches D9 et D10 pour pouvoir utiliser l'afficheur ST7735.
Voici donc ma question :
Comment déclarer l'utilisation de l'i2c n°2 du 32MX250 ? Sachant que la déclaration s'effectue par défaut sur l'i2c n°1
Reply
20-11-2017, 12:50 PM,
#2
RE: Déclaration de l'i2c n°2
Salut,
I2C.master(I2C_100KHZ); initie l'I2C1 par défaut.
C'est équivalent à : I2C1.master(I2C_100KHZ);
Donc pour l'I2C2 : I2C2.master(I2C_100KHZ);
Toutes les autres commandes sont à l'avenant, ex :
I2C2.start();
I2C2.write(0x00);
etc ...
It is easier to complain than it is to do, but it is better to do than it is to complain.
Reply
23-11-2017, 10:18 AM, (This post was last modified: 23-11-2017, 10:20 AM by Techno.)
#3
RE: Déclaration de l'i2c n°2
Compilation et fonctionnement sur carte 32MX250 de l'I2C n°2 impeccable...
J'affiche donc l'heure d'un DS3231 sur un afficheur ST7735.
Merci beaucoup
Reply
23-11-2017, 11:22 AM,
#4
RE: Déclaration de l'i2c n°2
Si tu n'y vois pas d'inconvénient, j'ajouterais bien ton programme aux exemples pour montrer comment faire fonctionner le DS3231.
It is easier to complain than it is to do, but it is better to do than it is to complain.
Reply
24-11-2017, 07:59 PM,
#5
RE: Déclaration de l'i2c n°2
Bien sur,
Voici le sketch avec les commentaires permettant de comprendre l'ensemble.
Sur un DS3231 neuf, il est nécessaire de le mettre à l'heure... Ce sketch ne le permet pas....
Code:
/*-----------------------------------------------------
Author origin : --<Dave Maners>&<régis Blanchot>
Modification : --<Thierry Lancelot>
Date: nov 2017

Description: utilisation du RTC DS3231 avec affichage de la date et de l''heure sur un ST7735, pas de mise à l''heure possible avec ce sketch
Tester sur carte perso 32MX250 avec Pinguino V12 et P32 Mis à jour


Fonctionnement RTC DS3231
SDA connection à SDA2 pin D10
SCL connection à SCL2 pin D9
Address i2c du module DS3231 = xD0
Alimentation en +3.3V

Registre Adresse
seconde (0 à 59) 00
minute (0 à 59) 01
heure (0 à 23) 02
jourSem (1 à 7) 03 Dimanche:1 Lundi:2 Mardi:3 Mercredi:4 Jeudi:5 Vendredi:6 Samedi:7
date (1 à 31) 04
mois (1 à 12) 05 Janvier:1 Fevrier:2 -----------> Décembre:12
année (0 à 99) 06


Les données de lecture du module RTC sont en BCD
Il est indispensable de convertir les informations binaire codé décimal vers décimal par bcdToDec
u8 bcdToDec(u8 val)
{ return ( (val/16*10) + (val%16) ); } val%16 correspond au modulo donc le restant de la division par 16

L'écriture des données s'effectue en format Hexadécimal


Pour l'écriture : wbuffer[0] = première adresse de registre à lire --- wlength = n (octets de données à envoyer) + 1 (address byte to specify)
rlength = 0 si rien à recevoir

Pour la lecture : wbuffer[0] = première adresse de registre à lire --- wlength = 1 (address byte to specify)
rlength = n (octets de données à recevoir)


ST7735 PINGUINO
---------------------------------------
LED VSS (+3.3V)
SCK D0
SDA D4
A0 (DC) digital pin D1
RESET VSS
CS D3
GND GND
VSS VSS (+3.3V)

#define SPITFT SPI2
ST7735.init(SPITFT, 1); DC sur D1
-----------------------------------------------------*/



#include <fonts/ArialBold14.h> //pour changer d'écriture, il faut aussi changer la ligne 168

#define SPITFT SPI2 //Hardware SPI

// u8 est une variable 1 octet
u8 I2C_address=0xD0; //Address i2c du module DS3231
u8 reg=0x00; // registre à lire
u8 i2c_tx_buffer[8]; //réservation 8 emplacements d'1 octet **** buffer de transmission***
u8 i2c_rx_buffer[7]={0,0,0,0,0,0,0}; //réservation 7 emplacements d'1 octet et écriture de 0 **** buffer de réception***

char Jour[8][8] = {"","Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"}; //8 emplacements avec des mots de 8 lettres
char Mois[13][8] = {"","janvier","fevrier","mars","avril","mai","juin","juillet","aout","septembre","octobre","novembre","decembre"}; //13 emplacements avec des mots de 8 lettres


int seconde, minute, heure, jourSem, date, mois, an; // déclaration des variables pour le module DS3231



// envoyer et recevoir des données
u8 DS3231_send_receive(u8 address, u8 *wbuffer, u8 wlength, u8 *rbuffer, u8 rlength)
{
u8 i;
u8 temp;

I2C2.start();

if(!I2C2.writeChar(address))
{
do
{
I2C2.restart();
}
while(!I2C2.writeChar(address));
}


for (i=0; i<wlength; i++)
{
while(!I2C2.writeChar(wbuffer[i]));
}


if( rlength > 0)
{
temp = address | 0x01;
do
{
I2C2.restart();
delay(500);
}
while(!I2C2.writeChar(temp)); // operation de lecture (bit 0 set to 1)

for (i=0; i<rlength; i++) // lecture séquentielle (par incrémentation)
{
rbuffer[i] = I2C2.readChar();
if (i== (rlength-1)) // Le dernier octet est envoyé ?
I2C2.sendNack(); // Oui, envoyer un Nack à l'esclave (fin de la lecture)
else
I2C2.sendAck(); // Non, envoyer un Ack (pour continuer la lecture)
}
}

I2C2.stop();
return(1);
}
// Fin de la routine "envoyer et recevoir des données"



// Conversion decimal vers binaire codé décimal
u8 decToBcd(u8 val)
{
return ( (val/10*16) + (val%10) ); // val%10 correspond au modulo donc le restant de la division par 10
}



// Conversion binaire codé décimal vers décimal
u8 bcdToDec(u8 val)
{
return ( (val/16*10) + (val%16) ); // val%16 correspond au modulo donc le restant de la division par 16
}



// réception des données du DS3231
void ReceptionDS3231(void)
{
I2C2.master(I2C_100KHZ); //Mode de fonctionnement de l'I2C2
i2c_tx_buffer[0]=reg;

while(!DS3231_send_receive(I2C_address,i2c_tx_buffer,1,i2c_rx_buffer,7));

seconde = bcdToDec(i2c_rx_buffer[0] & 0x7f);
minute = bcdToDec(i2c_rx_buffer[1] );
heure = bcdToDec(i2c_rx_buffer[2] & 0x3f); // Need to change this if 12 hour am/pm
jourSem = bcdToDec(i2c_rx_buffer[3] );
date = bcdToDec(i2c_rx_buffer[4] );
mois = bcdToDec(i2c_rx_buffer[5] );
an = bcdToDec(i2c_rx_buffer[6] );
}




void setup()

{

ST7735.init(SPITFT, 1);
ST7735.setFont(SPITFT,ArialBold14);
ST7735.setBackgroundColor(SPITFT, ST7735_YELLOW);
ST7735.setColor(SPITFT, ST7735_GREEN);
ST7735.setOrientation(SPITFT, 90);
ST7735.clearScreen(SPITFT);

}





void loop()
{

ReceptionDS3231();

// Affichage de l'heure
ST7735.setColor(SPITFT, ST7735_BLUE);
ST7735.setCursor(SPITFT, 2, 4);
ST7735.printf(SPITFT, "%02d:%02d:%02d\r\n", heure, minute, seconde); //Exemple d'affichage : 18:43:18


// Affichage de la date
ST7735.setColor(SPITFT, ST7735_GREEN);
ST7735.setCursor(SPITFT, 0, 2);
ST7735.printf(SPITFT, "%8s %2d %8s \r\n", Jour[jourSem], date, Mois[mois] ); //Exemple d'affichage : Vendredi 24 novembre

}
Reply
27-11-2017, 12:43 PM,
#6
RE: Déclaration de l'i2c n°2
Merci.
It is easier to complain than it is to do, but it is better to do than it is to complain.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)