CONVERSION PICBASIC 3B vers PICAXE

version terminée.
Serait il possible qu a la fin du temps lorsque l affichage passe de 0000 puis reste vierge ( ne plus rien afficher )
lorsqu on pousse sur le bouton start l affichage s allume de nouveau.
 
CORRECTION
serait il possible qu a la fin du cycle lorsque la led verte s eteint l affichage s eteigne aussi. L affichage se rallumera lors d 'un nouveau start
 
CORRECTION
serait il possible qu a la fin du cycle lorsque la led verte s eteint l affichage s eteigne aussi. L affichage se rallumera lors d 'un nouveau start
Bonjour,
Je ne vois pas pourquoi ce ne serait pas possible.
Je ne pourrai plus faire de test avant...un mois, c'est donc toi qui les feras.
Serait il possible qu a la fin du temps lorsque l affichage passe de 0000 puis reste vierge ( ne plus rien afficher )
lorsqu on pousse sur le bouton start l affichage s allume de nouveau.
Oui, mais le décompte démarre immédiatement avec la valeur mémorisée
Pour info, la luminosité des segments se règle par une variable "regLum" (voir liste symbol)
reglum=$80, l'afficheur est éteint, reglum=$88, valeur mini, puis valeur croissantes : $8a; $8b.....$8f est le max . $8c est intermédiaire.
A ajuster à la valeur voulue
Une modif à venir.
MM
 
Première tentative, pas testé:

Code:
; décompteur 1/10s  MM 050726
; réglage par poussoirs +/-
;pour temps=9990 10ème s => tmax=16 mn 39s;
;les poussoirs sont sur le 0V,
;Broches avec pullup sur 20X2 : bit0-bit7 = C.0,C.6,C.7,B.0,B.1,B.5,B.6,B.7

;****** MODE D'EMPLOI **********
;A la mise sous tension, mémoire vide, passage auto en mode programmation temps

;Mode Programmation du temps:
;L'affichage est en /10 de seconde, avec un point décimal sur le digit 3
;Pour identifier ce mode,il y a en plus un point sur le digit 4
;Appui sur plus:
;            appui court < 500ms => incrémentation de 1
;            appui long  > 500ms => défilemenrt rapide
;Appui sur moins:
;            Idem en décrémentation
;Appui sur MEM => clignotement vert + rouge => mise en mémoire EEPROM
;Passage en mode décomptage
;
;Mode décomptage.
;Le point sur le digit 4 disparait,reste le point décimal digit3
;Attente appui sur poussoir start => décompte du temps led rouge allumée.
;A 5 s => led orange allumée
;A 00,0 s => R et O éteintes, verte allumée 10 s => retour valeur enregistrée.
;Arrêt possible par appui sur MEM à tout moment du décompte
;MEM => arret décompte => retour attente start avec temps mémorisé
;deuxième appui sur MEM =>passge en mode programmation
                    
#picaxe 20X2
setfreq M16
symbol dio=pinC.1            ;sur TM1637
symbol clk=pinC.2         ;idem
symbol mem=pinC.0            ;poussoir MEM
symbol plus=pinC.6        ;poussoir plus                     
symbol moins=pinC.7
symbol start=pinB.7
symbol orange=B.0        ;led
symbol rouge=B.1
symbol verte=B.2
symbol octet=b0    ;octet doit être en b0; le bit0 est utilisé
symbol j=b1        ;position point décimal
symbol i=b2        ;compteur
symbol chiffre=b3
symbol dp=b4
symbol point=b5
symbol second=w12    ;en fait des /10 de secondes
symbol div=w13
symbol nbre=w14
symbol Ttot=w15
symbol AdrDep=$c0 ; adresse du 1er digit (poids fort)
symbol RegLum=$8c ; réglage luminosité $80 + 8(allumé, 0:éteint) + 0 à 7(intensité)
dp=$80
;pullup sur 20X2  bit0-bit7 = C.0,C.6,C.7,B.0,B.1,B.5,B.6,B.7
pullup %10000111    ;sur C.0,C.6,C.7,B.7
dirsC=%110                ;pour utilisation pinsC
settimer 59285  ;1/10 s à 16MHs  59285
;    ***** init TM1637 et temps EEPROM
    clk=1 : dio=1 : dio=0        ;bal start
    Octet=RegLum        ;Réglage luminosité
    gosub EnvoiOctet
    clk=0: dio=0: clk=1: dio=1        ;bal stop
    low rouge,verte,orange
    read 0,Ttot      ;lecture temps en EEPROM
    if Ttot=0 then    ;la mémoire est vide       
        gosub  introtemp    ;entrer une valeur en mémoire EEPROM
    endif
    second=Ttot    ;initialisation compteur seconde
    gosub affich    ;affichage temps initial

;********decompte *******
decompt:
    pause 200
    do loop while mem=0    ;attente relachement suite arret decompte
    low rouge
    do 
        second=Ttot
        gosub affich
        do        ;****** boucle attente départ ou intro temps  ******       
           if mem=0 then gosub introtemp ;passage en programmation temps
        loop while start=1    ;attente start
        do 
            do
                timer=0
                high rouge
                ;boucle décomptage
                second=Ttot -timer
                if second < 50  then        ;5 secondes avant la fin
                    high orange
                endif
                if mem=0 then decompt          ;arret décompte et RAZ
                gosub affich
            loop while second<>0
            high verte:low orange,rouge        ;fin décompte
            timer=0
            do loop while timer <= 100        ;attente 10s led verte ON
            low rouge,verte,orange 
            ; On éteint tout
            clk=1 : dio=1 : dio=0        ;bal start
            Octet=$80       ;Réglage luminosité nulle
            gosub EnvoiOctet
            clk=0: dio=0: clk=1: dio=1        ;bal stop
            do loop while start=1
            ;On rallume tout
            clk=1 : dio=1 : dio=0        ;bal start
            Octet=$8c       ;Réglage luminosité
            gosub EnvoiOctet
            clk=0: dio=0: clk=1: dio=1        ;bal stop
        loop         
    loop
    
introtemp:       ;sub intro nouveau temps
;********** intro secondes *******
    pause 200
    do loop while mem=0
    pause 200
    point=1        ;ajout point décimal sur digit n°4
    do     
        gosub affich
        timer=0
        ;***** code plus *****
        if plus=0 then
            second =second+5 max 9995         
            do while plus=0
                if timer >5 then       ;500ms défilement accéléré           
                    second =second+5 max 9995
                    gosub affich               
                endif
            loop         
            gosub affich               
        endif
        ; code moins   
        if moins=0 then
            second =second-5 min 0         
            do while moins=0
                if timer >5 then               
                    second =second-5
                    if second>9999 then: second=0 :endif  ;dépassement négatif               
                    gosub affich               
                endif
            loop         
        gosub affich               
        endif
        if mem=0 then exit    ;fin de boucle intro secondes
    loop
    do loop while mem=0   ;attente relâchement poussoir
    Ttot=second 
    write  0,Ttot    ;mise en EEPROM
    high orange, rouge :pause 500:low orange, rouge:pause 500
    high orange, rouge :pause 500:low orange, rouge
    point=0        ;sortie mode introtemps
    gosub affich
    return

affich:
    div=1000
    clk=1 : dio=1 : dio=0        ;balise start
    Octet=adrdep        ;synchro adresse départ
    gosub EnvoiOctet
    Nbre=second    ;on tronçonne Nbre et affiche chaque chiffre
    for j=1 to 4   
        Chiffre=Nbre/Div    ;on isole le chiffre à afficher
        if j=1 and second<1000  and second<>0 then
           chiffre=10    ;chiffre "blanc" càd noir, en fait
        endif
        if j=2 and second<100 and second<>0 then
           chiffre=10
        endif
        lookup Chiffre,($3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7f,$6f,0), Octet ; 0-9 +blanc uniquement
        if j=3 then    ;choix affichage point
           octet=octet | dp    ;ajout point décimal
        endif
        if point=1 and j=4 then ;mode programmation temps
           octet=octet | dp    ;ajout point digit 4
        endif
        gosub EnvoiOctet;
        Nbre=Nbre//Div
        Div=Div/10
    next j
    clk=0: dio=0: clk=1: dio=1        ;balise stop
    return

;******* Envoi des chiffres (octet) bit à bit dans le registre ********
EnvoiOctet:    ;lecture de b0 bit à bit de bit0 à bit8 poids faible en tête.
    for i=1 to 8 ; envoi
        clk=0 
        dio=bit0
        Octet = Octet/2        ;décalage du bit lu, bit1 devient bit0
        clk=1
    next i
    clk=0 :clk=1: clk=0    ; balise  ACK
    return
 
Deuxième tentative:
Après les 10 s, l'afficheur s'éteint, deux possibilités:
- Appui sur start, le décomptage est relancé avec la valeur mémorisée
- Appui sur mem, on repart au début de mode décomptage, un appui sur start, on décompte, un appui sur mem, on passe en mode introtemps, avec possibilité de modif du temps avec une nouvelle mémorisation.
Non testé, à vérifier :
Code:
; décompteur 1/10s  MM 060726
; réglage par poussoirs +/-
;pour temps=9990 10ème s => tmax=16 mn 39s;
;les poussoirs sont sur le 0V,
;Broches avec pullup sur 20X2 : bit0-bit7 = C.0,C.6,C.7,B.0,B.1,B.5,B.6,B.7

;****** MODE D'EMPLOI **********
;A la mise sous tension, mémoire vide, passage auto en mode programmation temps

;Mode Programmation du temps:
;L'affichage est en /10 de seconde, avec un point décimal sur le digit 3
;Pour identifier ce mode,il y a en plus un point sur le digit 4
;Appui sur plus:
;            appui court < 500ms => incrémentation de 1
;            appui long  > 500ms => défilemenrt rapide
;Appui sur moins:
;            Idem en décrémentation
;Appui sur MEM => clignotement vert + rouge => mise en mémoire EEPROM
;Passage en mode décomptage
;
;Mode décomptage.
;Le point sur le digit 4 disparait,reste le point décimal digit3
;Attente appui sur poussoir start => décompte du temps led rouge allumée.
;A 5 s => led orange allumée
;A 00,0 s => R et O éteintes, verte allumée 10 s puis, l'affichage s'éteint
;Deux possibilités:
        ;Appui sur start => le cycle repart avec valeur en mémoire
        ;Appui sur mem pour affichage temps mémorisé, un second appui pour réglage possible  
;Arrêt possible par appui sur MEM à tout moment du décompte
;MEM => arret décompte => retour attente start avec temps mémorisé
;deuxième appui sur MEM =>passage en mode programmation
                   
#picaxe 20X2
setfreq M16
symbol dio=pinC.1            ;sur TM1637
symbol clk=pinC.2         ;idem
symbol mem=pinC.0            ;poussoir MEM
symbol plus=pinC.6        ;poussoir plus                    
symbol moins=pinC.7
symbol start=pinB.7
symbol orange=B.0        ;led
symbol rouge=B.1
symbol verte=B.2
symbol octet=b0    ;octet doit être en b0; le bit0 est utilisé
symbol j=b1        ;position point décimal
symbol i=b2        ;compteur
symbol chiffre=b3
symbol dp=b4
symbol point=b5
symbol second=w12    ;en fait des /10 de secondes
symbol div=w13
symbol nbre=w14
symbol Ttot=w15
symbol AdrDep=$c0 ; adresse du 1er digit (poids fort)
symbol RegLum=$8c ; réglage luminosité $80 + 8(allumé, 0:éteint) + 0 à 7(intensité)
dp=$80
;pullup sur 20X2  bit0-bit7 = C.0,C.6,C.7,B.0,B.1,B.5,B.6,B.7
pullup %10000111    ;sur C.0,C.6,C.7,B.7
dirsC=%110                ;pour utilisation pinsC
settimer 59285  ;1/10 s à 16MHs  59285
;    ***** init TM1637 et temps EEPROM
    clk=1 : dio=1 : dio=0        ;bal start
    Octet=RegLum        ;Réglage luminosité
    gosub EnvoiOctet
    clk=0: dio=0: clk=1: dio=1        ;bal stop
    low rouge,verte,orange
    read 0,Ttot      ;lecture temps en EEPROM
    if Ttot=0 then    ;la mémoire est vide      
        gosub  introtemp    ;entrer une valeur en mémoire EEPROM
    endif
    second=Ttot    ;initialisation compteur seconde
    gosub affich    ;affichage temps initial

;********decompte *******
decompt:
    pause 200
    ;On rallume tout    si afficheur éteint
    clk=1 : dio=1 : dio=0        ;bal start
    Octet=$8c       ;Réglage luminosité
    gosub EnvoiOctet
    clk=0: dio=0: clk=1: dio=1        ;bal stop
    do loop while mem=0    ;attente relachement suite arret decompte
    low rouge
    do
        second=Ttot
        gosub affich
        do        ;****** boucle attente départ ou intro temps  ******      
           if mem=0 then gosub introtemp ;passage en programmation temps
        loop while start=1    ;attente start
        do
            do
                timer=0
                high rouge
                ;boucle décomptage
                second=Ttot -timer
                if second < 50  then        ;5 secondes avant la fin
                    high orange
                endif
                if mem=0 then decompt          ;arret décompte et RAZ
                gosub affich
            loop while second<>0
            high verte:low orange,rouge        ;fin décompte
            timer=0
            do loop while timer <= 100        ;attente 10s led verte ON
            low rouge,verte,orange
            ; On éteint tout
            clk=1 : dio=1 : dio=0        ;bal start
            Octet=$80       ;Réglage luminosité =0
            gosub EnvoiOctet
            clk=0: dio=0: clk=1: dio=1        ;bal stop
            do loop while start=1 and mem=1
            if mem=0 then decompt
            ;On rallume tout
            clk=1 : dio=1 : dio=0        ;bal start
            Octet=$8c       ;Réglage luminosité
            gosub EnvoiOctet
            clk=0: dio=0: clk=1: dio=1        ;bal stop
        loop        
    loop
   
introtemp:       ;sub intro nouveau temps
;********** intro secondes *******
     pause 200
    do loop while mem=0        ;attente relachement pous
    pause 200
    point=1        ;ajout point décimal sur digit n°4
    do    
        gosub affich
        timer=0
        ;***** code plus *****
        if plus=0 then
            second =second+5 max 9995        
            do while plus=0
                if timer >5 then       ;500ms défilement accéléré          
                    second =second+5 max 9995
                    gosub affich              
                endif
            loop        
            gosub affich              
        endif
        ; code moins  
        if moins=0 then
            second =second-5 min 0        
            do while moins=0
                if timer >5 then              
                    second =second-5
                    if second>9999 then: second=0 :endif  ;dépassement négatif              
                    gosub affich              
                endif
            loop        
        gosub affich              
        endif
        if mem=0 then exit    ;fin de boucle intro secondes
    loop
    do loop while mem=0   ;attente relâchement poussoir
    Ttot=second
    write  0,Ttot    ;mise en EEPROM
    high orange, rouge :pause 500:low orange, rouge:pause 500
    high orange, rouge :pause 500:low orange, rouge
    point=0        ;sortie mode introtemps
    gosub affich
    return

affich:
    div=1000
    clk=1 : dio=1 : dio=0        ;balise start
    Octet=adrdep        ;synchro adresse départ
    gosub EnvoiOctet
    Nbre=second    ;on tronçonne Nbre et affiche chaque chiffre
    for j=1 to 4  
        Chiffre=Nbre/Div    ;on isole le chiffre à afficher
        if j=1 and second<1000  and second<>0 then
           chiffre=10    ;chiffre "blanc" càd noir, en fait
        endif
        if j=2 and second<100 and second<>0 then
           chiffre=10
        endif
        lookup Chiffre,($3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7f,$6f,0), Octet ; 0-9 +blanc uniquement
        if j=3 then    ;choix affichage point
           octet=octet | dp    ;ajout point décimal
        endif
        if point=1 and j=4 then ;mode programmation temps
           octet=octet | dp    ;ajout point digit 4
        endif
        gosub EnvoiOctet;
        Nbre=Nbre//Div
        Div=Div/10
    next j
    clk=0: dio=0: clk=1: dio=1        ;balise stop
    return

;******* Envoi des chiffres (octet) bit à bit dans le registre ********
EnvoiOctet:    ;lecture de b0 bit à bit de bit0 à bit8 poids faible en tête.
    for i=1 to 8 ; envoi
        clk=0
        dio=bit0
        Octet = Octet/2        ;décalage du bit lu, bit1 devient bit0
        clk=1
    next i
    clk=0 :clk=1: clk=0    ; balise  ACK
    return

MM
 
J'ai fait deux sub: "allume" et "eteint", c'est plus clair.
Code:
; décompteur 1/10s  MM 060726
; réglage par poussoirs +/-
;pour temps=9990 10ème s => tmax=16 mn 39s;
;les poussoirs sont sur le 0V,
;Broches avec pullup sur 20X2 : bit0-bit7 = C.0,C.6,C.7,B.0,B.1,B.5,B.6,B.7

;****** MODE D'EMPLOI **********
;A la mise sous tension, mémoire vide, passage auto en mode programmation temps

;Mode Programmation du temps:
;L'affichage est en /10 de seconde, avec un point décimal sur le digit 3
;Pour identifier ce mode,il y a en plus un point sur le digit 4
;Appui sur plus:
;            appui court < 500ms => incrémentation de 1
;            appui long  > 500ms => défilemenrt rapide
;Appui sur moins:
;            Idem en décrémentation
;Appui sur MEM => clignotement vert + rouge => mise en mémoire EEPROM
;Passage en mode décomptage
;
;Mode décomptage.
;Le point sur le digit 4 disparait,reste le point décimal digit3
;Attente appui sur poussoir start => décompte du temps led rouge allumée.
;A 5 s => led orange allumée
;A 00,0 s => R et O éteintes, verte allumée 10 s puis, l'affichage s'éteint
;Deux possibilités:
        ;Appui sur start => le cycle repart avec valeur en mémoire
        ;Appui sur mem pour affichage temps mémorisé, un second appui pour réglage possible
;Arrêt possible par appui sur MEM à tout moment du décompte
;MEM => arret décompte => retour attente start avec temps mémorisé
;deuxième appui sur MEM =>passage en mode programmation
                
#picaxe 20X2
setfreq M16
symbol dio=pinC.1            ;sur TM1637
symbol clk=pinC.2         ;idem
symbol mem=pinC.0            ;poussoir MEM
symbol plus=pinC.6        ;poussoir plus                 
symbol moins=pinC.7
symbol start=pinB.7
symbol orange=B.0        ;led
symbol rouge=B.1
symbol verte=B.2
symbol octet=b0    ;octet doit être en b0; le bit0 est utilisé
symbol j=b1        ;position point décimal
symbol i=b2        ;compteur
symbol chiffre=b3
symbol dp=b4
symbol point=b5
symbol second=w12    ;en fait des /10 de secondes
symbol div=w13
symbol nbre=w14
symbol Ttot=w15
symbol AdrDep=$c0 ; adresse du 1er digit (poids fort)
symbol RegLum=$8c ; réglage luminosité $80 = eteint, $88 à $8F => luminosité croissante
dp=$80
;pullup sur 20X2  bit0-bit7 = C.0,C.6,C.7,B.0,B.1,B.5,B.6,B.7
pullup %10000111    ;sur C.0,C.6,C.7,B.7
dirsC=%110                ;pour utilisation pinsC
settimer 59285  ;1/10 s à 16MHs  59285
;    ***** init TM1637 et temps EEPROM
      gosub allume
    low rouge,verte,orange
    read 0,Ttot      ;lecture temps en EEPROM
    if Ttot=0 then    ;la mémoire est vide   
        gosub  introtemp    ;entrer une valeur en mémoire EEPROM
    endif
    second=Ttot    ;initialisation compteur seconde
    gosub affich    ;affichage temps initial

;********decompte *******
decompt:
    pause 200
    ;On rallume tout    si afficheur éteint
    gosub allume
    do loop while mem=0    ;attente relachement suite arret decompte
    low rouge
    do
        second=Ttot
        gosub affich
        do        ;****** boucle attente départ ou intro temps  ******   
           if mem=0 then gosub introtemp ;passage en programmation temps
        loop while start=1    ;attente start
          timer=0
        do
            do             
                high rouge
                ;boucle décomptage
                second=Ttot -timer
                if second < 50  then        ;5 secondes avant la fin
                    high orange
                endif
                if mem=0 then decompt          ;arret décompte et RAZ
                gosub affich
            loop while second<>0
            high verte:low orange,rouge        ;fin décompte
            timer=0
            do loop while timer <= 100        ;attente 10s led verte ON
            low rouge,verte,orange
            ; On éteint tout
            gosub eteint
            do loop while start=1 and mem=1    ;attente appui sur start ou mem
            if mem=0 then decompt
            ;On rallume tout
            gosub allume   
        loop     
    loop
 
introtemp:       ;sub intro nouveau temps
;********** intro secondes *******
     pause 200
    do loop while mem=0        ;attente relachement pous
    pause 200
    point=1        ;ajout point décimal sur digit n°4
    do 
        gosub affich
        timer=0
        ;***** code plus *****
        if plus=0 then
            second =second+5 max 9995     
            do while plus=0
                if timer >5 then       ;500ms défilement accéléré       
                    second =second+5 max 9995
                    gosub affich           
                endif
            loop     
            gosub affich           
        endif
        ; code moins
        if moins=0 then
            second =second-5 min 0     
            do while moins=0
                if timer >5 then           
                    second =second-5
                    if second>9999 then: second=0 :endif  ;dépassement négatif           
                    gosub affich           
                endif
            loop     
        gosub affich           
        endif
        if mem=0 then exit    ;fin de boucle intro secondes
    loop
    do loop while mem=0   ;attente relâchement poussoir
    Ttot=second
    write  0,Ttot    ;mise en EEPROM
    high orange, rouge :pause 500:low orange, rouge:pause 500
    high orange, rouge :pause 500:low orange, rouge
    point=0        ;sortie mode introtemps
    gosub affich
    return

affich:
    div=1000
    clk=1 : dio=1 : dio=0        ;balise start
    Octet=adrdep        ;synchro adresse départ
    gosub EnvoiOctet
    Nbre=second    ;on tronçonne Nbre et affiche chaque chiffre
    for j=1 to 4
        Chiffre=Nbre/Div    ;on isole le chiffre à afficher
        if j=1 and second<1000  and second<>0 then
           chiffre=10    ;chiffre "blanc" càd noir, en fait
        endif
        if j=2 and second<100 and second<>0 then
           chiffre=10
        endif
        lookup Chiffre,($3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7f,$6f,0), Octet ; 0-9 +blanc uniquement
        if j=3 then    ;choix affichage point
           octet=octet | dp    ;ajout point décimal
        endif
        if point=1 and j=4 then ;mode programmation temps
           octet=octet | dp    ;ajout point digit 4
        endif
        gosub EnvoiOctet;
        Nbre=Nbre//Div
        Div=Div/10
    next j
    clk=0: dio=0: clk=1: dio=1        ;balise stop
    return

allume:
     clk=1 : dio=1 : dio=0        ;bal start
    Octet=RegLum        ;Réglage luminosité
    gosub EnvoiOctet
    clk=0: dio=0: clk=1: dio=1        ;bal stop
    return
eteint:
    clk=1 : dio=1 : dio=0        ;bal start
    Octet=$80       ;Réglage luminosité =0
    gosub EnvoiOctet
    clk=0: dio=0: clk=1: dio=1        ;bal stop
    return

;******* Envoi des chiffres (octet) bit à bit dans le registre ********
EnvoiOctet:    ;lecture de b0 bit à bit de bit0 à bit8 poids faible en tête.
    for i=1 to 8 ; envoi
        clk=0
        dio=bit0
        Octet = Octet/2        ;décalage du bit lu, bit1 devient bit0
        clk=1
    next i
    clk=0 :clk=1: clk=0    ; balise  ACK
    return

MM
 
Last edited:
J'ai fait deux sub: "allume" et "eteint", c'est plus clair.
Code:
; décompteur 1/10s  MM 060726
; réglage par poussoirs +/-
;pour temps=9990 10ème s => tmax=16 mn 39s;
;les poussoirs sont sur le 0V,
;Broches avec pullup sur 20X2 : bit0-bit7 = C.0,C.6,C.7,B.0,B.1,B.5,B.6,B.7

;****** MODE D'EMPLOI **********
;A la mise sous tension, mémoire vide, passage auto en mode programmation temps

;Mode Programmation du temps:
;L'affichage est en /10 de seconde, avec un point décimal sur le digit 3
;Pour identifier ce mode,il y a en plus un point sur le digit 4
;Appui sur plus:
;            appui court < 500ms => incrémentation de 1
;            appui long  > 500ms => défilemenrt rapide
;Appui sur moins:
;            Idem en décrémentation
;Appui sur MEM => clignotement vert + rouge => mise en mémoire EEPROM
;Passage en mode décomptage
;
;Mode décomptage.
;Le point sur le digit 4 disparait,reste le point décimal digit3
;Attente appui sur poussoir start => décompte du temps led rouge allumée.
;A 5 s => led orange allumée
;A 00,0 s => R et O éteintes, verte allumée 10 s puis, l'affichage s'éteint
;Deux possibilités:
        ;Appui sur start => le cycle repart avec valeur en mémoire
        ;Appui sur mem pour affichage temps mémorisé, un second appui pour réglage possible
;Arrêt possible par appui sur MEM à tout moment du décompte
;MEM => arret décompte => retour attente start avec temps mémorisé
;deuxième appui sur MEM =>passage en mode programmation
                
#picaxe 20X2
setfreq M16
symbol dio=pinC.1            ;sur TM1637
symbol clk=pinC.2         ;idem
symbol mem=pinC.0            ;poussoir MEM
symbol plus=pinC.6        ;poussoir plus                 
symbol moins=pinC.7
symbol start=pinB.7
symbol orange=B.0        ;led
symbol rouge=B.1
symbol verte=B.2
symbol octet=b0    ;octet doit être en b0; le bit0 est utilisé
symbol j=b1        ;position point décimal
symbol i=b2        ;compteur
symbol chiffre=b3
symbol dp=b4
symbol point=b5
symbol second=w12    ;en fait des /10 de secondes
symbol div=w13
symbol nbre=w14
symbol Ttot=w15
symbol AdrDep=$c0 ; adresse du 1er digit (poids fort)
symbol RegLum=$8c ; réglage luminosité $80 = eteint, $88 à $8F => luminosité croissante
dp=$80
;pullup sur 20X2  bit0-bit7 = C.0,C.6,C.7,B.0,B.1,B.5,B.6,B.7
pullup %10000111    ;sur C.0,C.6,C.7,B.7
dirsC=%110                ;pour utilisation pinsC
settimer 59285  ;1/10 s à 16MHs  59285
;    ***** init TM1637 et temps EEPROM
      gosub allume
    low rouge,verte,orange
    read 0,Ttot      ;lecture temps en EEPROM
    if Ttot=0 then    ;la mémoire est vide   
        gosub  introtemp    ;entrer une valeur en mémoire EEPROM
    endif
    second=Ttot    ;initialisation compteur seconde
    gosub affich    ;affichage temps initial

;********decompte *******
decompt:
    pause 200
    ;On rallume tout    si afficheur éteint
    gosub allume
    do loop while mem=0    ;attente relachement suite arret decompte
    low rouge
    do
        second=Ttot
        gosub affich
        do        ;****** boucle attente départ ou intro temps  ******   
           if mem=0 then gosub introtemp ;passage en programmation temps
        loop while start=1    ;attente start
        do
            do
                timer=0
                high rouge
                ;boucle décomptage
                second=Ttot -timer
                if second < 50  then        ;5 secondes avant la fin
                    high orange
                endif
                if mem=0 then decompt          ;arret décompte et RAZ
                gosub affich
            loop while second<>0
            high verte:low orange,rouge        ;fin décompte
            timer=0
            do loop while timer <= 100        ;attente 10s led verte ON
            low rouge,verte,orange
            ; On éteint tout
            gosub eteint
            do loop while start=1 and mem=1    ;attente appui sur start ou mem
            if mem=0 then decompt
            ;On rallume tout
            gosub allume   
        loop     
    loop
 
introtemp:       ;sub intro nouveau temps
;********** intro secondes *******
     pause 200
    do loop while mem=0        ;attente relachement pous
    pause 200
    point=1        ;ajout point décimal sur digit n°4
    do 
        gosub affich
        timer=0
        ;***** code plus *****
        if plus=0 then
            second =second+5 max 9995     
            do while plus=0
                if timer >5 then       ;500ms défilement accéléré       
                    second =second+5 max 9995
                    gosub affich           
                endif
            loop     
            gosub affich           
        endif
        ; code moins
        if moins=0 then
            second =second-5 min 0     
            do while moins=0
                if timer >5 then           
                    second =second-5
                    if second>9999 then: second=0 :endif  ;dépassement négatif           
                    gosub affich           
                endif
            loop     
        gosub affich           
        endif
        if mem=0 then exit    ;fin de boucle intro secondes
    loop
    do loop while mem=0   ;attente relâchement poussoir
    Ttot=second
    write  0,Ttot    ;mise en EEPROM
    high orange, rouge :pause 500:low orange, rouge:pause 500
    high orange, rouge :pause 500:low orange, rouge
    point=0        ;sortie mode introtemps
    gosub affich
    return

affich:
    div=1000
    clk=1 : dio=1 : dio=0        ;balise start
    Octet=adrdep        ;synchro adresse départ
    gosub EnvoiOctet
    Nbre=second    ;on tronçonne Nbre et affiche chaque chiffre
    for j=1 to 4
        Chiffre=Nbre/Div    ;on isole le chiffre à afficher
        if j=1 and second<1000  and second<>0 then
           chiffre=10    ;chiffre "blanc" càd noir, en fait
        endif
        if j=2 and second<100 and second<>0 then
           chiffre=10
        endif
        lookup Chiffre,($3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7f,$6f,0), Octet ; 0-9 +blanc uniquement
        if j=3 then    ;choix affichage point
           octet=octet | dp    ;ajout point décimal
        endif
        if point=1 and j=4 then ;mode programmation temps
           octet=octet | dp    ;ajout point digit 4
        endif
        gosub EnvoiOctet;
        Nbre=Nbre//Div
        Div=Div/10
    next j
    clk=0: dio=0: clk=1: dio=1        ;balise stop
    return

allume:
     clk=1 : dio=1 : dio=0        ;bal start
    Octet=RegLum        ;Réglage luminosité
    gosub EnvoiOctet
    clk=0: dio=0: clk=1: dio=1        ;bal stop
    return
eteint:
    clk=1 : dio=1 : dio=0        ;bal start
    Octet=$80       ;Réglage luminosité =0
    gosub EnvoiOctet
    clk=0: dio=0: clk=1: dio=1        ;bal stop
    return

;******* Envoi des chiffres (octet) bit à bit dans le registre ********
EnvoiOctet:    ;lecture de b0 bit à bit de bit0 à bit8 poids faible en tête.
    for i=1 to 8 ; envoi
        clk=0
        dio=bit0
        Octet = Octet/2        ;décalage du bit lu, bit1 devient bit0
        clk=1
    next i
    clk=0 :clk=1: clk=0    ; balise  ACK
    return

MM
bonjour le decompte ne demarre pas lors de l'appuis sur le bouton start
 
Bonjour,
Dans aucune des versions?
Donne une description plus complète, je n'ai plus le moyen de tester les programmes.
MM
 
Bonjour,
Code:
        do        ;****** boucle attente départ ou intro temps  ******   
           if mem=0 then gosub introtemp ;passage en programmation temps
        loop while start=1    ;attente start
          timer=0
        do
            do             
                high rouge
                ;boucle décomptage
                second=Ttot -timer
                if second < 50  then        ;5 secondes avant la f
Dans aucune des versions?
Donne une description plus complète, je n'ai plus le moyen de tester les programmes.
MM
Ok, je pense qu'il y a eu un pb de copier- coller, regarde où est le timer =0 dans le programme,
Si il est dans la boucle de décomptage, ça marche pas, normal.
J'ai modifié #86, refait un essai avec maintenant
MM
 
Le reset du timer là est la question:
finalement, je reposte le code, avec le reset au bon endroit...j'espère :
J'avais repris 050726.... j'ai remodifié...
Code:
;
; décompteur 1/10s  MM 060726
; réglage par poussoirs +/-
;pour temps=9990 10ème s => tmax=16 mn 39s;
;les poussoirs sont sur le 0V,
;Broches avec pullup sur 20X2 : bit0-bit7 = C.0,C.6,C.7,B.0,B.1,B.5,B.6,B.7

;****** MODE D'EMPLOI **********
;A la mise sous tension, mémoire vide, passage auto en mode programmation temps

;Mode Programmation du temps:
;L'affichage est en /10 de seconde, avec un point décimal sur le digit 3
;Pour identifier ce mode,il y a en plus un point sur le digit 4
;Appui sur plus:
;            appui court < 500ms => incrémentation de 1
;            appui long  > 500ms => défilemenrt rapide
;Appui sur moins:
;            Idem en décrémentation
;Appui sur MEM => clignotement vert + rouge => mise en mémoire EEPROM
;Passage en mode décomptage
;
;Mode décomptage.
;Le point sur le digit 4 disparait,reste le point décimal digit3
;Attente appui sur poussoir start => décompte du temps led rouge allumée.
;A 5 s => led orange allumée
;A 00,0 s => R et O éteintes, verte allumée 10 s puis, l'affichage s'éteint
;Deux possibilités:
        ;Appui sur start => le cycle repart avec valeur en mémoire
        ;Appui sur mem pour affichage temps mémorisé, un second appui pour réglage possible
;Arrêt possible par appui sur MEM à tout moment du décompte
;MEM => arret décompte => retour attente start avec temps mémorisé
;deuxième appui sur MEM =>passage en mode programmation
              
#picaxe 20X2
setfreq M16
symbol dio=pinC.1            ;sur TM1637
symbol clk=pinC.2         ;idem
symbol mem=pinC.0            ;poussoir MEM
symbol plus=pinC.6        ;poussoir plus               
symbol moins=pinC.7
symbol start=pinB.7
symbol orange=B.0        ;led
symbol rouge=B.1
symbol verte=B.2
symbol octet=b0    ;octet doit être en b0; le bit0 est utilisé
symbol j=b1        ;position point décimal
symbol i=b2        ;compteur
symbol chiffre=b3
symbol dp=b4
symbol point=b5
symbol second=w12    ;en fait des /10 de secondes
symbol div=w13
symbol nbre=w14
symbol Ttot=w15
symbol AdrDep=$c0 ; adresse du 1er digit (poids fort)
symbol RegLum=$8c ; réglage luminosité $80 = eteint, $88 à $8F => luminosité croissante
dp=$80
;pullup sur 20X2  bit0-bit7 = C.0,C.6,C.7,B.0,B.1,B.5,B.6,B.7
pullup %10000111    ;sur C.0,C.6,C.7,B.7
dirsC=%110                ;pour utilisation pinsC
settimer 59285  ;1/10 s à 16MHs  59285
;    ***** init TM1637 et temps EEPROM
      gosub allume
    low rouge,verte,orange
    read 0,Ttot      ;lecture temps en EEPROM
    if Ttot=0 then    ;la mémoire est vide 
        gosub  introtemp    ;entrer une valeur en mémoire EEPROM
    endif
    second=Ttot    ;initialisation compteur seconde
    gosub affich    ;affichage temps initial

;********decompte *******
decompt:
    pause 200
    ;On rallume tout    si afficheur éteint
    gosub allume
    do loop while mem=0    ;attente relachement suite arret decompte
    low rouge
    do
        second=Ttot
        gosub affich
        do        ;****** boucle attente départ ou intro temps  ****** 
           if mem=0 then gosub introtemp ;passage en programmation temps
        loop while start=1    ;attente start        
        do
                timer=0
            do           ;boucle décomptage
                high rouge               
                second=Ttot -timer
                if second < 50  then        ;5 secondes avant la fin
                    high orange
                endif
                if mem=0 then decompt          ;arret décompte et RAZ
                gosub affich
            loop while second<>0
            high verte:low orange,rouge        ;fin décompte
            timer=0
            do loop while timer <= 100        ;attente 10s led verte ON
            low rouge,verte,orange
            ; On éteint tout
            gosub eteint
            do loop while start=1 and mem=1    ;attente appui sur start ou mem
            if mem=0 then decompt
            ;On rallume tout
            gosub allume 
        loop   
    loop
 
introtemp:       ;sub intro nouveau temps
;********** intro secondes *******
     pause 200
    do loop while mem=0        ;attente relachement pous
    pause 200
    point=1        ;ajout point décimal sur digit n°4
    do
        gosub affich
        timer=0
        ;***** code plus *****
        if plus=0 then
            second =second+5 max 9995   
            do while plus=0
                if timer >5 then       ;500ms défilement accéléré     
                    second =second+5 max 9995
                    gosub affich         
                endif
            loop   
            gosub affich         
        endif
        ; code moins
        if moins=0 then
            second =second-5 min 0   
            do while moins=0
                if timer >5 then         
                    second =second-5
                    if second>9999 then: second=0 :endif  ;dépassement négatif         
                    gosub affich         
                endif
            loop   
        gosub affich         
        endif
        if mem=0 then exit    ;fin de boucle intro secondes
    loop
    do loop while mem=0   ;attente relâchement poussoir
    Ttot=second
    write  0,Ttot    ;mise en EEPROM
    high orange, rouge :pause 500:low orange, rouge:pause 500
    high orange, rouge :pause 500:low orange, rouge
    point=0        ;sortie mode introtemps
    gosub affich
    return

affich:
    div=1000
    clk=1 : dio=1 : dio=0        ;balise start
    Octet=adrdep        ;synchro adresse départ
    gosub EnvoiOctet
    Nbre=second    ;on tronçonne Nbre et affiche chaque chiffre
    for j=1 to 4
        Chiffre=Nbre/Div    ;on isole le chiffre à afficher
        if j=1 and second<1000  and second<>0 then
           chiffre=10    ;chiffre "blanc" càd noir, en fait
        endif
        if j=2 and second<100 and second<>0 then
           chiffre=10
        endif
        lookup Chiffre,($3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7f,$6f,0), Octet ; 0-9 +blanc uniquement
        if j=3 then    ;choix affichage point
           octet=octet | dp    ;ajout point décimal
        endif
        if point=1 and j=4 then ;mode programmation temps
           octet=octet | dp    ;ajout point digit 4
        endif
        gosub EnvoiOctet;
        Nbre=Nbre//Div
        Div=Div/10
    next j
    clk=0: dio=0: clk=1: dio=1        ;balise stop
    return

allume:
     clk=1 : dio=1 : dio=0        ;bal start
    Octet=RegLum        ;Réglage luminosité
    gosub EnvoiOctet
    clk=0: dio=0: clk=1: dio=1        ;bal stop
    return
eteint:
    clk=1 : dio=1 : dio=0        ;bal start
    Octet=$80       ;Réglage luminosité =0
    gosub EnvoiOctet
    clk=0: dio=0: clk=1: dio=1        ;bal stop
    return

;******* Envoi des chiffres (octet) bit à bit dans le registre ********
EnvoiOctet:    ;lecture de b0 bit à bit de bit0 à bit8 poids faible en tête.
    for i=1 to 8 ; envoi
        clk=0
        dio=bit0
        Octet = Octet/2        ;décalage du bit lu, bit1 devient bit0
        clk=1
    next i
    clk=0 :clk=1: clk=0    ; balise  ACK
    return

MM
 
Last edited:
Le reset du timer là est la question:
finalement, je reposte le code, avec le reset au bon endroit...j'espère :
J'avais repris 050726.... j'ai remodifié...
Code:
;
; décompteur 1/10s  MM 060726
; réglage par poussoirs +/-
;pour temps=9990 10ème s => tmax=16 mn 39s;
;les poussoirs sont sur le 0V,
;Broches avec pullup sur 20X2 : bit0-bit7 = C.0,C.6,C.7,B.0,B.1,B.5,B.6,B.7

;****** MODE D'EMPLOI **********
;A la mise sous tension, mémoire vide, passage auto en mode programmation temps

;Mode Programmation du temps:
;L'affichage est en /10 de seconde, avec un point décimal sur le digit 3
;Pour identifier ce mode,il y a en plus un point sur le digit 4
;Appui sur plus:
;            appui court < 500ms => incrémentation de 1
;            appui long  > 500ms => défilemenrt rapide
;Appui sur moins:
;            Idem en décrémentation
;Appui sur MEM => clignotement vert + rouge => mise en mémoire EEPROM
;Passage en mode décomptage
;
;Mode décomptage.
;Le point sur le digit 4 disparait,reste le point décimal digit3
;Attente appui sur poussoir start => décompte du temps led rouge allumée.
;A 5 s => led orange allumée
;A 00,0 s => R et O éteintes, verte allumée 10 s puis, l'affichage s'éteint
;Deux possibilités:
        ;Appui sur start => le cycle repart avec valeur en mémoire
        ;Appui sur mem pour affichage temps mémorisé, un second appui pour réglage possible
;Arrêt possible par appui sur MEM à tout moment du décompte
;MEM => arret décompte => retour attente start avec temps mémorisé
;deuxième appui sur MEM =>passage en mode programmation
             
#picaxe 20X2
setfreq M16
symbol dio=pinC.1            ;sur TM1637
symbol clk=pinC.2         ;idem
symbol mem=pinC.0            ;poussoir MEM
symbol plus=pinC.6        ;poussoir plus              
symbol moins=pinC.7
symbol start=pinB.7
symbol orange=B.0        ;led
symbol rouge=B.1
symbol verte=B.2
symbol octet=b0    ;octet doit être en b0; le bit0 est utilisé
symbol j=b1        ;position point décimal
symbol i=b2        ;compteur
symbol chiffre=b3
symbol dp=b4
symbol point=b5
symbol second=w12    ;en fait des /10 de secondes
symbol div=w13
symbol nbre=w14
symbol Ttot=w15
symbol AdrDep=$c0 ; adresse du 1er digit (poids fort)
symbol RegLum=$8c ; réglage luminosité $80 = eteint, $88 à $8F => luminosité croissante
dp=$80
;pullup sur 20X2  bit0-bit7 = C.0,C.6,C.7,B.0,B.1,B.5,B.6,B.7
pullup %10000111    ;sur C.0,C.6,C.7,B.7
dirsC=%110                ;pour utilisation pinsC
settimer 59285  ;1/10 s à 16MHs  59285
;    ***** init TM1637 et temps EEPROM
      gosub allume
    low rouge,verte,orange
    read 0,Ttot      ;lecture temps en EEPROM
    if Ttot=0 then    ;la mémoire est vide
        gosub  introtemp    ;entrer une valeur en mémoire EEPROM
    endif
    second=Ttot    ;initialisation compteur seconde
    gosub affich    ;affichage temps initial

;********decompte *******
decompt:
    pause 200
    ;On rallume tout    si afficheur éteint
    gosub allume
    do loop while mem=0    ;attente relachement suite arret decompte
    low rouge
    do
        second=Ttot
        gosub affich
        do        ;****** boucle attente départ ou intro temps  ******
           if mem=0 then gosub introtemp ;passage en programmation temps
        loop while start=1    ;attente start       
        do
                timer=0
            do           ;boucle décomptage
                high rouge              
                second=Ttot -timer
                if second < 50  then        ;5 secondes avant la fin
                    high orange
                endif
                if mem=0 then decompt          ;arret décompte et RAZ
                gosub affich
            loop while second<>0
            high verte:low orange,rouge        ;fin décompte
            timer=0
            do loop while timer <= 100        ;attente 10s led verte ON
            low rouge,verte,orange
            ; On éteint tout
            gosub eteint
            do loop while start=1 and mem=1    ;attente appui sur start ou mem
            if mem=0 then decompt
            ;On rallume tout
            gosub allume
        loop  
    loop
 
introtemp:       ;sub intro nouveau temps
;********** intro secondes *******
     pause 200
    do loop while mem=0        ;attente relachement pous
    pause 200
    point=1        ;ajout point décimal sur digit n°4
    do
        gosub affich
        timer=0
        ;***** code plus *****
        if plus=0 then
            second =second+5 max 9995  
            do while plus=0
                if timer >5 then       ;500ms défilement accéléré    
                    second =second+5 max 9995
                    gosub affich        
                endif
            loop  
            gosub affich        
        endif
        ; code moins
        if moins=0 then
            second =second-5 min 0  
            do while moins=0
                if timer >5 then        
                    second =second-5
                    if second>9999 then: second=0 :endif  ;dépassement négatif        
                    gosub affich        
                endif
            loop  
        gosub affich        
        endif
        if mem=0 then exit    ;fin de boucle intro secondes
    loop
    do loop while mem=0   ;attente relâchement poussoir
    Ttot=second
    write  0,Ttot    ;mise en EEPROM
    high orange, rouge :pause 500:low orange, rouge:pause 500
    high orange, rouge :pause 500:low orange, rouge
    point=0        ;sortie mode introtemps
    gosub affich
    return

affich:
    div=1000
    clk=1 : dio=1 : dio=0        ;balise start
    Octet=adrdep        ;synchro adresse départ
    gosub EnvoiOctet
    Nbre=second    ;on tronçonne Nbre et affiche chaque chiffre
    for j=1 to 4
        Chiffre=Nbre/Div    ;on isole le chiffre à afficher
        if j=1 and second<1000  and second<>0 then
           chiffre=10    ;chiffre "blanc" càd noir, en fait
        endif
        if j=2 and second<100 and second<>0 then
           chiffre=10
        endif
        lookup Chiffre,($3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7f,$6f,0), Octet ; 0-9 +blanc uniquement
        if j=3 then    ;choix affichage point
           octet=octet | dp    ;ajout point décimal
        endif
        if point=1 and j=4 then ;mode programmation temps
           octet=octet | dp    ;ajout point digit 4
        endif
        gosub EnvoiOctet;
        Nbre=Nbre//Div
        Div=Div/10
    next j
    clk=0: dio=0: clk=1: dio=1        ;balise stop
    return

allume:
     clk=1 : dio=1 : dio=0        ;bal start
    Octet=RegLum        ;Réglage luminosité
    gosub EnvoiOctet
    clk=0: dio=0: clk=1: dio=1        ;bal stop
    return
eteint:
    clk=1 : dio=1 : dio=0        ;bal start
    Octet=$80       ;Réglage luminosité =0
    gosub EnvoiOctet
    clk=0: dio=0: clk=1: dio=1        ;bal stop
    return

;******* Envoi des chiffres (octet) bit à bit dans le registre ********
EnvoiOctet:    ;lecture de b0 bit à bit de bit0 à bit8 poids faible en tête.
    for i=1 to 8 ; envoi
        clk=0
        dio=bit0
        Octet = Octet/2        ;décalage du bit lu, bit1 devient bit0
        clk=1
    next i
    clk=0 :clk=1: clk=0    ; balise  ACK
    return

MM
cette version fonctionne je vais tester plus en profondeur mais ca a l'air de bien fonctionner merci 100000x pour tout ce travail bien fait
 
cette version fonctionne je vais tester plus en profondeur mais ca a l'air de bien fonctionner merci 100000x pour tout ce travail bien fait
Vérifie que tout fonctionne comme prévu, possibilité de sortir de la boucle par mem, modif du temps, etc
MM
 
ca fonctionne bien c est parfais
il faudrait peut etre faire un clear de la memoire apres envois d'un nouveau programme dans le picaxe. En effet il se met bien en mode programme du temps mais si par erreur j appuie sur la touche moins j ai des valeurs bizarre qui s affiche. Tout rentre dans l'ordre si j appuie sur la touche + . C est pas en sois grave ( on injecte pas le programme souvent ) mais pour le fun ....... le reste c est top
 
Ok, je vois ça, en fait, si on fait un - à partir de 0, on boucle sur 65535 çàd: 0-1=65535...Je pensais ce pb réglé, apparemment, c'est pas le cas
A suivre.
Il y avait un min=0, mais ça ne fonctionne pas bien, j'ai modifié. Au testeur de tester....

Code:
; décompteur 1/10s  MM 060726
; réglage par poussoirs +/-
;pour temps=9990 10ème s => tmax=16 mn 39s;
;les poussoirs sont sur le 0V,
;Broches avec pullup sur 20X2 : bit0-bit7 = C.0,C.6,C.7,B.0,B.1,B.5,B.6,B.7

;****** MODE D'EMPLOI **********
;A la mise sous tension, mémoire vide, passage auto en mode programmation temps

;Mode Programmation du temps:
;L'affichage est en /10 de seconde, avec un point décimal sur le digit 3
;Pour identifier ce mode,il y a en plus un point sur le digit 4
;Appui sur plus:
;            appui court < 500ms => incrémentation de 1
;            appui long  > 500ms => défilemenrt rapide
;Appui sur moins:
;            Idem en décrémentation
;Appui sur MEM => clignotement vert + rouge => mise en mémoire EEPROM
;Passage en mode décomptage
;
;Mode décomptage.
;Le point sur le digit 4 disparait,reste le point décimal digit3
;Attente appui sur poussoir start => décompte du temps led rouge allumée.
;A 5 s => led orange allumée
;A 00,0 s => R et O éteintes, verte allumée 10 s puis, l'affichage s'éteint
;Deux possibilités:
        ;Appui sur start => le cycle repart avec valeur en mémoire
        ;Appui sur mem pour affichage temps mémorisé, un second appui pour réglage possible
;Arrêt possible par appui sur MEM à tout moment du décompte
;MEM => arret décompte => retour attente start avec temps mémorisé
;deuxième appui sur MEM =>passage en mode programmation
               
#picaxe 20X2
setfreq M16
symbol dio=pinC.1            ;sur TM1637
symbol clk=pinC.2         ;idem
symbol mem=pinC.0            ;poussoir MEM
symbol plus=pinC.6        ;poussoir plus                
symbol moins=pinC.7
symbol start=pinB.7
symbol orange=B.0        ;led
symbol rouge=B.1
symbol verte=B.2
symbol octet=b0    ;octet doit être en b0; le bit0 est utilisé
symbol j=b1        ;position point décimal
symbol i=b2        ;compteur
symbol chiffre=b3
symbol dp=b4
symbol point=b5
symbol second=w12    ;en fait des /10 de secondes
symbol div=w13
symbol nbre=w14
symbol Ttot=w15
symbol AdrDep=$c0 ; adresse du 1er digit (poids fort)
symbol RegLum=$8c ; réglage luminosité $80 = eteint, $88 à $8F => luminosité croissante
dp=$80
;pullup sur 20X2  bit0-bit7 = C.0,C.6,C.7,B.0,B.1,B.5,B.6,B.7
pullup %10000111    ;sur C.0,C.6,C.7,B.7
dirsC=%110                ;pour utilisation pinsC
settimer 59285  ;1/10 s à 16MHs  59285
;    ***** init TM1637 et temps EEPROM
      gosub allume
    low rouge,verte,orange
    read 0,Ttot      ;lecture temps en EEPROM
    if Ttot=0 then    ;la mémoire est vide  
        gosub  introtemp    ;entrer une valeur en mémoire EEPROM
    endif
    second=Ttot    ;initialisation compteur seconde
    gosub affich    ;affichage temps initial

;********decompte *******
decompt:
    pause 200
    ;On rallume tout    si afficheur éteint
    gosub allume
    do loop while mem=0    ;attente relachement suite arret decompte
    low rouge
    do
        second=Ttot
        gosub affich
        do        ;****** boucle attente départ ou intro temps  ******  
           if mem=0 then gosub introtemp ;passage en programmation temps
        loop while start=1    ;attente start        
        do
                timer=0
            do      ;boucle décomptage      
                high rouge              
                second=Ttot -timer
                if second < 50  then        ;5 secondes avant la fin
                    high orange
                endif
                if mem=0 then decompt          ;arret décompte et RAZ
                gosub affich
            loop while second<>0
            high verte:low orange,rouge        ;fin décompte
            timer=0
            do loop while timer <= 100        ;attente 10s led verte ON
            low rouge,verte,orange          
            gosub eteint     ; On éteint tout
            do loop while start=1 and mem=1    ;attente appui sur start ou mem
            if mem=0 then decompt          
            gosub allume   ;On rallume tout
        loop  
    loop
 
introtemp:       ;sub intro nouveau temps
;********** intro secondes *******
     pause 200
    do loop while mem=0        ;attente relachement pous
    pause 200
    point=1        ;ajout point décimal sur digit n°4
    do
        gosub affich
        timer=0
        ;***** code plus *****
        if plus=0 then
            second =second+5 max 9995    
            do while plus=0
                if timer >5 then       ;500ms défilement accéléré      
                    second =second+5 max 9995
                    gosub affich          
                endif
            loop    
            gosub affich          
        endif
        ; code moins
        if moins=0 then
            second =second-5
                if second > 9999 then: second=0:endif   ;passage en négatif
            do while moins=0
                if timer >5 then          
                    second =second-5
                    if second>9999 then: second=0 :endif  ;dépassement négatif          
                    gosub affich          
                endif
            loop    
        gosub affich          
        endif
        if mem=0 then exit    ;fin de boucle intro secondes
    loop
    do loop while mem=0   ;attente relâchement poussoir
    Ttot=second
    write  0,Ttot    ;mise en EEPROM
    high orange, rouge :pause 500:low orange, rouge:pause 500
    high orange, rouge :pause 500:low orange, rouge
    point=0        ;sortie mode introtemps
    gosub affich
    return

affich:
    div=1000
    clk=1 : dio=1 : dio=0        ;balise start
    Octet=adrdep        ;synchro adresse départ
    gosub EnvoiOctet
    Nbre=second    ;on tronçonne Nbre et affiche chaque chiffre
    for j=1 to 4
        Chiffre=Nbre/Div    ;on isole le chiffre à afficher
        if j=1 and second<1000  and second<>0 then
           chiffre=10    ;chiffre "blanc" càd noir, en fait
        endif
        if j=2 and second<100 and second<>0 then
           chiffre=10
        endif
        lookup Chiffre,($3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7f,$6f,0), Octet ; 0-9 +blanc uniquement
        if j=3 then    ;choix affichage point
           octet=octet | dp    ;ajout point décimal
        endif
        if point=1 and j=4 then ;mode programmation temps
           octet=octet | dp    ;ajout point digit 4
        endif
        gosub EnvoiOctet;
        Nbre=Nbre//Div
        Div=Div/10
    next j
    clk=0: dio=0: clk=1: dio=1        ;balise stop
    return

allume:
     clk=1 : dio=1 : dio=0        ;bal start
    Octet=RegLum        ;Réglage luminosité
    gosub EnvoiOctet
    clk=0: dio=0: clk=1: dio=1        ;bal stop
    return
eteint:
    clk=1 : dio=1 : dio=0        ;bal start
    Octet=$80       ;Réglage luminosité =0
    gosub EnvoiOctet
    clk=0: dio=0: clk=1: dio=1        ;bal stop
    return

;******* Envoi des chiffres (octet) bit à bit dans le registre ********
EnvoiOctet:    ;lecture de b0 bit à bit de bit0 à bit8 poids faible en tête.
    for i=1 to 8 ; envoi
        clk=0
        dio=bit0
        Octet = Octet/2        ;décalage du bit lu, bit1 devient bit0
        clk=1
    next i
    clk=0 :clk=1: clk=0    ; balise  ACK
    return
MM
 
Ok, je vois ça, en fait, si on fait un - à partir de 0, on boucle sur 65535 çàd: 0-1=65535...Je pensais ce pb réglé, apparemment, c'est pas le cas
A suivre.
Il y avait un min=0, mais ça ne fonctionne pas bien, j'ai modifié. Au testeur de tester....

Code:
; décompteur 1/10s  MM 060726
; réglage par poussoirs +/-
;pour temps=9990 10ème s => tmax=16 mn 39s;
;les poussoirs sont sur le 0V,
;Broches avec pullup sur 20X2 : bit0-bit7 = C.0,C.6,C.7,B.0,B.1,B.5,B.6,B.7

;****** MODE D'EMPLOI **********
;A la mise sous tension, mémoire vide, passage auto en mode programmation temps

;Mode Programmation du temps:
;L'affichage est en /10 de seconde, avec un point décimal sur le digit 3
;Pour identifier ce mode,il y a en plus un point sur le digit 4
;Appui sur plus:
;            appui court < 500ms => incrémentation de 1
;            appui long  > 500ms => défilemenrt rapide
;Appui sur moins:
;            Idem en décrémentation
;Appui sur MEM => clignotement vert + rouge => mise en mémoire EEPROM
;Passage en mode décomptage
;
;Mode décomptage.
;Le point sur le digit 4 disparait,reste le point décimal digit3
;Attente appui sur poussoir start => décompte du temps led rouge allumée.
;A 5 s => led orange allumée
;A 00,0 s => R et O éteintes, verte allumée 10 s puis, l'affichage s'éteint
;Deux possibilités:
        ;Appui sur start => le cycle repart avec valeur en mémoire
        ;Appui sur mem pour affichage temps mémorisé, un second appui pour réglage possible
;Arrêt possible par appui sur MEM à tout moment du décompte
;MEM => arret décompte => retour attente start avec temps mémorisé
;deuxième appui sur MEM =>passage en mode programmation
              
#picaxe 20X2
setfreq M16
symbol dio=pinC.1            ;sur TM1637
symbol clk=pinC.2         ;idem
symbol mem=pinC.0            ;poussoir MEM
symbol plus=pinC.6        ;poussoir plus               
symbol moins=pinC.7
symbol start=pinB.7
symbol orange=B.0        ;led
symbol rouge=B.1
symbol verte=B.2
symbol octet=b0    ;octet doit être en b0; le bit0 est utilisé
symbol j=b1        ;position point décimal
symbol i=b2        ;compteur
symbol chiffre=b3
symbol dp=b4
symbol point=b5
symbol second=w12    ;en fait des /10 de secondes
symbol div=w13
symbol nbre=w14
symbol Ttot=w15
symbol AdrDep=$c0 ; adresse du 1er digit (poids fort)
symbol RegLum=$8c ; réglage luminosité $80 = eteint, $88 à $8F => luminosité croissante
dp=$80
;pullup sur 20X2  bit0-bit7 = C.0,C.6,C.7,B.0,B.1,B.5,B.6,B.7
pullup %10000111    ;sur C.0,C.6,C.7,B.7
dirsC=%110                ;pour utilisation pinsC
settimer 59285  ;1/10 s à 16MHs  59285
;    ***** init TM1637 et temps EEPROM
      gosub allume
    low rouge,verte,orange
    read 0,Ttot      ;lecture temps en EEPROM
    if Ttot=0 then    ;la mémoire est vide 
        gosub  introtemp    ;entrer une valeur en mémoire EEPROM
    endif
    second=Ttot    ;initialisation compteur seconde
    gosub affich    ;affichage temps initial

;********decompte *******
decompt:
    pause 200
    ;On rallume tout    si afficheur éteint
    gosub allume
    do loop while mem=0    ;attente relachement suite arret decompte
    low rouge
    do
        second=Ttot
        gosub affich
        do        ;****** boucle attente départ ou intro temps  ****** 
           if mem=0 then gosub introtemp ;passage en programmation temps
        loop while start=1    ;attente start       
        do
                timer=0
            do      ;boucle décomptage     
                high rouge             
                second=Ttot -timer
                if second < 50  then        ;5 secondes avant la fin
                    high orange
                endif
                if mem=0 then decompt          ;arret décompte et RAZ
                gosub affich
            loop while second<>0
            high verte:low orange,rouge        ;fin décompte
            timer=0
            do loop while timer <= 100        ;attente 10s led verte ON
            low rouge,verte,orange         
            gosub eteint     ; On éteint tout
            do loop while start=1 and mem=1    ;attente appui sur start ou mem
            if mem=0 then decompt         
            gosub allume   ;On rallume tout
        loop 
    loop
 
introtemp:       ;sub intro nouveau temps
;********** intro secondes *******
     pause 200
    do loop while mem=0        ;attente relachement pous
    pause 200
    point=1        ;ajout point décimal sur digit n°4
    do
        gosub affich
        timer=0
        ;***** code plus *****
        if plus=0 then
            second =second+5 max 9995   
            do while plus=0
                if timer >5 then       ;500ms défilement accéléré     
                    second =second+5 max 9995
                    gosub affich         
                endif
            loop   
            gosub affich         
        endif
        ; code moins
        if moins=0 then
            second =second-5
                if second > 9999 then: second=0:endif   ;passage en négatif
            do while moins=0
                if timer >5 then         
                    second =second-5
                    if second>9999 then: second=0 :endif  ;dépassement négatif         
                    gosub affich         
                endif
            loop   
        gosub affich         
        endif
        if mem=0 then exit    ;fin de boucle intro secondes
    loop
    do loop while mem=0   ;attente relâchement poussoir
    Ttot=second
    write  0,Ttot    ;mise en EEPROM
    high orange, rouge :pause 500:low orange, rouge:pause 500
    high orange, rouge :pause 500:low orange, rouge
    point=0        ;sortie mode introtemps
    gosub affich
    return

affich:
    div=1000
    clk=1 : dio=1 : dio=0        ;balise start
    Octet=adrdep        ;synchro adresse départ
    gosub EnvoiOctet
    Nbre=second    ;on tronçonne Nbre et affiche chaque chiffre
    for j=1 to 4
        Chiffre=Nbre/Div    ;on isole le chiffre à afficher
        if j=1 and second<1000  and second<>0 then
           chiffre=10    ;chiffre "blanc" càd noir, en fait
        endif
        if j=2 and second<100 and second<>0 then
           chiffre=10
        endif
        lookup Chiffre,($3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7f,$6f,0), Octet ; 0-9 +blanc uniquement
        if j=3 then    ;choix affichage point
           octet=octet | dp    ;ajout point décimal
        endif
        if point=1 and j=4 then ;mode programmation temps
           octet=octet | dp    ;ajout point digit 4
        endif
        gosub EnvoiOctet;
        Nbre=Nbre//Div
        Div=Div/10
    next j
    clk=0: dio=0: clk=1: dio=1        ;balise stop
    return

allume:
     clk=1 : dio=1 : dio=0        ;bal start
    Octet=RegLum        ;Réglage luminosité
    gosub EnvoiOctet
    clk=0: dio=0: clk=1: dio=1        ;bal stop
    return
eteint:
    clk=1 : dio=1 : dio=0        ;bal start
    Octet=$80       ;Réglage luminosité =0
    gosub EnvoiOctet
    clk=0: dio=0: clk=1: dio=1        ;bal stop
    return

;******* Envoi des chiffres (octet) bit à bit dans le registre ********
EnvoiOctet:    ;lecture de b0 bit à bit de bit0 à bit8 poids faible en tête.
    for i=1 to 8 ; envoi
        clk=0
        dio=bit0
        Octet = Octet/2        ;décalage du bit lu, bit1 devient bit0
        clk=1
    next i
    clk=0 :clk=1: clk=0    ; balise  ACK
    return
MM
Bonjour , cette version fonctionne correctement.
Je fais quelques essais en profondeur......mais je pense que tout est bon
Bonne journée
 
Bonjour peux tu sur la version 030726 corriger le bug "programmation" comme sur la version 060726 comme cela je dispose
d une version display toujours allumé et d une version display eteint apres le temps ecoulé
 
Bonjour , cette version fonctionne correctement.
Je fais quelques essais en profondeur......mais je pense que tout est bon
Bonne journée
Bonjour,
Il y a peut être un gosub allume en doublon à la fin de decompt, sans conséquence...
Ok, j'attends la prochaine demande de modif ;)

MM
 
Last edited:
Bonjour,
Il y a peut être un gosub allume en doublon à la fin de decompt, sans conséquence...
Ok, j'attends la prochaine demande de modif ;)

MM
Bonjour peux tu sur la version 030726 corriger le bug "programmation" comme sur la version 060726 comme cela je dispose
d une version display toujours allumé et d une version display eteint apres le temps ecoulé
 
Bonjour peux tu sur la version 030726 corriger le bug "programmation" comme sur la version 060726 comme cela je dispose
d une version display toujours allumé et d une version display eteint apres le temps ecoulé
Bonjour,
Il suffit de mettre en commentaire le "gosub eteint" .
il y a des broches inutilisées, on pourrait ajouter un cavalier ou inter pour avoir les deux versions dispo.
Je viens de voir que la doc dit de prendre 65536 et non 65535 pour le calcul de set timer...c'est corrigé ci dessous

code à tester
Code:
; décompteur 1/10s  MM 060726
; réglage par poussoirs +/-
;pour temps=9990 10ème s => tmax=16 mn 39s;
;les poussoirs sont sur le 0V,
;Broches avec pullup sur 20X2 : bit0-bit7 = C.0,C.6,C.7,B.0,B.1,B.5,B.6,B.7

;****** MODE D'EMPLOI **********
;A la mise sous tension, mémoire vide, passage auto en mode programmation temps

;Mode Programmation du temps:
;L'affichage est en /10 de seconde, avec un point décimal sur le digit 3
;Pour identifier ce mode,il y a en plus un point sur le digit 4
;Appui sur plus:
;            appui court < 500ms => incrémentation de 1
;            appui long  > 500ms => défilemenrt rapide
;Appui sur moins:
;            Idem en décrémentation
;Appui sur MEM => clignotement vert + rouge => mise en mémoire EEPROM
;Passage en mode décomptage
;
;Mode décomptage.
;Le point sur le digit 4 disparait,reste le point décimal digit3
;Attente appui sur poussoir start => décompte du temps led rouge allumée.
;A 5 s => led orange allumée
;A 00,0 s => R et O éteintes, verte allumée 10 s puis, l'affichage s'éteint
;Deux possibilités:
        ;Appui sur start => le cycle repart avec valeur en mémoire
        ;Appui sur mem pour affichage temps mémorisé, un second appui pour réglage possible
;Arrêt possible par appui sur MEM à tout moment du décompte
;MEM => arret décompte => retour attente start avec temps mémorisé
;deuxième appui sur MEM =>passage en mode programmation
               
#picaxe 20X2
setfreq M16
symbol dio=pinC.1            ;sur TM1637
symbol clk=pinC.2         ;idem
symbol mem=pinC.0            ;poussoir MEM
symbol plus=pinC.6        ;poussoir plus                
symbol moins=pinC.7
symbol start=pinB.7
symbol orange=B.0        ;led
symbol rouge=B.1
symbol verte=B.2
symbol octet=b0    ;octet doit être en b0; le bit0 est utilisé
symbol j=b1        ;position point décimal
symbol i=b2        ;compteur
symbol chiffre=b3
symbol dp=b4
symbol point=b5
symbol second=w12    ;en fait des /10 de secondes
symbol div=w13
symbol nbre=w14
symbol Ttot=w15
symbol AdrDep=$c0 ; adresse du 1er digit (poids fort)
symbol RegLum=$8c ; réglage luminosité $80 = eteint, $88 à $8F => luminosité croissante
dp=$80
;pullup sur 20X2  bit0-bit7 = C.0,C.6,C.7,B.0,B.1,B.5,B.6,B.7
pullup %10000111    ;sur C.0,C.6,C.7,B.7
dirsC=%110                ;pour utilisation pinsC
settimer 59286  ;1/10 s à 16MHs ; 59286 et non 59285...

;    ***** init TM1637 et temps EEPROM
    gosub allume        ;règle l'allumage des segments
    low rouge,verte,orange
    read 0,Ttot      ;lecture temps en EEPROM
    if Ttot=0 then    ;la mémoire est vide  
        gosub  introtemp    ;entrer une valeur en mémoire EEPROM
    endif
    second=Ttot    ;initialisation compteur seconde
    gosub affich    ;affichage temps initial

;********decompte *******
decompt:
    pause 200  
    gosub allume ;On rallume tout    si afficheur éteint
    do loop while mem=0    ;attente relachement suite arret decompte
    low rouge
    do
        second=Ttot
        gosub affich
        do        ;****** boucle attente départ ou intro temps  ******  
           if mem=0 then gosub introtemp ;passage en programmation temps
        loop while start=1    ;attente start        
        do
                timer=0
            do      ;boucle décomptage      
                high rouge              
                second=Ttot -timer
                if second < 50  then        ;5 secondes avant la fin
                    high orange
                endif
                if mem=0 then decompt          ;arret décompte et RAZ
                gosub affich
            loop while second<>0
            high verte:low orange,rouge        ;fin décompte
            timer=0
            do loop while timer <= 100        ;attente 10s led verte ON
            low rouge,verte,orange          
            ;gosub eteint     ; On éteint tout
            do loop while start=1 and mem=1    ;attente appui sur start ou mem
            if mem=0 then decompt            ;on est sorti de l'attente
            gosub allume   ;On rallume tout
        loop  
    loop
 
introtemp:       ;sub intro nouveau temps
;********** intro secondes *******
     pause 200
    do loop while mem=0        ;attente relachement pous
    pause 200
    point=1        ;ajout point décimal sur digit n°4
    do
        gosub affich
        timer=0
        ;***** code plus *****
        if plus=0 then
            second =second+5 max 9995    
            do while plus=0
                if timer >5 then       ;500ms défilement accéléré      
                    second =second+5 max 9995
                    gosub affich          
                endif
            loop    
            gosub affich          
        endif
        ; code moins
        if moins=0 then
            second =second-5
                if second > 9999 then: second=0:endif   ;passage en négatif
            do while moins=0
                if timer >5 then          
                    second =second-5
                    if second>9999 then: second=0 :endif  ;dépassement négatif          
                    gosub affich          
                endif
            loop    
        gosub affich          
        endif
        if mem=0 then exit    ;sortie de boucle
    loop
    do loop while mem=0   ;attente relâchement poussoir
    Ttot=second
    write  0,Ttot    ;mise en EEPROM
    high orange, rouge :pause 500:low orange, rouge:pause 500
    high orange, rouge :pause 500:low orange, rouge
    point=0        ;sortie mode introtemps
    gosub affich
    return

affich:
    div=1000
    clk=1 : dio=1 : dio=0        ;balise start
    Octet=adrdep        ;synchro adresse départ
    gosub EnvoiOctet
    Nbre=second    ;on tronçonne Nbre et affiche chaque chiffre
    for j=1 to 4
        Chiffre=Nbre/Div    ;on isole le chiffre à afficher
        if j=1 and second<1000  and second<>0 then
           chiffre=10    ;chiffre "blanc" càd noir, en fait
        endif
        if j=2 and second<100 and second<>0 then
           chiffre=10
        endif
        lookup Chiffre,($3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7f,$6f,0), Octet ; 0-9 +blanc uniquement
        if j=3 then    ;choix affichage point
           octet=octet | dp    ;ajout point décimal
        endif
        if point=1 and j=4 then ;mode programmation temps
           octet=octet | dp    ;ajout point digit 4
        endif
        gosub EnvoiOctet;
        Nbre=Nbre//Div
        Div=Div/10
    next j
    clk=0: dio=0: clk=1: dio=1        ;balise stop
    return

allume:
     clk=1 : dio=1 : dio=0        ;bal start
    Octet=RegLum        ;Réglage luminosité
    gosub EnvoiOctet
    clk=0: dio=0: clk=1: dio=1        ;bal stop
    return
eteint:
    clk=1 : dio=1 : dio=0        ;bal start
    Octet=$80       ;Réglage luminosité =0
    gosub EnvoiOctet
    clk=0: dio=0: clk=1: dio=1        ;bal stop
    return

;******* Envoi des chiffres (octet) bit à bit dans le registre ********
EnvoiOctet:    ;lecture de b0 bit à bit de bit0 à bit8 poids faible en tête.
    for i=1 to 8 ; envoi
        clk=0
        dio=bit0
        Octet = Octet/2        ;décalage du bit lu, bit1 devient bit0
        clk=1
    next i
    clk=0 :clk=1: clk=0    ; balise  ACK
    return

MM
 
Last edited:
Bonjour,
Il suffit de mettre en commentaire le "gosub eteint" .
il y a des broches inutilisées, on pourrait ajouter un cavalier ou inter pour avoir les deux versions dispo.
Je viens de voir que la doc dit de prendre 65536 et non 65535 pour le calcul de set timer...c'est corrigé ci dessous

code à tester
Code:
; décompteur 1/10s  MM 060726
; réglage par poussoirs +/-
;pour temps=9990 10ème s => tmax=16 mn 39s;
;les poussoirs sont sur le 0V,
;Broches avec pullup sur 20X2 : bit0-bit7 = C.0,C.6,C.7,B.0,B.1,B.5,B.6,B.7

;****** MODE D'EMPLOI **********
;A la mise sous tension, mémoire vide, passage auto en mode programmation temps

;Mode Programmation du temps:
;L'affichage est en /10 de seconde, avec un point décimal sur le digit 3
;Pour identifier ce mode,il y a en plus un point sur le digit 4
;Appui sur plus:
;            appui court < 500ms => incrémentation de 1
;            appui long  > 500ms => défilemenrt rapide
;Appui sur moins:
;            Idem en décrémentation
;Appui sur MEM => clignotement vert + rouge => mise en mémoire EEPROM
;Passage en mode décomptage
;
;Mode décomptage.
;Le point sur le digit 4 disparait,reste le point décimal digit3
;Attente appui sur poussoir start => décompte du temps led rouge allumée.
;A 5 s => led orange allumée
;A 00,0 s => R et O éteintes, verte allumée 10 s puis, l'affichage s'éteint
;Deux possibilités:
        ;Appui sur start => le cycle repart avec valeur en mémoire
        ;Appui sur mem pour affichage temps mémorisé, un second appui pour réglage possible
;Arrêt possible par appui sur MEM à tout moment du décompte
;MEM => arret décompte => retour attente start avec temps mémorisé
;deuxième appui sur MEM =>passage en mode programmation
              
#picaxe 20X2
setfreq M16
symbol dio=pinC.1            ;sur TM1637
symbol clk=pinC.2         ;idem
symbol mem=pinC.0            ;poussoir MEM
symbol plus=pinC.6        ;poussoir plus               
symbol moins=pinC.7
symbol start=pinB.7
symbol orange=B.0        ;led
symbol rouge=B.1
symbol verte=B.2
symbol octet=b0    ;octet doit être en b0; le bit0 est utilisé
symbol j=b1        ;position point décimal
symbol i=b2        ;compteur
symbol chiffre=b3
symbol dp=b4
symbol point=b5
symbol second=w12    ;en fait des /10 de secondes
symbol div=w13
symbol nbre=w14
symbol Ttot=w15
symbol AdrDep=$c0 ; adresse du 1er digit (poids fort)
symbol RegLum=$8c ; réglage luminosité $80 = eteint, $88 à $8F => luminosité croissante
dp=$80
;pullup sur 20X2  bit0-bit7 = C.0,C.6,C.7,B.0,B.1,B.5,B.6,B.7
pullup %10000111    ;sur C.0,C.6,C.7,B.7
dirsC=%110                ;pour utilisation pinsC
settimer 59286  ;1/10 s à 16MHs ; 59286 et non 59285...

;    ***** init TM1637 et temps EEPROM
    gosub allume        ;règle l'allumage des segments
    low rouge,verte,orange
    read 0,Ttot      ;lecture temps en EEPROM
    if Ttot=0 then    ;la mémoire est vide 
        gosub  introtemp    ;entrer une valeur en mémoire EEPROM
    endif
    second=Ttot    ;initialisation compteur seconde
    gosub affich    ;affichage temps initial

;********decompte *******
decompt:
    pause 200 
    gosub allume ;On rallume tout    si afficheur éteint
    do loop while mem=0    ;attente relachement suite arret decompte
    low rouge
    do
        second=Ttot
        gosub affich
        do        ;****** boucle attente départ ou intro temps  ****** 
           if mem=0 then gosub introtemp ;passage en programmation temps
        loop while start=1    ;attente start       
        do
                timer=0
            do      ;boucle décomptage     
                high rouge             
                second=Ttot -timer
                if second < 50  then        ;5 secondes avant la fin
                    high orange
                endif
                if mem=0 then decompt          ;arret décompte et RAZ
                gosub affich
            loop while second<>0
            high verte:low orange,rouge        ;fin décompte
            timer=0
            do loop while timer <= 100        ;attente 10s led verte ON
            low rouge,verte,orange         
            ;gosub eteint     ; On éteint tout
            do loop while start=1 and mem=1    ;attente appui sur start ou mem
            if mem=0 then decompt            ;on est sorti de l'attente
            gosub allume   ;On rallume tout
        loop 
    loop
 
introtemp:       ;sub intro nouveau temps
;********** intro secondes *******
     pause 200
    do loop while mem=0        ;attente relachement pous
    pause 200
    point=1        ;ajout point décimal sur digit n°4
    do
        gosub affich
        timer=0
        ;***** code plus *****
        if plus=0 then
            second =second+5 max 9995   
            do while plus=0
                if timer >5 then       ;500ms défilement accéléré     
                    second =second+5 max 9995
                    gosub affich         
                endif
            loop   
            gosub affich         
        endif
        ; code moins
        if moins=0 then
            second =second-5
                if second > 9999 then: second=0:endif   ;passage en négatif
            do while moins=0
                if timer >5 then         
                    second =second-5
                    if second>9999 then: second=0 :endif  ;dépassement négatif         
                    gosub affich         
                endif
            loop   
        gosub affich         
        endif
        if mem=0 then exit    ;sortie de boucle
    loop
    do loop while mem=0   ;attente relâchement poussoir
    Ttot=second
    write  0,Ttot    ;mise en EEPROM
    high orange, rouge :pause 500:low orange, rouge:pause 500
    high orange, rouge :pause 500:low orange, rouge
    point=0        ;sortie mode introtemps
    gosub affich
    return

affich:
    div=1000
    clk=1 : dio=1 : dio=0        ;balise start
    Octet=adrdep        ;synchro adresse départ
    gosub EnvoiOctet
    Nbre=second    ;on tronçonne Nbre et affiche chaque chiffre
    for j=1 to 4
        Chiffre=Nbre/Div    ;on isole le chiffre à afficher
        if j=1 and second<1000  and second<>0 then
           chiffre=10    ;chiffre "blanc" càd noir, en fait
        endif
        if j=2 and second<100 and second<>0 then
           chiffre=10
        endif
        lookup Chiffre,($3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7f,$6f,0), Octet ; 0-9 +blanc uniquement
        if j=3 then    ;choix affichage point
           octet=octet | dp    ;ajout point décimal
        endif
        if point=1 and j=4 then ;mode programmation temps
           octet=octet | dp    ;ajout point digit 4
        endif
        gosub EnvoiOctet;
        Nbre=Nbre//Div
        Div=Div/10
    next j
    clk=0: dio=0: clk=1: dio=1        ;balise stop
    return

allume:
     clk=1 : dio=1 : dio=0        ;bal start
    Octet=RegLum        ;Réglage luminosité
    gosub EnvoiOctet
    clk=0: dio=0: clk=1: dio=1        ;bal stop
    return
eteint:
    clk=1 : dio=1 : dio=0        ;bal start
    Octet=$80       ;Réglage luminosité =0
    gosub EnvoiOctet
    clk=0: dio=0: clk=1: dio=1        ;bal stop
    return

;******* Envoi des chiffres (octet) bit à bit dans le registre ********
EnvoiOctet:    ;lecture de b0 bit à bit de bit0 à bit8 poids faible en tête.
    for i=1 to 8 ; envoi
        clk=0
        dio=bit0
        Octet = Octet/2        ;décalage du bit lu, bit1 devient bit0
        clk=1
    next i
    clk=0 :clk=1: clk=0    ; balise  ACK
    return

MM

Ok pour ton idée de mettre un jumper pour selectionner le mode d'affichage toujours "ON" ou bien off a la fin du temps
 
Ok pour ton idée de mettre un jumper pour selectionner le mode d'affichage toujours "ON" ou bien off a la fin du temps
Bonjour,
Le plus pratique serait un petit interrupteur à glissière quelque part, pour choisir sans rien démonter.
La R de pullup sur B.6 est activée, donc B.6=1 par défaut. On peut choisir à quoi cela correspond.
Ici, sans cavalier, ça reste allumé.
Code:
; décompteur 1/10s  MM 060726
; réglage par poussoirs +/-
;pour temps=9990 10ème s => tmax=16 mn 39s;
;les poussoirs sont sur le 0V,
;Broches avec pullup sur 20X2 : bit0-bit7 = C.0,C.6,C.7,B.0,B.1,B.5,B.6,B.7

;****** MODE D'EMPLOI **********
;A la mise sous tension, mémoire vide, passage auto en mode programmation temps

;Mode Programmation du temps:
;L'affichage est en /10 de seconde, avec un point décimal sur le digit 3
;Pour identifier ce mode,il y a en plus un point sur le digit 4
;Appui sur plus:
;            appui court < 500ms => incrémentation de 1
;            appui long  > 500ms => défilemenrt rapide
;Appui sur moins:
;            Idem en décrémentation
;Appui sur MEM => clignotement vert + rouge => mise en mémoire EEPROM
;Passage en mode décomptage
;
;Mode décomptage.
;Le point sur le digit 4 disparait,reste le point décimal digit3
;Attente appui sur poussoir start => décompte du temps led rouge allumée.
;A 5 s => led orange allumée
;A 00,0 s => R et O éteintes, verte allumée 10 s puis, l'affichage s'éteint
;Deux possibilités:
        ;Appui sur start => le cycle repart avec valeur en mémoire
        ;Appui sur mem pour affichage temps mémorisé, un second appui pour réglage possible
;Arrêt possible par appui sur MEM à tout moment du décompte
;MEM => arret décompte => retour attente start avec temps mémorisé
;deuxième appui sur MEM =>passage en mode programmation
             
#picaxe 20X2
setfreq M16
symbol dio=pinC.1         ;sur TM1637
symbol clk=pinC.2         ;idem
symbol mem=pinC.0         ;poussoir MEM
symbol plus=pinC.6        ;poussoir plus              
symbol moins=pinC.7
symbol A_E=pinB.6            ;affichage Allumé_Eteint
symbol start=pinB.7
symbol orange=B.0        ;leds
symbol rouge=B.1
symbol verte=B.2
symbol octet=b0    ;octet doit être en b0; le bit0 est utilisé
symbol j=b1        ;position point décimal
symbol i=b2        ;compteur
symbol chiffre=b3
symbol dp=b4
symbol point=b5        ;point digit 4
symbol second=w12    ;en fait des /10 de secondes
symbol div=w13
symbol nbre=w14
symbol Ttot=w15        ;tepmps mémorisé
symbol AdrDep=$c0 ; adresse du 1er digit (poids fort)
symbol RegLum=$8c ; réglage luminosité $80 = eteint, $88 à $8F => luminosité croissante
dp=$80
;pullup sur 20X2  bit0-bit7 = C.0,C.6,C.7,B.0,B.1,B.5,B.6,B.7
pullup %11000111    ;sur C.0,C.6,C.7,B.6,B.7
dirsC=%110                ;pour utilisation pinsC
settimer 59286  ;1/10 s à 16MHs  59286

;    ***** init TM1637 et temps EEPROM
    gosub allume        ;règle l'allumage des segments
    low rouge,verte,orange
    read 0,Ttot      ;lecture temps en EEPROM
    if Ttot=0 then    ;la mémoire est vide
        gosub  introtemp    ;entrer une valeur en mémoire EEPROM
    endif
    second=Ttot    ;initialisation compteur seconde
    gosub affich    ;affichage temps initial

;********decompte *******
decompt:
    pause 200
    gosub allume ;On rallume tout    si afficheur éteint
    do loop while mem=0    ;attente relachement suite arret decompte
    low rouge
    do
        second=Ttot
        gosub affich
        do        ;****** boucle attente départ ou intro temps  ******
           if mem=0 then gosub introtemp ;passage en programmation temps
        loop while start=1    ;attente start      
        do
                timer=0
            do      ;boucle décomptage    
                high rouge            
                second=Ttot -timer
                if second < 50  then        ;5 secondes avant la fin
                    high orange
                endif
                if mem=0 then decompt       ;arret décompte et RAZ
                gosub affich
            loop while second<>0
            high verte:low orange,rouge     ;fin décompte
            timer=0
            do loop while timer <= 100      ;attente 10s led verte ON
            low rouge,verte,orange
                if A_E=0 then      ;option afficheur éteint  
                     gosub eteint     ; On éteint tout
                endif
            do loop while start=1 and mem=1    ;attente appui sur start ou mem
            if mem=0 then decompt            ;on est sorti de l'attente
            gosub allume   ;On rallume tout
        loop
    loop
 
introtemp:       ;sub intro nouveau temps
;********** intro secondes *******
     pause 200
    do loop while mem=0        ;attente relachement pous
    pause 200
    point=1        ;ajout point décimal sur digit n°4
    do
        gosub affich
        timer=0
        ;***** code plus *****
        if plus=0 then
            second =second+5 max 9995  
            do while plus=0
                if timer >5 then       ;500ms défilement accéléré    
                    second =second+5 max 9995
                    gosub affich        
                endif
            loop  
            gosub affich        
        endif
        ; code moins
        if moins=0 then
            second =second-5
                if second > 9999 then: second=0:endif   ;passage en négatif
            do while moins=0
                if timer >5 then        
                    second =second-5
                    if second>9999 then: second=0 :endif  ;dépassement négatif        
                    gosub affich        
                endif
            loop  
        gosub affich        
        endif
        if mem=0 then exit    ;sortie de boucle
    loop
    do loop while mem=0   ;attente relâchement poussoir
    Ttot=second
    write  0,Ttot    ;mise en EEPROM
    high orange, rouge :pause 500:low orange, rouge:pause 500
    high orange, rouge :pause 500:low orange, rouge
    point=0        ;sortie mode introtemps
    gosub affich
    return

affich:
    div=1000
    clk=1 : dio=1 : dio=0        ;balise start
    Octet=adrdep        ;synchro adresse départ
    gosub EnvoiOctet
    Nbre=second    ;on tronçonne Nbre et affiche chaque chiffre
    for j=1 to 4
        Chiffre=Nbre/Div    ;on isole le chiffre à afficher
        if j=1 and second<1000  and second<>0 then
           chiffre=10    ;chiffre "blanc" càd noir, en fait
        endif
        if j=2 and second<100 and second<>0 then
           chiffre=10
        endif
        lookup Chiffre,($3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7f,$6f,0), Octet ; 0-9 +blanc uniquement
        if j=3 then    ;choix affichage point
           octet=octet | dp    ;ajout point décimal
        endif
        if point=1 and j=4 then ;mode programmation temps
           octet=octet | dp    ;ajout point digit 4
        endif
        gosub EnvoiOctet;
        Nbre=Nbre//Div
        Div=Div/10
    next j
    clk=0: dio=0: clk=1: dio=1        ;balise stop
    return

allume:
     clk=1 : dio=1 : dio=0        ;bal start
    Octet=RegLum        ;Réglage luminosité
    gosub EnvoiOctet
    clk=0: dio=0: clk=1: dio=1        ;bal stop
    return
eteint:
    clk=1 : dio=1 : dio=0        ;bal start
    Octet=$80       ;Réglage luminosité =0
    gosub EnvoiOctet
    clk=0: dio=0: clk=1: dio=1        ;bal stop
    return

;******* Envoi des chiffres (octet) bit à bit dans le registre ********
EnvoiOctet:    ;lecture de b0 bit à bit de bit0 à bit8 poids faible en tête.
    for i=1 to 8 ; envoi
        clk=0
        dio=bit0
        Octet = Octet/2        ;décalage du bit lu, bit1 devient bit0
        clk=1
    next i
    clk=0 :clk=1: clk=0    ; balise  ACK
    return
decompt.JPG
A tester...
MM
 
Bonjour,
Le plus pratique serait un petit interrupteur à glissière quelque part, pour choisir sans rien démonter.
La R de pullup sur B.6 est activée, donc B.6=1 par défaut. On peut choisir à quoi cela correspond.
Ici, sans cavalier, ça reste allumé.
Code:
; décompteur 1/10s  MM 060726
; réglage par poussoirs +/-
;pour temps=9990 10ème s => tmax=16 mn 39s;
;les poussoirs sont sur le 0V,
;Broches avec pullup sur 20X2 : bit0-bit7 = C.0,C.6,C.7,B.0,B.1,B.5,B.6,B.7

;****** MODE D'EMPLOI **********
;A la mise sous tension, mémoire vide, passage auto en mode programmation temps

;Mode Programmation du temps:
;L'affichage est en /10 de seconde, avec un point décimal sur le digit 3
;Pour identifier ce mode,il y a en plus un point sur le digit 4
;Appui sur plus:
;            appui court < 500ms => incrémentation de 1
;            appui long  > 500ms => défilemenrt rapide
;Appui sur moins:
;            Idem en décrémentation
;Appui sur MEM => clignotement vert + rouge => mise en mémoire EEPROM
;Passage en mode décomptage
;
;Mode décomptage.
;Le point sur le digit 4 disparait,reste le point décimal digit3
;Attente appui sur poussoir start => décompte du temps led rouge allumée.
;A 5 s => led orange allumée
;A 00,0 s => R et O éteintes, verte allumée 10 s puis, l'affichage s'éteint
;Deux possibilités:
        ;Appui sur start => le cycle repart avec valeur en mémoire
        ;Appui sur mem pour affichage temps mémorisé, un second appui pour réglage possible
;Arrêt possible par appui sur MEM à tout moment du décompte
;MEM => arret décompte => retour attente start avec temps mémorisé
;deuxième appui sur MEM =>passage en mode programmation
            
#picaxe 20X2
setfreq M16
symbol dio=pinC.1         ;sur TM1637
symbol clk=pinC.2         ;idem
symbol mem=pinC.0         ;poussoir MEM
symbol plus=pinC.6        ;poussoir plus             
symbol moins=pinC.7
symbol A_E=pinB.6            ;affichage Allumé_Eteint
symbol start=pinB.7
symbol orange=B.0        ;leds
symbol rouge=B.1
symbol verte=B.2
symbol octet=b0    ;octet doit être en b0; le bit0 est utilisé
symbol j=b1        ;position point décimal
symbol i=b2        ;compteur
symbol chiffre=b3
symbol dp=b4
symbol point=b5        ;point digit 4
symbol second=w12    ;en fait des /10 de secondes
symbol div=w13
symbol nbre=w14
symbol Ttot=w15        ;tepmps mémorisé
symbol AdrDep=$c0 ; adresse du 1er digit (poids fort)
symbol RegLum=$8c ; réglage luminosité $80 = eteint, $88 à $8F => luminosité croissante
dp=$80
;pullup sur 20X2  bit0-bit7 = C.0,C.6,C.7,B.0,B.1,B.5,B.6,B.7
pullup %11000111    ;sur C.0,C.6,C.7,B.6,B.7
dirsC=%110                ;pour utilisation pinsC
settimer 59286  ;1/10 s à 16MHs  59286

;    ***** init TM1637 et temps EEPROM
    gosub allume        ;règle l'allumage des segments
    low rouge,verte,orange
    read 0,Ttot      ;lecture temps en EEPROM
    if Ttot=0 then    ;la mémoire est vide
        gosub  introtemp    ;entrer une valeur en mémoire EEPROM
    endif
    second=Ttot    ;initialisation compteur seconde
    gosub affich    ;affichage temps initial

;********decompte *******
decompt:
    pause 200
    gosub allume ;On rallume tout    si afficheur éteint
    do loop while mem=0    ;attente relachement suite arret decompte
    low rouge
    do
        second=Ttot
        gosub affich
        do        ;****** boucle attente départ ou intro temps  ******
           if mem=0 then gosub introtemp ;passage en programmation temps
        loop while start=1    ;attente start     
        do
                timer=0
            do      ;boucle décomptage   
                high rouge           
                second=Ttot -timer
                if second < 50  then        ;5 secondes avant la fin
                    high orange
                endif
                if mem=0 then decompt       ;arret décompte et RAZ
                gosub affich
            loop while second<>0
            high verte:low orange,rouge     ;fin décompte
            timer=0
            do loop while timer <= 100      ;attente 10s led verte ON
            low rouge,verte,orange
                if A_E=0 then      ;option afficheur éteint 
                     gosub eteint     ; On éteint tout
                endif
            do loop while start=1 and mem=1    ;attente appui sur start ou mem
            if mem=0 then decompt            ;on est sorti de l'attente
            gosub allume   ;On rallume tout
        loop
    loop
 
introtemp:       ;sub intro nouveau temps
;********** intro secondes *******
     pause 200
    do loop while mem=0        ;attente relachement pous
    pause 200
    point=1        ;ajout point décimal sur digit n°4
    do
        gosub affich
        timer=0
        ;***** code plus *****
        if plus=0 then
            second =second+5 max 9995 
            do while plus=0
                if timer >5 then       ;500ms défilement accéléré   
                    second =second+5 max 9995
                    gosub affich       
                endif
            loop 
            gosub affich       
        endif
        ; code moins
        if moins=0 then
            second =second-5
                if second > 9999 then: second=0:endif   ;passage en négatif
            do while moins=0
                if timer >5 then       
                    second =second-5
                    if second>9999 then: second=0 :endif  ;dépassement négatif       
                    gosub affich       
                endif
            loop 
        gosub affich       
        endif
        if mem=0 then exit    ;sortie de boucle
    loop
    do loop while mem=0   ;attente relâchement poussoir
    Ttot=second
    write  0,Ttot    ;mise en EEPROM
    high orange, rouge :pause 500:low orange, rouge:pause 500
    high orange, rouge :pause 500:low orange, rouge
    point=0        ;sortie mode introtemps
    gosub affich
    return

affich:
    div=1000
    clk=1 : dio=1 : dio=0        ;balise start
    Octet=adrdep        ;synchro adresse départ
    gosub EnvoiOctet
    Nbre=second    ;on tronçonne Nbre et affiche chaque chiffre
    for j=1 to 4
        Chiffre=Nbre/Div    ;on isole le chiffre à afficher
        if j=1 and second<1000  and second<>0 then
           chiffre=10    ;chiffre "blanc" càd noir, en fait
        endif
        if j=2 and second<100 and second<>0 then
           chiffre=10
        endif
        lookup Chiffre,($3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7f,$6f,0), Octet ; 0-9 +blanc uniquement
        if j=3 then    ;choix affichage point
           octet=octet | dp    ;ajout point décimal
        endif
        if point=1 and j=4 then ;mode programmation temps
           octet=octet | dp    ;ajout point digit 4
        endif
        gosub EnvoiOctet;
        Nbre=Nbre//Div
        Div=Div/10
    next j
    clk=0: dio=0: clk=1: dio=1        ;balise stop
    return

allume:
     clk=1 : dio=1 : dio=0        ;bal start
    Octet=RegLum        ;Réglage luminosité
    gosub EnvoiOctet
    clk=0: dio=0: clk=1: dio=1        ;bal stop
    return
eteint:
    clk=1 : dio=1 : dio=0        ;bal start
    Octet=$80       ;Réglage luminosité =0
    gosub EnvoiOctet
    clk=0: dio=0: clk=1: dio=1        ;bal stop
    return

;******* Envoi des chiffres (octet) bit à bit dans le registre ********
EnvoiOctet:    ;lecture de b0 bit à bit de bit0 à bit8 poids faible en tête.
    for i=1 to 8 ; envoi
        clk=0
        dio=bit0
        Octet = Octet/2        ;décalage du bit lu, bit1 devient bit0
        clk=1
    next i
    clk=0 :clk=1: clk=0    ; balise  ACK
    return
View attachment 27139
A tester...
MM
Bonjour en mode " display eteint " c 'est OK
en mode " display allumé" la led verte s'eteint bien mais l'affichage indique toujours 0000 au lieu de reafficher le temps programmé
 
Bonjour en mode " display eteint " c 'est OK
en mode " display allumé" la led verte s'eteint bien mais l'affichage indique toujours 0000 au lieu de reafficher le temps programmé
Bonjour,
C'était pas comme ça avant? je sais plus...
Ok, après les 10s, on recharge le temps en mémoire et on l'affiche... ou pas.
Essaye ça :

Code:
; décompteur 1/10s  MM 110726
; réglage par poussoirs +/-
;pour temps=9990 10ème s => tmax=16 mn 39s;
;les poussoirs sont sur le 0V,
;Broches avec pullup sur 20X2 : bit0-bit7 = C.0,C.6,C.7,B.0,B.1,B.5,B.6,B.7

;****** MODE D'EMPLOI **********
;A la mise sous tension, mémoire vide, passage auto en mode programmation temps

;Mode Programmation du temps:
;L'affichage est en /10 de seconde, avec un point décimal sur le digit 3
;Pour identifier ce mode,il y a en plus un point sur le digit 4
;Appui sur plus:
;            appui court < 500ms => incrémentation de 1
;            appui long  > 500ms => défilement rapide
;Appui sur moins:
;            Idem en décrémentation
;Appui sur MEM => clignotement vert + rouge => mise en mémoire EEPROM
;Passage en mode décomptage
;
;Mode décomptage.
;Le point sur le digit 4 disparait,reste le point décimal digit3
;Attente appui sur poussoir start => décompte du temps led rouge allumée.
;A 5 s => led orange allumée
;A 00,0 s => R et O éteintes, verte allumée 10 s puis, l'affichage s'éteint
;Deux possibilités:
        ;Appui sur start => le cycle repart avec valeur en mémoire
        ;Appui sur mem pour affichage temps mémorisé, un second appui pour réglage possible
;Arrêt possible par appui sur MEM à tout moment du décompte
;MEM => arret décompte => retour attente start avec temps mémorisé
;deuxième appui sur MEM =>passage en mode programmation
              
#picaxe 20X2
setfreq M16
symbol dio=pinC.1         ;sur TM1637
symbol clk=pinC.2         ;idem
symbol mem=pinC.0         ;poussoir MEM
symbol plus=pinC.6        ;poussoir plus               
symbol moins=pinC.7
symbol A_E=pinB.6            ;affichage Allumé_Eteint
symbol start=pinB.7
symbol orange=B.0        ;leds
symbol rouge=B.1
symbol verte=B.2
symbol octet=b0    ;octet doit être en b0; le bit0 est utilisé
symbol j=b1        ;position point décimal
symbol i=b2        ;compteur
symbol chiffre=b3
symbol dp=b4
symbol point=b5        ;point digit 4
symbol second=w12    ;en fait des /10 de secondes
symbol div=w13
symbol nbre=w14
symbol Ttot=w15        ;tepmps mémorisé
symbol AdrDep=$c0 ; adresse du 1er digit (poids fort)
symbol RegLum=$8c ; réglage luminosité $80 = eteint, $88 à $8F => luminosité croissante
dp=$80
;pullup sur 20X2  bit0-bit7 = C.0,C.6,C.7,B.0,B.1,B.5,B.6,B.7
pullup %11000111    ;sur C.0,C.6,C.7,B.6,B.7
dirsC=%110                ;pour utilisation pinsC
settimer 59286  ;1/10 s à 16MHs  59286

;    ***** init TM1637 et temps EEPROM
    gosub allume        ;règle l'allumage des segments
    low rouge,verte,orange
    read 0,Ttot      ;lecture temps en EEPROM
    if Ttot=0 then    ;la mémoire est vide 
        gosub  introtemp    ;entrer une valeur en mémoire EEPROM
    endif
    second=Ttot    ;initialisation compteur seconde
    gosub affich    ;affichage temps initial

;********decompte *******
decompt:
    pause 200 
    gosub allume ;On rallume tout    si afficheur éteint
    do loop while mem=0    ;attente relachement suite arret decompte
    low rouge
    do
        second=Ttot
        gosub affich
        do        ;****** boucle attente départ ou intro temps  ****** 
           if mem=0 then gosub introtemp ;passage en programmation temps
        loop while start=1    ;attente start       
        do
                timer=0
            do      ;boucle décomptage     
                high rouge             
                second=Ttot -timer
                if second < 50  then        ;5 secondes avant la fin
                    high orange
                endif
                if mem=0 then decompt       ;arret décompte et RAZ
                gosub affich
            loop while second<>0
            high verte:low orange,rouge     ;fin décompte
            timer=0
            do loop while timer <= 100      ;attente 10s led verte ON
            low rouge,verte,orange
                second=Ttot            ;on recharge le temps mémorisé
                gosub affich        ;on l'affiche
                if A_E=0 then      ;option afficheur éteint   
                     gosub eteint     ; On éteint tout
                endif
            do loop while start=1 and mem=1    ;attente appui sur start ou mem
            if mem=0 then decompt            ;on est sorti de l'attente
            gosub allume   ;On rallume tout, éteint ou pas
        loop 
    loop
 
introtemp:       ;sub intro nouveau temps
;********** intro secondes *******
     pause 200
    do loop while mem=0        ;attente relachement pous
    pause 200
    point=1        ;ajout point décimal sur digit n°4
    do
        gosub affich
        timer=0
        ;***** code plus *****
        if plus=0 then
            second =second+5 max 9995   
            do while plus=0
                if timer >5 then       ;500ms défilement accéléré     
                    second =second+5 max 9995
                    gosub affich         
                endif
            loop   
            gosub affich         
        endif
        ; code moins
        if moins=0 then
            second =second-5
                if second > 9999 then: second=0:endif   ;passage en négatif
            do while moins=0
                if timer >5 then         
                    second =second-5
                    if second>9999 then: second=0 :endif  ;dépassement négatif         
                    gosub affich         
                endif
            loop   
        gosub affich         
        endif
        if mem=0 then exit    ;sortie de boucle
    loop
    do loop while mem=0   ;attente relâchement poussoir
    Ttot=second
    write  0,Ttot    ;mise en EEPROM
    high orange, rouge :pause 500:low orange, rouge:pause 500
    high orange, rouge :pause 500:low orange, rouge
    point=0        ;sortie mode introtemps
    gosub affich
    return

affich:
    div=1000
    clk=1 : dio=1 : dio=0        ;balise start
    Octet=adrdep        ;synchro adresse départ
    gosub EnvoiOctet
    Nbre=second    ;on tronçonne Nbre et affiche chaque chiffre
    for j=1 to 4
        Chiffre=Nbre/Div    ;on isole le chiffre à afficher
        if j=1 and second<1000  and second<>0 then
           chiffre=10    ;chiffre "blanc" càd noir, en fait
        endif
        if j=2 and second<100 and second<>0 then
           chiffre=10
        endif
        lookup Chiffre,($3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7f,$6f,0), Octet ; 0-9 +blanc uniquement
        if j=3 then    ;choix affichage point
           octet=octet | dp    ;ajout point décimal
        endif
        if point=1 and j=4 then ;mode programmation temps
           octet=octet | dp    ;ajout point digit 4
        endif
        gosub EnvoiOctet;
        Nbre=Nbre//Div
        Div=Div/10
    next j
    clk=0: dio=0: clk=1: dio=1        ;balise stop
    return

allume:
     clk=1 : dio=1 : dio=0        ;bal start
    Octet=RegLum        ;Réglage luminosité
    gosub EnvoiOctet
    clk=0: dio=0: clk=1: dio=1        ;bal stop
    return
eteint:
    clk=1 : dio=1 : dio=0        ;bal start
    Octet=$80       ;Réglage luminosité =0
    gosub EnvoiOctet
    clk=0: dio=0: clk=1: dio=1        ;bal stop
    return

;******* Envoi des chiffres (octet) bit à bit dans le registre ********
EnvoiOctet:    ;lecture de b0 bit à bit de bit0 à bit8 poids faible en tête.
    for i=1 to 8 ; envoi
        clk=0
        dio=bit0
        Octet = Octet/2        ;décalage du bit lu, bit1 devient bit0
        clk=1
    next i
    clk=0 :clk=1: clk=0    ; balise  ACK
    return

MM
 
Last edited:
Bonjour,
C'était pas comme ça avant? je sais plus...
Ok, après les 10s, on recharge le temps en mémoire et on l'affiche... ou pas.
Essaye ça :

Code:
; décompteur 1/10s  MM 110726
; réglage par poussoirs +/-
;pour temps=9990 10ème s => tmax=16 mn 39s;
;les poussoirs sont sur le 0V,
;Broches avec pullup sur 20X2 : bit0-bit7 = C.0,C.6,C.7,B.0,B.1,B.5,B.6,B.7

;****** MODE D'EMPLOI **********
;A la mise sous tension, mémoire vide, passage auto en mode programmation temps

;Mode Programmation du temps:
;L'affichage est en /10 de seconde, avec un point décimal sur le digit 3
;Pour identifier ce mode,il y a en plus un point sur le digit 4
;Appui sur plus:
;            appui court < 500ms => incrémentation de 1
;            appui long  > 500ms => défilement rapide
;Appui sur moins:
;            Idem en décrémentation
;Appui sur MEM => clignotement vert + rouge => mise en mémoire EEPROM
;Passage en mode décomptage
;
;Mode décomptage.
;Le point sur le digit 4 disparait,reste le point décimal digit3
;Attente appui sur poussoir start => décompte du temps led rouge allumée.
;A 5 s => led orange allumée
;A 00,0 s => R et O éteintes, verte allumée 10 s puis, l'affichage s'éteint
;Deux possibilités:
        ;Appui sur start => le cycle repart avec valeur en mémoire
        ;Appui sur mem pour affichage temps mémorisé, un second appui pour réglage possible
;Arrêt possible par appui sur MEM à tout moment du décompte
;MEM => arret décompte => retour attente start avec temps mémorisé
;deuxième appui sur MEM =>passage en mode programmation
             
#picaxe 20X2
setfreq M16
symbol dio=pinC.1         ;sur TM1637
symbol clk=pinC.2         ;idem
symbol mem=pinC.0         ;poussoir MEM
symbol plus=pinC.6        ;poussoir plus              
symbol moins=pinC.7
symbol A_E=pinB.6            ;affichage Allumé_Eteint
symbol start=pinB.7
symbol orange=B.0        ;leds
symbol rouge=B.1
symbol verte=B.2
symbol octet=b0    ;octet doit être en b0; le bit0 est utilisé
symbol j=b1        ;position point décimal
symbol i=b2        ;compteur
symbol chiffre=b3
symbol dp=b4
symbol point=b5        ;point digit 4
symbol second=w12    ;en fait des /10 de secondes
symbol div=w13
symbol nbre=w14
symbol Ttot=w15        ;tepmps mémorisé
symbol AdrDep=$c0 ; adresse du 1er digit (poids fort)
symbol RegLum=$8c ; réglage luminosité $80 = eteint, $88 à $8F => luminosité croissante
dp=$80
;pullup sur 20X2  bit0-bit7 = C.0,C.6,C.7,B.0,B.1,B.5,B.6,B.7
pullup %11000111    ;sur C.0,C.6,C.7,B.6,B.7
dirsC=%110                ;pour utilisation pinsC
settimer 59286  ;1/10 s à 16MHs  59286

;    ***** init TM1637 et temps EEPROM
    gosub allume        ;règle l'allumage des segments
    low rouge,verte,orange
    read 0,Ttot      ;lecture temps en EEPROM
    if Ttot=0 then    ;la mémoire est vide
        gosub  introtemp    ;entrer une valeur en mémoire EEPROM
    endif
    second=Ttot    ;initialisation compteur seconde
    gosub affich    ;affichage temps initial

;********decompte *******
decompt:
    pause 200
    gosub allume ;On rallume tout    si afficheur éteint
    do loop while mem=0    ;attente relachement suite arret decompte
    low rouge
    do
        second=Ttot
        gosub affich
        do        ;****** boucle attente départ ou intro temps  ******
           if mem=0 then gosub introtemp ;passage en programmation temps
        loop while start=1    ;attente start      
        do
                timer=0
            do      ;boucle décomptage    
                high rouge            
                second=Ttot -timer
                if second < 50  then        ;5 secondes avant la fin
                    high orange
                endif
                if mem=0 then decompt       ;arret décompte et RAZ
                gosub affich
            loop while second<>0
            high verte:low orange,rouge     ;fin décompte
            timer=0
            do loop while timer <= 100      ;attente 10s led verte ON
            low rouge,verte,orange
                second=Ttot            ;on recharge le temps mémorisé
                gosub affich        ;on l'affiche
                if A_E=0 then      ;option afficheur éteint  
                     gosub eteint     ; On éteint tout
                endif
            do loop while start=1 and mem=1    ;attente appui sur start ou mem
            if mem=0 then decompt            ;on est sorti de l'attente
            gosub allume   ;On rallume tout, éteint ou pas
        loop
    loop
 
introtemp:       ;sub intro nouveau temps
;********** intro secondes *******
     pause 200
    do loop while mem=0        ;attente relachement pous
    pause 200
    point=1        ;ajout point décimal sur digit n°4
    do
        gosub affich
        timer=0
        ;***** code plus *****
        if plus=0 then
            second =second+5 max 9995  
            do while plus=0
                if timer >5 then       ;500ms défilement accéléré    
                    second =second+5 max 9995
                    gosub affich        
                endif
            loop  
            gosub affich        
        endif
        ; code moins
        if moins=0 then
            second =second-5
                if second > 9999 then: second=0:endif   ;passage en négatif
            do while moins=0
                if timer >5 then        
                    second =second-5
                    if second>9999 then: second=0 :endif  ;dépassement négatif        
                    gosub affich        
                endif
            loop  
        gosub affich        
        endif
        if mem=0 then exit    ;sortie de boucle
    loop
    do loop while mem=0   ;attente relâchement poussoir
    Ttot=second
    write  0,Ttot    ;mise en EEPROM
    high orange, rouge :pause 500:low orange, rouge:pause 500
    high orange, rouge :pause 500:low orange, rouge
    point=0        ;sortie mode introtemps
    gosub affich
    return

affich:
    div=1000
    clk=1 : dio=1 : dio=0        ;balise start
    Octet=adrdep        ;synchro adresse départ
    gosub EnvoiOctet
    Nbre=second    ;on tronçonne Nbre et affiche chaque chiffre
    for j=1 to 4
        Chiffre=Nbre/Div    ;on isole le chiffre à afficher
        if j=1 and second<1000  and second<>0 then
           chiffre=10    ;chiffre "blanc" càd noir, en fait
        endif
        if j=2 and second<100 and second<>0 then
           chiffre=10
        endif
        lookup Chiffre,($3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7f,$6f,0), Octet ; 0-9 +blanc uniquement
        if j=3 then    ;choix affichage point
           octet=octet | dp    ;ajout point décimal
        endif
        if point=1 and j=4 then ;mode programmation temps
           octet=octet | dp    ;ajout point digit 4
        endif
        gosub EnvoiOctet;
        Nbre=Nbre//Div
        Div=Div/10
    next j
    clk=0: dio=0: clk=1: dio=1        ;balise stop
    return

allume:
     clk=1 : dio=1 : dio=0        ;bal start
    Octet=RegLum        ;Réglage luminosité
    gosub EnvoiOctet
    clk=0: dio=0: clk=1: dio=1        ;bal stop
    return
eteint:
    clk=1 : dio=1 : dio=0        ;bal start
    Octet=$80       ;Réglage luminosité =0
    gosub EnvoiOctet
    clk=0: dio=0: clk=1: dio=1        ;bal stop
    return

;******* Envoi des chiffres (octet) bit à bit dans le registre ********
EnvoiOctet:    ;lecture de b0 bit à bit de bit0 à bit8 poids faible en tête.
    for i=1 to 8 ; envoi
        clk=0
        dio=bit0
        Octet = Octet/2        ;décalage du bit lu, bit1 devient bit0
        clk=1
    next i
    clk=0 :clk=1: clk=0    ; balise  ACK
    return

MM
cette version fonctionne parfaitement.J'ai testé toutes les fonctions et aucun bug. TOP BOULOT
 
Bon, ben tant mieux.
Si je peux avoir des précisions, photos, explications, sur son utilisation, sur quoi et à qui ça peut servir, c'est parfait...
MM
 
le but du système est le suivant :
lors de certaines courses automobiles ont impose un temps d'arrêt au stand minimum calculé a partir de l'entrée des stands.C'est difficile pour le team manager ( que je suis )de savoir avec exactitude le moment où il a franchit la ligne d'entrée des stands et donc du début du chronométrage de l arrêt. Le pilote en appuyant sur la touche start déclenche le compte a rebours . Cela lui permet de sortir des stands et de reprendre la piste juste au bon moment ni trop tôt ( sinon pénalités ) ni trop tard .
La toute première version du système ( avec picbasic) était installé dans deux lamborghini .....
Ici les modules que nous avons fait seront plus modestement installés dans des citroen C1 que je gère en course.
Un display est placé a la vue du pilote et le deuxième est pour que de l'extérieur je vois le décompte.
Je suis en train de terminer les boitiers. Quand tout sera terminé je t'envois des photos.
je vais demander au team un petit budget pour faire une détection par module GPS du passage de la ligne d'entrée des stands......avec mise en mémoire des données(GPS ) de la ligne dans une sdcard.
 
suite .....
la première version du système date de 2016 et fonctionnait avec un BP ou une balise optique. Puis une grosse société de matériel électronique pour voiture de course a sorti une copie plus performante de mon système avec une détection GPS. Un des pilotes d'une des lamborghini n'était autre que le patron de cette société. Maintenant nous ne pouvons plus placer de balise au bord de piste.....
 
le but du système est le suivant :
lors de certaines courses automobiles ont impose un temps d'arrêt au stand minimum calculé a partir de l'entrée des stands.C'est difficile pour le team manager ( que je suis )de savoir avec exactitude le moment où il a franchit la ligne d'entrée des stands et donc du début du chronométrage de l arrêt. Le pilote en appuyant sur la touche start déclenche le compte a rebours . Cela lui permet de sortir des stands et de reprendre la piste juste au bon moment ni trop tôt ( sinon pénalités ) ni trop tard .
La toute première version du système ( avec picbasic) était installé dans deux lamborghini .....
Ici les modules que nous avons fait seront plus modestement installés dans des citroen C1 que je gère en course.
Un display est placé a la vue du pilote et le deuxième est pour que de l'extérieur je vois le décompte.
Je suis en train de terminer les boitiers. Quand tout sera terminé je t'envois des photos.
je vais demander au team un petit budget pour faire une détection par module GPS du passage de la ligne d'entrée des stands......avec mise en mémoire des données(GPS ) de la ligne dans une sdcard.
Merci,
La détection de l'entrée dans le stand par GPS me parait un peu compliquée. Une barrière optique , genre entrée de garage, et une liaison radio semble plus simple.
Quelle est la distance entre entrée des stands et le point d’arrêt ?
Regarde cette page:
MM
 
Last edited:
suite .....
la première version du système date de 2016 et fonctionnait avec un BP ou une balise optique. Puis une grosse société de matériel électronique pour voiture de course a sorti une copie plus performante de mon système avec une détection GPS. Un des pilotes d'une des lamborghini n'était autre que le patron de cette société. Maintenant nous ne pouvons plus placer de balise au bord de piste.....
Ok, je retire la barrière....
MM
 
C'est le système de chronométrage officiel qui contrôle le temps d arrêt.
Il y a dans chaque voiture un module qui génère un code ( spécifique a chaque voiture ) et ce code est lu par une boucle magnétique incrustée dans la piste. Nous ne pouvons pas utiliser ce signal.
il y a une boucle a l'entrée et a la sortie des stands.
 
. Nous ne pouvons pas utiliser ce signal.
Ce serait trop simple....
Mais je suis pas sûr que le GPS, avec l'imprécision de la position et le temps d'échantillonnage soit plus précis que le poussoir..
MM
 
Les détections par GPS fonctionnent parfaitement. Tous les systèmes de chronométrages embarquées et acquisitions de données fonctionnent avec des antennes GPS .Je sais de quoi je parle j'installe dans des voitures des modules datalogger avec GPS pour le laptime. Precis au 10é de seconde.
 
Les détections par GPS fonctionnent parfaitement. Tous les systèmes de chronométrages embarquées et acquisitions de données fonctionnent avec des antennes GPS .Je sais de quoi je parle j'installe dans des voitures des modules datalogger avec GPS pour le laptime. Precis au 10é de seconde.
Ok, je n'ai pas cette expérience, j'avais simplement un doute sur la précision de la position.
MM
 
Back
Top