Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

[resolu] DS1307 (RTC) + LCD + PIC 16F877 A
venom
Avatar de l’utilisateur
Expert
Expert
Messages : 1621
Âge : 40
Enregistré en : avril 2016
Localisation : Klyntar
Contact :

#1 Message par venom » mar. 12 avr. 2016 23:31

Bonsoir,

Voilà je suis tomber sur votre code en recherchant le moyen de faire fonctionné / récupéré l'heure d'un DS 1307.

J'ai donc essayé d'adapter votre code a un microcontrolleur 16f877A et un ecran lcd. Malhereusement rien a faire pas moyen d'afficher la date et l'heure.

Voici un screen de ma simulation sous proteus :
ds1307.png


La seule chose que j'ai du enlevé de votre code est :

Code : Tout sélectionner


  ANSELA 
= 0;               // Configure le PORTA en digital
  ANSELB = 0;               // Configure le PORTB en digital
  ANSELC = 0;               // Configure le PORTC en digital
  SLRCON = 0;               // ?? Configure all PORTS at the standard Slew    


Car sans doute non compatible avec mon pic.
Pensez vous que ça peut être la cause ?
Cordialement Venom

ps: je suis novice dans le domaine. :oops:






@++
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Modifié en dernier par venom le jeu. 14 avr. 2016 06:33, modifié 1 fois.
Mon site web
Mon discord : venom#4888

DS1307 (RTC) + LCD + PIC 16F877 A
Jérémy
Administrateur du site
Administrateur du site
Messages : 2750
Âge : 46
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#2 Message par Jérémy » mer. 13 avr. 2016 08:25

Bonjour venom,

Tout d'abord bienvenu sur FantasPic.

 ! Message de modération :
Déplacement du sujet dans la partie adéquate


Je me suis permis de déplacer ton sujet pour le mettre dans la bonne catégorie. Il est préférable, afin d'avoir un maximum de réponse, de mettre le lien de la DS de son PIC, afin de faciliter le travail des personnes voulant t'aider.

Pour répondre à ta question, OUI cela peut être la cause, car si tes ports ne sont pas en digital, tu va avoir de belle surprise. Il faut trouvé la commande pour les mettre en digital sur ton PIC et sur ton compilateur?

Avec quel compilateur travail tu ?
As tu essayé d’afficher en premier du texte sur ton LCD ? Un tuto est en cours sur les LCD justement.
Peut tu poster TOUT ton code ?

Je repasse tout à l'heure pour creuser tout ça

A+
C'est en faisant des erreurs, que l'on apprend le mieux !!!

DS1307 (RTC) + LCD + PIC 16F877 A
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#3 Message par Guest » mer. 13 avr. 2016 08:40

bonjour

Sur le schéma le rétroéclairage a la masse pas bon il faut passer par un potar.

Pour le soft quand on début en C on utilise les librairies fournies avec le compilateur, après si cela ne fonctionne,pas, problème initialisation du pic ou du LCD et de la liaison serie.
Pour les ports en digital je ne pense pas surtout sur le PORTB le digital ou analogique c'est sur le PORTA et PORTE, maintenant qu'il soit mal configure en entrée ou en sortie nous ramène a la configuration du pic ;)
A+

DS1307 (RTC) + LCD + PIC 16F877 A
Jérémy
Administrateur du site
Administrateur du site
Messages : 2750
Âge : 46
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#4 Message par Jérémy » mer. 13 avr. 2016 10:41

Re,

J'ai regardé un peu mieux. JE ne connais pas les simulateurs et leurs réactions.

1/ en principe on place une résistance de Pull-UP sur la broche MCLR et pas direct au PIC . ( genre 10k)
2/ MaÏ a raison il ne faut pas mettre la broche Vee du LCD à la masse mais sur un potentiomètre pour régler la luminosité . Si tu le mets à la masse la luminosité sera au plus faible et donc tu ne verra rien ( je sais pas si ça fonctionne en simu). Pareil si tu la mets à Vcc tu risque d'avoir trop de contraste et donc tout noir.
3/ Sans DS du DS1307, je trouve bizarre que le plusde l’alimentation soit branché sur Vout ( qui me semblerais une sortie plutôt qu'une entrée).
4/ Ta DS1307 est alimentée en 3V ton pic en 3.3v ? sinon peut être un probléme de signal si en 5V sur le bus I2C ?

Sans ton programme complet dur d'aller plus loin .

Essaye de faire fonctionner ton LCD tout seul ( genre affiche un texte quelconque) ,puis ensuite une variable .
Il faut tout de même que tu passe le PORTB en numérique . ( voir la commande)
L'i2C est bien initialisé ? ainsi que le LCD ?
C'est en faisant des erreurs, que l'on apprend le mieux !!!

DS1307 (RTC) + LCD + PIC 16F877 A
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#5 Message par Guest » mer. 13 avr. 2016 11:51

Jérémy a écrit :Il faut tout de même que tu passe le PORTB en numérique . ( voir la commande)

Curieux tu sais pourquoi? la c'est moi qui suis curieux ;) puisque il n'y a pas d'analogique sur le PORTB d'un 16F877A,
venom tu peux poster un peu plus de code ou ton code merci ;)

A+

DS1307 (RTC) + LCD + PIC 16F877 A
paulfjujo
Avatar de l’utilisateur
Maître
Maître
Messages : 3260
Âge : 75
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#6 Message par paulfjujo » mer. 13 avr. 2016 13:51

3/ Sans DS du DS1307, je trouve bizarre que le plusde l’alimentation soit branché sur Vout ( qui me semblerais une sortie plutôt qu'une entrée).



tout à fait ; SOUT est une sortie (collecteur ouvert) pouvant etre à 1Hz ou multiple suivant l'init du RTC DS1307
Vbat doit etre connecté à VBat ! alim de secours de la RTC.
le DS1307 serait alimenté en 5V .. mais avec le simulateur Proteus ?????
Dans la vraie vie on ne se pose pas une telle question.
Aide toi, le ciel ou FantasPic t'aidera

[resolu] DS1307 (RTC) + LCD + PIC 16F877 A
venom
Avatar de l’utilisateur
Expert
Expert
Messages : 1621
Âge : 40
Enregistré en : avril 2016
Localisation : Klyntar
Contact :

#7 Message par venom » mer. 13 avr. 2016 21:20

Bonsoir a tous,

Merci d'avance pour votre aide. Je vais essayé de répondre a toutes vos questions ;)

Avec quel compilateur travail tu ?
Je travail avec mikroC

As tu essayé d’afficher en premier du texte sur ton LCD ?
oui et le texte s'affiche bien.

Peut tu poster TOUT ton code ?
Bien sur, le voici :

Code : Tout sélectionner

/*----------------------------------------------------------------------------------
- Tutoriel Module RTC 2 click sur plaque easyPic 7
- fait par Jérémy le 01/11/2015 sur www.FantasPic.fr
- Pic 18F45K22 avec MikroC 6.6.2
- Fosc : 8Mhz
----------------------------------------------------------------------------------*/

#define RTC_ADDR  0xD0   // Adresse I²C de l'esclave + ecriture ( DS1307) 0xD0

// LCD module connections
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;

// Constantes
/* unsigned char txt1[]=" RTC2 click sur ";
unsigned char txt2[]="www.FantasPic.fr"; */

// Variables
unsigned char heuresminutessecondesjourn_jourmoisannee,  D_secondes,  U_secondes;
char oldstate 0;

// Prototypes
unsigned short Bcd2Dec(unsigned short decnum);
unsigned short Dec2Bcd(unsigned short decnum);

/****************************************************************************
* Fonction: Lire les données sur le RTC
* parametre d'entrée : adresse du registre à lire
* parametre de sortie : valeur lue dans le registre
**********************************************************************************/
unsigned char RTC_Read(unsigned char addr){
  
unsigned char value// Déclaration variable temporaire

  
I2C1_Start();        // Début de l'I²C
  
I2C1_Wr(RTC_ADDR);   // Adresse du RTC ( 0xD0 cf datasheet)
  
I2C1_Wr(addr);       // adresse du registre à lire
  
I2C1_Start();        // On répète le signal de départ
  
I2C1_Wr(RTC_ADDR);   // Adresse du DS1307

  
value I2C1_Rd(0);  // lecture et enregistrement de la valeur le 0=pour no ACK
  
I2C1_Stop();         // Arrêt de l'I²C

  
return value;        // On retourne la valeur lue
}

/**************************************************************************************************
* Fonction: Ecrire les données sur le DS1307
* parametre d'entrée : adresse du registre à ecrire + valeur à y mettre
**************************************************************************************************/
void RTC_Write(unsigned char addrunsigned char value){
  
I2C1_Start();         // Début de l'I²C
  
I2C1_Wr(RTC_ADDR);    // Adresse du RTC ( 0xD0 cf datasheet)
  
I2C1_Wr(addr);        // adresse du registre à écrire
  
I2C1_Wr(value);       // On écrit la valeur dans le registre
  
I2C1_Stop();          // Arrêt de l'I²C
}

/**************************************************************************************************
* Fonction: Ecrire le Groupe Date Heure sur appui du BP
* parametre d'entrée : Les 7 valeurs du GDH à initialiser
**************************************************************************************************/
void Ecrire_GDH (unsigned char heures unsigned char minutesunsigned char secondes ,
unsigned char jour,unsigned char n_jourunsigned char mois,unsigned char annee){

  
I2C1_Start();         // Début de l'I²C
  
I2C1_Wr(RTC_ADDR);    // Adresse du RTC ( 0xD0 cf datasheet)
  
I2C1_Wr(0);           // Met le pointeur à cette adresse ( N° registre)

  
secondes Dec2Bcd(secondes); // Conversion de décimal en BCD pour le RTC
  
I2C1_Wr(secondes);            // On écrit la valeur dans le registre des secondes
  
minutes Dec2Bcd(minutes);   // Après écriture la valeur du pointeur du registre est incrémenter automatiquement
  
I2C1_Wr(minutes);             // On peut enchainer directement avec la prochaine valeur
  
heures Dec2Bcd(heures);     // etc ... toutes à la suite.
  
I2C1_Wr(heures);
  
jour Dec2Bcd(jour);
  
I2C1_Wr(jour);
  
n_jour Dec2Bcd(n_jour);
  
I2C1_Wr(n_jour);
  
mois Dec2Bcd(mois);
  
I2C1_Wr(mois);
  
annee Dec2Bcd(annee);
  
I2C1_Wr(annee);

  
I2C1_Stop();                      // Arrêt de l'I²C
}

/**************************************************************************************************
* Fonction: Lit le Groupe Date Heure sur le RTC pour mettre à jour l'affichage
**************************************************************************************************/
void Lecture_GDH(){

  
I2C1_Start();                // Début de l'I²C
  
I2C1_Wr(RTC_ADDR);           // Adresse du RTC ( 0xD0 cf datasheet)
  
I2C1_Wr(0);                  // lecture à cette adresse ( N° registre)
  
I2C1_Repeated_Start();       // On répète le signal de départ
  
I2C1_Wr(RTC_ADDR+1);         // Adresse du DS1307 (1=lire / 0=ecrire)

  
secondes I2C1_Rd(1);          // Lecture et enregistrement de la valeur
  
secondes Bcd2Dec(secondes);   // Conversion de BCD en décimal pour l'afficheur
  
minutes I2C1_Rd(1);
  
minutes Bcd2Dec(minutes);
  
heures I2C1_Rd(1);
  
heures Bcd2Dec(heures);
  
jour I2C1_Rd(1);
  
jour Bcd2Dec(jour);
  
n_jour I2C1_Rd(1);
  
n_jour Bcd2Dec(n_jour);
  
mois I2C1_Rd(1);
  
mois Bcd2Dec(mois);
  
annee I2C1_Rd(0);
  
annee Bcd2Dec(annee);

  
I2C1_Stop();                    // Arrêt de l'I²C
}

/*##################################################################################
##########################    PROGRAMME PRINCIPAL    ###############################
##################################################################################*/
void main(){
 
/* ANSELA = 0;               // Configure le PORTA en digital
  ANSELB = 0;               // Configure le PORTB en digital
  ANSELC = 0;               // Configure le PORTC en digital
  SLRCON = 0;               // ?? Configure all PORTS at the standard Slew */


  
PORTB 0;
  
TRISB 0;                 // Configure PORTB as output

  
TRISA0_bit 1;           // Met RA0 en entrée pour le BP.
                            // Utilisé pour initialisé l'horloge avec une valeur enregistrée

  
I2C1_Init(100000);        // Initialise le BUS I2C
  
Lcd_Init();               // Initialise le Lcd

  
Lcd_Cmd(_LCD_CLEAR);      // Efface écran
  
Lcd_Cmd(_LCD_CURSOR_OFF); // Curseur off
/*Lcd_Out(1,1,txt1);        // Écrit le texte de présentation 1er ligne
  Lcd_Out(2,1,txt2);        // Écrit le texte de présentation 2iéme ligne */

  
LCD_Chr(1,9,'.');         // On écrit la matrice du texte statique
  
LCD_Chr(1,12,'.');
  
LCD_Out(2,1,"Heure:");
  
LCD_Chr(2,11,':');
  
LCD_Chr(2,14,':');
  
LCD_Out(1,13,"20");       // le 20 c'est pour l'année 20xx

  
Ecrire_GDH06,  36,  50,    4,  140416);  //heure: min: sec: N°jour: jour: mois: année
  
/*##################################################################################
############################    BOUCLE INFINIE    ##################################
##################################################################################*/
  
while(1){
      
/*if (Button(&PORTA, 0, 1, 0))oldstate = 1;  // Anti-rebond
      if (oldstate && Button(&PORTA, 0, 1, 1)) { // Si le BP est appuyé on envoi le GDH suivant
         Ecrire_GDH( 23,  59,  50,    4,  31, 12, 15);  //heure: min: sec: N°jour: jour: mois: année
         oldstate = 0;  // mise à 0 du flag
       }*/

      
Lecture_GDH();

      switch(
jour)       // On sélectionne le jour suivant la valeur retournée
        
{
          case 
1LCD_Out(1,1"Lundi"); break;  // Affichage du jour en fonction de la valeur
          
case 2LCD_Out(1,1"Mardi"); break;
          case 
3LCD_Out(1,1"Mer "); break;
          case 
4LCD_Out(1,1"Jeudi"); break;
          case 
5LCD_Out(1,1"Vend "); break;
          case 
6LCD_Out(1,1"Sam "); break;
          case 
7LCD_Out(1,1"Dim "); break;
        }

      
Lcd_Chr(1,7, (n_jour 10)   + 48);  // Le numéro du jour dizaine
      
Lcd_Chr(1,8, (n_jour 10)   + 48);  // Le numéro du jour unité
      
Lcd_Chr(1,10, (mois 10) + 48);
      
Lcd_Chr(1,11, (mois 10) + 48);
      
Lcd_Chr(1,15, (annee 10)  + 48);
      
Lcd_Chr(1,16, (annee 10)  + 48);

      
Lcd_Chr(2,9, (heures 10)   + 48); // Deuxième lignes 9iéme caractère dizaine des heures
      
Lcd_Chr(2,10, (heures 10)   + 48); // Unité des heures
      
Lcd_Chr(2,12, (minutes 10) + 48);
      
Lcd_Chr(2,13, (minutes 10) + 48);
      
Lcd_Chr(2,15, (secondes 10) + 48);
      
Lcd_Chr(2,16, (secondes 10) + 48);

        
Delay_mS(10); // pause de 10ms
   
}


Sur le schéma le rétroéclairage a la masse pas bon il faut passer par un potar.
Sous simulation le lcd s'allume toujours bien avec ou sans potar.

Ta DS1307 est alimentée en 3V ton pic en 3.3v ?
j'avoue ne pas savoir a combien est le pic. Mais je pense que la simulation n'en prend pas compte.

Après j'ai encore du mal a bien comprendre les datasheet :oops: peux être trop novice pour ce projet.

si non voici le datasheet du 16f877A

Merci de votre aide en tout cas. Merci !
Ps: vous ne travaillez jamais avec des simulateurs ?






@++
Modifié en dernier par venom le jeu. 14 avr. 2016 06:39, modifié 2 fois.
Mon site web
Mon discord : venom#4888

DS1307 (RTC) + LCD + PIC 16F877 A
Gérard
Avatar de l’utilisateur
Expert
Expert
Messages : 1938
Âge : 67
Enregistré en : septembre 2015
Localisation : Alsace - Haut-Rhin

#8 Message par Gérard » mer. 13 avr. 2016 22:22

La batterie de backup se branche sur VBat.
La DS1307 s'alimente en 5V.
Le 877 n'a pas de registre ANSEL.
Le simulateur n'est pas la vrai vie.
Le 18/04/19 je suis devenu papy de jumeaux, le 01/09/23 une petite cousine des jumeaux est née.

DS1307 (RTC) + LCD + PIC 16F877 A
Jérémy
Administrateur du site
Administrateur du site
Messages : 2750
Âge : 46
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#9 Message par Jérémy » jeu. 14 avr. 2016 00:01

Ps: vous ne travaillez jamais avec des simulateurs ?

J'ai la chance de posséder une carte easyPic7, que je trouve bien mieux qu'un simulateur ! :D car c'est du réel ! Et j'ai jamais trouve de bon simulateur gratuit, tous sont hors de prix.

Pense à regarder aussi les adresse I2C de ton simulateur si c'est bon ? Tiens nous au jus
C'est en faisant des erreurs, que l'on apprend le mieux !!!

[resolu] DS1307 (RTC) + LCD + PIC 16F877 A
venom
Avatar de l’utilisateur
Expert
Expert
Messages : 1621
Âge : 40
Enregistré en : avril 2016
Localisation : Klyntar
Contact :

#10 Message par venom » jeu. 14 avr. 2016 06:33

C'est bon j'ai trouver. En faite mon montage ainsi que le code était "bon" car sous simulateur, il faut ajouté le debugger I2C :)

Voici le montage modifier pour vous montrer le changement :

DS1307.png


Ok pour la easypic7 Jérémy, je me doute que sa doit être mieux pour bosser dessus ;) mais c'est chère :?
Merci de votre aide en tout cas.







@++
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Modifié en dernier par venom le jeu. 14 avr. 2016 18:46, modifié 3 fois.
Mon site web
Mon discord : venom#4888


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 2 invités