Répondre à la discussion
Affichage des résultats 1 à 11 sur 11

programme PCF8583 avec le pic16f877



  1. #1
    med.h-our

    programme PCF8583 avec le pic16f877


    ------

    bonjours tous le monde .
    je voudrai réaliser un datalogger ca veut dire stoker des donnés en temps reel dans une eeprom ;
    et pour cela je voudrai utiliser l'horloge temps réel "PFC8583"
    pour l'instant je voudrai juste programme PFC ca veut dire, lire les information de PCF et les afficher sur un LCD connctè au PORTD de 877.
    j'ai lu son datasheet et j'ai écrié ce programme avec le langage c de Mikroc.
    //////////////////////////////////////////////////////////////////////////////char seconds, minutes, hours, day, month, year; // Global date/time variables
    char *text = "A";
    char *text2 = "wait...";
    char ps,mamas,ws,v,zs;
    unsigned long t,m,ri,ka,zi,momy,rav,ram ;
    unsigned long tt ;
    unsigned long a ;
    unsigned long b;
    unsigned long k ;
    unsigned long fe ;
    unsigned long i,x;
    //--------------------- Reads time and date information from RTC (PCF8583)
    void Read_Time()
    {
    I2C_Start(); // Issue start signal
    I2C_Wr(0xA0); // Address PCF8583, see PCF8583 datasheet
    I2C_Wr(2); // Start from address 2
    I2C_Start(); // Issue repeated start signal
    I2C_Wr(0xA1); // Address PCF8583 for reading R/W=1

    seconds =I2C_Rd(1); // Read seconds byte
    minutes =I2C_Rd(1); // Read minutes byte
    hours =I2C_Rd(1); // Read hours byte
    day =I2C_Rd(1); // Read year/day byte
    month =I2C_Rd(0); // Read weekday/month byte
    Soft_I2C_Stop(); // Issue stop signal
    }

    //-------------------- Formats date and time
    void Transform_Time()
    {
    seconds = ((seconds & 0xF0) >> 4)*10 + (seconds & 0x0F); // Transform seconds
    minutes = ((minutes & 0xF0) >> 4)*10 + (minutes & 0x0F); // Transform months
    hours = ((hours & 0xF0) >> 4)*10 + (hours & 0x0F); // Transform hours
    year = (day & 0xC0) >> 6; // Transform year
    day = ((day & 0x30) >> 4)*10 + (day & 0x0F); // Transform day
    month = ((month & 0x10) >> 4)*10 + (month & 0x0F); // Transform month
    }
    /////////////////////foncion d'affichange////////////////////////////////////
    void afflcd ( unsigned long t )
    {
    if (t>=100) //****************************** *****************************
    {
    if (t<1000) //:::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::
    {
    a=t;
    do {
    a=a-10;
    }
    while (a>=10);
    v=a;
    tt=t-v;
    k=tt;
    do{
    k=k-100;
    }
    while (k>=100);
    b=k;
    ws=b/10;
    fe=tt-b;
    zs=fe/100;
    mamas=0;ps=0;
    }
    else //:::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::: ::::::
    {
    if (t<10000)
    {
    a=t;
    do {
    a=a-10;
    }
    while (a>=10);
    v=a; //le premier chiffre a afficher
    tt=t-v;
    k=tt;
    do{
    k=k-100;
    }
    while (k>=100);
    b=k;
    ws=b/10; // le deuxiemme chiifre a afficher
    zi=tt-b;
    m=zi;
    do{
    m=m-1000;
    }
    while (m>=1000);
    ka=m;
    zs=ka/100; // le troisiemme chiffre
    fe=zi-ka;
    ps=fe/1000; // le quatriemme chiffre
    mamas=0;
    }
    else
    {
    a=t;
    do {
    a=a-10;
    }
    while (a>=10);
    v=a; //le premier chiffre a afficher
    tt=t-v;
    k=tt;
    do{
    k=k-100;
    }
    while (k>=100);
    b=k;
    ws=b/10; // le deuxiemme chiifre a afficher
    zi=tt-b;
    m=zi;
    do{
    m=m-1000;
    }
    while (m>=1000);
    ka=m;
    zs=ka/100; // le troisiemme chiffre
    fe=zi-ka;
    rav=fe;
    do
    {
    rav=rav-10000;
    }
    while ( rav>=10000);
    ram=rav;
    ps=ram/1000; //le quatriemme chiffre
    momy=fe-ram;
    mamas=momy/10000; //le cinquiemme chiffre
    }
    }
    }
    else //****************************** ****************************** *************
    {
    if (t<10) //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!
    { v=abs(t);
    ws=0;
    zs=0;
    ps=0;
    mamas=0;
    }
    else //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!
    {
    a=t;
    do {
    a=a-10;
    }
    while (a>=10);
    v=a;
    tt=t-v;
    k=tt;
    ws=k/10;
    zs=0;
    ps=0;
    mamas=0;
    }
    }
    TRISD = 0; // PORTB is output
    Lcd_Config(&PORTD,2,3,0,7,6,5, 4); // Initialize LCD connected to PORTB
    Lcd_Cmd(Lcd_CLEAR); // Clear display
    Lcd_Cmd(Lcd_CURSOR_OFF); // Turn cursor off
    Lcd_Out(1, 1, text); // Print text to LCD, 2nd row, 1st column
    LCD_Chr_Cp(' ') ;
    LCD_Chr_Cp('0' + mamas) ;
    LCD_Chr_Cp('0' + ps) ;
    LCD_Chr_Cp('0' + zs) ;
    LCD_Chr_Cp('0' + ws) ;
    LCD_Chr_Cp('0' + v) ;
    }


    //----------------- Main procedure
    void main()
    {

    TRISB=0b00000001;
    PORTB=0;
    TRISD=0;PORTD=0;
    I2C_Init(100000);
    Delay_ms(2000);
    for(;
    {
    Read_Time(); // Read time from RTC(PCF8583)
    Transform_Time(); // Format date and time
    afflcd(seconds);delay_ms(500);
    afflcd(minutes);delay_ms(500);
    afflcd(hours);delay_ms(500);
    afflcd(day);delay_ms(500);
    afflcd(month);delay_ms(500);
    afflcd(year);delay_ms(500);
    Delay_ms(1000); // Wait 1 second
    }
    }
    ////////////////////////////////////////////////////////////////////////////
    je vais vous expliquer bravement mon programme ,
    la fonction afflcd sert a afficher une variable de 5 chiffre sur les LCD connecté au PORTD de PIC
    ps: j'ai tester cette fonction et elle marche très bien avec d'autre programme .
    et les routines Read_Time et Transform_Time c''est pour lire et decodè les information de PCF ;
    voila mon problème :
    la routine Read_Time ne fonction pas :s
    le programme lorsque il rentre ds cette fonnction et ne sort plus...
    PS:je utilise le MIKROC .8.2
    merciii d'avance...

    -----

  2. Publicité
  3. #2
    o3k

    Re : programme PCF8583 avec le pic16f877

    Sais tu à quel instruction il reste bloqué? attendrait-il indéfiniment l'ACK du PCF ?

  4. #3
    med.h-our

    Re : programme PCF8583 avec le pic16f877

    Citation Envoyé par o3k Voir le message
    Sais tu à quel instruction il reste bloqué? attendrait-il indéfiniment l'ACK du PCF ?
    il s'arrête a I2C_Init(100000); et il exécute pa le reste ;
    et j'ai pas bien compris ta question si tu peu l'expliquer stp ..
    meme si j'enlève cette instruction il exécute pa le fonction read_time() :s
    Dernière modification par med.h-our ; 26/08/2010 à 13h35.

  5. #4
    o3k

    Re : programme PCF8583 avec le pic16f877

    Déjà arrives tu a compiler? cela m'étonnerai étant donné que tu mélanges 2 librairies I2C (HARD et SOFT) hors les #define de la soft ne sont pas déclaré donc erreur du compilo.

    Sinon si tu bloque au start c'est certainement que le PCF n'envoie pas l'ack au pic pour signaler sa présence (cf fonctionnement BUS I2C)

  6. A voir en vidéo sur Futura
  7. Comparatifs

    Gagnez du temps et de l'argent grâce à nos comparatifs de produits. Parmi nos sujets :
  8. #5
    vede

    Cool Re : programme PCF8583 avec le pic16f877

    Salut,

    Citation Envoyé par o3k Voir le message
    Déjà arrives tu a compiler? cela m'étonnerai étant donné que tu mélanges 2 librairies I2C (HARD et SOFT) hors les #define de la soft ne sont pas déclaré donc erreur du compilo.(...)
    exact... c'est très zétrange ce Soft_I2C_Stop();...

    il s'arrête a I2C_Init(100000); et il exécute pa le reste ;
    et j'ai pas bien compris ta question si tu peu l'expliquer stp ..
    meme si j'enlève cette instruction il exécute pa le fonction read_time() :s
    ça aussi c'est tétrange...
    si tu enlèves "I2C_Init(100000);" tu arrives quand même à compiler???
    bizarre... bizarre...

    sinon niveau connexion SDA et SCL, ça ressemble à quoi?

    vede
    ;O]
    _____________
    ...

  9. #6
    o3k

    Re : programme PCF8583 avec le pic16f877

    Oui effectivement, avant tout montres nous ton schéma
    N'oublies pas les pull-up sur les lignes SDA et SCL.

  10. Publicité
  11. #7
    med.h-our

    Re : programme PCF8583 avec le pic16f877

    voila le programme que je l'ai compiler il se compile très bien avec Mikroc 8.2
    mais ; ai niveau de simulation avec proteus il donne rien la ligne SDA est toujours au niveau logique zero :s
    //////////////////////////////////////////////////////////////////////////////////////
    char seconds, minutes, hours, day, month, year; // Global date/time variables
    char *text = "A";
    char *text2 = "wait...";
    char ps,mamas,ws,v,zs;
    unsigned long t,m,ri,ka,zi,momy,rav,ram ;
    unsigned long tt ;
    unsigned long a ;
    unsigned long b;
    unsigned long k ;
    unsigned long fe ;
    unsigned long i,x;
    //--------------------- Reads time and date information from RTC (PCF8583)
    void Read_Time()
    {
    I2C_Start(); // Issue start signal
    I2C_Wr(0xA0); // Address PCF8583, see PCF8583 datasheet
    I2C_Wr(2); // Start from address 2
    I2C_Start(); // Issue repeated start signal
    I2C_Wr(0xA1); // Address PCF8583 for reading R/W=1

    seconds =I2C_Rd(1); // Read seconds byte
    minutes =I2C_Rd(1); // Read minutes byte
    hours =I2C_Rd(1); // Read hours byte
    day =I2C_Rd(1); // Read year/day byte
    month =I2C_Rd(0); // Read weekday/month byte
    I2C_Stop(); // Issue stop signal
    }

    //-------------------- Formats date and time
    void Transform_Time()
    {
    seconds = ((seconds & 0xF0) >> 4)*10 + (seconds & 0x0F); // Transform seconds
    minutes = ((minutes & 0xF0) >> 4)*10 + (minutes & 0x0F); // Transform months
    hours = ((hours & 0xF0) >> 4)*10 + (hours & 0x0F); // Transform hours
    year = (day & 0xC0) >> 6; // Transform year
    day = ((day & 0x30) >> 4)*10 + (day & 0x0F); // Transform day
    month = ((month & 0x10) >> 4)*10 + (month & 0x0F); // Transform month
    }
    /////////////////////foncion d'affichange////////////////////////////////////
    void afflcd ( unsigned long t )
    {
    if (t>=100) //****************************** *****************************
    {
    if (t<1000) //:::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::
    {
    a=t;
    do {
    a=a-10;
    }
    while (a>=10);
    v=a;
    tt=t-v;
    k=tt;
    do{
    k=k-100;
    }
    while (k>=100);
    b=k;
    ws=b/10;
    fe=tt-b;
    zs=fe/100;
    mamas=0;ps=0;
    }
    else //:::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::: ::::::
    {
    if (t<10000)
    {
    a=t;
    do {
    a=a-10;
    }
    while (a>=10);
    v=a; //le premier chiffre a afficher
    tt=t-v;
    k=tt;
    do{
    k=k-100;
    }
    while (k>=100);
    b=k;
    ws=b/10; // le deuxiemme chiifre a afficher
    zi=tt-b;
    m=zi;
    do{
    m=m-1000;
    }
    while (m>=1000);
    ka=m;
    zs=ka/100; // le troisiemme chiffre
    fe=zi-ka;
    ps=fe/1000; // le quatriemme chiffre
    mamas=0;
    }
    else
    {
    a=t;
    do {
    a=a-10;
    }
    while (a>=10);
    v=a; //le premier chiffre a afficher
    tt=t-v;
    k=tt;
    do{
    k=k-100;
    }
    while (k>=100);
    b=k;
    ws=b/10; // le deuxiemme chiifre a afficher
    zi=tt-b;
    m=zi;
    do{
    m=m-1000;
    }
    while (m>=1000);
    ka=m;
    zs=ka/100; // le troisiemme chiffre
    fe=zi-ka;
    rav=fe;
    do
    {
    rav=rav-10000;
    }
    while ( rav>=10000);
    ram=rav;
    ps=ram/1000; //le quatriemme chiffre
    momy=fe-ram;
    mamas=momy/10000; //le cinquiemme chiffre
    }
    }
    }
    else //****************************** ****************************** *************
    {
    if (t<10) //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!
    { v=abs(t);
    ws=0;
    zs=0;
    ps=0;
    mamas=0;
    }
    else //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!
    {
    a=t;
    do {
    a=a-10;
    }
    while (a>=10);
    v=a;
    tt=t-v;
    k=tt;
    ws=k/10;
    zs=0;
    ps=0;
    mamas=0;
    }
    }
    TRISD = 0; // PORTB is output
    Lcd_Config(&PORTD,2,3,0,7,6,5, 4); // Initialize LCD connected to PORTB
    Lcd_Cmd(Lcd_CLEAR); // Clear display
    Lcd_Cmd(Lcd_CURSOR_OFF); // Turn cursor off
    Lcd_Out(1, 1, text); // Print text to LCD, 2nd row, 1st column
    LCD_Chr_Cp(' ') ;
    LCD_Chr_Cp('0' + mamas) ;
    LCD_Chr_Cp('0' + ps) ;
    LCD_Chr_Cp('0' + zs) ;
    LCD_Chr_Cp('0' + ws) ;
    LCD_Chr_Cp('0' + v) ;
    }


    //----------------- Main procedure
    void main()
    {

    TRISB=0b00000001;
    PORTB=0;
    TRISD=0;PORTD=0;
    I2C_Init(100000);
    Delay_ms(2000);
    for(;
    {
    Read_Time(); // Read time from RTC(PCF8583)
    Transform_Time(); // Format date and time
    afflcd(seconds);delay_ms(500);
    afflcd(minutes);delay_ms(500);
    afflcd(hours);delay_ms(500);
    afflcd(day);delay_ms(500);
    afflcd(month);delay_ms(500);
    afflcd(year);delay_ms(500);
    Delay_ms(1000); // Wait 1 second
    }
    }

    ////////////////////////////////////////////////////////////////////////////////////
    dsl pour le 1er programme j'ai pa remarque cette instruction
    mais malgrè ca il marche pa :S
    et pr le shema
    ja'i connctè l'afficheur au PORTD et il marche tres bien avec d'autre prog
    et PCF au portc RC3 et RC4 avec les pull-ups
    et si vous pouvez m'expliquer la différence entre la déclaration soft et hard ...
    Dernière modification par med.h-our ; 26/08/2010 à 20h26.

  12. #8
    med.h-our

    Re : programme PCF8583 avec le pic16f877

    Citation Envoyé par vede Voir le message
    Salut,


    exact... c'est très zétrange ce Soft_I2C_Stop();...



    ça aussi c'est tétrange...
    si tu enlèves "I2C_Init(100000);" tu arrives quand même à compiler???
    bizarre... bizarre...

    sinon niveau connexion SDA et SCL, ça ressemble à quoi?

    vede
    ;O]
    _____________
    ...
    oui il se cmplie avec mikroc 8.2
    oui moi aussi je trouve ca bizzard mais aidez moi svp ;

  13. #9
    med.h-our

    Re : programme PCF8583 avec le pic16f877

    re
    j'ai changer cette instruction par month =I2C_Rd(1);
    il s'exécute complétement mais il affiche n'importe quoi !!!

  14. #10
    vede

    Cool Re : programme PCF8583 avec le pic16f877

    re ;O]
    Citation Envoyé par med.h-our Voir le message
    re
    j'ai changer cette instruction par month =I2C_Rd(1);
    il s'exécute complétement mais il affiche n'importe quoi !!!
    vérifies ta fonction "afflcd()" qui affiche les chiffres sur le LCD...
    car moi j'y comprends rien... (+48 ;O])...

    et le code indenté et commenté, dans des balises "code"... delà là sera plus clair...
    et après moi j'y entends rien à ISIS...

  15. #11
    tsotso123

    Re : programme PCF8583 avec le pic16f877

    mon probleme est de réaliser le shéma de pic16F877 avec le pcf 8583 et l'lcd
    mon programme se compile mais la simulation sur ISIS nz marche pas car mon shéma n'est pas compatible avec le programme si dessous:
    svp quelqu'un peut m'envoyer le shéma

Discussions similaires

  1. programmation de l'heure pic18f252 avec un pcf8583 alim
    Par titi1024 dans le forum Électronique
    Réponses: 3
    Dernier message: 21/04/2010, 15h17
  2. help!!un programme C en assembleur (PIC16F877)
    Par solid_sneak06 dans le forum Électronique
    Réponses: 13
    Dernier message: 22/02/2010, 00h13
  3. Programme gérer afficheur AIMV avec PIC16F877
    Par Aiasi_42 dans le forum Électronique
    Réponses: 0
    Dernier message: 27/03/2008, 14h30
  4. conversion avec un pic16F877
    Par T-bag dans le forum Électronique
    Réponses: 4
    Dernier message: 06/12/2006, 21h55
  5. aide petit programme PIC16F877
    Par solid_sneak06 dans le forum Électronique
    Réponses: 12
    Dernier message: 26/04/2006, 20h18
Découvrez nos comparatifs produits sur l'informatique et les technologies.