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
 
 

AFFICHEUR LEDS avec DRIVER MAX7219
PICAXE 08M2
APPLICATION THERMOMÈTRE base DS18B20
 

Pour l'affichage de données, il y a le choix entre l'afficheur LCD et l'afficheur LED.

Ces deux types d'afficheurs sont présents dans les pages de ce site. Les LCD 1602 à 2004 sont souvent préférés pour leur facilité d'utilisation (surtout en version série) et le nombre de caractères disponibles. Pour les afficheurs LED, le câblage des afficheurs et l'utilisation du multiplexage sont pénalisants, pour un résultat parfois médiocre.
Un forumeur m'a fait découvrir sur eBay des afficheurs composés de 2, 4, 5 ou 8 beaux digits de 20 mm de haut, pilotés par un MAX7219, et tout change:
 


Les avantages sont nombreux:
  • liaison simplifiée, 5 fils en tout, alimentation comprise
  • Déjà monté sur plaquette avec le driver (mais peuvent être achetés séparément)
  • Affichage de chaque digit par décodage (table de caractères intégrée: on tape 1, il écrit 1) ou segment par segment pour fabriquer des caractères non présents dans la table, ex "°" ou "C"
  • Réglage de la luminosité
  • fonction test
  • Très économique (4 à 5 euros tout compris)
  • Pilotable par tout µC (un picaxe 08M2 suffit pour un thermomètre).
  • Pour l'afficheur matricel 8x8 lisez ensuite cette page

Application de test: Un thermomètre simple.

Il faut:
  • Un DS18B20
  • Un picaxe 08M2
  • Un afficheur 5 digits piloté par MAX 7219
  • Et ... une résistance, enfin trois si on veut pouvoir programmer sur site.
Les datasheets:  
 
Il y a 6 broches sur l'afficheur:
GRN = 0 Volt
VCC = 5 Volts
SI  = DIN (Data In , entrée donnée)
SO  = Serial Out (non utilisé)
CS* = DATA (validation du registre. En fait, c'est CS barre)
SCL = CLK (impulsion horloge, valide le bit)

 
Contrairement aux picaxes de la série X1 ou X2, la série M2 ne dispose pas de la commande SPI (shiftout) gérant ces données en une seule ligne, pas grave, la doc picaxe nous explique comment s'en passer.

La datasheet du MAX7219:
Ce qu'il faut savoir pour commander ces afficheurs (aide aux purs francophones).
Rappel pour les débutants: 15, ou $F, ou %11111 sont trois façons d'écrire la même chose, en décimal, ou en hexadécimal, ou en binaire.

Le format de registre:
Il est composé de 16 bits. L'octet de poids faible (D0-D7) contient des données pures.
L'octet de poids fort "ADRESSE" contient soit le n° du digit concerné (de 1 à 8) soit une commande.

Détail de l'octet de poids fort  "ADDRESS"
Les bits D12- D15 ne sont pas utilisés.
L'adresse 0 ($0) n'a pas de fonction.
Les adresses= 1 à 8 ($1 à $8) désigne le digit concerné par les "données (D0-D7).
ATTENTION: Le digit0 a l'adresse n°1 dans cette table ! Source de confusion.
Adresse= 9 ($9): mode de décodage pour chaque digit.
Adresse= 10 ($A): réglage de l'intensité d'éclairage des digits (16 niveaux dans "données");
Adresse= 11 ($B): nombre de digits (1 à 8 dans "données")
Adresse= 12 ($C): activation du digit (en veille si"donnée" =0 ; actif si "donnée"= 1, la valeur par défaut est 0 !)
Adresse = 15 ($F): fonction test, tous les segments des digits et les points décimaux allumés, éclairage maximum.

              

Détail des données associées suivant les cas:

Adressse 12 (ou $C)
Table des données pour Shutdown, activation,
$12

Adresse 9 (ou $9)
Table des données du mode décodage ($9)
D0 correspond le digit 0
Ex : si D0=1, le digit 0 sera décodé suivant la table décodage code B
si D0=0, le digit 0 sera décrit segment par segment   

Avec adresse 9 et donnée 1 : décodage par table Code B
Voici la partie intéressante de la table 5 Code B Font.
Rappel: le bit est à 1 dans la commande adressée $9.
Il y a 16 caractères enregistrés dans cette table.
Les 10 premiers correspondent aux chiffres de 0 à 9
(on envoie un 1 et le digit écrit 1, c'est simple)
Ensuite:
10 (ou $A) écrit -
11 (ou $B) écrit E

12 (ou $C) écrit H
13 (ou $D) écrit L
14 (ou $E) écrit P
15 (ou $F) n'écrit rien,"blank"(càd noir)
Les caractères non décrits dans cette table doivent être dessinés segment par segment.
Pour ajouter le point décimal, il faut mettre D7 à 1,
c'est à dire ajouter 128 (ou $80) au nombre "n" envoyé, en écrivant "n |$80"  (| = OU logique)

Avec adresse 9 et donnée 0 : description par segments
 La table 6 donne la description par segments.
Rappel: Le bit est à 0 dans la commande adressée $9
On selectionne dans la partie "données" les segments que l'on veut allumer Ex:
Pour écrire un C, il faut allumer les segments A,D,E,F en envoyant:
% 01001110

Pour allumer aussi le point décimal, il faut ajouter D7 et envoyer:
% 11001110
                                            


Photo:
La sonde du thermomètre en arrière plan est juste à côté du DS18B20
Les chiffres sont issus de la table de caractères (code B) intégrée.
Les deux derniers caractères sont définis par allumage des segments.
 

 
Le code:
On y retrouve presque tout.

 
;Afficheur driver MAX7219
; Programme d'essai
; MM 15/10/13

 
;Configuration câblage:  
'        +V 1 v 8 0V
'           2   7 C.0 vers DIN (DATA IN) du 7219
'DS18B20    3   6 C.1 vers LOAD (SC*) du 7219
'TEST/LUM   4   5 C.2 vers CLK du 7219

;Format des registres MAX 7219 sur 16 bits:
;|------------------------------w13------------------------------|                                                             |
;|-----------b27-----------------|------------b26 ---------------|
;|-X-|-X-|-X-|-X-|--ADRESSE------|----------DONNEES--------------|   
;|D15|D14|D13|D12|D11|D10|D09|D08|D07|D06|D05|D04|D03|D02|D01|D00|

    #picaxe 08M2
    setfreq m16
     symbol    DIN      = C.0    ;Entrée Data In de l'afficheur
      symbol    LOAD     = C.1    ;Entrée Load de l'afficheur
      symbol    CLK      = C.2    ;Entrée CLK de l'afficheur
      symbol    TEST    = pinC.3
      symbol    LEN      = 1        ;durée impulsion 1ms
      symbol    temp    = b1    ;lecture température    
      symbol    cpt        = b2      ;compteur
      ;                    b3    unité
      ;                    b4    dizaine
      ;                    b5    centaine
      symbol    lum    =b6
    symbol    regis    =w13    ;=(b27,b26) chaque bit sera envoyé dans le registre
      low DIN
      low LOAD
      low CLK     
      pullup %1000  ;activation résistance pullup sur C.3
;******** initialisation 7219 *******
    b27=$09  'mode décodage
    b26=%11111100  'code B sauf digit 0 et 1 (Bref, les deux derniers)
    gosub shiftt
 
      b27=$0b  'limite scanner = Nbre de digits
      b26=$04  '$04=5 digits ,$03=4 digits,, etc...
      gosub shiftt

      b27=$0c  'shutdown mode
      b26=$01  '=normal (afficheur actif)
      gosub shiftt      

      b27=$0a  'luminosité
      b26=$04  '=croissante de 0 à 15, ici c'est 4
      gosub shiftt
      
;***** Affichage des 2 derniers digits "°C"
;    DATA    REG        D7 D6 D5 D4 D3 D2 D1 D0
;            SEG        DP  A  B  C  D  E  F  G
;    
    b27=1
    b26=%01001110    ;C = seg A,D,E,F on= % 01001110
    gosub shiftt    
;    
    b27=2
    b26=%001100011    ;°= seg A,B,F,G on = %01100011
    gosub shiftt
    
;******    Boucle de lecture *****************        
    Do
        '  b27=position du digit (1 to 8)
        '  b26=valeur à afficher
        '  gosub shiftt pour remplir le registre du max7219 bit par bit
        '  Pour afficher un point décimal:  b26=value or $80

        if test = 0 then gosub tst   ;poussoir test et luminosité
        readtemp C.4,temp            ;lecture température
    
;****** simulation temp négative -4°C au début pour démo ********        
        if time<1 then   ;c'est juste pour voir
             temp=132    ;le signe - s'allumer une fois
        endif
;*************************************************           
        if temp> 128 then            ;temp négative
            temp=temp-128            ; valeur absolue
            bintoascii temp, b5,b4,b3    ;décomposition en digit
            b5=$0a                    ;signe - (codeB) devant
                    else            ;sinon
            bintoascii temp, b5,b4,b3    ;décomposition en digit
            b5=b5-48                ;retour numérique
        endif
                
        b27=3            ;digit 3
        b26=b3-48        ;ascii -> numérique
        gosub shiftt    ;affichage
        b27=4
        b26=b4-48
        gosub shiftt    ;affichage
        b27=5
        b26=b5            ;déjà traité
        gosub shiftt    ;affichage   
    loop
    
;******** Sous programme affichage *************************
  ;Format du registre sur 16 bits:
;|------------------------------w13------------------------------|                                                        
;|-----------b27-----------------|------------b26 ---------------|
;|-X-|-X-|-X-|-X-|--ADRESSE------|----------DONNEES--------------|   
;|D15|D14|D13|D12|D11|D10|D09|D08|D07|D06|D05|D04|D03|D02|D01|D00|
;Ex: chiffre 5 dans digit 2
;|-X-|-X-|-X-|-X-| 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 |

;La broche DIN va prendre successivementla valeur de chaque bit de w13, scanné de gauche à droire
shiftt:
    for cpt=1 to 16            ;test des 16 bits de w13
        w12=w13 & $8000        ;w13 = b27,b26 & %1000 0000 0000 0000: on ne garde que le 1er bit à gauche de w12   
        low DIN                ; broche DIN à 0 à priori
        if w12=0 then saut     ;w12 contient la valeur (0 ou 1) à transmettre
        high DIN            ;;on ne passe ici que si w12 <> 0, alors DIN =1 (évidemment)
saut:    pulsout CLK,LEN     ; envoi 1 pulse horloge pour valider DIN
        w13=w13*2             ; on décale w13 vers la gauche pour examiner le bit suivant
    next cpt
  pulsout LOAD,LEN    ;chargement du registre terminé, un pulse sur load valide le registre (commande ou affichage)
  return
;******* fonction test, tous segments ON et réglage lumière ***********
tst:
;****** test segments (rapide) ****************    
    b27=$0f  'display test
      b26=$01  '=tous les segments de tous les digits allumés
      gosub shiftt          
    pause 1000    
      b27=$0f  'display test
      b26=$00  '=normal
      gosub shiftt
      
;******* suivi d'un réglage de luminosité *************     
      do while test=0
          inc lum
          if lum>15 then
              lum=0
          endif                   
          b27=$0a  'luminosité
          b26=lum '=croissante de 0 à 15
          gosub shiftt
          pause 1000
          if lum=0 or lum=15 then
              pause 4000
          endif
      loop
      return



Créer un site
Créer un site