picaxe et afficheur segment

JRTEC

Senior Member
Bonjour

je viensvers vous pour un renseignement , afin d adapter au mieux un montage j aimerai pouvoir ecrire une valeur sur 4 afficheur a segment

comment vous y prenderiez vous ?
 

PieM

Senior Member
je viens vers vous pour un renseignement , afin d adapter au mieux un montage j aimerai pouvoir ecrire une valeur sur 4 afficheur a segment
Bonjour,
une solution simple serait d'utiliser un module afficheur avec liaison série comme ICI
 

BESQUEUT

Senior Member
Bonjour,
je viens vers vous pour un renseignement : afin d'adapter au mieux un montage j'aimerais pouvoir écrire une valeur sur 4 afficheurs à segments.
Comment vous y prendriez-vous ?
Si c'est seulement pour afficher des chiffres, il y a ça aussi (moins cher...) :
http://www.gotronic.fr/art-afficheur-4-digits-grove-led05291p-19020.htm
Commandez en même temps le câble de liaison qui vous va le mieux...

Si vous souhaitez contrôler les segments un par un, c'est plus compliqué... mais faisable.
 

JRTEC

Senior Member
Bonsoir,

merci pour vous reponse

je prefere des digits pour ce montage tout simplement pour une question de taille pour un système embarqué

j ai attaquer le programme et je viens de coller bêtement l exemple que vous m avez donné je verrai plus tard lors du monatge quoi corriger
 

MGU

Senior Member
Bonsoir,

OK, pas de problèmes.

Surtout que ces afficheurs à base de max7219 sont intéressants.
Le programme cité #6 (dont il faut remercier l'auteur) ne fonctionne pas directement, "shiftout" est une commande et ne peut être utilisé en étiquette.
J'ai retouché légèrement et commenté en français. J'ai commandé deux de ces afficheurs (4 et 5 digits à 4 euros) et je les attends.
Le programme doit fonctionner (je crois) mais il faut l'intégrer dans un programme global.
Voici un programme d'essai qui devrait lire un ADC et afficher le résultat.
Maintenant, le bus est du type SPI, un SPIOUT devrait faire l'affaire...

Ben oui, je confirme, tout est dans la doc picaxe, à la fin de la commande "shiftout"... on lit pas assez les docs.

Code:
[FONT=Courier New]
;Afficheur driver MAX7219

;Configuration câblage:  
 
'     +V 1 v 8 0V
'          2   7 C.0 to 7219 DIN  = DATA IN
'          3   6 C.1 to 7219 LOAD
'          4   5 C.2 to 7219 CLK

;Format des données sur 16 bits:

;|------------------------------w0-------------------------------|                                                               | 
;|-----------b1------------------|------------b0-----------------| 
;|-X-|-X-|-X-|-X-|--ADRESSE------|----------DONNEES--------------|   
;|D15|D14|D13|D12|D11|D10|D09|D08|D07|D06|D05|D04|D03|D02|D01|D00|


	#picaxe 08M2
  symbol DIN  	= C.0	;Entrée Dta 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 LEN  	= 1		;durée impulsion 1ms
  symbol cpt	= b3
  	

  low DIN
  low LOAD
  low CLK
 
'	initialisation 7219
  b1=$09  'decode mode
  b0=$ff  '=yes, all digits=BCD
  gosub shiftt

  b1=$0a  'intensity
  b0=$0f  '=max
  gosub shiftt

  b1=$0b  'limite scanner
  b0=$03  '=4 digits, $00=1 digit , $01=2 digits, etc...
  gosub shiftt

  b1=$0c  'shutdown mode
  b0=$01  '=normal
  gosub shiftt

  b1=$0f  'display test
  b0=$01  '=all on
  gosub shiftt

  b1=$0f  'display test
  b0=$00  '=normal
  gosub shiftt

  b1=$0a  'intensity
  b0=$05  '=mid-low, $00=min on, $0f=max on
  gosub shiftt
  
;	Boucle de test 
Do
'  b1=position du digit (1 to 8)
'  b0=value à afficher
'  gosub shiftt
'  Pour afficher un point décimal:
'  b0=value or $80

	readadc C.4,b5
	bintoascii b5,b6,b7,b8
	b0=0
	b1=b8-48      ;faudrait voir
	gosub shiftt
	b0=1
	b1=b7-48
	gosub shiftt
	b0=2
	b1=b6-48
	gosub shiftt
loop

;******** Sous programme affichage *************************
  ;Format des données sur 16 bits:

;   |------------------------------w0-------------------------------|                                                               | 
;   |---------------b1--------------|--------------b0---------------| 
;   |-X-|-X-|-X-|-X-|----ADRESSE----|----------DONNEES--------------|   
;   |D15|D14|D13|D12|D11|D10|D09|D08|D07|D06|D05|D04|D03|D02|D01|D00|
;Ex: chiffre 6 dans digit 2(qui est numéroté 3..) 
;   |-X-|-X-|-X-|-X-| 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 |[/FONT]

shiftt:
  for cpt=1 to 16	        ;test des 16 bits de w0
    w6=w0 & $8000	;w0 = b1,b0 & %1000 0000 0000 0000: on garde le 1er bit à gauche de w0    
    if w6=0 then 	        ;w6 est la valeur à transmettre
    	low DIN              ;;si w6 =0 alors on modifie: DIN =0
              else             ;sinon
	 high DIN            ;DIN=1         
    endif
    pulsout CLK,LEN       ; envoi 1 pulse horloge pour valider DIN
    w0=w0*2               ; on décale w0 vers la gauche pour examiner le bit suivant
  next cpt
  pulsout LOAD,LEN	;chargement du registre terminé, un pulse sur load
  return
[/FONT]
 
Last edited:

MGU

Senior Member
IL semble que la commande SPIOUT ne soit pas disponible sur la série M2 (la doc mentirait-elle?).
Et comme ma modif est plus gourmande en octets que l'original, retour à l'original:

Code:
[FONT=Courier New]

;Afficheur driver MAX7219

;Configuration câblage:  
 
'     +V 1 v 8 0V
'          2   7 C.0 to 7219 DIN  = DATA IN
'          3   6 C.1 to 7219 LOAD
'          4   5 C.2 to 7219 CLK

;Format des données sur 16 bits:

;|------------------------------w0-------------------------------|                                                               | 
;|-----------b1------------------|------------b0-----------------| 
;|-X-|-X-|-X-|-X-|--ADRESSE------|----------DONNEES--------------|   
;|D15|D14|D13|D12|D11|D10|D09|D08|D07|D06|D05|D04|D03|D02|D01|D00|


	#picaxe 08M2
  symbol DIN  	= C.0	;Entrée Dta 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 LEN  	= 1		;durée impulsion 1ms
  symbol cpt	= b3  	

  low DIN
  low LOAD
  low CLK
 
'	initialisation 7219
	b1=$09  'decode mode
	b0=$ff  '=yes, all digits=BCD
	gosub shiftt

  b1=$0a  'intensity
  b0=$0f  '=max
  gosub shiftt

  b1=$0b  'limite scanner
  b0=$03  '=4 digits, $00=1 digit , $01=2 digits, etc...
  gosub shiftt

  b1=$0c  'shutdown mode
  b0=$01  '=normal
  gosub shiftt

  b1=$0f  'display test
  b0=$01  '=all on
  gosub shiftt

  b1=$0f  'display test
  b0=$00  '=normal
  gosub shiftt

  b1=$0a  'intensity
  b0=$05  '=mid-low, $00=min on, $0f=max on
  gosub shiftt
  
;	Boucle de test 
Do
'  b1=position du digit (1 to 8)
'  b0=value à afficher
'  gosub shiftt
'  Pour afficher un point décimal:
'  b0=value or $80

	readadc C.4,b5
	bintoascii b5,b6,b7,b8
	b0=0
	b1=b8-48
	gosub shiftt
	b0=1
	b1=b7-48
	gosub shiftt
	b0=2
	b1=b6-48
	gosub shiftt
loop

;******** Sous programme affichage *************************
  ;Format des données sur 16 bits:

;   |------------------------------w0-------------------------------|                                                               | 
;   |---------------b1--------------|--------------b0---------------| 
;   |-X-|-X-|-X-|-X-|----ADRESSE----|----------DONNEES--------------|   
;   |D15|D14|D13|D12|D11|D10|D09|D08|D07|D06|D05|D04|D03|D02|D01|D00|
;Ex: chiffre 6 dans digit 2(qui est numéroté 3..) 
;   |-X-|-X-|-X-|-X-| 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 |

shiftt:
	for cpt=1 to 16	        ;test des 16 bits de w0
		w6=w0 & $8000	;w0 = b1,b0 & %1000 0000 0000 0000: on garde le 1er bit à gauche de w0    
		low DIN				; sortie DIN à 0 à priori
		if w6=0 then saut 	  ;w6 est la valeur à transmettre
		high DIN              ;si w6 <> 0, alors DIN =1
saut:  	pulsout CLK,LEN       ; envoi 1 pulse horloge pour valider DIN
		w0=w0*2               ; on décale w0 vers la gauche pour examiner le bit suivant
	next cpt
  pulsout LOAD,LEN	;chargement du registre terminé, un pulse sur load
  return



[/FONT]
 

PieM

Senior Member
IL semble que la commande SPIOUT ne soit pas disponible sur la série M2 (la doc mentirait-elle?).
Bonjour,
C'est vrai que la doc n'est pas claire !
j'ai toujours utilisé personnellement la version soft MSB ou LSBFirst.
Ce que je comprends (?), c'est que spiout ne fonctionne que sur 20X2, 28X1, 28X2, 40X1, 40X2, que de toute façon c'est une version bit bang d'une SPI . transparent pour l'utilisateur donc.
Sur ces Picaxes, la version hard existe avec HSPIOUT
Pour tous les autre Picaxes, il faut utiliser la version software...
 

MGU

Senior Member
Bonjour,

Merci PieM, effectivement, en lisant calmement, j'ai compris qu'il fallait utiliser le bout de programme à la fin pour les M2.
Lorsque j'aurai ces afficheurs (~3 sem), je verrai comment les utiliser.

MM
 

MGU

Senior Member
Bonjour,

Je viens de recevoir l'afficheur 5 digits pilotés par un max 7219
Après correction des erreurs grossières coutumières, l'afficheur fonctionne parfaitement, chiffres de 15mm de haut, très lumineux (réglable), ils facilitent énormément l'utilisation des afficheurs led pour un prix dérisoire.

afficheur .JPG

Voici le programme d'essai corrigé:

Code:
;Afficheur driver MAX7219
; Programme d'essai
; MM 14/10/13

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

;Format des données sur 16 bits:

[FONT=Courier New];|------------------------------w0-------------------------------|                                                              
;|-----------b1------------------|------------b0-----------------| 
;|-X-|-X-|-X-|-X-|--ADRESSE------|----------DONNEES--------------|   
;|D15|D14|D13|D12|D11|D10|D09|D08|D07|D06|D05|D04|D03|D02|D01|D00|[/FONT]


	#picaxe 08M2
	setfreq m16
 	symbol DIN  	= C.0	;Entrée Dta 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 LEN  	= 1		;durée impulsion 1ms
  	symbol cpt		= b3  	

  	low DIN
  	low LOAD
  	low CLK
 
;******** initialisation 7219 *******
	b1=$09  'decode mode
	b0=$ff  '=yes, all digits=BCD
	gosub shiftt

  	b1=$0a  'intensity
  	b0=$0f  '=max
  	gosub shiftt

  	b1=$0b  'limite scanner
  	b0=$04  '$04=5 digits ,$03=4 digits, $00=1 digit , $01=2 digits, etc...
  	gosub shiftt

  	b1=$0c  'shutdown mode
  	b0=$01  '=normal
  	gosub shiftt

  	b1=$0f  'display test
  	b0=$01  '=all on
  	gosub shiftt

  	b1=$0f  'display test
  	b0=$00  '=normal
  	gosub shiftt

  	b1=$0a  'intensity
  	b0=$05  '=mid-low, $00=min on, $0f=max on
  	gosub shiftt
  
;	Boucle de test 
	Do
	'  b1=position du digit (1 to 8)
	'  b0=value à afficher
	'  gosub shiftt
	'  Pour afficher un point décimal:
	'  b0=value or $80

		readadc10 C.4,w13
		w13=w13*64		;pour afficher les 5 digits
		bintoascii w13,b4,b5,b6,b7,b8
		b1=1
		b0=b8-48
		gosub shiftt
		b1=2
		b0=b7-48
		gosub shiftt
		b1=3
		b0=b6-48
		b0=b0 | $80		;ajout du point décimal
		gosub shiftt
		b1=4
		b0=b5-48
		gosub shiftt
		b1=5
		b0=b4-48
		gosub shiftt	
	loop

;******** Sous programme affichage *************************
  ;Format des données sur 16 bits:

; [FONT=Courier New]  |------------------------------w0-------------------------------|                                                               
;   |---------------b1--------------|--------------b0---------------| 
;   |-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 |[/FONT]

shiftt:
	for cpt=1 to 16	        ;test des 16 bits de w0
		w6=w0 & $8000		;w0 = b1,b0 & %1000 0000 0000 0000: on garde le 1er bit à gauche de w0    
		low DIN				; siortie DIN à 0 à priori
		if w6=0 then saut 	;w6 est la valeur à transmettre
		high DIN            ;;si w6 <> 0, alors DIN =1
saut:	pulsout CLK,LEN     ; envoi 1 pulse horloge pour valider DIN
		w0=w0*2             ; on décale w0 vers la gauche pour examiner le bit suivant
	next cpt
  pulsout LOAD,LEN	;chargement du registre terminé, un pulse sur load
  return
Voici le code d'essai corrigé:
 

BESQUEUT

Senior Member
Posté sur le coup de minuit... y a de la passion dans l'air...
Merci d'avoir partagé expérience et code (avec commentaires !) C'est une bonne solution à un problème fréquent.
 

MGU

Senior Member
Bonjour,

Je repasse présenter une application de l'afficheur 5 digits MAX 7219.
Ces afficheurs sont une excellente alternative au LCD.
Voici un thermomètre avec trois composants (presque).
IL y a presque toutes les possibilités:
Gestion des digits par codeB (table intégrée) ou par segments
test et réglage de luminosité.
Quelques compléments et le code commenté sur:
http://electromag1.wifeo.com/afficheurs-led-pilotes-par-max7219.php

thermomax7219.jpg
Phototherm.JPG

MM
 

JRTEC

Senior Member
Bonsoir

encore du beau travail je suis etonné

je vais m inspirer de cela des que j ai un peu de temps

encore merci
 
Top