affichage heure et date sur LCD et utilisation PWM
Répondre à la discussion
Affichage des résultats 1 à 4 sur 4

affichage heure et date sur LCD et utilisation PWM



  1. #1
    invite639d7aaf

    affichage heure et date sur LCD et utilisation PWM


    ------

    Bonjour;

    j'ai eu quelque problème en essayant d'afficher sur LCD et utiliser le PWM au même temps par exemple quand je fais fonctionner que le PWM ça marche trés bien si je fais fonctionner que l'affichage sur LCD ça fonctionne impécablement mais quand je regroupe les deux rien ne marche.


    a noter que je dois faire tourner 2 moteurs à l'aide de PWM1 et PWM2, ainsi que d'afficher l'heure et la date sur LCD; j'utilise un PIC 16F877A. le programme est comme suit:

    Code:
    sbit LCD_RS at RB4_bit;
    sbit LCD_EN at RB5_bit;
    sbit LCD_D4 at RB0_bit;
    sbit LCD_D5 at RB1_bit;
    sbit LCD_D6 at RB2_bit;
    sbit LCD_D7 at RB3_bit;
    
    sbit LCD_RS_Direction at TRISB4_bit;
    sbit LCD_EN_Direction at TRISB5_bit;
    sbit LCD_D4_Direction at TRISB0_bit;
    sbit LCD_D5_Direction at TRISB1_bit;
    sbit LCD_D6_Direction at TRISB2_bit;
    sbit LCD_D7_Direction at TRISB3_bit;
    
    char seconds, minutes, hours, day, month, year, ordrjr;
    int cap1=0,cap2=0,rapport_cyclique=0;
    void Read_Time() {
      I2C1_Start();
      I2C1_Wr(0xD0);
      I2C1_Wr(0);
    
      I2C1_Repeated_Start();
      I2C1_Wr(0xD1);
      seconds = I2C1_Rd(1);
      minutes = I2C1_Rd(1);
      hours = I2C1_Rd(1);
      ordrjr = I2C1_Rd(1);
      day = I2C1_Rd(1);
      month = I2C1_Rd(1);
      year = I2C1_Rd(0);
      I2C1_Stop();
     }
    
    void Transform_Time() {
      seconds  =  ((seconds & 0xF0) >> 4)*10 + (seconds & 0x0F);
      minutes  =  ((minutes & 0xF0) >> 4)*10 + (minutes & 0x0F);
      hours    =  ((hours & 0xF0)  >> 4)*10  + (hours & 0x0F);
      day      =  ((day & 0x30) >> 4 )*10    + (day & 0x0F);
      month    =  ((month & 0x10)  >> 4)*10 + (month & 0x0F);
      year     =  ((year & 0xF0)  >> 6)*10  + (year & 0x0F);
    }
    
    void Display_Time() {
       Lcd_Chr(1, 6, (day / 10)   + 48);
       Lcd_Chr(1, 7, (day % 10)   + 48);
       Lcd_Chr(1, 9, (month / 10) + 48);
       Lcd_Chr(1,10, (month % 10) + 48);
       Lcd_Chr(1,15,  year        + 48);
       Lcd_Chr(2, 6, (hours / 10)   + 48);
       Lcd_Chr(2, 7, (hours % 10)   + 48);
       Lcd_Chr(2, 9, (minutes / 10) + 48);
       Lcd_Chr(2,10, (minutes % 10) + 48);
       Lcd_Chr(2,12, (seconds / 10) + 48);
       Lcd_Chr(2,13, (seconds % 10) + 48);
    }
    
    void Init_Main() {
      TRISB = 0;
      PORTB = 0xFF;
      TRISB = 0xff;
      I2C1_Init(100000);
      Lcd_Init();
      Lcd_Cmd(_LCD_CLEAR);
      Lcd_Cmd(_LCD_CURSOR_OFF);
      Lcd_Out(1,1,"Date:");
      Lcd_Chr(1,8,'.');
      Lcd_Chr(1,11,'.');
      Lcd_Chr(1,16,'.');
      Lcd_Out(2,1,"Time:");
      Lcd_Chr(2,8,':');
      Lcd_Chr(2,11,':');
      Lcd_Out(1,12,"201");
    }
    
    void main() {
      Delay_ms(500);
      Init_Main();
      PWM1_Init(500);
      PWM2_Init(500);
      PWM1_Start();
      PWM2_Start();
      ADCON1=0X07;
      TRISA=0xFF;
      TRISC=0;
      PORTC=0;
      PWM1_Set_Duty(0);
      PWM2_Set_Duty(0);        // Set current duty for PWM1
    
      while (1) {
        Read_Time();
        Transform_Time();
        Display_Time();
        
        cap1=ADC_Read(0);
    
      if(cap1<512) {
    
        Delay_ms(250);
        cap2=ADC_Read(0);
        if(cap2>cap1){
         PWM1_Set_Duty(255);
         PWM2_Set_Duty(0);
         }
        else{
         PWM1_Set_Duty(255);
         PWM2_Set_Duty(255);
         }
        }
      else if((cap1>=512)&&(cap1<1023)){
       PWM1_Set_Duty(255);
       PWM2_Set_Duty(0);
       }
      else{
       PWM1_Set_Duty(0);
       PWM2_Set_Duty(0);
       }
    
      }
    }

    -----

  2. #2
    invite635643ae

    Re : affichage heure et date sur LCD et utilisation PWM

    Ce que tu essais de faire s'appelle de la programmation concurentielle, ou en embarqué du temps réel, pour ca il te faut un système d'exploitation plus communément appelée OS or le microcontroleur n'en contient pas puisqu'il est constitué d'un seul coeur, tu ne peux donc pas effectuer plusieurs instructions simultanément! Cependant en utilisant les interruptions, qui sont justement très utilisé dans les systèmes embarqués temps réels, tu peux arriver à faire quelque chose qui se rapproche de ton projet, mais il faudra que tes routines soient les plus courtes possibles et que l'humaine ne puisse pas percevoir qu'il y a interruption de ton programme donc tout dépend de tes temps de réponses,


    Le mieux est de passer par un système multitâche que tu vas coder et qui va simule du temps réel, ca ne sera pas du vrai temps réel! Tu vas simplement faire croire au microcontroleur qu'il effectue plusieurs taches en meme temps alors qu'en fait tu vas simplement fractionner le temps mis pour effectuer chaque tache.


    Pour ca tu devras passer par le timer et l'interruption de ton micro

  3. #3
    invite635643ae

    Re : affichage heure et date sur LCD et utilisation PWM

    Ou alors acheter un RTOS déja tout fais et l'implanter dans ton microcontroleur, voir google pour ca

  4. #4
    Montd'est

    Re : affichage heure et date sur LCD et utilisation PWM

    Citation Envoyé par Creezys Voir le message
    Bonjour;

    j'ai eu quelque problème en essayant d'afficher sur LCD et utiliser le PWM au même temps par exemple quand je fais fonctionner que le PWM ça marche trés bien si je fais fonctionner que l'affichage sur LCD ça fonctionne impécablement mais quand je regroupe les deux rien ne marche.


    a noter que je dois faire tourner 2 moteurs à l'aide de PWM1 et PWM2, ainsi que d'afficher l'heure et la date sur LCD; j'utilise un PIC 16F877A. le programme est comme suit:
    A mon sens: aucunement besoin de changer de µC;

    J'ai déjà fait ce genre de mélange LCD/PWM rapide, maintes fois avec 16F877A et 16F876A: jamais eu de souci.

    A mon avis tu devrais à tout prix virer TOUTES les instructions de type "Delay" qui bloquent momentanément le programme et posent problème à mon avis au LCD.

    Je n'en met jamais perso, je me sert systématiquement de compteur (basé sur TMR0 ou sur PWM ce qui permet d'éviter le conflit si on utilise déjà le PWM) à tous les coups, ça prends juste un peu plus de temps à faire mais ça fait moins de mauvaises surprises.
    Dernière modification par Montd'est ; 20/06/2014 à 18h39.

  5. A voir en vidéo sur Futura

Discussions similaires

  1. Date et heure volatiles
    Par Fistos dans le forum Matériel - Hardware
    Réponses: 8
    Dernier message: 04/10/2011, 16h13
  2. heure ou date se dérègle
    Par inviteba6e8313 dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 18/08/2011, 16h14
  3. réglage date heure
    Par invite0557f6df dans le forum Logiciel - Software - Open Source
    Réponses: 8
    Dernier message: 06/06/2008, 12h52
  4. date et heure powerpoint
    Par invite1551156a dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 20/06/2006, 12h34
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...