Driver pour DS1307 en C : Demande d'aide
Répondre à la discussion
Affichage des résultats 1 à 6 sur 6

Driver pour DS1307 en C : Demande d'aide



  1. #1
    lcoulon

    Driver pour DS1307 en C : Demande d'aide


    ------

    Bonjour

    Je cherche à utiliser une clock temps reelle : DS1307 avec un Pic pour passer un des ports du Pic à "1" ( RB0 par exemple ) lorsqu'une date et heure précise se présente.

    Pourriez vous m'aider svp, je ne sais pas comment démarrer.
    Je vous remercie beaucoup,

    Code:
    #include <16F876a.h> 
    #include <ds1307.h> 
    #fuses NOWDT,XT, PUT, NOPROTECT, BROWNOUT ,NODEBUG ,NOLVP 
    #use delay(clock=4000000) 
    #use rs232(baud=9600,parity=N,xmit=PIN_A0,rcv=PIN_A1,bits=8) 
    #zero_ram 
    
    int DATE,MTH,YR,HR,MT,SECDS,DOW; // 
    
    void main() {     
    
       setup_adc_ports(NO_ANALOGS); 
       setup_adc(ADC_OFF); 
       setup_spi(FALSE); 
       setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); 
       setup_comparator(NC_NC_NC_NC); 
       setup_vref(FALSE); 
    
       ds1307_init(); 
       while(1){ 
    
          ds1307_get_time(HR,MT,SECDS); 
          ds1307_get_date(DATE,MTH,YR,DOW);    
        
          printf("\rTime %2D:%02D:%02D",HR,MT,SECDS); 
          printf("      Date  %2D/%02D/%02D",DATE,MTH,YR); 
          delay_ms(100); 
           
          if(!input(PIN_C0 ))       
             ds1307_set_date_time(28,1,8,2,11,50,0);  // Time 11:50:00      Date   28/01/08    
       } 
    } 
    __________________________________________________
    
    DS1307.C 
    Code: 
    ////////////////////////////////////////////////////////////////////////////////// 
    ///                               DS1307.C                                   /// 
    ///                     Driver for Real Time Clock                           /// 
    ///                                                                          /// 
    /// ds1307_init() - Enable oscillator without clearing the seconds register -/// 
    ///                 used when PIC loses power and DS1307 run from 3V BAT     /// 
    ///               - Disable squarewave output                                /// 
    ///                                                                          /// 
    /// ds1307_set_date_time(day,mth,year,dow,hour,min,sec)  Set the date/time   /// 
    ///                                                                          /// 
    /// ds1307_get_date(day,mth,year,dow)               Get the date             /// 
    ///                                                                          /// 
    /// ds1307_get_time(hr,min,sec)                     Get the time             /// 
    ///                                                                          /// 
    //////////////////////////////////////////////////////////////////////////////// 
    #use delay(clock=4000000) 
    #define RTC_SDA  PIN_C4 
    #define RTC_SCL  PIN_C3 
    #use i2c(master, sda=RTC_SDA, scl=RTC_SCL) 
    
    BYTE bin2bcd(BYTE binary_value); 
    BYTE bcd2bin(BYTE bcd_value); 
    
    void ds1307_init(void) 
    { 
       BYTE seconds = 0; 
    
       i2c_start(); 
       i2c_write(0xD0);      // WR to RTC 
       i2c_write(0x00);      // REG 0 
       i2c_start(); 
       i2c_write(0xD1);      // RD from RTC 
       seconds = bcd2bin(i2c_read(0)); // Read current "seconds" in DS1307 
       i2c_stop(); 
       seconds &= 0x7F; 
    
       delay_us(3); 
    
       i2c_start(); 
       i2c_write(0xD0);      // WR to RTC 
       i2c_write(0x00);      // REG 0 
       i2c_write(bin2bcd(seconds));     // Start oscillator with current "seconds value 
       i2c_start(); 
       i2c_write(0xD0);      // WR to RTC 
       i2c_write(0x07);      // Control Register 
       i2c_write(0x80);     // Disable squarewave output pin 
       i2c_stop(); 
    
    } 
    
    void ds1307_set_date_time(BYTE day, BYTE mth, BYTE year, BYTE dow, BYTE hr, BYTE min, BYTE sec) 
    { 
      sec &= 0x7F; 
      hr &= 0x3F; 
    
      i2c_start(); 
      i2c_write(0xD0);            // I2C write address 
      i2c_write(0x00);            // Start at REG 0 - Seconds 
      i2c_write(bin2bcd(sec));      // REG 0 
      i2c_write(bin2bcd(min));      // REG 1 
      i2c_write(bin2bcd(hr));      // REG 2 
      i2c_write(bin2bcd(dow));      // REG 3 
      i2c_write(bin2bcd(day));      // REG 4 
      i2c_write(bin2bcd(mth));      // REG 5 
      i2c_write(bin2bcd(year));      // REG 6 
      i2c_write(0x80);            // REG 7 - Disable squarewave output pin 
      i2c_stop(); 
    } 
    
    void ds1307_get_date(BYTE &day, BYTE &mth, BYTE &year, BYTE &dow) 
    { 
      i2c_start(); 
      i2c_write(0xD0); 
      i2c_write(0x03);            // Start at REG 3 - Day of week 
      i2c_start(); 
      i2c_write(0xD1); 
      dow  = bcd2bin(i2c_read() & 0x7f);   // REG 3 
      day  = bcd2bin(i2c_read() & 0x3f);   // REG 4 
      mth  = bcd2bin(i2c_read() & 0x1f);   // REG 5 
      year = bcd2bin(i2c_read(0));            // REG 6 
      i2c_stop(); 
    } 
    
    void ds1307_get_time(BYTE &hr, BYTE &min, BYTE &sec) 
    { 
      i2c_start(); 
      i2c_write(0xD0); 
      i2c_write(0x00);            // Start at REG 0 - Seconds 
      i2c_start(); 
      i2c_write(0xD1); 
      sec = bcd2bin(i2c_read() & 0x7f); 
      min = bcd2bin(i2c_read() & 0x7f); 
      hr  = bcd2bin(i2c_read(0) & 0x3f); 
      i2c_stop(); 
    
    } 
    
    BYTE bin2bcd(BYTE binary_value) 
    { 
      BYTE temp; 
      BYTE retval; 
    
      temp = binary_value; 
      retval = 0; 
    
      while(1) 
      { 
        // Get the tens digit by doing multiple subtraction 
        // of 10 from the binary value. 
        if(temp >= 10) 
        { 
          temp -= 10; 
          retval += 0x10; 
        } 
        else // Get the ones digit by adding the remainder. 
        { 
          retval += temp; 
          break; 
        } 
      } 
    
      return(retval); 
    } 
    
    
    // Input range - 00 to 99. 
    BYTE bcd2bin(BYTE bcd_value) 
    { 
      BYTE temp; 
    
      temp = bcd_value; 
      // Shifting upper digit right by 1 is same as multiplying by 8. 
      temp >>= 1; 
      // Isolate the bits for the upper digit. 
      temp &= 0x78; 
    
      // Now return: (Tens * 8) + (Tens * 2) + Ones 
    
      return(temp + (temp >> 2) + (bcd_value & 0x0f)); 
    }

    -----

  2. #2
    hdgetnet

    Re : Driver pour DS1307 en C : Demande d'aide

    bonjour . ..........

  3. #3
    hdgetnet

    Re : Driver pour DS1307 en C : Demande d'aide

    Salut j'ai déjà travailler sur ce Driver, il est très bien fait
    par exemple ton RB0 se met à 1 lorsqu'il est 12h00mm00ss

    donc voici algo que je te propose

    mettre en place une interruption d'un timer ( par exemple tous les 1s)
    // ça veut dire que tous les 1 seconde tu viens lire l'heure du DS1307

    ds1307_get_time(HR,MT,SECDS);

    dans le main
    while 1
    //lecture du DS1307 tous les 1s ( c'est automatique par interruption)
    si (HR==12 & MT==0 & SECDS==0) alors RB0=1


    je peux t'écrire le code mais je te laisse chercher un peu

  4. #4
    lcoulon

    Re : Driver pour DS1307 en C : Demande d'aide

    Merci de ton aide,

    Je ne sais pas comment mettre en place une interruption timer toutes les secondes

    Pourrais tu me donner les lignes de codes à écrire pour réaliser une alarme à une date et heure donnée stp ?

    Je t'en serais très reconnaissant .


    Comme tu connais bien ce pilote, aurais tu un exemple de code à m'envoyer utilisant 1307.c je pourrais ainsi essayer de m'en servir pour comprendre le fonctionnement ce driver.

  5. A voir en vidéo sur Futura
  6. #5
    lcoulon

    Re : Driver pour DS1307 en C : Demande d'aide

    Je pensais à débuter ainsi :

    Code:
    while(1)
      {
        delay_ms(1000);
       
        ds1307_get_date(day,month,year,dow);
        ds1307_get_time(hrs,min,sec);
    mais ensuite je ne sais pas comment comparer la ce qui est obtenu avec une date et heure définie .

    Pourrais tu me donner les lignes de codes à écrire pour réaliser l' alarme à une date et heure donnée stp ?

    Je t'en serais très reconnaissant .

  7. #6
    hdgetnet

    Re : Driver pour DS1307 en C : Demande d'aide

    salut

    dans ton code tu ne compare rien
    tu fait simplement une lecture de heure et la date de ton DS1307.

    Je suppose que tu utilise le compilo PICC de CCS. Dans ce cas tu peux voir qu'il y a un exemple d'utilisation de ce driver dans le répertoire d'installation. norlament, c::/programme files/PICC/exemple

    Pourrais tu me donner les lignes de codes à écrire pour réaliser l' alarme à une date et heure donnée stp ?
    NON !! car je ne t'aide pas !!

    Je préfère te conseiller, te guider

    Déjà lit la datasheet du DS1307 pour comprendre comment il fonctionne.

    Bonne lecture

Discussions similaires

  1. Demande d'aide pour un programme en C
    Par Soadnemesis dans le forum Logiciel - Software - Open Source
    Réponses: 5
    Dernier message: 07/06/2008, 09h40
  2. Demande d'aide pour un mecanicien
    Par invite8e35f2ca dans le forum Chimie
    Réponses: 9
    Dernier message: 07/05/2008, 12h11
  3. Demande d'aide pour lecture de fichiers joints [pour groupe antimalware]
    Par inviteb430a917 dans le forum Internet - Réseau - Sécurité générale
    Réponses: 3
    Dernier message: 26/05/2007, 08h48
  4. Demande d'aide pour DM
    Par inviteffe7a925 dans le forum Électronique
    Réponses: 11
    Dernier message: 09/03/2007, 16h05
  5. Demande d'aide pour achat pour Barlow*3 et occulaires 6mm et 32mm
    Par invitea24a23fb dans le forum Matériel astronomique et photos d'amateurs
    Réponses: 6
    Dernier message: 07/12/2005, 18h55
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...