aide programmation température pic16f877
Affichage des résultats 1 à 4 sur 4

aide programmation température pic16f877



Mode arborescent

  1. #4
    invite03ccaa53

    Re : aide programmation température pic16f877

    bjr,
    voila notre code... toute aide est la bienvenue!!!

    /*
    IIC BUS INTERFACE:

    Code size for one read and one write to IIC device:

    8 MHz clock : 110 instructions
    4 MHz clock : 91 instructions
    2 MHz clock : 82 instructions
    500 kHz clock : 76 instructions

    Use of macros are recommended. This module use
    subroutines in one level. New macros may be
    constructed in a similar way.

    Delay syntax:
    delay_4us_m3 : insert a 4 microseconds delay, but subtract the
    time to execute 3 instruction cycles

    1 instruction cycle = 4 clock cycles = 1 microsecond at 4 MHz
    */


    #ifndef WRITE_sda

    #define TEST_IIC

    /* these should be user defined */

    #define Clock_8MHz

    #pragma bit scl_IIC @ PORTA.1
    #pragma bit sda_IIC @ PORTA.0

    #define WRITE_sda() TRISA = 0xFE
    #define READ_sda() TRISA = 0xFF

    #define IIC_address_RW_0 0xa2
    #define IIC_address_RW_1 0xa3

    char IIC_byte;
    bit IIC_error, master_ack;

    #endif

    #ifdef Clock_8MHz
    #define delay_(kn) { char x; x=kn; do x--; while (x>0); }
    #define delay_4us_m1 delay_( 2)
    #define delay_4us_m3 nop();nop();nop();nop();nop();
    #define delay_4us_m6 nop(); nop();
    #define delay_4us_m7 nop();
    #define delay_4us_m8
    #define delay_5us_m1 delay_( 3)
    #define delay_5us_m2 delay_( 3)
    #define delay_5us_m5 nop();nop();nop();nop();nop();
    #define delay_5us_m7 nop();nop();nop();
    #define delay_5us_m10
    #define delay_0us_m1
    #endif

    #ifdef Clock_4MHz
    #define delay_4us_m1 nop();nop();nop();
    #define delay_4us_m3 nop();
    #define delay_4us_m6
    #define delay_4us_m7
    #define delay_4us_m8
    #define delay_5us_m1 nop();nop();nop();nop();
    #define delay_5us_m2 nop();nop();nop();
    #define delay_5us_m5
    #define delay_5us_m7
    #define delay_5us_m10
    #define delay_0us_m1
    #endif

    #ifdef Clock_2MHz
    #define delay_4us_m1 nop();
    #define delay_4us_m3
    #define delay_4us_m6
    #define delay_4us_m7
    #define delay_4us_m8
    #define delay_5us_m1 nop();nop();
    #define delay_5us_m2 nop();
    #define delay_5us_m5
    #define delay_5us_m7
    #define delay_5us_m10
    #define delay_0us_m1
    #endif

    #ifdef Clock_500kHz
    #define delay_4us_m1
    #define delay_4us_m3
    #define delay_4us_m6
    #define delay_4us_m7
    #define delay_4us_m8
    #define delay_5us_m1
    #define delay_5us_m2
    #define delay_5us_m5
    #define delay_5us_m7
    #define delay_5us_m10
    #define delay_0us_m1
    #endif


    void startIICcomm( void)
    /* assuming sda_IIC = 1 and scl_IIC = 1 */
    {
    WRITE_sda();
    sda_IIC = 0;
    delay_5us_m10
    }


    void stopIICcomm( void)
    {
    scl_IIC = 0;
    WRITE_sda();
    sda_IIC = 0;
    delay_5us_m1
    scl_IIC = 1;
    delay_4us_m1
    sda_IIC = 1;
    delay_4us_m6
    }


    void readIICbus( void)
    /* reads one byte from IIC slave device */
    {
    char counter;

    scl_IIC = 0;
    READ_sda();
    counter = 8;
    do {
    scl_IIC = 0;
    delay_5us_m1
    scl_IIC = 1;
    delay_4us_m7
    Carry = sda_IIC;
    IIC_byte = rl( IIC_byte);
    } while ( -- counter > 0);

    scl_IIC = 0;
    WRITE_sda();
    sda_IIC = master_ack;
    delay_5us_m7
    scl_IIC = 1;
    delay_4us_m6
    }


    void sendIICbyte( char W)
    /* writes one byte to IIC slave device */
    {
    char counter;

    IIC_byte = W;
    WRITE_sda();
    counter = 8;

    do {
    IIC_byte = rl( IIC_byte);
    scl_IIC = 0;
    delay_5us_m5
    sda_IIC = Carry;
    delay_0us_m1 /* minimum 250 nanosec. */
    scl_IIC = 1;
    delay_4us_m3
    } while ( -- counter > 0);

    /* read ack. */

    scl_IIC = 0;
    READ_sda();
    delay_5us_m2
    scl_IIC = 1;
    if ( sda_IIC)
    IIC_error = 1;
    delay_4us_m8
    }


    #define readByteFromIIC( address, variable) \
    startIICcomm(); \
    sendIICbyte( IIC_address_RW_0); \
    sendIICbyte( address); \
    stopIICcomm(); \
    \
    startIICcomm(); \
    sendIICbyte( IIC_address_RW_1); \
    \
    /* more bytes to read .. \
    master_ack = 0; \
    readIICbus(); */ \
    \
    master_ack = 1; \
    readIICbus(); \
    stopIICcomm(); \
    variable = IIC_byte


    #define writeByteToIIC( address, IIC_data) \
    startIICcomm(); \
    sendIICbyte( IIC_address_RW_0); \
    sendIICbyte( address); \
    \
    sendIICbyte( IIC_data); \
    /* + more bytes to send \
    sendIICbyte( .. ); */ \
    \
    stopIICcomm();

    /* NOTE: EEPROM's require a delay between each
    (block) write to the IIC device */


    #ifdef TEST_IIC
    void main( void)
    {
    char x;
    //writeByteToIIC( 1, 100);

    readByteFromIIC( 0x9A, x); /*C est Ici qu on voudrait pouvoir capter la temperature a partir
    /*de l'adresse de la sonde sur le bus I2C


    }
    #endif

  2. A voir en vidéo sur Futura

Discussions similaires

  1. aide en programmation en c
    Par invite7670cc44 dans le forum Électronique
    Réponses: 0
    Dernier message: 12/06/2007, 16h45
  2. aide programmation python
    Par invited0b2ef3b dans le forum Logiciel - Software - Open Source
    Réponses: 30
    Dernier message: 10/06/2006, 12h58
  3. aide petit programme PIC16F877
    Par invite3842cc13 dans le forum Électronique
    Réponses: 12
    Dernier message: 26/04/2006, 20h18
  4. Aide à la programmation des PIC
    Par invite3a1051d7 dans le forum Électronique
    Réponses: 0
    Dernier message: 06/07/2005, 17h36
  5. Aide pour programmation VBA
    Par invite588da7a7 dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 08/07/2004, 22h55
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...