[Programmation] Problème affichage 7segments PIC
Répondre à la discussion
Affichage des résultats 1 à 12 sur 12

Problème affichage 7segments PIC



  1. #1
    Jkrss

    Problème affichage 7segments PIC


    ------

    Bonjour,
    Je suis en train de faire un projet de sonelec : un compteur de tempo.

    12CA38F3-7FE3-4A78-87E6-9F4EAE3BAB4A.gif

    Probleme: Je ne comprends pas pourquoi ça affiche les bonnes mesures mais que l’affichage ne se fait pas clairement...
    Il y a des segments à moitié allumés.
    67602FB5-1628-4ABA-A4D2-A9CC964514E3.jpg
    Merci de m’eclairer Sur ce problème
    Cordialement,
    John

    -----

  2. #2
    DAUDET78

    Re : Problème affichage 7segments PIC

    Bonjour Jkrss et bienvenue sur FUTURA
    Citation Envoyé par Jkrss Voir le message
    Il y a des segments à moitié allumés.
    Il faut, dans le soft (je ne le connais pas) faire un "blanking" lors de la commutation entre afficheur :
    1. On met RA2=0 Q3 est Off
    2. Tempo rapide (de l'ordre de 100µS)
    3. On change RB0 à RB6
    4. On met RA1=1 Q2 est On
    5. Tempo lente d'affichage (de l'ordre de 5mS) affichage digit du milieu
    6. On met RA1=0 Q2 est Off
    7. Tempo rapide (de l'ordre de 100µS)
    8. On change RB0 à RB6
    9. On met RA0=1 Q1 est On
    10. Tempo lente d'affichage (de l'ordre de 5mS) affichage digit de droite
    11. On met RA0=0 Q1 est Off
    12. Tempo rapide (de l'ordre de 100µS)
    13. On change RB0 à RB6
    14. On met RA2=1 Q3 est On
    15. Tempo lente d'affichage (de l'ordre de 5mS) affichage digit de gauche
    16. GOTO 1.
    J'aime pas le Grec

  3. #3
    elektrax

    Re : Problème affichage 7segments PIC

    meme probleme jamais résolu avec un autre schéma a 7 segments de sonelec
    sans pouvoir modifier le code source en mikroPascal
    pourquoi les prototypes de sonelec fonctionnent avec le code fourni ?
    j'ai bien une idée que je testerai peut etre un jour, sans modifier le code source.
    merci

  4. #4
    nornand

    Re : Problème affichage 7segments PIC

    bjr ca ressemble a un problème de vitesse de multiplexage .
    le 5+ le 3 donne le 9 qui s'affiche derrière le 1
    Dernière modification par nornand ; 13/07/2018 à 17h52.

  5. A voir en vidéo sur Futura
  6. #5
    Jkrss

    Re : Problème affichage 7segments PIC

    Effectivement, de gauche a droite, chaque chiffre s'affiche superposé et faiblement éclairé sur le précédent.
    IMG_1049.jpgIMG_1050.jpgIMG_1051.jpgIMG_1052.jpg

    Mais aucune idée de comment résoudre le problème..

  7. #6
    dje8269

    Re : Problème affichage 7segments PIC

    Bonjour ,

    Il te suffit de suivre les indications de DAUDET78 .

    Tu dois intercaler un blanking ( une laps de temps trés court sans aucun segment alimenté) .
    L'erreur vient du fait que pendant un temps trés court deux transistors , active en même temps 2 afficheurs. Donc tu vois l'empreinte de l'ancien sur le suivant. La luminosité est plus faible car le temps allumage très court .

    Reprends ton code
    C'est en faisant des erreurs; que l'on apprend le mieux !!

  8. #7
    Jkrss

    Re : Problème affichage 7segments PIC

    program electronique_compteur_tempo_00 1_16f628;

    var
    i: byte;
    dTap: dword;
    iTaps: array[0..3] of word; // store last values
    bTap, bTapNew, bTapOld: boolean;
    iPulses: word;
    iBPM: word;
    bOVF, bCalc: boolean;

    Disp_1: sbit at PORTA.0;
    Disp_2: sbit at PORTA.1;
    Disp_3: sbit at PORTA.2;
    Seg_A : sbit at PORTB.0;
    Seg_B : sbit at PORTB.1;
    Seg_C : sbit at PORTB.2;
    Seg_D : sbit at PORTB.3;
    Seg_E : sbit at PORTB.4;
    Seg_F : sbit at PORTB.5;
    Seg_G : sbit at PORTB.6;
    OutTest : sbit at PORTA.3;

    InCalc: sBit at PORTA.5;

    const
    bDispIsCC = true; // true if Common Cathode, false if Common Anode
    iTMR0Start = $04;
    iTMR1HStart = $FC; // preset for timer1 MSB register
    iTMR1LStart = $40; // preset for timer1 LSB register ($18 before correction)

    procedure Main_Init;
    begin
    CMCON := $07; // disable comparators
    OPTION_REG.NOT_RBPU := 0; // enable pullups, just used by RB7
    TRISA := %11100000;
    TRISB := %10000000;
    PORTA := %00000000;
    PORTB := %11111111;

    INTCON.GIE := 1;
    INTCON.PEIE := 1;
    INTCON.RBIE := 1;

    // timer1 activation
    PIE1.TMR1IE := 1;
    // Timer1 Registers: Prescaler=1:1; TMR1 Preset=64536; Freq=1*000,00Hz; Period=1,00 ms
    T1CON.T1CKPS1 := 0; // bits 5-4 Prescaler Rate Select bits
    T1CON.T1CKPS0 := 0; // bit 4
    T1CON.T1OSCEN := 0; // bit 3 Timer1 Oscillator Enable Control: bit 1=on
    T1CON.NOT_T1SYNC := 1; // bit 2 Timer1 External Clock Input Synchronization Control bit:1=Do not synchronize external clock input
    T1CON.TMR1CS := 0; // bit 1 Timer1 Clock Source Select bit:0=Internal clock (FOSC/4) / 1 = External clock from pin T1CKI (on the rising edge)
    T1CON.TMR1ON := 1; // bit 0 enables timer
    TMR1H := iTMR1HStart; // preset for timer1 MSB register
    TMR1L := iTMR1LStart; // preset for timer1 LSB register

    iBPM := 0;
    iPulses := 0;
    i := 0;
    for i := 0 to 3 do
    iTaps[i] := 0;
    end;

    procedure Interrupt;
    begin
    // timer1
    if TestBit(PIR1, TMR1IF) = 1 then
    begin
    OutTest := OutTest xor $01; // Test out 500 Hz (1000 int / sec)
    if iPulses < 10000 then // reset if no action during 10 sec
    inc(iPulses)
    else
    begin
    iPulses := 0;
    iBPM := 0;
    bOVF := true; // overflow
    end;
    TMR1H := iTMR1HStart; // preset for timer1 MSB register
    TMR1L := iTMR1LStart; // preset for timer1 LSB register
    ClearBit(PIR1, TMR1IF);
    end;

    // tap button pressed
    if TestBit(INTCON, RBIF) then
    begin
    bTapNew := TestBit(PORTB, 7);
    if bTapNew then
    bTap := true;
    ClearBit(INTCON, RBIF);
    end;

    end;

    procedure Display_DoDelay;
    begin
    Delay_ms(1);
    end;

    procedure Display_Refresh_Seg(SegVal: byte);
    var
    ValTmp: byte;
    begin
    // result := xGFEDCBA
    case SegVal of
    $00 : ValTmp := %11000000;
    $01 : ValTmp := %11111001;
    $02 : ValTmp := %10100100;
    $03 : ValTmp := %10110000;
    $04 : ValTmp := %10011001;
    $05 : ValTmp := %10010010;
    $06 : ValTmp := %10000010;
    $07 : ValTmp := %11111000;
    $08 : ValTmp := %10000000;
    $09 : ValTmp := %10010000;
    $0A : ValTmp := %10111111; // "-"
    end;

    // display is Common Cathode
    if bDispIsCC then
    begin
    Seg_A := ValTmp.0 xor 1;
    Seg_B := ValTmp.1 xor 1;
    Seg_C := ValTmp.2 xor 1;
    Seg_D := ValTmp.3 xor 1;
    Seg_E := ValTmp.4 xor 1;
    Seg_F := ValTmp.5 xor 1;
    Seg_G := ValTmp.6 xor 1;
    //Seg_DP := ValTmp.7 xor 1;
    end

    // display is Common Anode
    else begin
    Seg_A := ValTmp.0;
    Seg_B := ValTmp.1;
    Seg_C := ValTmp.2;
    Seg_D := ValTmp.3;
    Seg_E := ValTmp.4;
    Seg_F := ValTmp.5;
    Seg_G := ValTmp.6;
    //Seg_DP := ValTmp.7;
    end;
    end;

    procedure Display_Refresh;
    var
    iDigit: Word;
    i1, i2, i3: byte;
    begin

    iDigit := iBPM mod 10;
    i1 := byte(iDigit);
    //i1 := byte(iBPM mod 10);
    iDigit := (iBPM div 10) mod 10;
    i2 := byte(iDigit);
    //i2 := byte((iBPM div 10) mod 10);
    iDigit := iBPM div 100;
    i3 := byte(iDigit);
    //i3 := byte(iBPM div 100);

    // Select Display #1 (most on right) and show its value
    Disp_1 := 1; Disp_2 := 0; Disp_3 := 0;
    Display_Refresh_Seg(i1);
    Display_DoDelay;

    // Select Display #2 and show its value
    Disp_1 := 0; Disp_2 := 1; Disp_3 := 0;
    Display_Refresh_Seg(i2);
    Display_DoDelay;

    // Select Display #3 and show its value
    Disp_1 := 0; Disp_2 := 0; Disp_3 := 1;
    Display_Refresh_Seg(i3);
    Display_DoDelay;

    // unselect all Displays
    Disp_1 := 0; Disp_2 := 0; Disp_3 := 0;

    end;

    begin
    Main_Init;

    // welcome led blink
    PORTA.4 := 1;
    for i := 0 to 5 do
    begin
    PORTA.4 := PORTA.4 xor 1;
    delay_ms(100);
    end;

    while true do
    begin

    // BPM switch pressed ?
    if bTap then
    begin
    bTap := false;
    iTaps[0] := iTaps[1];
    iTaps[1] := iTaps[2];
    iTaps[2] := iTaps[3];
    iTaps[3] := word(60000 / iPulses);
    dTap := dword(iTaps[0] + iTaps[1] + iTaps[2] + iTaps[3]);
    if InCalc then
    iBPM := word(dTap / 4)
    else
    iBPM := iTaps[3];
    iPulses := 0;
    PORTA.4 := PORTA.4 xor 1; // show tap action toggle led on / off
    end;

    // show BPM (multiplex display)
    Display_Refresh;


    end;
    end.




    Voici le code fourni par sonelec, mais je ne sais pas où dois-je ajouter les lignes de blanking (je n'ai jamais fais de programmation... désolé de mon ignorance

  9. #8
    DAUDET78

    Re : Problème affichage 7segments PIC

    Sans aucune garantie ... j'ai modifié des lignes de code notées //Modif

    Code:
    var
      i: byte;
      dTap: dword;
      iTaps: array[0..3] of word;  // store last values
      bTap, bTapNew, bTapOld: boolean;
      iPulses: word;
      iBPM: word;
      bOVF, bCalc: boolean;
      
      Disp_1: sbit at PORTA.0;
      Disp_2: sbit at PORTA.1;
      Disp_3: sbit at PORTA.2;
      Seg_A : sbit at PORTB.0;
      Seg_B : sbit at PORTB.1;
      Seg_C : sbit at PORTB.2;
      Seg_D : sbit at PORTB.3;
      Seg_E : sbit at PORTB.4;
      Seg_F : sbit at PORTB.5;
      Seg_G : sbit at PORTB.6;
      OutTest : sbit at PORTA.3;
      
      InCalc: sBit at PORTA.5;
    
    const
      bDispIsCC = true;  // true if Common Cathode, false if Common Anode
      iTMR0Start = $04;
      iTMR1HStart = $FC; // preset for timer1 MSB register
      iTMR1LStart = $40; // preset for timer1 LSB register ($18 before correction)
    
    procedure Main_Init;
    begin
      CMCON := $07;     // disable comparators
      OPTION_REG.NOT_RBPU := 0; // enable pullups, just used by RB7
      TRISA := %11100000;
      TRISB := %10000000;
      PORTA := %00000000;
      PORTB := %11111111;
    
      INTCON.GIE := 1;
      INTCON.PEIE := 1;
      INTCON.RBIE := 1;
    
      // timer1 activation
      PIE1.TMR1IE := 1;
      // Timer1 Registers: Prescaler=1:1; TMR1 Preset=64536; Freq=1*000,00Hz; Period=1,00 ms
      T1CON.T1CKPS1 := 0;  // bits 5-4  Prescaler Rate Select bits
      T1CON.T1CKPS0 := 0;  // bit 4
      T1CON.T1OSCEN := 0;  // bit 3 Timer1 Oscillator Enable Control: bit 1=on
      T1CON.NOT_T1SYNC  := 1;  // bit 2 Timer1 External Clock Input Synchronization Control bit:1=Do not synchronize external clock input
      T1CON.TMR1CS  := 0;  // bit 1 Timer1 Clock Source Select bit:0=Internal clock (FOSC/4) / 1 = External clock from pin T1CKI (on the rising edge)
      T1CON.TMR1ON  := 1;  // bit 0 enables timer
      TMR1H := iTMR1HStart;         // preset for timer1 MSB register
      TMR1L := iTMR1LStart;         // preset for timer1 LSB register
    
      iBPM := 0;
      iPulses := 0;
      i := 0;
      for i := 0 to 3 do
        iTaps[i] := 0;
    end;
    
    procedure Interrupt;
    begin
      // timer1
      if TestBit(PIR1, TMR1IF) = 1 then
      begin
        OutTest := OutTest xor $01;  // Test out 500 Hz (1000 int / sec)
        if iPulses < 10000 then      // reset if no action during 10 sec
          inc(iPulses)
        else
        begin
          iPulses := 0;
          iBPM := 0;
          bOVF := true;               // overflow
        end;
        TMR1H := iTMR1HStart;         // preset for timer1 MSB register
        TMR1L := iTMR1LStart;         // preset for timer1 LSB register
        ClearBit(PIR1, TMR1IF);
      end;
      
      // tap button pressed
      if TestBit(INTCON, RBIF) then
      begin
        bTapNew := TestBit(PORTB, 7);
        if bTapNew then
          bTap := true;
        ClearBit(INTCON, RBIF);
      end;
    
    end;
    
    procedure Display_DoDelay;
    begin
      Delay_ms(5);  //Modif
    end;
    
    procedure Display_Refresh_Seg(SegVal: byte);
    var
      ValTmp: byte;
    begin
      // result := xGFEDCBA
      case SegVal of
        $00 : ValTmp := %11000000;
        $01 : ValTmp := %11111001;
        $02 : ValTmp := %10100100;
        $03 : ValTmp := %10110000;
        $04 : ValTmp := %10011001;
        $05 : ValTmp := %10010010;
        $06 : ValTmp := %10000010;
        $07 : ValTmp := %11111000;
        $08 : ValTmp := %10000000;
        $09 : ValTmp := %10010000;
        $0A : ValTmp := %10111111;   // "-"
      end;
      
      // display is Common Cathode
      if bDispIsCC then
      begin
        Seg_A := ValTmp.0 xor 1;
        Seg_B := ValTmp.1 xor 1;
        Seg_C := ValTmp.2 xor 1;
        Seg_D := ValTmp.3 xor 1;
        Seg_E := ValTmp.4 xor 1;
        Seg_F := ValTmp.5 xor 1;
        Seg_G := ValTmp.6 xor 1;
        //Seg_DP := ValTmp.7 xor 1;
      end
    
      // display is Common Anode
      else begin
        Seg_A := ValTmp.0;
        Seg_B := ValTmp.1;
        Seg_C := ValTmp.2;
        Seg_D := ValTmp.3;
        Seg_E := ValTmp.4;
        Seg_F := ValTmp.5;
        Seg_G := ValTmp.6;
        //Seg_DP := ValTmp.7;
      end;
    end;
    
    procedure Display_Refresh;
    var
      iDigit: Word;
      i1, i2, i3: byte;
    begin
    
      iDigit := iBPM mod 10;
      i1 := byte(iDigit);
      //i1 := byte(iBPM mod 10);
      iDigit := (iBPM div 10) mod 10;
      i2 := byte(iDigit);
      //i2 := byte((iBPM div 10) mod 10);
      iDigit := iBPM div 100;
      i3 := byte(iDigit);
      //i3 := byte(iBPM div 100);
    
      // Select Display #1 (most on right) and show its value
      Disp_1 := 0; Disp_2 := 0; Disp_3 := 0; //Modif
      Delay_ms(1);  //Modif
      Display_Refresh_Seg(i1);
      Disp_1 := 1; Disp_2 := 0; Disp_3 := 0;//Modif
      Display_DoDelay;
    
      // Select Display #2 and show its value
      Disp_1 := 0; Disp_2 := 0; Disp_3 := 0; //Modif
      Delay_ms(1);  //Modif
      Display_Refresh_Seg(i2);
      Disp_1 := 0; Disp_2 := 1; Disp_3 := 0; //Modif
      Display_DoDelay;
    
      // Select Display #3 and show its value
      Disp_1 := 0; Disp_2 := 0; Disp_3 := 0; //Modif
      Delay_ms(1);  //Modif
      Display_Refresh_Seg(i3);
      Disp_1 := 0; Disp_2 := 0; Disp_3 := 1; //Modif
      Display_DoDelay;
      
      // unselect all Displays
      Disp_1 := 0; Disp_2 := 0; Disp_3 := 0;
    
    end;
    
    begin
      Main_Init;
    
      // welcome led blink
      PORTA.4 := 1;
      for i := 0 to 5 do
      begin
        PORTA.4 := PORTA.4 xor 1;
        delay_ms(100);
      end;
      
      while true do
      begin
    
        // BPM switch pressed ?
        if bTap then
        begin
          bTap := false;
          iTaps[0] := iTaps[1];
          iTaps[1] := iTaps[2];
          iTaps[2] := iTaps[3];
          iTaps[3] := word(60000 / iPulses);
          dTap := dword(iTaps[0] + iTaps[1] + iTaps[2] + iTaps[3]);
          if InCalc then
            iBPM := word(dTap / 4)
          else
            iBPM := iTaps[3];
          iPulses := 0;
          PORTA.4 := PORTA.4 xor 1; // show tap action toggle led on / off
        end;
    
        // show BPM (multiplex display)
        Display_Refresh;
        
    
      end;
    end.
    J'aime pas le Grec

  10. #9
    Jkrss

    Re : Problème affichage 7segments PIC

    Merci beaucoup !

    Ce sont des delays qui ont pour effet de ralentir la vitesse de balayage du coup ?

    je test ça de suite !

  11. #10
    DAUDET78

    Re : Problème affichage 7segments PIC

    Citation Envoyé par Jkrss Voir le message
    Merci beaucoup !
    Tu me diras merci si ça marche !

    Ce sont des delays qui ont pour effet de ralentir la vitesse de balayage du coup ?
    Oui, à priori, je pense que la procedure Display_DoDelay détermine la cadence du multiplexage avec un pas de 1ms
    Comme je met un blanking de 1ms (c'est trop mais je ne me risque pas à faire moins car je ne sais pas comment faire moins), j'ai passé la cadence du multiplexage à 5ms pour conserver de la luminosité.

    La cadence du multiplexage n'est pas critique. Il faut rester au dessus de 25 affichages par seconde (persistance rétinienne) . Soit 12 ms max pour Display_DoDelay , donc 12+1 =13ms par digit
    J'aime pas le Grec

  12. #11
    adipie

    Re : Problème affichage 7segments PIC

    Citation Envoyé par DAUDET78 Voir le message
    Comme je met un blanking de 1ms (c'est trop mais je ne me risque pas à faire moins car je ne sais pas comment faire moins),
    Pour une pause de 100 micro secondes: Delay_us(100)

  13. #12
    DAUDET78

    Re : Problème affichage 7segments PIC

    Citation Envoyé par adipie Voir le message
    Pour une pause de 100 micro secondes: Delay_us(100)
    Merci !
    Y a toujours, sur ce forum un jeune pour conseiller un vieux ...
    J'aime pas le Grec

Discussions similaires

  1. Affichage De température Sur 7Segments !!
    Par rharrabi dans le forum Électronique
    Réponses: 16
    Dernier message: 22/05/2013, 16h55
  2. affichage simultané sur plusieurs afficheurs 7segments
    Par invite5e3d901c dans le forum Électronique
    Réponses: 2
    Dernier message: 13/05/2012, 13h22
  3. Adapter CAN -> 7segments 2 Digit
    Par kosbor57 dans le forum Électronique
    Réponses: 17
    Dernier message: 26/07/2011, 20h47
  4. convertisseur Hexadécimal/7segments
    Par invite3a769f22 dans le forum Électronique
    Réponses: 4
    Dernier message: 10/05/2011, 01h27
  5. PIC+7segments sur 1 seule PIN
    Par invitefc2bba3f dans le forum Électronique
    Réponses: 3
    Dernier message: 03/03/2010, 13h39
Découvrez nos comparatifs produits sur l'informatique et les technologies.