CONVERSION PICBASIC 3B vers PICAXE

Bonjour
je cherche une personne qui convertirait un programme conçu pour un PICBASIC 3b vers un PICAXE avec quelques modifications.
Il s'agit d'un timer avec affichage sur module 4 display 7 segments ( serie qui doit devenir i2c ) .
 
Bonjour,
J'ai fait jadis une alarme maison à base de picbasic 3d, j'ai ensuite découvert les picaxes, beaucoup moins chers.
Les basics sont proches, à part quelques commandes spécifiques.
Tu peux éditer ton programme picbasic, il n'y a aucun souci pour le convertir.
Jette un œil sur ce site, il y a peut être une application picaxe proche de ton programme.
Je suppose que l'afficheur I2C serait un TM1637...

Ne pas tenir compte des alarmes de "sécurité" éventuelles
MM
 
Ce programme est un timer qui decompte un temps ajustable . il etait affiché sur un display SGN4 de comfile ( vendu par lextronic )
Lextronic ne veut plus livrer à l'exporation ( meme en Belgique ) . Donc je ne sais plus avoir de display. Je voulais donc changer mais le picbasic n'accepte pas les nouveaux displays Afficheur I2C 4 digits rouges ADA1270.
le fonctionnement est le suivant :
a la mise sous tension (12v) on mesure l'etat de la batterie. si trop faible j ai message "low bat" qui s'affiche qq seconde puis le systeme affiche le temps (qui a ete mis en memoire ) a decompter. lorsque le sw decompte est activé une led rouge s'allume et le display decompte. arrivé a "0000" une led verte s'allume qq seconde puis s'eteint de même que le display.Si j'actionne de nouveau le sw decompte le cycle recommence.
La selection du temps se fait par 2 SW un incremente et l'autre décremente pour obtenir la valeur si j appuye en meme temps sur les deux sw je met en memoire le temps affiché afin d'etre utilisé ulterieurement.

j aurais aussi aimé avec la nouvelle version du programme avoir deux displays au lieu d'un et allumer une led lorsqu'il ne reste que exemple 5 sec ( ajustable) .
le temps afficher est en minute et seconde .
Avec les picbasics j 'avais une erreur ( normale ) de 3/10 de seconde .Ce n'etait pas important
Maintenant si avec picaxe la precision est meilleur c'est un +.


autre chose :
le programme de commande moteur ne fonctionne pas encore comme je souhaite:

je rappele le fonctionnement:
si entrée C3 est ON la sortie C1 est ON
si C3 est OFF la sortie C1 reste ON jusqu'a ce que l'entree C4 soit niveau 0
pour info tant que le moteur tourne la sortie C4 est a un niveau 1
merci pour votre aide.
Cela m'aide a comprendre les picaxes
 
Ce programme est un timer qui decompte un temps ajustable . il etait affiché sur un display SGN4 de comfile ( vendu par lextronic )
Lextronic ne veut plus livrer à l'exporation ( meme en Belgique ) . Donc je ne sais plus avoir de display. Je voulais donc changer mais le picbasic n'accepte pas les nouveaux displays Afficheur I2C 4 digits rouges ADA1270.
le fonctionnement est le suivant :
a la mise sous tension (12v) on mesure l'etat de la batterie. si trop faible j ai message "low bat" qui s'affiche qq seconde puis le systeme affiche le temps (qui a ete mis en memoire ) a decompter. lorsque le sw decompte est activé une led rouge s'allume et le display decompte. arrivé a "0000" une led verte s'allume qq seconde puis s'eteint de même que le display.Si j'actionne de nouveau le sw decompte le cycle recommence.
La selection du temps se fait par 2 SW un incremente et l'autre décremente pour obtenir la valeur si j appuye en meme temps sur les deux sw je met en memoire le temps affiché afin d'etre utilisé ulterieurement.

j aurais aussi aimé avec la nouvelle version du programme avoir deux displays au lieu d'un et allumer une led lorsqu'il ne reste que exemple 5 sec ( ajustable) .
le temps afficher est en minute et seconde .
Avec les picbasics j 'avais une erreur ( normale ) de 3/10 de seconde .Ce n'etait pas important
Maintenant si avec picaxe la precision est meilleur c'est un +.


autre chose :
le programme de commande moteur ne fonctionne pas encore comme je souhaite:

je rappele le fonctionnement:
si entrée C3 est ON la sortie C1 est ON
si C3 est OFF la sortie C1 reste ON jusqu'a ce que l'entree C4 soit niveau 0
pour info tant que le moteur tourne la sortie C4 est a un niveau 1
merci pour votre aide.
Cela m'aide a comprendre les picaxes
Jette un œil sur cette page de mon site, ça ressemble à ce que tu cherches.
Si la précision est importante, il faut savoir que les picaxe série M2 ont un timer interne d'une précision relative (sans quartz) qui peut être améliorée
 
Last edited:
CORRECTION : le programme switch on off fonctionne j ai compris mon erreur
juste oublié de mettre une resistance pour tiré le niveau
Si c'est un résistance pullup, on peut ajouter une pullup interne qui évite une R extérieure
MM
 
As tu lu la page du site sur le compteur - décompteur cité au dessus ?
Il n'y a pas la mesure de tension, mais est ce utile ? Le 08M2 et le TM1637 peuvent descendre en tension,
MM
 
Bonjour,
Je ne sais pas si il y aura une suite à cette discussion, mais voici quelques réflexions sur ce projet de compteur.
Il est inutile de traduire ligne par ligne le programme picbasic. Le programme picaxe proposé fait exactement la même chose, la principale différence porte sur la sélection du temps par poussoirs +/-, la solution par potar est beaucoup plus pratique et rapide (voir vidéo du site)
Les TM1637 chinois n'ont pas d'adressage . Il y a chez Gotronic des afficheurs TM167 avec un driver I2C adressable, mais ...indisponibles.
Pour un second afficheur, il faudra utiliser un 14M2, On trouve des TM1637 pour quelques euros:
MM
 
bonjour
désolé pour cette réponse tardive je vais voir comment je peux faire pour faire la conversion.....
Bonjour,
Tu feras comme tu veux....
Mais je répète que la conversion ligne à ligne n'est pas la solution. Il sera beaucoup plus rapide et sûr de repartir d'un cahier des charges, surtout si tu veux aussi modifier le programme.
Tu veux ajouter un afficheur, lequel ? Un autre 4 digits? Il y a aussi des LCD 1602 ou 2004 qui peuvent convenir.
L'afficheur SGN4 de comfile est au moins 4 fois plus cher qu'un TM1637, l'affichage est identique mais commande différente
Dis ce que tu veux changer par rapport au programme décompteur 08M2.
Bref, précise ta demande.
MM
 
Bonjour,
Je mets en clair ce CdC pour y réfléchir.
CAHIER DES CHARGES TIMER.
PICAXE 14M
AFFICHEUR : WPI425 (driver TM1637)
I2C4 (driver MAX7219) de GOTRONIC
Si possible : aƯichage sur WPI et I2C4 en même temps
Si pas possible : aƯichage simultané sur 2 WPI ou 2 I2C4
TIMER DECOMPTE LE TEMPS.
AFFICHAGE 0000 (seconde et 10é de secondes)
Exemple : 2 minutes et 30 secondes : 1500
LED ROUGE ON PENDANT DECOMPTE
LED ROUGE ON ET LED ORANGE ON 5 secs (réglable dans le programme) avant fin du
temps programmé
LED ROUGE et ORANGE OFF ET LED VERTE ON LORSQUE LE TEMPS EST ECOULE
LES DISPLAYS AFFICHENT 0000 a la fin du temps et la led verte reste allumée encore
pendant 10 secondes (réglable dans le programme) ensuite en réaƯiche le temps qui a
été mémorisé.
Puis le cycle peut recommencer
On essaye d’avoir la meilleur précision possible
REGLAGE :
2 BOUTONS POUSSOIRS POUR AJUSTER LE TEMPS (+ et -)
Mise en MÉMOIRE du temps en appuyant simultanément sur les 2 boutons.
Le temps réglé est mis en mémoire (même si coupure alimentation)
LED ROUGE et VERTE CLIGNOTE pour confirmer la mise en mémoire du temps
DECLENCHEMENT :
Le timer est démarré en appuyant sur un SW ou en activant une entrée avec un niveau 1

Ok, les drivers TM167 et MAX7219 sont deux drivers d'affichage totalement différents ...pourquoi ne pas choisir l'un ou l'autre? A quoi servent ces deux affichages ?.
Les picaxes série M2 ont un timer réduits à la commande spéciale TIME, avec une commande à la seconde prêt, Mais on ne peut pas afficher le 1/10 de seconde. On pourrait, entre deux secondes faire une boucle avec 10 pauses de 100ms. ou compter des pauses de 100ms. Je ne sais pas quelle précision cela donnerait.
Pour un vrai timer réglable au 1/10 de seconde, il faut passer à la série X2, avec un 20X2 par ex.
En résumé, as tu besoin d'un affichage au 1/10 de s ou d'une précision de 1/10. Je ne sais pas ce qui déclenche ce chrono, mais si c'est un appui manuel, le 1/10 de seconde et illusoire.
Le réglage par poussoirs n'est pas le plus pratique, un potentiomètre est beaucoup plus rapide (voir vidéo), mais si tu y tiens, pas de pb.
Dis ce que tu en penses,
L'affichage du décomptage au 1/10 est il nécessaire ?
MM
 
Bonjour,
Je mets en clair ce CdC pour y réfléchir.
CAHIER DES CHARGES TIMER.
PICAXE 14M
AFFICHEUR : WPI425 (driver TM1637)
I2C4 (driver MAX7219) de GOTRONIC
Si possible : aƯichage sur WPI et I2C4 en même temps
Si pas possible : aƯichage simultané sur 2 WPI ou 2 I2C4
TIMER DECOMPTE LE TEMPS.
AFFICHAGE 0000 (seconde et 10é de secondes)
Exemple : 2 minutes et 30 secondes : 1500
LED ROUGE ON PENDANT DECOMPTE
LED ROUGE ON ET LED ORANGE ON 5 secs (réglable dans le programme) avant fin du
temps programmé
LED ROUGE et ORANGE OFF ET LED VERTE ON LORSQUE LE TEMPS EST ECOULE
LES DISPLAYS AFFICHENT 0000 a la fin du temps et la led verte reste allumée encore
pendant 10 secondes (réglable dans le programme) ensuite en réaƯiche le temps qui a
été mémorisé.
Puis le cycle peut recommencer
On essaye d’avoir la meilleur précision possible
REGLAGE :
2 BOUTONS POUSSOIRS POUR AJUSTER LE TEMPS (+ et -)
Mise en MÉMOIRE du temps en appuyant simultanément sur les 2 boutons.
Le temps réglé est mis en mémoire (même si coupure alimentation)
LED ROUGE et VERTE CLIGNOTE pour confirmer la mise en mémoire du temps
DECLENCHEMENT :
Le timer est démarré en appuyant sur un SW ou en activant une entrée avec un niveau 1

Ok, les drivers TM167 et MAX7219 sont deux drivers d'affichage totalement différents ...pourquoi ne pas choisir l'un ou l'autre? A quoi servent ces deux affichages ?.
Les picaxes série M2 ont un timer réduits à la commande spéciale TIME, avec une commande à la seconde prêt, Mais on ne peut pas afficher le 1/10 de seconde. On pourrait, entre deux secondes faire une boucle avec 10 pauses de 100ms. ou compter des pauses de 100ms. Je ne sais pas quelle précision cela donnerait.
Pour un vrai timer réglable au 1/10 de seconde, il faut passer à la série X2, avec un 20X2 par ex.
En résumé, as tu besoin d'un affichage au 1/10 de s ou d'une précision de 1/10. Je ne sais pas ce qui déclenche ce chrono, mais si c'est un appui manuel, le 1/10 de seconde et illusoire.
Le réglage par poussoirs n'est pas le plus pratique, un potentiomètre est beaucoup plus rapide (voir vidéo), mais si tu y tiens, pas de pb.
Dis ce que tu en penses,
L'affichage du décomptage au 1/10 est il nécessaire ?
MM
On peut partir sur des afficheurs WP1425 ( driver TM1637 )
Pour la precision on peut utiliser un 20X2 pas de probleme.
L'affichage au dixiemme est necessaire.
Il faut le reglage par bouton poussoire.
Le déclenchement du décompte se fait par un bouton poussoir ( moins precis ) ou une cellule de detection de passage ( tres precise ) et plus tard ....par une detection GPS
l'idée des versions afficheurs differentes est juste pour une question de visibilité.
Le premier est vu a une distance de +- 80 cm tandisque l'autre a 2m
 
Le WP425 est un produit Welleman qui est....belge. Donc, il doit être dispo en Belgique sans passer par GoTronic:
Mais, c'est aussi un produit chinois:
Les dimensions sont évidemment les mêmes.

Comment se fait l'affichage ?
AFFICHAGE 0000 (seconde et 10é de secondes)
Exemple : 2 minutes et 30 secondes : 1500
On fait quoi avec les poussoirs. on appuie 1500 fois ? Ou on affiche en minutes et secondes et on convertit ? Mais la résolution de 1/10 de s disparait...C'est un réglage en mn et s en réalité, et un affichage en 1/10 s.....
Si tu veux un affichage plus grand, je t'invite à lire cette discussion: https://www.picaxeforum.co.uk/threads/chrono-agility.25290/
http://electromag1.wifeo.com/chrono-agility.php ....Je rigole
MM
 
Last edited:
Bonjour, pour moi la programmation picaxe c est nouveau.Pour l instant je me suis contenté de faire des petits programmes simple pour comprendre le fonctionement. Le but de passer en picaxe c est pour remplacer mes boitiers de chronometrage realisé avec PICBASIC et afficheurs serie de chez COMFILE ( lextronic ) puisque celui ci ne veut plus en vendre en Belgique et passer a une technologie plus recente.
Pour programmer mes picaxe j'utilise le programme PICAXE EDITOR6.
Pour depanner mes boitiers j ai encore qq picbasic en stock mais plus de display et c est la le probleme qui me pousse a changer de systeme.
Pour le reglage du temps a decompter on garde le SW de reglage ON jusqu'a la bonne valeur.
 
Pour le reglage du temps a decompter on garde le SW de reglage ON jusqu'a la bonne valeur.
Bonjour,
Ok, je vais voir comment ajouter le défilement au programme que j'ai commencé. Je persiste à penser que le réglage par potar est beaucoup simple et rapide...Tant pis...
Autre chose, si tu règles le temps en mn et s, la résolution est la seconde. On en gagne pas en précision en voyant défiler des 1/10 de s. Le compteur s'arrête à 0s, de la même façon.
C'est pour chronométrer quoi ?
Je ne vois pas pourquoi le picbasic 3b ne pourrait pas piloter un TM1637. Il faudrait se replonger dans le picbasic.... c'est loin.
Je me posais la question du cordon de programmation, sans doute un AXE027, avec un jack.
A la semaine prochaine...😉
MM
PS:
J'ai regardé la vidéo ...et j'ai rien compris. On compte au début et on décompte à la fin ??
L'introduction de la valeur se fait bien en mn et s ? ou non ?
Quelle est la procédure pour introduire la valeur ? A la fin, on appuie sur + et - ensemble, ok, mais au début ? Idem?
MM
 
Last edited:
quelques image s du montage
Pour incrementé le temps on pousse sur SW + et inversement pour reduire ...jussqu'a la bonne valeur.
On mets en memoire avec le SW MEMOIRE.
Le decompte est declenché par un SW et une cellule.
il y a deux displays un pour le mecano et un pour le pilote
On chronometre un temps d'arret obligatoire.
Le premier module que j avais monté date de 2015.
 

Attachments

Bonjour,
Les photos sont belles, mais ça n'aide pas à savoir à quoi ça sert.
Il y a donc finalement trois poussoirs : plus, moins, mémoire.
Le décompte est déclenché par un SW et une cellule ....elle est où la cellule. Il est où le SW ?
On chronomètre un temps d'arrêt obligatoire ....Ahhhhh .
Reprenons...
La sélection de cette tempo se fait par deux poussoirs, avec défilement, (pas pratique, réfléchit au potar), validé par le poussoir mémoire. En minutes et secondes, mais le décompte se fait en secondes et dixièmes. Je comprends que c'est pour voir arriver le 0, mais en fait, si c'est pour le départ, il vaudrait mieux éteindre des leds les 5 dernières secondes (comme en F1)
J'ai déjà fait un truc du même genre pour un stop and go de mini Z:
http://electromag1.wifeo.com/stop-and-go-pour-piste-mini-z.php
A suivre
MM
 
Last edited:
Voici du grain à moudre avec un premier jet de code.
Je n'ai pas d'afficheur sous la main et je n'ai testé qu'au simu. Le test réel réservera des surprises...
La tension bat n'est pas traitée
Le choix de la tempo se fait par le troisième poussoir MEM. Le déroulement rapide avec maintien du poussoir est difficilement compatible avec la mémorisation par appui sur les deux poussoirs +/- en même temps . Et à quoi servirait ce poussoir MEM ?

Code:
; décompteur 1/10s  MM 240526
; réglage par poussoirs +/-
;pour temps=9990 10ème s => tmax=16 mn 39s
;intro temps en mn et s
#picaxe 20X2
setfreq M16
symbol flag=bit0
symbol dio=C.1
symbol clk=C.2
symbol memo=pinC.4
symbol plus1=pinC.5
symbol moin1=pinC.6
symbol topdep=pinC.7
symbol orange=B.0
symbol rouge=B.1
symbol verte=B.2
symbol minut=b1
symbol second=b2
symbol nombre=b3
symbol digit=b4
symbol octet=b5
symbol j=b6        ;position point décimal
symbol i=b7        ;compteur
symbol chiffre=b8
symbol dp=b9
symbol point=b10
symbol div=w13
symbol adrdep=w12
dp=$80

Pullup %1110000000000000        ;pullup sur C;5,C.6,C.7
    do        ;boucle principale
        read 0,minut,second        ;lecture temps en EEPROM
        ;gosub affich                ;affichage temps
        if memo=0 then
            gosub introtemp            ;si plus1 et moins appuyés
        endif
        gosub decompte
    loop

decompte:
    point=3        ;point décimal à droite
    settimer 59385        ;1/10 s à 16MHs
    nombre= 60*minut + second
    gosub affich
    do loop while topdep=1    ;attente top
    do
        nombre=nombre-timer
        if timer < 50 and flag=0 then        ;5 secondes avant la fin
            high orange
            flag=1
        endif
        ;gosub affich
    loop while nombre >0
        high rouge        ;on est à 0
        high verte
    settimer t1s_16
    do loop while timer <= 10
    reset        ;RAZ

introtemp:                    ;sub intro nouveau temps
;********** intro minutes ******* 
    settimer t1s_16            ;1s à 16MHs 
    div=10    ;pour affichage 2 chiffres
    point=2    ;point décimal au centre
    do                 
        timer=0            ;code plus
        if plus1=0 then         
            minut    =minut+1 max 16                     
            if timer>1 then
                do
                    minut=minut+1
                    pause 2000        ;500ms à 16MHz
                loop while plus1=0                         
            endif
            nombre=minut
            digit=1        ;départ sur digit1 
            ;gosub affich         
        endif 
        timer=0            ;code moins
        if moin1=0 then         
            minut    =minut-1 min 0                 
            if timer>1 then
                do
                    minut=minut-1
                    pause 2000        ;500ms à 16MHz
                loop while moin1=0                         
            endif
            nombre=minut
            digit=1        ;départ sur digit1 
            ;gosub affich         
        endif         
        if memo=0 then exit
    loop     
;******** intro secondes    **************
    do loop while memo=0        ;attente relachement
    div=1000
    do                 
        timer=0        ;code plus
        if plus1=0 then         
            second=second+1 max 16                     
            if timer>1 then
                do
                    second=second+1
                    pause 2000        ;500ms à 16MHz
                loop while plus1=0                         
            endif
            nombre=second
            digit=1        ;départ sur digit1 
            ;gosub affich         
        endif     
        timer=0
        if moin1=0 then         
            second    =second-1 min 0                 
            if timer>1 then
                do
                    second=second-1
                    pause 2000        ;500ms à 16MHz
                loop while moin1=0                         
            endif
            nombre=second
            digit=1        ;départ sur digit1 
            ;gosub affich         
        endif         
        If memo =0 then exit
    loop 
    write 0,minut,second        ;mise en mémoire EEPROM
    do loop while memo=0
    return

affich:
    high clk : high dio : low dio        ;bal start
    Octet=adrdep        ;synchro adresse départ
    gosub EnvoiOctet
    for j=1 to 4
        Chiffre=Nombre/Div
        gosub DecTo7seg
        if j=point then
            octet=octet | dp    ;ajout points centraux
        endif
        gosub EnvoiOctet
        Nombre=Nombre//Div
        Div=Div/10
    next j
    low clk: low dio: high clk: high dio        ;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
        low clk
        if bit0=1 then high dio else low dio endif    ;positionnement DIO 
        Octet = Octet/2        ;effacement du bit lu, bit1 devient bit0
        high clk
     next i
    low clk :high clk: low clk    ; 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

Il faudrait choisir un afficheur TM1637 avec points décimaux et non horaire ( : au centre)
Je ne vois plus de MAX 7219 4 digits, les autres ont la même taille de digits que les,TM

MM

A suivre..
MM
 
Last edited:
Voici du grain à moudre avec un premier jet de code.
Je n'ai pas d'afficheur sous la main et je n'ai testé qu'au simu. Le test réel réservera des surprises...
La tension bat n'est pas traitée
Le choix de la tempo se fait par le troisième poussoir MEM. Le déroulement rapide avec maintien du poussoir est difficilement compatible avec la mémorisation par appui sur les deux poussoirs +/- en même temps . Et à quoi servirait ce poussoir MEM ?

Code:
; décompteur 1/10s  MM 240526
; réglage par poussoirs +/-
;pour temps=9990 10ème s => tmax=16 mn 39s
;intro temps en mn et s
#picaxe 20X2
setfreq M16
symbol flag=bit0
symbol dio=C.1
symbol clk=C.2
symbol memo=pinC.4
symbol plus1=pinC.5
symbol moin1=pinC.6
symbol topdep=pinC.7
symbol orange=B.0
symbol rouge=B.1
symbol verte=B.2
symbol minut=b1
symbol second=b2
symbol nombre=b3
symbol digit=b4
symbol octet=b5
symbol j=b6        ;position point décimal
symbol i=b7        ;compteur
symbol chiffre=b8
symbol dp=b9
symbol point=b10
symbol div=w13
symbol adrdep=w12
dp=$80

Pullup %1110000000000000        ;pullup sur C;5,C.6,C.7
    do        ;boucle principale
        read 0,minut,second        ;lecture temps en EEPROM
        ;gosub affich                ;affichage temps
        if memo=0 then
            gosub introtemp            ;si plus1 et moins appuyés
        endif
        gosub decompte
    loop

decompte:
    point=3        ;point décimal à droite
    settimer 59385        ;1/10 s à 16MHs
    nombre= 60*minut + second
    gosub affich
    do loop while topdep=1    ;attente top
    do
        nombre=nombre-timer
        if timer < 50 and flag=0 then        ;5 secondes avant la fin
            high orange
            flag=1
        endif
        ;gosub affich
    loop while nombre >0
        high rouge        ;on est à 0
        high verte
    settimer t1s_16
    do loop while timer <= 10
    reset        ;RAZ

introtemp:                    ;sub intro nouveau temps
;********** intro minutes *******
    settimer t1s_16            ;1s à 16MHs
    div=10    ;pour affichage 2 chiffres
    point=2    ;point décimal au centre
    do                
        timer=0            ;code plus
        if plus1=0 then        
            minut    =minut+1 max 16                    
            if timer>1 then
                do
                    minut=minut+1
                    pause 2000        ;500ms à 16MHz
                loop while plus1=0                        
            endif
            nombre=minut
            digit=1        ;départ sur digit1
            ;gosub affich        
        endif
        timer=0            ;code moins
        if moin1=0 then        
            minut    =minut-1 min 0                
            if timer>1 then
                do
                    minut=minut-1
                    pause 2000        ;500ms à 16MHz
                loop while moin1=0                        
            endif
            nombre=minut
            digit=1        ;départ sur digit1
            ;gosub affich        
        endif        
        if memo=0 then exit
    loop    
;******** intro secondes    **************
    do loop while memo=0        ;attente relachement
    div=1000
    do                
        timer=0        ;code plus
        if plus1=0 then        
            second=second+1 max 16                    
            if timer>1 then
                do
                    second=second+1
                    pause 2000        ;500ms à 16MHz
                loop while plus1=0                        
            endif
            nombre=second
            digit=1        ;départ sur digit1
            ;gosub affich        
        endif    
        timer=0
        if moin1=0 then        
            second    =second-1 min 0                
            if timer>1 then
                do
                    second=second-1
                    pause 2000        ;500ms à 16MHz
                loop while moin1=0                        
            endif
            nombre=second
            digit=1        ;départ sur digit1
            ;gosub affich        
        endif        
        If memo =0 then exit
    loop
    write 0,minut,second        ;mise en mémoire EEPROM
    do loop while memo=0
    return

affich:
    high clk : high dio : low dio        ;bal start
    Octet=adrdep        ;synchro adresse départ
    gosub EnvoiOctet
    for j=1 to 4
        Chiffre=Nombre/Div
        gosub DecTo7seg
        if j=point then
            octet=octet | dp    ;ajout points centraux
        endif
        gosub EnvoiOctet
        Nombre=Nombre//Div
        Div=Div/10
    next j
    low clk: low dio: high clk: high dio        ;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
        low clk
        if bit0=1 then high dio else low dio endif    ;positionnement DIO
        Octet = Octet/2        ;effacement du bit lu, bit1 devient bit0
        high clk
     next i
    low clk :high clk: low clk    ; 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

Il faudrait choisir un afficheur TM1637 avec points décimaux et non horaire ( : au centre)
Je ne vois plus de MAX 7219 4 digits, les autres ont la même taille de digits que les,TM

MM

A suivre..
MM
Bonjour
je vais dés que possible essayer ce premier jet. On part bien sur un picaxe 20X2 ?
J'en commande chez gotronic aujourdhui et un display .
Pour le reglage du temps ce n'est vraiment pas possible par potentiometre.
La mise en memoire se fait bien par le SW "MEM" c 'est parfait.
Plus besoin de la verification de la tension batterie
Merci et bonne journée
 
Bonjour
je vais dés que possible essayer ce premier jet. On part bien sur un picaxe 20X2 ? ( OK J ai vu la ligne qui indique le modele )
J'en commande chez gotronic aujourdhui et un display .
Pour le reglage du temps ce n'est vraiment pas possible par potentiometre.
La mise en memoire se fait bien par le SW "MEM" c 'est parfait.
Plus besoin de la verification de la tension batterie
Merci et bonne journée
 
Suite:
J'ai relu, il manque les affichages, ceux qui sont en commentaires, mais aussi dans les boucles de défilement poussoir.
C'est pour un 20X2 pour l'affichage des 1/10 de s, mais j'aimerais savoir à quoi ça sert, je répète que le 0 arrivera au même instant dans tous les cas, /10 ou seconde entière. Je ne pense pas que tu puisses lire les 1/10 de s pendant qu'ils défilent. Mais bon...
Je ne vois pas de TM1637 à points décimaux chez Gotro, il y a un autre modèle avec interface I2C réel ...non dispo .
Chez Ali:

Couleur au choix
Une autre solution: acheter des afficheurs plus grands et ajouter un driver TM1637 ou MAX7219 le tout sur une carte JLCPCB.
MM
 
Last edited:
Bonjour,
Nouveau code avec quelques modifs et quelques erreurs corrigées....Il doit en rester
Les I/O seront à redistribuer suivant facilités PCB
Toujours pas testé...
Code:
; chronomètre 1/10s  MM 010626
; réglage par poussoirs +/-
;pour temps=9990 10ème s => tmax=16 mn 39s
;intro temps en mn et s
;les poussoirs sont sur le 0V, pullup internes
#picaxe 20X2
setfreq M16
symbol flag=bit0
symbol dio=C.1        ;sur TM1637
symbol clk=C.2        ;idem
symbol memo=pinC.4        ;poussoir MEM
symbol plus1=pinC.5
symbol moin1=pinC.6
symbol topdep=pinC.7
symbol orange=B.0
symbol rouge=B.1
symbol verte=B.2
symbol minut=b1
symbol second=b2
symbol nombre=b3
symbol digit=b4
symbol octet=b5
symbol j=b6        ;position point décimal
symbol i=b7        ;compteur
symbol chiffre=b8
symbol dp=b9
symbol point=b10
symbol div=w13
symbol adrdep=w12
dp=$80

Pullup %1111000000000000        ;pullup sur C.4 ,C.5,C.6,C.7
    do        ;boucle principale
        read 0,minut,second        ;lecture temps en EEPROM
        gosub affich                ;affichage temps
        if memo=0 then
            gosub introtemp            ;si plus1 et moins appuyés
        endif
        gosub decompte
    loop

decompte:
    point=3        ;point décimal à droite
    settimer 59385        ;1/10 s à 16MHs
    nombre= 60*minut + second
    gosub affich
    do loop while topdep=1    ;attente top
    do
        nombre=nombre-timer
        if timer < 50 and flag=0 then        ;5 secondes avant la fin
            high orange
            flag=1
        endif
        gosub affich
    loop while nombre >0
        high rouge        ;on est à 0
        high verte
    settimer t1s_16
    do loop while timer <= 10
    reset        ;RAZ

introtemp:                    ;sub intro nouveau temps
;********** intro minutes *******  
    do loop while memo=0
    settimer t1s_16            ;1s à 16MHs      
    point=2    ;point décimal au centre
    do                  
        timer=0            ;code plus
        if plus1=0 then          
            minut    =minut+1 max 16                      
            if timer>1 then
                do
                    minut=minut+1
                    pause 2000        ;500ms à 16MHz
                    nombre=minute *100    ;
                    gosub affich    ;affichage nombre
                loop while plus1=0    ;on boucle si appuié                          
            endif
            nombre=minut
            digit=1        ;départ sur digit n°1  
            gosub affich          
        endif  

        timer=0            ;code moins
        if moin1=0 then          
            minut    =minut-1 min 0                  
            if timer>1 then
                do
                    minut=minut-1
                    pause 2000        ;500ms à 16MHz
                    nombre=minute*100
                    gosub affich
                loop while moin1=0                          
            endif
            nombre=minut
            digit=1        ;départ sur digit1  
            gosub affich          
        endif          
        if memo=0 then exit
    loop      
;******** intro secondes    **************
    do loop while memo=0        ;attente relachement
    do                  
        timer=0        ;code plus
        if plus1=0 then          
            second=second+1 max 16                      
            if timer>1 then
                do
                    second=second+1
                    pause 2000        ;500ms à 16MHz
                    nombre=minute *100 + seconde    ;on réécrit le total
                    gosub affich        ;;on réécrit le total sur 4 digits
                loop while plus1=0                          
            endif
            nombre=minute *100 + second
            digit=1        ;départ sur digit1  
            gosub affich          
        endif      
        timer=0
        if moin1=0 then          
            second    =second-1 min 0                  
            if timer>1 then
                do
                    second=second-1
                    pause 2000        ;500ms à 16MHz
                    nombre=minute *100 + seconde
                    gosub affich
                loop while moin1=0                          
            endif
            nombre=minute *100 + second
            digit=1        ;départ sur digit1  
            gosub affich          
        endif          
        If memo =0 then exit
    loop  
    write 0,minut,second        ;mise en mémoire EEPROM
    do loop while memo=0
    return

affich:
    div=1000
    high clk : high dio : low dio        ;bal start
    Octet=adrdep        ;synchro adresse départ
    gosub EnvoiOctet
    for j=1 to 4
        Chiffre=Nombre/Div
        gosub DecTo7seg
        if j=point then
            octet=octet | dp    ;ajout points centraux
        endif
        gosub EnvoiOctet
        Nombre=Nombre//Div
        Div=Div/10
    next j
    low clk: low dio: high clk: high dio        ;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
        low clk
        if bit0=1 then high dio else low dio endif    ;positionnement DIO  
        Octet = Octet/2        ;effacement du bit lu, bit1 devient bit0
        high clk
     next i
    low clk :high clk: low clk    ; 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

MM
 
Last edited:
Bonjour,
Pour info, j'ai fait un premier essai et......rien ne fonctionne....c'est normal
Pas la peine d'essayer ce qui procède.
MM
 
Bonjour
je n'ai pas encore reçu mes picaxes 20 . J ai par contre les dipslays et c'est vrai qu'ils sont petits. Dans une voiture ça sera assez difficile de voir.
Pour le défilement des 1/10 c est nécessaire d'afficher un mouvement sur le display et avec l'habitude on peut interpreter ( sans toute fois de la précision ) ce qui defile.Le module sert a décompter un temps d'arrêt obligatoire.
Quel est la taille de fichier maximum que l'on peut attacher? Je pourrais t'envoyer une petite vidéo pour mieux comprendre le fonctionnement de l ancien système a picbasic.
Bonne journée
picaxe devrait arriver vendredi
 
Bonjour,
C'est trop compliqué, s’inscrire, etc pas grave, le CDC est suffisant.
Je vais faire aussi une vidéo sur Youtube, tu diras si il faut changer quelque chose.
Je persiste à penser que le défilement ds 1/10 ne sert à rien, 5 leds qui s'éteignent dans les 5 dernière secondes seraient beaucoup plus pratiques pour se préparer à repartir le + rapidement possible, je ne vois pas ce qu'apportent des chiffres illisibles.
Le TM1637 que j'ai est blanc, très lumineux et très visible, tu verras la vidéo.
Mais à la limite, tu peux acheter des afficheurs de la taille de ton choix (anode commune) et les driver avec un CI TM1637 ou MAX7219
Sur un 20X2, la taille max est 4096 octets (2048 pour un 20M2). Le fichier du compteur fera dans les 500 octets. Le plus volumineux est l'intro du temps, avec minutes, secondes , +,-, et défilement.
A suivre
 
Voici la vidéo :
https://youtu.be/fQf71sz36Ps

Je pense que c'est assez conforme au DCD. L’afficheur ébloui la caméra, il est au max de luminosité, on peut réduire
Les 3 poussoirs sont mem, plus, moins et start.
On en peut pas arrêter le décomptage, on peut l'ajouter en rappuyant sur mem ou start.
J'ai remarqué sur la vidéo que le défilement des secondes était plus lent que celui des minutes...c'est corrigé.
Alors ?
Le code suit
MM
 
Je persiste et signe .......il faut l affichage des 1/10 si tu pouvais visualiser la vidéo...tu verrais le defilement.
L'ancien module avec les picbasic fonctionnent comme cela ....avec affichage des 1/10 et c est visible.
peut etre que sur un dispaly de 10mm ça se voit pas mais sur un 20 mm oui et j en suis CERTAIN
 
Ok, tu as sans doute raison, c'est toi qui t'en sert.
J'ai regardé la vidéo, le TM est plus petit, mais lisible, j'essaierai de faire une vidéo de jour. Sinon, il faut le fabriqué, je ne vois plus cet afficheur dispo.
Le code:
Code:
; chronomètre 1/10s  MM 030626
; réglage par poussoirs +/-
;pour temps=9990 10ème s => tmax=16 mn 39s
;intro temps en mn et s
;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
#picaxe 20X2
setfreq M16
symbol dio=C.1        ;sur TM1637
symbol clk=C.2        ;idem
symbol mem=pinC.0        ;poussoir MEM
symbol plus1=pinC.6
symbol moin1=pinC.7
symbol topdep=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 utulisé
symbol minut=b1
symbol second=b2
;symbol digit=b4
symbol j=b6        ;position point décimal
symbol i=b7        ;compteur
symbol chiffre=b8
symbol dp=b9
symbol point=b10
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

    ;    ***** init TM1637
    high clk : high dio : low dio        ;bal start
    Octet=RegLum        ;Réglage luminosité    
    gosub EnvoiOctet
    low clk: low dio: high clk: high dio        ;bal stop
    low rouge,verte,orange
   read 0,minut,second        ;lecture temps en EEPROM
    if minut=0 and second=0 then    ;la mémoire est vide
        point=2
        minut=8
        second=29        
        gosub  introtemp
    endif
    nombre=minut * 100 + second
    div=1000 : gosub affich    

;********decompte ******* 
    do 
       do        ;****** boucle attente départ ou intro temps  ******
            if mem=0 then gosub introtemp
            point=3
           nombre=minut*60+second *10        ;temps en 1/10 de s
           div= 1000 :gosub affich
       loop while topdep=1    ;attente top
         settimer 59385        ;1/10 s à 16MHs  
        timer=0    
        Ttot=nombre
        high rouge
        do        
            nombre=Ttot -timer            
            if nombre < 50  then        ;5 secondes avant la fin
               high orange           
            endif                
            div=1000 :gosub affich        
        loop while nombre<>0       
        high verte:low orange,rouge 
        timer=0   
        do loop while timer <= 100
        low rouge,verte,orange
        nombre=60*minut+ second *10
        div=1000: gosub affich
    loop  

introtemp:       ;sub intro nouveau temps
;********** intro minutes *******     
    do loop while mem=0
    settimer t1s_16            ;1s à 16MHs      
    point=2    ;point décimal au centre
    do           
            nombre=minut
            div=10:gosub affich      
    ;code plus
            timer=0
        if plus1=0 then 
                minut =minut+1 max 16                  
                do while plus1=0
                    if timer >1 then                        
                        minut =minut+1 max 16
                        nombre=minut   
                          div=10:gosub affich    
                        pause 500
                     endif      
                loop                            
                nombre=minut   
                  div=10 :gosub affich                       
        endif 
     ; code moins            
        if moin1=0 then 
                minut =minut-1 min 0                 
                do while moin1=0
                    if timer >1 then                        
                        dec minut
                        if minut > 16 then: minut=0 : endif    
                        nombre=minut   
                          div=10:gosub affich    
                        pause 500
                     endif      
                loop                            
                nombre=minut   
                  div=10 :gosub affich                       
        endif  
        if mem=0 then exit
    loop   
;******** intro secondes    **************
    do loop while mem=0
    high orange:pause 500:low orange    
   do           
            nombre=minut*100 +second
            div=1000 :gosub affich      
    ;code plus
            timer=0
        if plus1=0 then 
                second =second+1 max 59                 
                do while plus1=0
                    if timer >1 then                        
                        second =second+1 max 59
                        nombre=minut*100 +second   
                          div=1000:gosub affich    
                        pause 500
                     endif      
                loop                            
                nombre=minut*100+ second  
                  div=1000 :gosub affich                       
        endif 
     ; code moins            
        if moin1=0 then 
                second =second-1 min 0                 
                do while moin1=0
                    if timer >1 then                        
                        second =second-1
                        if second>59 then: second=0 :endif
                        nombre=minut*100+ second  
                          div=1000:gosub affich    
                        pause 500
                     endif      
                loop                            
                nombre=minut*100 +second    
                  div=1000 :gosub affich                       
        endif  
        if mem=0 then exit
    loop 
    do loop while mem=0            
    write  0,minut,second    ;mise en EEPROM
    high orange, rouge :pause 500:low orange, rouge:pause 500
    high orange, rouge :pause 500:low orange, rouge:pause 500
    return
affich:   
    high clk : high dio : low dio        ;bal start
    Octet=adrdep        ;synchro adresse départ
    gosub EnvoiOctet
    Nbre=Nombre
    for j=1 to 4
        Chiffre=Nbre/Div
        gosub DecTo7seg
        if j=point then    ;choix affichage point
            octet=octet | dp    ;ajout points centraux
        endif
        gosub EnvoiOctet
        Nbre=Nbre//Div
        Div=Div/10
    next j
    low clk: low dio: high clk: high dio        ;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
        low clk
        if bit0=1 then high dio else low dio endif    ;positionnement DIO  
        Octet = Octet/2        ;effacement du bit lu, bit1 devient bit0
        high clk
     next i
    low clk :high clk: low clk    ; 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
MM
 
Le défilement sur ta vidéo est plus rapide, le même code sans les pauses:
Code:
; chronomètre 1/10s  MM 030626
; réglage par poussoirs +/-
;pour temps=9990 10ème s => tmax=16 mn 39s
;intro temps en mn et s
;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
#picaxe 20X2
setfreq M16
symbol dio=C.1        ;sur TM1637
symbol clk=C.2        ;idem
symbol mem=pinC.0        ;poussoir MEM
symbol plus1=pinC.6
symbol moin1=pinC.7
symbol topdep=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 utulisé
symbol minut=b1
symbol second=b2
;symbol digit=b4
symbol j=b6        ;position point décimal
symbol i=b7        ;compteur
symbol chiffre=b8
symbol dp=b9
symbol point=b10
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

    ;    ***** init TM1637
    high clk : high dio : low dio        ;bal start
    Octet=RegLum        ;Réglage luminosité   
    gosub EnvoiOctet
    low clk: low dio: high clk: high dio        ;bal stop
    low rouge,verte,orange
   read 0,minut,second        ;lecture temps en EEPROM
    if minut=0 and second=0 then    ;la mémoire est vide
        point=2
        minut=8
        second=29       
        gosub  introtemp
    endif
    nombre=minut * 100 + second
    div=1000 : gosub affich   

;********decompte *******
    do
       do        ;****** boucle attente départ ou intro temps  ******
            if mem=0 then gosub introtemp
            point=3
           nombre=minut*60+second *10        ;temps en 1/10 de s
           div= 1000 :gosub affich
       loop while topdep=1    ;attente top
         settimer 59385        ;1/10 s à 16MHs 
        timer=0   
        Ttot=nombre
        high rouge
        do       
            nombre=Ttot -timer           
            if nombre < 50  then        ;5 secondes avant la fin
               high orange          
            endif               
            div=1000 :gosub affich       
        loop while nombre<>0      
        high verte:low orange,rouge
        timer=0  
        do loop while timer <= 100
        low rouge,verte,orange
        nombre=60*minut+ second *10
        div=1000: gosub affich
    loop 

introtemp:       ;sub intro nouveau temps
;********** intro minutes *******    
    do loop while mem=0
    settimer t1s_16            ;1s à 16MHs     
    point=2    ;point décimal au centre
    do          
            nombre=minut
            div=10:gosub affich     
    ;code plus
            timer=0
        if plus1=0 then
                minut =minut+1 max 16                 
                do while plus1=0
                    if timer >1 then                       
                        minut =minut+1 max 16
                        nombre=minut  
                          div=10:gosub affich   
                        ;pause 300
                     endif     
                loop                           
                nombre=minut  
                  div=10 :gosub affich                      
        endif
     ; code moins           
        if moin1=0 then
                minut =minut-1 min 0                
                do while moin1=0
                    if timer >1 then                       
                        dec minut
                        if minut > 16 then: minut=0 : endif   
                        nombre=minut  
                          div=10:gosub affich   
                        ;pause 300
                     endif     
                loop                           
                nombre=minut  
                  div=10 :gosub affich                      
        endif 
        if mem=0 then exit
    loop  
;******** intro secondes    **************
    do loop while mem=0
    high orange:pause 500:low orange   
   do          
            nombre=minut*100 +second
            div=1000 :gosub affich     
    ;code plus
            timer=0
        if plus1=0 then
                second =second+1 max 59                
                do while plus1=0
                    if timer >1 then                       
                        second =second+1 max 59
                        nombre=minut*100 +second  
                          div=1000:gosub affich   
                        ;pause 300
                     endif     
                loop                           
                nombre=minut*100+ second 
                  div=1000 :gosub affich                      
        endif
     ; code moins           
        if moin1=0 then
                second =second-1 min 0                
                do while moin1=0
                    if timer >1 then                       
                        second =second-1
                        if second>59 then: second=0 :endif
                        nombre=minut*100+ second 
                          div=1000:gosub affich   
                        ;pause 300
                     endif     
                loop                           
                nombre=minut*100 +second   
                  div=1000 :gosub affich                      
        endif 
        if mem=0 then exit
    loop
    do loop while mem=0           
    write  0,minut,second    ;mise en EEPROM
    high orange, rouge :pause 500:low orange, rouge:pause 500
    high orange, rouge :pause 500:low orange, rouge:pause 500
    return
affich:  
    high clk : high dio : low dio        ;bal start
    Octet=adrdep        ;synchro adresse départ
    gosub EnvoiOctet
    Nbre=Nombre
    for j=1 to 4
        Chiffre=Nbre/Div
        gosub DecTo7seg
        if j=point then    ;choix affichage point
            octet=octet | dp   
        endif
        gosub EnvoiOctet
        Nbre=Nbre//Div
        Div=Div/10
    next j
    low clk: low dio: high clk: high dio        ;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
        low clk
        if bit0=1 then high dio else low dio endif    ;positionnement DIO 
        Octet = Octet/2        ;effacement du bit lu, bit1 devient bit0
        high clk
     next i
    low clk :high clk: low clk    ; 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
Au choix
MM
 
Last edited:
Bonjour,
Dernière mouture simplifiée. Le réglage du temps se fait uniquement en secondes, résolution 1 seconde.
Le mode d'emploi est en commentaire dans le code.
La précision ne semble pas trop mauvaise, même si il n'y a qu' un résonateur et pas de quartz . Éventuellement ajustable par modification du preload timer . Le calcul donne 59285 (et non 59385 (n))
Tous les poussoirs sont au 0 v + R pullup internes (moins de câblage).
Pour deux afficheurs, il faut simplement les mettre en //


Code:
; chronomètre 1/10s  MM 050626
; réglage par poussoirs +/-
;pour temps=9990 10ème s => tmax=16 mn 39s
;intro temps en mn et s
;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:
;Le point décimal est sur le digit 4 => valeur en secondes
;Appui sur plus1:
;            appui court < 1s => incrémentation de 1
;            appui long  > 1s => défilement 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  t<5s => led orange allumée
;A  t=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
;Attente appui sur start
                    
#picaxe 20X2
setfreq M16
symbol dio=C.1        ;sur TM1637
symbol clk=C.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

;    ***** init TM1637
    high clk : high dio : low dio        ;bal start
    Octet=RegLum        ;Réglage luminosité
    gosub EnvoiOctet
    low clk: low dio: high clk: high dio        ;bal stop
    low rouge,verte,orange
    read 0,second        ;lecture temps en EEPROM
    if second=0 then    ;la mémoire est vide
        point=3   
        gosub  introtemp
    endif
    nombre=second* 10
    gosub affich

;********decompte *******
decompt:
    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
            point=3
            nombre=second *10        ;temps en 1/10 de s
            gosub affich
        loop while start=1    ;attente top
        settimer 59285  ;1/10 s à 16MHs  59285
        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 *10
        gosub affich
    loop

introtemp:       ;sub intro nouveau temps
;********** intro secondes *******
    do loop while mem=0
    settimer t1s_16            ;1s à 16MHs
    point=4
    do   
        nombre=second
        gosub affich
        ;***** code plus *****
        timer=0
        if plus1=0 then
            second =second+1 max 999         
            do while plus1=0
                if timer >1 then                
                    second =second+1 max 999
                    nombre=second
                    gosub affich               
                endif
            loop                    
            nombre=second
            gosub affich               
        endif
        ; code moins    
        if moin1=0 then
            second =second-1 min 0         
            do while moin1=0
                if timer >1 then                
                    second =second-1
                    if second>999 then: second=0 :endif
                    nombre=second
                    gosub affich                
                endif
            loop                    
            nombre=second
            gosub affich               
        endif
        if mem=0 then exit
    loop
    do loop while mem=0    
    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
    return

affich:
div=1000
  high clk : high dio : low dio        ;bal start
    Octet=adrdep        ;synchro adresse départ
    gosub EnvoiOctet
    Nbre=Nombre
    for j=1 to 4
        Chiffre=Nbre/Div
        gosub DecTo7seg
        if j=point then    ;choix affichage point
            octet=octet | dp    ;ajout points centraux
        endif
        gosub EnvoiOctet;
        Nbre=Nbre//Div
        Div=Div/10
    next j
    low clk: low dio: high clk: high dio        ;bal stop
    return
 rem
;******* 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
        low clk
        if bit0=1 then high dio else low dio endif    ;positionnement DIO
        Octet = Octet/2        ;effacement du bit lu, bit1 devient bit0
        high clk
     next i
    low clk :high clk: low clk    ; balise  ACK
    return
 ; endrem
;****** Conversion des chiffres en segments
DecTo7seg:
    lookup Chiffre,($3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7f,$6f), Octet ; 0-9 uniquement
    return

Y a plus qu'a tester...
MM
 
Last edited:
Bonjour,
Voici une nouvelle mise à jour suit, rien de nouveau sinon une mise en forme un peu plus "élégante" à mon goût.
Modif visible : le temps de passage en défilement est réduit de 1s à 500ms.
Le réglage du temps se fait en secondes entières et plus mn ,secondes, qui compliquait pour rien.

Code:
; chronomètre 1/10s  MM 100626
; réglage par poussoirs +/-
;pour temps=9990 10ème s => tmax=16 mn 39s
;intro temps en mn et s
;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:
;Le point décimal est sur le digit 4 => valeur en secondes
;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 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
        point=3     
        gosub  introtemp    ;entrer une valeur en mémoire EEPROM
    endif
    nombre=second* 10
    gosub affich

;********decompte *******
decompt:
    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
            point=3
            nombre=second *10        ;temps en 1/10 de s
            gosub affich
        loop while start=1    ;attente top
        settimer 59285  ;1/10 s à 16MHs  59285
        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 *10
        gosub affich
    loop


introtemp:       ;sub intro nouveau temps
;********** intro secondes *******
    do loop while mem=0 
    point=4        ;point décimal sur digit n°4
    do     
        nombre=second
        gosub affich
        ;***** code plus *****
        timer=0
        if plus1=0 then
            second =second+1 max 999           
            do while plus1=0
                if timer >5 then       ;500ms défilement accéléré              
                    second =second+1 max 999
                    nombre=second
                    gosub affich                 
                endif
            loop                      
            nombre=second
            gosub affich                 
        endif
        ; code moins      
        if moin1=0 then
            second =second-1 min 0           
            do while moin1=0
                if timer >5 then                  
                    second =second-1
                    if second>999 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
    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=point then    ;choix affichage point
            octet=octet | dp    ;ajout point décimal
        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

PS : Il est de coutume de se tutoyer sur les forums, mais ce n'est pas une obligation.
MM
 
Last edited:
Bonjour
j ai procédé aux premiers essais du programme.
J ai deux bugs de fonctionnement.
le premier :
lorsque l' on a mémorisé un temps il est impossible de le modifier avec les touches + ou -.
le deuxiemme :
l'incrementation du temps n'est pas correcte ou l'affichage n'est pas correcte :
si l'affichage indique par exemple 0010 ce n'est pas 10 secondes mais bien une minute qui sera memorisée
apres avoir poussé sur la touche mem on affiche alors 0100
Le reste a l'air de bien fonctionné.
tu as fais un superbe boulot merci
 
Bonjour
j ai procédé aux premiers essais du programme.
J ai deux bugs de fonctionnement.
le premier :
lorsque l' on a mémorisé un temps il est impossible de le modifier avec les touches + ou -.
le deuxiemme :
l'incrementation du temps n'est pas correcte ou l'affichage n'est pas correcte :
si l'affichage indique par exemple 0010 ce n'est pas 10 secondes mais bien une minute qui sera memorisée
apres avoir poussé sur la touche mem on affiche alors 0100
Le reste a l'air de bien fonctionné.
tu as fais un superbe boulot mercit
Bonjour
Lorsque l on a mémorisé un temps, le programme attend un appui sur star,
L affichage est 23.0 s. par ex. Pour modifier, appuyer sur MEM , l affichage passe a 22. En secondes, + /- pour modifier ex :25. Appui sur MEM passe a 25.0 et attend start,
Je ferai une vidéo on verra. ce qu'il faut modifier
Il faut un afficheur a point de décimal, par point horaire.
La position du . différentie les phases réglage et décompte
MM
 
Last edited:
Back
Top