Electromag1 Circuits électroniques et Picaxes

Petit site pour ceux qui bricolent en électronique en général et sur les PICAXES en particulier.
Les PICAXES sont des microprocesseurs (PIC de Microship) programmables en BASIC. Pleins de qualités, pas chers, ultra faciles à programmer.
Tout (ou presque) est sur le site du distributeur Gotronic (voir les liens).
Les pages  seront ajoutées ou modifiées petit à petit.
Dans le but d'améliorer ce blog, communiquez moi vos remarques et les erreurs que vous pouvez constater.
Pour me contacter: Envoyez un mail à l'adresse : mag1mic@free.fr .  Tout message reçoit une réponse
Pour retourner au menu, Cliquer sur "LISTE DES PAGES", ici ou en haut de la colonne de gauche
Pour laisser un message, allez dans le "LIVRE D'OR"
Bonne visite
 
 

CHRONOMÈTRE LONGUE DURÉE
de 0 à 99h:59mn

picaxe 08M2 et afficheur TM1637


Cette page est une réponse à une demande sur un forum d'électronique. Il s'agissait de fabriquer un chrono avec "de belles leds rouges bien voyantes". Voir ICI
Cette réponse se compose essentiellement de trois composants: un picaxe 08M2, un afficheur horaire basé sur un TM1637 et un poussoir.
L'alimentation peut être un de ces blocs secteur régulés 5 V qui remplissent maintenant nos tiroirs.

Le schéma:

 
Un minimum de composants, en considérant que si le µC n'est pas programmé sur site, les deux résistances sont supprimées et C.5 est relié au 0 V.
Le condensateur 100µF est déjà dans le bloc secteur, seul le 100nF près du µC est nécessaire.
Il reste deux broches libres, C.0 et C.4 pour des extensions.

Petite vidéo de démo:

 
Le code, une méthode parmi d'autres:
La gestion du TM1637 occupe le plus de place, voir les pages sur cet afficheur .
La boucle principale ne comprend que quelques lignes, une commande "select case" à deux états:
état 0, le chrono est en attente
état 1, le chono compte le temps sous la forme HH:MM
Les deux points centraux clignottent au rythme de la seconde et visualisent le fonctionnement du chronomètre.
Le changement d'état est obtenu sur interruption par le poussoir:
appui court < 2 s, changement d'état 0 ou 1
appui long, reset du chrono.
 
Remarque, avec la correction d'une seconde par heure, le précision reste inférieure à 1 seconde sur plus de 20 heures. Cette correction n'est sans doute pas valable pour tous les µC et devra être ajustée.


Le code:
Avec un copier coller dans l'éditeur PE5 ou PE6, il retrouvera des couleurs.


; *******************************************
; Application TM 1637: Minuterie 0 à 99:59
;  MM  08/03/2015 ,modification 13/03/2015
; *******************************************
;Broches I/O ***************
    symbol LED= C.0
    symbol clk= C.2
    symbol dio= C.1    
    symbol valid=pinC.3
;Bits *********************
    symbol clignot=bit8
    symbol etat=bit9
;Bytes **********************
    symbol Octet=b0
    ;b1 pour les bits    
    symbol i=b2
    symbol j=b3   
    symbol minut=b4
    symbol heur=b5
    symbol dp=b6
    symbol Chiffre=b7
;Words *****************************
    symbol Div=w12
    symbol Nombre=w13 ; nombre de 4 chiffres à afficher
;Initialisation TM1634 *********************************************************    
    ;symbol TypeAdr=$40 ; adressage auto-incrémenté
    symbol AdrDep=$c0 ; adresse du 1er digit (poids fort)
    symbol RegLum=$8c ; réglage luminosité $80 + 8(allumé, 0:éteint) + 0 à 7(intensité)        
    setfreq M32        ;à 32MHz, time = 0,5 s
    pullup %1000    ;activation résistance pullup sur C.3
; ****************    laissé pour mémoire    ****************
    ;gosub I2CStart
    ;Octet=TypeAdr        ;Mode d'adresse, incrémenation auto par défaut
    ;gosub I2CEnvoiOctet;
    ;gosub I2CStop
; **********************************    
    gosub I2CStart    ;
    Octet=RegLum        ;Réglage luminosité
    gosub I2CEnvoiOctet
    gosub I2CStop
;Affichage données en mémoires EEPROM *********************************************
    dp=$80            ;pour allumage DP
    read 0,heur,minut        ;lecture EEPROM    
    nombre=heur*100 + minut    ;mise en forme affichage
    gosub Affnbre
    setint %0000,%1000    ;interruption sur C.3 niveau bas
    etat=0
    time=0                ;etat initial
;*** boucle principale ****************
    do    
    select     etat    
        case 0            ;état arret chrono
            dp=0        ;affichage sans : centraux        
            nombre=100*heur+minut        
            gosub Affnbre
            do loop while etat=0    ;attente interruption
        case 1
            do                    
                clignot=time//2        ;parité time    
                if clignot=0 then
                             dp=0        ;pas de :
                            else dp=$80    ;affichage :    
                endif            
                if time>119 then    ;é 32 MHz time=0,5 s
                    inc minut        ;1 mn = 120 time        
                    time=0            ;raz time
                        write 0,heur,minut    ;sauvegarde
                    if minut>59 then    ;increm heure
                        inc heur
                        time=time+2    ;retard 1s/heure    
                        minut=0            ;raz minutes
                    endif
                endif
                nombre=100*heur+minut    ;mise en forme affichage
                gosub Affnbre                
            loop while etat=1
    endselect    
    loop
        
;**** Affichage ***************
Affnbre:
    gosub I2CStart
    Octet=AdrDep        ;début séqunce sur digit n?1
    gosub I2CEnvoiOctet    
    div=1000
    for j=1 to 4
        Chiffre=Nombre/Div
        gosub DecTo7seg
        if j=2 then
            octet=octet | dp    ;ajout points centraux
        endif
        gosub I2CEnvoiOctet
        Nombre=Nombre//Div
        Div=Div/10
    next j
    gosub I2CStop
    return
        
; ******* sous programme interruption sur C.3 **************
interrupt:                
    time=0                
    do        ;boucle attente pour raz            
        if time>3 then
            heur=0:minut=0
            write 0,heur,minut    ;raz chrono
            reset                
        endif
    loop while valid=0 ;attente relachement poussoir
    etat= not etat    ;si appui court changement d'état    
    setint %0000,%1000        ;réactivation interruption
    time=0            
return        

;****** balise Start *********************
I2CStart:
    high clk
    high dio
    low dio
    return
    
;******* balise Stop ********************
I2CStop:
    low clk
    low dio
    high clk
    high dio
    return
    
;******* Envoi des chiffres (octet) bit à bit dans le registre ********
I2CEnvoiOctet:    ;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         ; traitement ACK    
    high clk
    low clk
    return
    
;****** Conversion des chiffres en segments
DecTo7seg:
    lookup Chiffre,($3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7f,$6f), Octet ; 0-9 uniquement
    return

 

 



Créé avec Créer un site
Créer un site