CONVERSION PICBASIC 3B vers PICAXE

Bonjour,
la fonction pour modifier le temps ne fonctionne pas correctement.
je viens d'essayer comme expliqué....;mais cela ne marche pas.
si plus facile on peut ajouter un SW "reset"
bonne journée
 
Bonjour,
la fonction pour modifier le temps ne fonctionne pas correctement.
je viens d'essayer comme expliqué....;mais cela ne marche pas.
si plus facile on peut Eajouter un SW "reset"
bonne journée
Hello,
J'ai du mal m'expliquer. Deux modes : programmation et décompte. En mode décompte, les poussoirs +/- sont désactivés.Il faut passer en mode programmation par MEM
Je ferai une vidéo demain
MM
 
Last edited:
Bonjour
j effectue une serie de tests . ET tu as fais un super boulot tout a l'air de fonctionner convenablement.

j enverrais une vidéo sur youtube des que possible
 
dans les commentaires les accents sont remplacés par des ? quand je corrige j'enregistre le programme puis lors de la reouverture de celui ci j ai de nouveau les ? au lieu des accents j utilise PICAXE editor 6.2.0 as tu une idée.
Le programme timer fonctionne parfaitement.
je prepare un typon
 
dans les commentaires les accents sont remplacés par des ? quand je corrige j'enregistre le programme puis lors de la reouverture de celui ci j ai de nouveau les ? au lieu des accents j utilise PICAXE editor 6.2.0 as tu une idée.
Le programme timer fonctionne parfaitement.
je prepare un typon
Hello
Il faut aller dans les réglages. J'ai pas de pc sous la main pour guider
MM
 
Suite,
Les réglages sont dans "Options de simulation"....bon
Langue : French-Français
Fichier : Unicode (UFT-16)
Et ça devrait fonctionner
je prépare un typon
On peut prévoir de récupérer les broches inutilisées. Quelle méthode employée ?
MM
 
Last edited:
Suite,
Les réglages sont dans "Options de simulation"....bon
Langue : French-Français
Fichier : Unicode (UFT-16)
Et ça devrait fonctionner

On peut prévoir de récupérer les broches inutilisées. Quelle méthode employée ?
MM
Bonjour
je dois recevoir ce vendredi les circuits imprimés prototypes .
Sur le banc d'essais tout fonctionne bien.
La precision est bonne.
Le top serait de pouvoir introduire le temps par 5/10 de seconde et non plus par seconde.
a bientot
MV
 
Voici une modif qui devrait convenir...à tester:
En mode réglage du temps, il y a un point sur le digit 4 pour rappeler dans quel mode on est
Il disparait en mode décomptage. Le point décimal sur digit 3 est toujours présent

Code:
; décompteur 1/10s  MM 240626
; 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 programmartion temps
;Mode Programmation du temps:
;Appui sur plus1:
;            appui court < 500ms => incrémentation de 0,5s
;            appui long  > 500ms => défilemenrt rapide
;Appui sur moin1:
;            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 décimal est sur le digit 3 => 1/10 de s sur digit 4 . Ex: 025,8 s
;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 => arrert décompte => retour start MEM => programmation MEM => mise en mémoire => start
;Attente appui sur start
                    
#picaxe 20X2
setfreq M16
symbol dio=pinC.1        ;sur TM1637
symbol clk=pinC.2        ;idem
symbol mem=pinC.0        ;poussoir MEM
symbol plus1=pinC.6
symbol moin1=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=b6        ;position point décimal
symbol i=b7        ;compteur
symbol chiffre=b8
symbol dp=b9
symbol point=b10
symbol second=w11
symbol div=w12
symbol nombre=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,second        ;lecture temps en EEPROM
    if second=0 then    ;la mémoire est vide       
        gosub  introtemp    ;entrer une valeur en mémoire EEPROM
    endif
    nombre=second
    gosub affich

;********decompte *******
decompt:
    pause 200
    do loop while mem=0    ;suite arret decompte
    low rouge
    do
        do        ;****** boucle attente départ ou intro temps  ******       
            if mem=0 then gosub introtemp           
            nombre=second         ;temps en 1/10 de s
            gosub affich
        loop while start=1    ;attente top   
        timer=0
        Ttot=nombre
        high rouge
        do
            nombre=Ttot -timer
            if nombre < 50  then        ;5 secondes avant la fin
               high orange
            endif
            if mem=0 then decompt   
            gosub affich
        loop while nombre<>0
        high verte:low orange,rouge
        timer=0
        do loop while timer <= 100
        low rouge,verte,orange
        nombre=second
        gosub affich
    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   
        nombre=second
        gosub affich
         timer=0
        ;***** code plus *****
        if plus1=0 then
            second =second+5 max 9995         
            do while plus1=0
                if timer >5 then       ;500ms défilement accéléré           
                    second =second+5 max 9995
                    nombre=second
                    gosub affich               
                endif
            loop                   
            nombre=second
            gosub affich               
        endif
        ; code moins   
        if moin1=0 then
            second =second-5 min 0         
            do while moin1=0
                if timer >5 then               
                    second =second-5
                    if second>9999 then: second=0 :endif
                    nombre=second
                    gosub affich               
                endif
            loop                   
            nombre=second
            gosub affich               
        endif
        if mem=0 then exit    ;fin de boucle intro secondes
    loop
    do loop while mem=0   ;attente relâchement poussoir 
    write  0,second    ;mise en EEPROM
    high orange, rouge :pause 500:low orange, rouge:pause 500
    high orange, rouge :pause 500:low orange, rouge:pause 500
    point=0
    return

affich:
    div=1000
    clk=1 : dio=1 : dio=0        ;bal start
    Octet=adrdep        ;synchro adresse départ
    gosub EnvoiOctet
    Nbre=Nombre
    for j=1 to 4
        Chiffre=Nbre/Div
        gosub DecTo7seg
        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 difgit 4
        endif
        gosub EnvoiOctet;
        Nbre=Nbre//Div
        Div=Div/10
    next j
    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        ;effacement du bit lu, bit1 devient bit0
        clk=1
    next i
    clk=0 :clk=1: clk=0    ; balise  ACK
    return

;****** Conversion des chiffres en segments
DecTo7seg:
    lookup Chiffre,($3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7f,$6f), Octet ; 0-9 uniquement
    return
 
Last edited:
Voici une modif qui devrait convenir...à tester:
En mode réglage du temps, il y a un point sur le digit 4 pour rappeler dans quel mode on est
Il disparait en mode décomptage. Le point décimal sur digit 3 est toujours présent

Code:
; décompteur 1/10s  MM 240626
; 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 programmartion temps
;Mode Programmation du temps:
;Appui sur plus1:
;            appui court < 500ms => incrémentation de 0,5s
;            appui long  > 500ms => défilemenrt rapide
;Appui sur moin1:
;            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 décimal est sur le digit 3 => 1/10 de s sur digit 4 . Ex: 025,8 s
;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 => arrert décompte => retour start MEM => programmation MEM => mise en mémoire => start
;Attente appui sur start
                
#picaxe 20X2
setfreq M16
symbol dio=pinC.1        ;sur TM1637
symbol clk=pinC.2        ;idem
symbol mem=pinC.0        ;poussoir MEM
symbol plus1=pinC.6
symbol moin1=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=b6        ;position point décimal
symbol i=b7        ;compteur
symbol chiffre=b8
symbol dp=b9
symbol point=b10
symbol second=w11
symbol div=w12
symbol nombre=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,second        ;lecture temps en EEPROM
    if second=0 then    ;la mémoire est vide   
        gosub  introtemp    ;entrer une valeur en mémoire EEPROM
    endif
    nombre=second
    gosub affich

;********decompte *******
decompt:
    pause 200
    do loop while mem=0    ;suite arret decompte
    low rouge
    do
        do        ;****** boucle attente départ ou intro temps  ******   
            if mem=0 then gosub introtemp       
            nombre=second         ;temps en 1/10 de s
            gosub affich
        loop while start=1    ;attente top
        timer=0
        Ttot=nombre
        high rouge
        do
            nombre=Ttot -timer
            if nombre < 50  then        ;5 secondes avant la fin
               high orange
            endif
            if mem=0 then decompt
            gosub affich
        loop while nombre<>0
        high verte:low orange,rouge
        timer=0
        do loop while timer <= 100
        low rouge,verte,orange
        nombre=second
        gosub affich
    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
        nombre=second
        gosub affich
         timer=0
        ;***** code plus *****
        if plus1=0 then
            second =second+5 max 9995     
            do while plus1=0
                if timer >5 then       ;500ms défilement accéléré       
                    second =second+5 max 9995
                    nombre=second
                    gosub affich           
                endif
            loop               
            nombre=second
            gosub affich           
        endif
        ; code moins
        if moin1=0 then
            second =second-5 min 0     
            do while moin1=0
                if timer >5 then           
                    second =second-5
                    if second>9999 then: second=0 :endif
                    nombre=second
                    gosub affich           
                endif
            loop               
            nombre=second
            gosub affich           
        endif
        if mem=0 then exit    ;fin de boucle intro secondes
    loop
    do loop while mem=0   ;attente relâchement poussoir
    write  0,second    ;mise en EEPROM
    high orange, rouge :pause 500:low orange, rouge:pause 500
    high orange, rouge :pause 500:low orange, rouge:pause 500
    point=0
    return

affich:
    div=1000
    clk=1 : dio=1 : dio=0        ;bal start
    Octet=adrdep        ;synchro adresse départ
    gosub EnvoiOctet
    Nbre=Nombre
    for j=1 to 4
        Chiffre=Nbre/Div
        gosub DecTo7seg
        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 difgit 4
        endif
        gosub EnvoiOctet;
        Nbre=Nbre//Div
        Div=Div/10
    next j
    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        ;effacement du bit lu, bit1 devient bit0
        clk=1
    next i
    clk=0 :clk=1: clk=0    ; balise  ACK
    return

;****** Conversion des chiffres en segments
DecTo7seg:
    lookup Chiffre,($3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7f,$6f), Octet ; 0-9 uniquement
    return
Bonjour,
En attendant le résultat, on peut quand même dire que si ces afficheurs sont trop petits, on trouve des afficheurs de 0.8 ou un 1 inch à des prix abordables:
ou
et des TM1637:

Bref, de quoi fabriquer des afficheurs grands et pas chers...Un PCB JLCPCB pour 2€?
MM
 
Bonjour,
Oui,ça avance. Sans le schéma final, je ne peux rien en dire, sinon qu'il faudra adapter le code en fonction des broches choisies.
Les courants max sur les sorties sont de 20mA, largement suffisants pour alimenter une led, je suppose que l'ULN a son utilité.
Beaucoup de broches sur les connecteurs. Pour les TM1637, 4 fils suffisent, à mettre en / / pour deux afficheurs.
Que penses tu des afficheurs 0.8 et 1 inch ?
Pour info,tu fais tes PCB avec quoi, ou qui ?
MM
 
les pcb sont fait chez JLCPCB qui pour le moment offre le meilleur rapport qualité prix.
Pour le dessin des print j'utilise SPRINT LAYOUT 60 pas le plus sofistiqué mais je le maitrise bien donc je change pas.
Pour les broches des connecteurs ......je dois pouvoir remplacer le print sans trop de manipulations ....;
les displays sont top.
Pour le schema final j ai garder ta configuration j ai juste ajouter ULM pour augmenter le courant disponible.
 
les pcb sont fait chez JLCPCB qui pour le moment offre le meilleur rapport qualité prix.
Pour le dessin des print j'utilise SPRINT LAYOUT 60 pas le plus sofistiqué mais je le maitrise bien donc je change pas.
Pour les broches des connecteurs ......je dois pouvoir remplacer le print sans trop de manipulations ....;
les displays sont top.
Pour le schema final j ai garder ta configuration j ai juste ajouter ULM pour augmenter le courant disponible.
Pour les Gerbers, j'utilise DipTrace, le routage automatique est une aide intéressante.
Je ne vois pas la même configuration, le schéma original est en #36. A confirmer.
Les display sont top, ok, mais penses tu en monté un en 4 digits
Un ex: vu de face, le TM1637 est sur la face arrière

display 0 8 pouce.JPG
MM
 
Ok, sur la photo, je voyais plutôt l'ULN sur bB.4 à B.7.
Si le schéma est complet, il manque les R de limitation de courant sur les leds;
Il faudrait aussi un condo de découplage 100nF céramique sur les broches alim du µC.
MM
 
Utiliser les sorties dans le programme a savoir B0,B1,B2
Les led sont des 12v avec resistance de limitation incorporée
le condo est present ( C3 )

Je vais essayer la modif du programme
bonne journée
 
Hello,
Sur le schéma, je vois la 10k circuit de programmation après la 22k, au lieu de avant la 22k. Ce n'est pas un diviseur de tension.
MM
 
c'est une erreur de position sur la mise au net du schema .Sur le print elle est au bon endroit
Je viens de tester la modification de programme c'est TOP.
 
tu n as plus qu'a m'envoyer la facture......
Chez moi, tout est gratuit.
Mais tu peux peut être me donner quelques détails sur ce qui semble être une course, avec pilote et mécanicien,
Et si tu es d'accord, je pourrais ajouter une page dans la rubrique "Les projets des forumeurs" de ce site:
https://electromag1.wifeo.com/
Avec si possible, une photo ou une vidéo du système en place.
MM
 
Dés que je fini le montage final ......tu auras toutes les infos et photos que tu demandes.
Oui le but du timer est de faire un decompte vu par le pilote lors de son arret au stand et de repartir au bon moment pour eviter une penalité.La premiere version avec PICBASIC etait monté dans des Lamborghini super trophéo.
Bien sur tu peux publier une page dans la rubrique " projet"
Le top maintenant serait d'afficher le temps sans les "0" exemple 020.5 donc afficher 20.5 mais lorsque le temps est ecoulé afficher 0000
C 'est moins perturbant pour le pilote.....( je precise c'est pas tous des "lumieres " ils conduisent bien mais pour le reste.......
 
Bonjour,
Voici un code moins perturbant ;
Code:
; décompteur 1/10s  MM 290626
; 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 programmartion 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 plus1:
;            appui court < 500ms => incrémentation de 1
;            appui long  > 500ms => défilemenrt rapide
;Appui sur moin1:
;            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 plus1=pinC.6
symbol moin1=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=b6        ;position point décimal
symbol i=b7        ;compteur
symbol chiffre=b8
symbol dp=b9
symbol point=b10
symbol second=w11
symbol div=w12
symbol nombre=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,second        ;lecture temps en EEPROM
    if second=0 then    ;la mémoire est vide          
        gosub  introtemp    ;entrer une valeur en mémoire EEPROM
    endif
    nombre=second
    gosub affich

;********decompte *******
decompt:
    pause 200
    do loop while mem=0    ;attente relachement suite arret decompte  
    low rouge
    do
        do        ;****** boucle attente départ ou intro temps  ******          
            if mem=0 then gosub introtemp              
            nombre=second         ;temps en 1/10 de s
            gosub affich
        loop while start=1    ;attente start    
        timer=0
        Ttot=nombre
        high rouge
        do        ;boucle décomptage
            nombre=Ttot -timer  
            if nombre < 50  then        ;5 secondes avant la fin
               high orange  
            endif
            if mem=0 then decompt          ;arret décompte et RAZ  
            gosub affich
        loop while nombre<>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
        nombre=second
        gosub affich
    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      
        nombre=second
        gosub affich
         timer=0
        ;***** code plus *****  
        if plus1=0 then
            second =second+5 max 9995            
            do while plus1=0
                if timer >5 then       ;500ms défilement accéléré              
                    second =second+5 max 9995
                    nombre=second
                    gosub affich                  
                endif
            loop                      
            nombre=second
            gosub affich                  
        endif
        ; code moins      
        if moin1=0 then
            second =second-5 min 0            
            do while moin1=0
                if timer >5 then                  
                    second =second-5
                    if second>9999 then: second=0 :endif
                    nombre=second
                    gosub affich                  
                endif
            loop                      
            nombre=second
            gosub affich                  
        endif
        if mem=0 then exit    ;fin de boucle intro secondes
    loop
    do loop while mem=0   ;attente relâchement poussoir    
    write  0,second    ;mise en EEPROM
    high orange, rouge :pause 500:low orange, rouge:pause 500
    high orange, rouge :pause 500:low orange, rouge
    point=0
    return

affich:
    div=1000
    clk=1 : dio=1 : dio=0        ;balise start
    Octet=adrdep        ;synchro adresse départ
    gosub EnvoiOctet
    Nbre=Nombre
    for j=1 to 4      
        Chiffre=Nbre/Div    ;on isole le chiffre à afficher
        if j=1 and Nbre<1000 and Nbre<>0 then
            chiffre=10
        endif
        if j=2 and Nbre<100 and Nbre<>0 then
            chiffre=10
        endif
        gosub DecTo7seg
        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 difgit 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        ;effacement du bit lu, bit1 devient bit0
        clk=1
    next i
    clk=0 :clk=1: clk=0    ; balise  ACK
    return

;****** Conversion des chiffres en segments
DecTo7seg:
    lookup Chiffre,($3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7f,$6f,0), Octet ; 0-9 +blanc uniquement
    return
MM
 
jusqu' 99 secondes c'est OK apres par exemple 120.5 secondes j ai comme affichage au decompte 1 0.5 le deux ne s affiche pas
idem si 220.5 au decompte j affiche 2 20.5
 
Oui, il y avait une erreur de choix de variable, je pense que c'est corrigé:
A tester:
Code:
; décompteur 1/10s  MM 290626
; 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 programmartion 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 plus1:
;            appui court < 500ms => incrémentation de 1
;            appui long  > 500ms => défilemenrt rapide
;Appui sur moin1:
;            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 plus1=pinC.6
symbol moin1=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=b6        ;position point décimal
symbol i=b7        ;compteur
symbol chiffre=b8
symbol dp=b9
symbol point=b10
symbol second=w11
symbol div=w12
symbol nombre=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,second        ;lecture temps en EEPROM
    if second=0 then    ;la mémoire est vide       
        gosub  introtemp    ;entrer une valeur en mémoire EEPROM
    endif
    nombre=second
    gosub affich

;********decompte *******
decompt:
    pause 200
    do loop while mem=0    ;attente relachement suite arret decompte
    low rouge
    do
        do        ;****** boucle attente départ ou intro temps  ******       
            if mem=0 then gosub introtemp           
            nombre=second         ;temps en 1/10 de s
            gosub affich
        loop while start=1    ;attente start 
        timer=0
        Ttot=nombre
        high rouge
        do        ;boucle décomptage
            nombre=Ttot -timer
            if nombre < 50  then        ;5 secondes avant la fin
               high orange
            endif
            if mem=0 then decompt          ;arret décompte et RAZ
            gosub affich
        loop while nombre<>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
        nombre=second
        gosub affich
    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   
        nombre=second
        gosub affich
         timer=0
        ;***** code plus *****
        if plus1=0 then
            second =second+5 max 9995         
            do while plus1=0
                if timer >5 then       ;500ms défilement accéléré           
                    second =second+5 max 9995
                    nombre=second
                    gosub affich               
                endif
            loop                   
            nombre=second
            gosub affich               
        endif
        ; code moins   
        if moin1=0 then
            second =second-5 min 0         
            do while moin1=0
                if timer >5 then               
                    second =second-5
                    if second>9999 then: second=0 :endif
                    nombre=second
                    gosub affich               
                endif
            loop                   
            nombre=second
            gosub affich               
        endif
        if mem=0 then exit    ;fin de boucle intro secondes
    loop
    do loop while mem=0   ;attente relâchement poussoir 
    write  0,second    ;mise en EEPROM
    high orange, rouge :pause 500:low orange, rouge:pause 500
    high orange, rouge :pause 500:low orange, rouge
    point=0
    return

affich:
    div=1000
    clk=1 : dio=1 : dio=0        ;balise start
    Octet=adrdep        ;synchro adresse départ
    gosub EnvoiOctet
    Nbre=Nombre
    for j=1 to 4   
        Chiffre=Nbre/Div    ;on isole le chiffre à afficher
        if j=1 and nombre<1000  and nombre<>0 then
            chiffre=10
        endif
        if j=2 and nombre<100 and nombre<>0 then
            chiffre=10
        endif
        gosub DecTo7seg
        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        ;effacement du bit lu, bit1 devient bit0
        clk=1
    next i
    clk=0 :clk=1: clk=0    ; balise  ACK
    return

;****** Conversion des chiffres en segments
DecTo7seg:
    lookup Chiffre,($3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7f,$6f,0), Octet ; 0-9 +blanc uniquement
    return
MM
 
Last edited:
Il y qq chose que je comprend pas ...display blanc j ai les points display vert j ai pas les points c 'est deux drivers TM1637 h
 

Attachments

  • IMG_4590.jpeg
    IMG_4590.jpeg
    94.4 KB · Views: 1
  • IMG_4591.jpeg
    IMG_4591.jpeg
    84.1 KB · Views: 1
Oui, c'est pour ça que j'avais insisté sur ce point (#21) ;)
Le TM1637 est un driver pour afficheur 7 segments, un des bits de l'octet commande le point décimal.
Sur le digit 2, il y a un point ou deux points pour les afficheurs horaires qui sont les plus courants.
Si il y a deux points centraux, le point décimal (au dessous) ne fonctionne pas. On a pas le choix.
Finalement, la taille est suffisante, ou pas ?
La programmation picaxe c 'est une passion pour toi ?
C'est beaucoup dire, mon père était radio-électricien, je suis tombé dans l'électronique tout petit (y a trèèèèèès longtemps)
Découvert le picaxe en 2010, en remplacement du picbasic 3B et qui faisant la même chose beaucoup moins cher (c'est toujours vrai).
MM
 
Last edited:
Bonjour,
Voici une version nettoyée des changements de variables inutiles venus de divers copier-coller.
Normalement, il fait exactement la même chose, en un peu plus propre.
J'ai aussi mis à jour le mode d'emploi.

Code:
; décompteur 1/10s  MM 300626
; 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 programmartion 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 0,5s
;            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   
        timer=0
        high rouge
        do        ;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   
    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
        gosub DecTo7seg
        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        ;isolement chiffre suivant
        Div=Div/10            ;diviseur suivant
    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        ;octet=b0 => décalage à droite, bit1 devient bit0
        clk=1
    next i
    clk=0 :clk=1: clk=0    ; balise  ACK
    return

;****** Conversion des chiffres en segments
DecTo7seg:
    lookup Chiffre,($3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7f,$6f,0), Octet ; 0-9 +blanc uniquement
    return
MM
 
Bonjour,
Encore une petite modif, le lookup est dans le code, le sous programme d'une seule ligne n'était qu'une perte de temps:

Code:
; décompteur 1/10s  MM 030726
; 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  
        timer=0
        high rouge
        do        ;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  
    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
MM
 
Bonjour,
Encore une petite modif, le lookup est dans le code, le sous programme d'une seule ligne n'était qu'une perte de temps:

Code:
; décompteur 1/10s  MM 030726
; 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 
        timer=0
        high rouge
        do        ;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 
    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
MM
Bonjour je ferais les essais des modifications de programmes a mon retour au travail ce lundi
Bon weekend.
 
Normalement, il n'y a rien de changé, c'est juste une question de simplification pour gagner quelques µs.
MM
 
Back
Top