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. Publicité
  3. #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

  4. #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

  5. #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.

  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. A voir en vidéo sur Futura
  8. #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 !!

  9. Publicité
  10. #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

  11. #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

  12. #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 !

  13. #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

  14. #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)

  15. #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

  16. Publicité

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 aniscorpio 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 slim_anus dans le forum Électronique
    Réponses: 4
    Dernier message: 10/05/2011, 01h27
  5. PIC+7segments sur 1 seule PIN
    Par Tchotch dans le forum Électronique
    Réponses: 3
    Dernier message: 03/03/2010, 13h39
Découvrez nos comparatifs produits sur l'informatique et les technologies.