IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

bus I2C avec compilateur c de CCS


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 1
    Points : 1
    Points
    1
    Par défaut bus I2C avec compilateur c de CCS
    salut toutle monde je ne parviens pas à transferer une donnée de plus de 8 bits.

    Voici le code :
    code master :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    #include <16F883.h>
    #device ADC=10
     
    #fuses INTRC,NOWDT,MCLR,DEBUG,NOPROTECT,NOLVP,NOBROWNOUT,NOPUT,NOCPD
    #use delay(clock=8000000)   // (8000000)8MHz Clock ,31kHz
     
    #use i2c(MULTI_MASTER, sda=PIN_C4,scl=PIN_C3,force_hw )// 
     
     
    //#use i2c(MULTI_MASTER, sda=PIN_C4,scl=PIN_C3, force_hw) 
     
    #define  LED         PIN_B4
    #define	t 0x08
     
    #define end_1 0xA0     //adresse de l'esclave
     
    int8 val,val1,val2,val3;
     
     
    //fonction d'envoie de donnée à l'esclave
    void envoie_i2c(BYTE end_disp, BYTE adr, int8 data )
    {
     
       i2c_start();               //commence la transmission
     
       i2c_write(end_disp);           //choisie l'addresse de l'esclave avec qui communiqué
     
       i2c_write(adr);           //envoie l'adresse de la donnée
     
       i2c_write(data);           //envoie la donnée
     
       i2c_stop();                //arrêt de la communication
     
       delay_ms(100);             //delay      
     
     
    /*
    	i2c_write( data );           //envoie la donnée
     
    	i2c_write( data>>8 );           //envoie la donnée
     
    	nb1=    data >> 8;
     
     
    	i2c_write( data );           //envoie la donnée
     
    	i2c_write( nb1 );           //envoie la donnée
     
       i2c_write( *((int8*)(&data)+0) );           //envoie la donnée
     
       i2c_write( *((int8*)(&data)+1) );           //envoie la donnée
    */
     
    } 
     
    void main()
    {
    //	set_tris_b(0xFF);
       	set_tris_c(0b10111111); 
     
    	setup_oscillator(OSC_1MHZ,0);   //(8MHZ,31kHZ)set oscillator to 8Mhz 
     
     
    	val = 200;
    	val1 = 155;
    	val2 = 230;
    	val3 = 45;
     
     
    	output_high(LED);
    	delay_ms( 500);
    	output_low(LED);
    	delay_ms(500);
     
    	while(TRUE)
       {       
     
             envoie_i2c(end_1, t,val );  //envoie une donnée a l'esclave      
             		output_high(LED);
             delay_ms(1000);
     
     
             envoie_i2c(end_1, t,val1 );  //envoie une donnée a l'esclave      
             		output_low(LED);
             delay_ms(1000);
     
             envoie_i2c(end_1, t,val2 );  //envoie une donnée a l'esclave      
             		output_high(LED);
             delay_ms(1000);
     
             envoie_i2c(end_1, t,val3 );  //envoie une donnée a l'esclave      
             		output_low(LED);
             delay_ms(1000);
     
     
       } 
     
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    /////////////////////////////////////////
     
    ////SLAVE//////////////////////////
     
     
    #include <16F877.h>
    #device adc=10
     
    #FUSES NOWDT //No Watch Dog Timer
    #FUSES XT //
    #FUSES NOPUT //No Power Up Timer
    #FUSES NOPROTECT //Code not protected from reading
    #FUSES NODEBUG //No Debug mode for ICD
    #FUSES NOBROWNOUT //No brownout reset
    #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
    #FUSES NOCPD //No EE protection
     
    #use delay(clock=4000000)
     
    #use i2c(SLAVE,sda=PIN_C4,scl=PIN_C3,address=0xA0, force_hw)
     
    #include "C:\mplab_projet\flex_lcd_aba.c"
     
     
     
    #define LED PIN_B3
     
    int state, address, buffer[0x08]; // address and array of Bytes, change size to suit your needs
     
    short bit1 ;
     
    #INT_SSP NOCLEAR
    void ssp_interupt (void)
    {
    clear_interrupt(int_SSP);
     
    state = i2c_isr_state();
     
    if(state < 0x80) //le maitre est entrain d'envoyé des donnée
    {
    if(state == 0) //premier octet réçue est l'adresse de l'esclave
    { // output_high(LED);
    }
    if(state == 1) //second octet réçue est l'adresse
    {
    address = i2c_read();
    }
    if(state == 2) //troisieme octet reçu est la donnée
    {
    *( (int8* )( &buffer[address + (state-2)]) ) = i2c_read();
     
    output_high(LED);
     
    bit1= true;
     
     
    }
     
     
    }
     
    /*
    if(state == 0x80) //master is requesting data
    {
    i2c_write (buffer[address]); //send requested data
     
    }
    */
     
    }
     
     
    void main()
    {
    set_tris_c(0xFF);
     
    bit1 = false;
     
    enable_interrupts(INT_SSP); //enable I2C interrupts
    enable_interrupts(GLOBAL);
     
     
    buffer[0x00] = 0b10000000;
    buffer[0x01] = 0b10000001;
     
    buffer[0x02] = 0b01000010;
    buffer[0x03] = 0b01000011;
     
    buffer[0x04] = 0b10000000;
    buffer[0x05] = 0b10000001;
     
    buffer[0x06] = 0b01000010;
    buffer[0x07] = 0b01000011;
     
     
     
     
    lcd_init();
    delay_ms(10);
    printf(lcd_putc,"\fcommunication I2C\n");//
     
    printf(lcd_putc,"val : ");
     
     
    while(TRUE)
    {
     
    delay_ms(100);
     
    if(bit1) // attend la donnée
    {
    lcd_gotoxy(9,2);
    printf(lcd_putc,"%u ",buffer[address]); //Lu
     
    bit1=false;
    }
    else
    {
    }
     
    }
     
     
     
    }
    merci pour votre aide

  2. #2
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 727
    Points
    1 727
    Par défaut
    Salut,

    Si c'est un problème d'utilisation d'I2C, seul quelqu'un connaissant cette technologie pourra te répondre et je crains qu'il n'y en ait pas beaucoup par ici (sous réserve).
    Si c'est un problème d'utilisation d'I2C mélangé a des problématiques du langage C, explique nous plus en détail quel est le problème

  3. #3
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    946
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 946
    Points : 1 351
    Points
    1 351
    Par défaut
    Salut,

    Je ne pense pas pouvoir t'être d'un grand secours, cependant, ta routine d'envoi d'octets se termine pas une tempo de 100msec... N'y aurait-il pas un watchdog par défaut qui te reseterait ta carte?

    A+

    Pfeuh

  4. #4
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    859
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 859
    Points : 714
    Points
    714
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      i2c_write(data);           //envoie la donnée
    Bon, ben il faut passer un pointeur et une longueur à la fonction et réaliser une boucle sur cet envoi.
    Si tu ne vis pas ce que tu penses alors tu penses ce que tu vis.

Discussions similaires

  1. Réponses: 1
    Dernier message: 18/12/2007, 15h04
  2. Probleme avec compilateur Code::Blocks
    Par ..::snake::.. dans le forum Code::Blocks
    Réponses: 3
    Dernier message: 13/06/2007, 20h01
  3. Creer un bus I2c en C++
    Par ToMs dans le forum C++
    Réponses: 3
    Dernier message: 28/03/2006, 17h10
  4. acceder au bus i2c avec visual c++
    Par ledaker dans le forum MFC
    Réponses: 1
    Dernier message: 06/03/2006, 10h43
  5. boost - Probleme avec compilateur C++ de visual studio 2005
    Par gilles641 dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 24/01/2006, 19h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo