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

PIC 18F4620 Conflit entre I2C et PWM



  1. #1
    memphis001

    PIC 18F4620 Conflit entre I2C et PWM


    ------

    Bonjour à tous,


    J'utilise un PIC18F4620 avec sur le bus I2C un module RTC et j'utilise également les 2 ports PWM pour faire varier des LEDs.

    Je programme en C avec microC.

    J'arrive à gérer le module RTC pour afficher la date et l'heure sur un écran LCD.
    J'arrive à gérer les sorties PWM.

    Le bus I2C est sur les ports RC3 et RC4.
    Les 2 ports PWM sont sur RC1 et RC2.

    Le problème est que lorsque je fais varier mon signal PWM, l'année change dans le module RTC et ensuite plus rien, ca plante.

    Quelqu'un aurait une idée pour régler le problème?

    Merci

    -----

  2. Publicité
  3. #2
    maximilien

    Re : PIC 18F4620 Conflit entre I2C et PWM

    Citation Envoyé par memphis001 Voir le message

    Quelqu'un aurait une idée pour régler le problème?
    Il faut sans doute voir le code!!

  4. #3
    memphis001

    Re : PIC 18F4620 Conflit entre I2C et PWM

    Je n'avais pas mis le code pensant à un pb matériel du fait que les 2 sont sur le PORT C...


    Ci-dessous le programme principal (J'ai enlevé les déclarations de constantes, variables, etc)

    Code:
    void main() {
      CMCON = 0x07;           // turn off comparators
      ADCON1 = 0x0F;          // AD-Ports as digital I/O
      ADCON0= 0x0;
    
      LATC = 0;                     // set PORTC to 0
      TRISC = 0;                    // designate PORTC pins as output
      
      PWM1_Init(5000);
      PWM2_Init(5000);
      PWM1_Start();
      PWM2_Start();
      
      I2C1_Init(100000);                 // Initialize Soft I2C communication
    
      Lcd_Init();                        // Initialize LCD
      Lcd_Cmd(_LCD_CURSOR_OFF);          // Cursor off
    
      blue_percent=0;
      white_percent=0;
    
      principal();
    }
    
    void principal() {
      debut:
      Lcd_Cmd(_LCD_CLEAR);
      if(mode==0) Lcd_Out(4,1,"AUTO");
      if(mode==1) Lcd_Out(4,1,"MANU");
    
      while(1) {
         Display_Temp(14,4);
         Display_Time();
         Display_Gradation();
    
         if (RA4_bit) {
            delay_ms(100);
            goto parametres;
         }
    
         if(mode==1) {
          if (RA2_bit) {
            Delay_ms(40);
            white_percent++;
            white_duty  = (white_percent*255)/100;
            PWM2_Set_Duty(white_duty);
           }
    
          if (RA1_bit) {
            Delay_ms(40);
            white_percent--;
            white_duty  = (white_percent*255)/100;
            PWM2_Set_Duty(white_duty);
           }
    
          if (RA0_bit) {
            Delay_ms(40);
            blue_percent++;
            blue_duty  = (blue_percent*255)/100;
            PWM1_Set_Duty(blue_duty);
           }
    
          if (RA3_bit) {
            Delay_ms(40);
            blue_percent--;
            blue_duty  = (blue_percent*255)/100;
            PWM1_Set_Duty(blue_duty);
           }
         }
    
    
    
      }
    
    
    }
    
    
    void Display_Gradation() {
         // Bleu
         Lcd_Out(2,1,"BLEU:");
         ShortToStr(blue_percent, txt_percent);
         Lcd_Out(2,16,txt_percent);
         Lcd_Out(2,20,"%");
         // BLanc
         Lcd_Out(3,1,"BLANC:");
         ShortToStr(white_percent, txt_percent);
         Lcd_Out(3,16,txt_percent);
         Lcd_Out(3,20,"%");
    }
    
    
    
    
    
    
    void Display_Temp(unsigned short x,unsigned short y) {
      //--- Perform temperature reading
      Ow_Reset(&PORTE, 2);                         // Onewire reset signal
      Ow_Write(&PORTE, 2, 0xCC);                   // Issue command SKIP_ROM
      Ow_Write(&PORTE, 2, 0x44);                   // Issue command CONVERT_T
      Delay_us(120);
      Ow_Reset(&PORTE, 2);
      Ow_Write(&PORTE, 2, 0xCC);                   // Issue command SKIP_ROM
      Ow_Write(&PORTE, 2, 0xBE);                   // Issue command READ_SCRATCHPAD
      temp =  Ow_Read(&PORTE, 2);
      temp = (Ow_Read(&PORTE, 2) << 8) + temp;
    
      // Check if temperature is negative
       if (temp & 0x8000) {
       text[0] = '-';
       temp = ~temp + 1;
       }
    
      // Extract temp_whole
      temp_whole = temp >> RES_SHIFT ;
    
      // Convert temp_whole to characters
      if (temp_whole/100)
         text[0] = temp_whole/100  + 48;
      //else
         //text[0] = '0';
    
      text[1] = (temp_whole/10)%10 + 48;             // Extract tens digit
      text[2] =  temp_whole%10     + 48;             // Extract ones digit
    
      // Extract temp_fraction and convert it to unsigned int
      temp_fraction  = temp << (4-RES_SHIFT);
      temp_fraction &= 0x000F;
      temp_fraction *= 625;
    
      // Convert temp_fraction to characters
      text[4] =  temp_fraction/1000    + 48;         // Extract thousands digit
    
      //## Température
      Lcd_Out(y,x,text);
      Lcd_Chr(y,x+5,223);
      Lcd_Out(y,x+6,"C");
    }


    Ci-dessous, le code pour le module RTC:
    Code:
    //------------------ Déclaration des variables
    //### RTC ###
    struct TTime {
      char year, month, day, hours, minutes, seconds;
    } TimeRead;
    char yearmod4, byteRead;
    char txt[11];
    void ReadTime();
    
    
    //--------------------- Reads time and date information from RTC (PCF8583)
    void Read_Time() {
    char updateYear;
    
       updateYear = 0;
    
       I2C1_Start();                // issue start signal
       I2C1_Wr(0xA0);               // address PCF8583
       I2C1_Wr(2);                  // first word address
       I2C1_Repeated_Start();       // issue repeated start signal
       I2C1_Wr(0xA1);               // address PCF8583 for reading R/W=1
    
       byteRead = I2C1_Rd(1);       // read seconds byte
       TimeRead.seconds = (byteRead >> 4)*10 + (byteRead & 0x0F); // transform seconds
    
       byteRead = I2C1_Rd(1);     // read minutes byte
       TimeRead.minutes = (byteRead >> 4)*10 + (byteRead & 0x0F); // transform minutes
    
       byteRead = I2C1_Rd(1);     // read hours byte
       TimeRead.hours = (byteRead >> 4)*10 + (byteRead & 0x0F); // transform hours
    
       byteRead = I2C1_Rd(1);     // read year/day byte
       TimeRead.day = ((byteRead & 0b00110000) >> 4)*10 + (byteRead & 0x0F); // transform day
       yearmod4 = (byteRead & 0b11000000) >> 6;   // get year mod 4 from RTC
    
       byteRead = I2C1_Rd(0);     // read weekday/month byte
       TimeRead.month = ((byteRead & 0b00010000) >> 4)*10 + (byteRead & 0x0F); // transform month
    
       I2C1_Stop();
       I2C1_Start();                 // issue start signal
       I2C1_Wr(0xA0);               // address PCF8583
       I2C1_Wr(0x10);               // first word address
       I2C1_Repeated_Start();        // issue repeated start signal
       I2C1_Wr(0xA1);               // address PCF8583 for reading R/W=1
    
       byteRead = I2C1_Rd(0);     // read year
       if (yearmod4 != byteRead % 4 ) { // check if year is incremented in RTC
           byteRead++;  // in this case the new value should be written to RTC RAM at address 16(0x10)
           updateYear = 1;
           }
       TimeRead.year = byteRead;
    
       I2C1_Stop();
    
       if (updateYear > 0) {
          I2C1_Start();            // issue start signal
          I2C1_Wr(0xA0);          // address PCF8530
          I2C1_Wr(0x10);          // start from word at address 16
          I2C1_Wr(TimeRead.year);         // write year to RAM
          I2C1_Stop();             // issue stop signal
          }
    }
    
    
    void Display_Time() {
       Read_Time();
       // output values to LCD display
       txt[0] = (TimeRead.day / 10) + 48;
       txt[1] = (TimeRead.day % 10) + 48;
       txt[2] = '/';
       txt[3] = (TimeRead.month / 10) + 48;
       txt[4] = (TimeRead.month % 10) + 48;
       txt[5] = '/';
       txt[6] = '2';
       txt[7] = (TimeRead.year / 100) + 48;
       txt[8] = ((TimeRead.year % 100) / 10) + 48;
       txt[9] = (TimeRead.year % 10)  + 48;
       txt[10] = 0;  // null to terminate the string
       Lcd_Out(1,1,txt);
    
       txt[0] = (TimeRead.hours / 10) + 48;
       txt[1] = (TimeRead.hours % 10) + 48;
       txt[2] = ':';
       txt[3] = (TimeRead.minutes / 10) + 48;
       txt[4] = (TimeRead.minutes % 10) + 48;
       txt[5] = 0;  // null to terminate the string
       Lcd_Out(1,16,txt);
    }

  5. #4
    maximilien

    Re : PIC 18F4620 Conflit entre I2C et PWM

    Cela me rappelle quelque chose....

    Y aurait il un aquarium derrière??

  6. #5
    memphis001

    Re : PIC 18F4620 Conflit entre I2C et PWM

    Oui, pourquoi?

  7. A voir en vidéo sur Futura
  8. #6
    maximilien

    Re : PIC 18F4620 Conflit entre I2C et PWM


    Ton montage pourra surement intéresser un autre membre:
    http://forums.futura-sciences.com/el...a-horloge.html

    Je vais regarder ton code avec un peu plus d'attention, je l'ai pour l'instant survolé.

    PS: peut tu poster le schéma électrique?

  9. Publicité
  10. #7
    memphis001

    Re : PIC 18F4620 Conflit entre I2C et PWM

    Je viens justement de trouver le topic dont tu parles.

    Pas de schéma électrique de fait pour le moment, c'est dans ma tête et surtout je développe sur une platine easypic6.

  11. #8
    maximilien

    Re : PIC 18F4620 Conflit entre I2C et PWM

    J'ai regarder la doc de ton PIC et un peu ton prog je n'ai rien trouvé.
    Je ne connais pas vraiment les PIC18...
    Et le câblage as tu regardé?
    Citation Envoyé par memphis001 Voir le message
    je développe sur une platine easypic6.
    Il y a peu j'ai câblé une carte sur ma easypic3 et cela ne fonctionnait pas... J'ai re-câblé sur une labdec ça fonctionnait!
    (il y avait un PIC et un liaison sur RB0 seulement)

  12. #9
    memphis001

    Re : PIC 18F4620 Conflit entre I2C et PWM

    Ok merci pour tes recherches.

    Le problème c'est que je n'ai que la platine easypic6 à disposition.

    J'ai une petite plaque d'essai, je vais tenter de faire marcher le circuit dessus.

  13. #10
    memphis001

    Re : PIC 18F4620 Conflit entre I2C et PWM

    Re,

    Je viens de tester avec un PIC16F887 et cela fonctionne correctement.

    Je suppose donc que côté câblage tout va bien.

    Avec le PIC18F4620, le problème viens du PWM1 sur RC2, en effet le PWM2 sur RC1 ne provoque pas le plantage.

    Également, l'année augmente de 4 avant de planter.

    Je cherche mais ne vois pas ce qui ne va pas...

Sur le même sujet


Discussions similaires

  1. PIC 18F4620 + afficheur LCD 4x16
    Par Twiz dans le forum Électronique
    Réponses: 2
    Dernier message: 25/04/2009, 12h22
  2. Communication I2C entre 3 pic 16f876
    Par jiji94 dans le forum Électronique
    Réponses: 0
    Dernier message: 07/04/2008, 18h40
  3. lmx5453 compatible a un pic 18f4620?
    Par calozio dans le forum Électronique
    Réponses: 2
    Dernier message: 07/02/2007, 19h39
  4. PIC 18F4620 et tracas....
    Par vincequeen dans le forum Électronique
    Réponses: 0
    Dernier message: 20/05/2006, 18h52
  5. Réponses: 3
    Dernier message: 01/11/2005, 22h45
Découvrez nos comparatifs produits sur l'informatique et les technologies.