picaxe 8M2 et MAX 7219 64 led

JRTEC

Senior Member
#1
Bonsoir

je suis en train de faire une monatge ou j emploie un 8M2 et un Max7219, a fin d afficher un caractere en fonction d une tension lue

Sur l ebauche de mon programme , PE5 me dis:" Error: #Directive error - invalid #picaxe type "

Code:
;Afficheur driver MAX7219
;Matrice de leds 8x8
;JR 15/18/2017

;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 8M2
    setfreq m32
    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    CAPT   = C.4	;valeur capteur bdv
    symbol    LEN    = 1      ;durée impulsion 1ms
    symbol    num    = b1    ;colonne  
    symbol    cpt    = b2      ;compteur
    
    symbol calv  = w10 ;valeur de la tension du capteur en volt au momment de la mesure
      ;              
     symbol    chif  =b6
     symbol    val   =b7
     symbol        cpt2=b8       
    symbol  regis    =w13    ;=(b27,b26) chaque bit sera envoyé dans le registre
    low DIN
    low LOAD
    low CLK
;***** description des colonnes (digits) en RAM:

;chiffre "1":
    table 10,(0,0,0,%11111111,%11111111,0,0,0)
;chiffre "2":   
    table 20,(0,%11111011,%11111011,%11011011,%11011011,%11011111,%11011111,0)
;chiffre "3":   
    table 30,(0,%11000011,%11000011,%11011011,%11011011,%11111111,%11111111,0)
;chiffre "4":  
    table 40,(0,%00111111,%00111111,%001100000,%11111000,%11111000,%00110000,0)
;chiffre "5":
    table 50,(0,%11011111,%11011111,,%11011011,%11011011,%11111011,%11111011,0)
;chiffre "6":
    table 60,(0,%11111111,%11111111,,%11011011,%11011011,%11111011,%11111011,0)
;lettre N    
    table 70,(0,%11111111,%11111111,%00001110,%000111110,%11111111,%11111111,0)
;lettre R
    table 80,(0,%11111111,%11111111,%00011011,%00111011,%11101111,%11001111,0)
;lettre E
    table 90,(0,%11111111,%11111111,%11011011,%11011011,%11000011,%11000011,0)
    
    

 
;******** initialisation 7219 *******
    b27=$09  'mode décodage
    b26=%00000000  'pas de décodage code B mais segments
    gosub shiftt
 
    b27=$0b  'limite scanner = Nbre de digits
    b26=$07    '$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
      
    b27=$0f  'display test
    b26=$00  '=normal
    gosub shiftt

  
 Debut:

 
 

 readadc capt,  calv
		
		if calv<20 then table 90
		 
		endif
		
		if calv>4980 then table 90
		 
		endif
		
		if calv>20 and calv<250 then table 80
		 
		endif
		
		if calv>250 and calv<500 then table 70
		 
		endif		
		
		if calv>550 and calv<1200 then table 10
		 
		endif	
		
		if calv>1200 and calv<1900 then table 20
		 
		endif		
			
		if calv>1900 and calv<2700 then table 30
		 
		endif	
		
		if calv>2750 and calv<3500 then table 40
		 
		endif	
		
		if calv>3550 and calv<4450 then table 50
		 
		endif		
			
		
		if calv>4550 and calv<4950 then table 60
		 
		endif		
		
	
           
      
				
				
goto debut	
	
    
;******** 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
 
tst:
;****** test segments ****************    
    b27=$0f  'display test
    b26=$01  '=tous les segments de tous les digits allumés
    gosub shiftt          
    do loop while test=0  
    b27=$0f  'display test
    b26=$00  '=normal
    gosub shiftt
      
return
un peu serai t il possible svp ?

Par avance merci
 

JRTEC

Senior Member
#3
Bonjour et merci

On vois les professionniels

Je veux mesure sur une patte du picaxeune tension allant de 0 a 5 v

Betement j ai reporte les plage du capteur en mV

Autre question le 08M2 ne supporte les " tables " alors que le 14M2 oui ?

Code:
;Afficheur driver MAX7219
;Matrice de leds 8x8
;JR 15/18/2017

;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 14M2
    setfreq m32
    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    CAPT   = C.4	;valeur capteur bdv
    symbol    LEN    = 1      ;durée impulsion 1ms
    symbol    num    = b1    ;colonne  
    symbol    cpt    = b2      ;compteur
    
    symbol calv  = w10 ;valeur de la tension du capteur en volt au momment de la mesure
      ;              
     symbol    chif  =b6
     symbol    val   =b7
     symbol        cpt2=b8       
    symbol  regis    =w13    ;=(b27,b26) chaque bit sera envoyé dans le registre
    low DIN
    low LOAD
    low CLK
;***** description des colonnes (digits) en RAM:

;chiffre "1":
    table 10,(0,0,0,%11111111,%11111111,0,0,0)
;chiffre "2":   
    table 20,(0,%11111011,%11111011,%11011011,%11011011,%11011111,%11011111,0)
;chiffre "3":   
    table 30,(0,%11000011,%11000011,%11011011,%11011011,%11111111,%11111111,0)
;chiffre "4":  
    table 40,(0,%00111111,%00111111,%001100000,%11111000,%11111000,%00110000,0)
;chiffre "5":
    table 50,(0,%11011111,%11011111,%11011011,%11011011,%11111011,%11111011,0)
;chiffre "6":
    table 60,(0,%11111111,%11111111,%11011011,%11011011,%11111011,%11111011,0)
;lettre N    
    table 70,(0,%11111111,%11111111,%00001110,%000111110,%11111111,%11111111,0)
;lettre R
    table 80,(0,%11111111,%11111111,%00011011,%00111011,%11101111,%11001111,0)

    
    

 ;******* Recherche caractère ******************
Affich:
        For num =1 to 8   ;n° de colonne
        b27=num           ;adresse registre
        chif=val*10 +num-1 ;calage sur le premier octet du chiffre val
        readtable chif,b26 ;lecture de l'octet "donnée colonne"
        gosub shiftt       ;affichage colonne  
        next        
    return
    
;******** initialisation 7219 *******
    b27=$09  'mode décodage
    b26=%00000000  'pas de décodage code B mais segments
    gosub shiftt
 
    b27=$0b  'limite scanner = Nbre de digits
    b26=$07    '$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
      
    b27=$0f  'display test
    b26=$00  '=normal
    gosub shiftt

  
 Debut:

 
 

 readadc capt,  calv
		
		
		
		if calv>2 and calv<21 then table 80 gosub shiftt
		gosub affich
		endif
		 
		endif
		
		if calv>21 and calv<50 then table 70
		 
		endif		
		
		if calv>50 and calv<120 then table 10
		 
		endif	
		
		if calv>120 and calv<190 then table 20
		 
		endif		
			
		if calv>190 and calv<270 then table 30
		 
		endif	
		
		if calv>270 and calv<350 then table 40
		 
		endif	
		
		if calv>350 and calv<440 then table 50
		 
		endif		
			
		
		if calv>455 and calv<495 then table 60
		 
		endif		
		
	
           
      
				
				
goto debut	
	
    
;******** 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
 

      
return
Par contre a la simulation je plante a la selection de la plage
 
Last edited:

MGU

Senior Member
#4
Bonjour,

Pas de "table" pour le 08M2, mais il y a lookup qui peut remplacer.

Pour la sélection, regarde select case, plus pratique et plus souple que if, else, elseif, etc

après then, il faut une adresse (étiquette), ou un sous programme après un then gosub

A suivre

MM
 

MGU

Senior Member
#5
Un truc non testé avec un 08M2, à essayer:
J'ai laissé les tables en rem pour des copier-coller, il y a des cas à compléter

Code:
;Afficheur driver MAX7219
;Matrice de leds 8x8
;JR 15/18/2017

;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 m32
    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    CAPT   = C.4	;valeur capteur bdv
    symbol    LEN    = 1      ;durée impulsion 1ms
    symbol    col    = b27    ;n° de colonne dans le registre w13= (b27;b26)
    symbol    cpt    = b2      ;compteur
	
    symbol calv  = w10 ;valeur de la tension du capteur en volt au momment de la mesure        
   
    low DIN
    low LOAD
    low CLK
#rem
;***** description des colonnes (digits) en RAM:

;chiffre "1":
    table 10,(0,0,0,%11111111,%11111111,0,0,0)
;chiffre "2":   
    table 20,(0,%11111011,%11111011,%11011011,%11011011,%11011111,%11011111,0)
;chiffre "3":   
    table 30,(0,%11000011,%11000011,%11011011,%11011011,%11111111,%11111111,0)
;chiffre "4":  
    table 40,(0,%00111111,%00111111,%001100000,%11111000,%11111000,%00110000,0)
;chiffre "5":
    table 50,(0,%11011111,%11011111,%11011011,%11011011,%11111011,%11111011,0)
;chiffre "6":
    table 60,(0,%11111111,%11111111,%11011011,%11011011,%11111011,%11111011,0)
;lettre N    
    table 70,(0,%11111111,%11111111,%00001110,%000111110,%11111111,%11111111,0)
;lettre R
    table 80,(0,%11111111,%11111111,%00011011,%00111011,%11101111,%11001111,0)
#endrem  
       
;******** initialisation 7219 *******
    b27=$09  'mode décodage
    b26=%00000000  'pas de décodage code B mais segments
    gosub shiftt
 
    b27=$0b  'limite scanner = Nbre de digits
    b26=$07    '$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
      
    b27=$0f  'display test
    b26=$00  '=normal
    gosub shiftt  
	 do
	 		readadc10 capt,  calv
			select calv
				case < 20
					gosub cas1	;chiffre 1
				case 25 to 240
					gosub cas2
				case 250 to 490
					gosub cas3
				case 500 to 1150
					gosub cas4
				case 1200 to 1850
					gosub cas5
				case 1900 to 2650
					gosub cas6
				case 2700 to 3450
					gosub cas7
				case 3500 to 4950
					gosub cas8			
				case > 4950
					gosub cas9
			endselect
			
		cas1:	;chiffre 1  col=b27, ici, c'est le n° de colone de la matrice et b26 sa description en bits
				for col=0 to 7
					lookup col ,(0,0,0,%11111111,%11111111,0,0,0),b26
					gosub shiftt
				next
				return
		cas2:	;chiffe 2	
				for col=0 to 7
					lookup col ,(0,%11111011,%11111011,%11011011,%11011011,%11011111,%11011111,0),b26
					gosub shiftt
				next		
				return
		cas3:	;chiffe 3	
				for col=0 to 7
					lookup cpt ,(0,%11000011,%11000011,%11011011,%11011011,%11111111,%11111111,0),b26
					gosub shiftt
				next		
				return
		cas4:
				return
		cas5:
				return	
		cas6:
				return
		cas7:
				return	
		cas8:
				return
		cas9:
				return

	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
MM
 

MGU

Senior Member
#6
Plus complet et moins d'erreur de colonnes


Code:
;Afficheur driver MAX7219
;Matrice de leds 8x8
;JR 15/18/2017

;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 m32
    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    CAPT   = C.4	;valeur capteur bdv
    symbol    LEN    = 1      ;durée impulsion 1ms
    symbol    col    = b27    ;n° de colonne dans le registre w13= (b27;b26)
    symbol    cpt    = b2      ;compteur
	
    symbol calv  = w10 ;valeur de la tension du capteur en volt au momment de la mesure        
   
    low DIN
    low LOAD
    low CLK
#rem
;***** description des colonnes (digits) en RAM:

;chiffre "1":
    table 10,(0,0,0,%11111111,%11111111,0,0,0)
;chiffre "2":   
    table 20,(0,%11111011,%11111011,%11011011,%11011011,%11011111,%11011111,0)
;chiffre "3":   
    table 30,(0,%11000011,%11000011,%11011011,%11011011,%11111111,%11111111,0)
;chiffre "4":  
    table 40,(0,%00111111,%00111111,%001100000,%11111000,%11111000,%00110000,0)
;chiffre "5":
    table 50,(0,%11011111,%11011111,%11011011,%11011011,%11111011,%11111011,0)
;chiffre "6":
    table 60,(0,%11111111,%11111111,%11011011,%11011011,%11111011,%11111011,0)
;lettre N    
    table 70,(0,%11111111,%11111111,%00001110,%000111110,%11111111,%11111111,0)
;lettre R
    table 80,(0,%11111111,%11111111,%00011011,%00111011,%11101111,%11001111,0)
;lettre E
	 table 90,(0,%11111111,%11111111,%11011011,%11011011,%11000011,%11000011,0)
#endrem  
       
;******** initialisation 7219 *******
    b27=$09  'mode décodage
    b26=%00000000  'pas de décodage code B mais segments
    gosub shiftt
 
    b27=$0b  'limite scanner = Nbre de digits
    b26=$07    '$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
      
    b27=$0f  'display test
    b26=$00  '=normal
    gosub shiftt  
	 do
	 		readadc10 capt,  calv
			select calv
				case < 4
					gosub casEE	;lettre E
				case 4 to 50
					gosub casR
				case 51 to 102
					gosub casN
				case 103 to 245
					gosub cas1
				case 246 to 389
					gosub cas2
				case 390 to 552
					gosub cas3
				case 553 to 716
					gosub cas4
				case 716 to 911
					gosub cas5
				case 912 to 1013
					gosub cas6			
				case > 1013
					gosub casEE
			endselect

		casEE:	;lettre E
				for col=0 to 7
					lookup col ,(0,%11111111,%11111111,%11011011,%11011011,%11000011,%11000011,0),b26			
					gosub shiftt
				next
				return
		casR:
				for col=0 to 7
					lookup col ,(0,%11111111,%11111111,%00011011,%00111011,%11101111,%11001111,0),b26			
					gosub shiftt
				next
				return
		casN:
				for col=0 to 7
					lookup col ,(0,%11111111,%11111111,%00001110,%000111110,%11111111,%11111111,0),b26			
					gosub shiftt
				next
				return			
		cas1:	;chiffre 1  col=b27, ici, c'est le n° de colone de la matrice et b26 sa description en bits
				for col=0 to 7
					lookup col ,(0,0,0,%11111111,%11111111,0,0,0),b26					
					gosub shiftt
				next
				return
		cas2:	;chiffe 2	
				for col=0 to 7
					lookup col ,(0,%11111011,%11111011,%11011011,%11011011,%11011111,%11011111,0),b26
					gosub shiftt
				next		
				return
		cas3:	;chiffe 3	
				for col=0 to 7
					lookup cpt ,(0,%11000011,%11000011,%11011011,%11011011,%11111111,%11111111,0),b26
					gosub shiftt
				next		
				return
		cas4:
				for col=0 to 7
					lookup col ,(0,%00111111,%00111111,%001100000,%11111000,%11111000,%00110000,0),b26
					gosub shiftt
				next		
				return
		cas5:
				for col=0 to 7
					lookup col ,(0,%11011111,%11011111,%11011011,%11011011,%11111011,%11111011,0),b26
					gosub shiftt
				next		
				return	
		cas6:
				for col=0 to 7
					lookup col ,(0,%11111111,%11111111,%11011011,%11011011,%11111011,%11111011,0),b26
					gosub shiftt
				next		
				return
	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:
	inc col						;le n° de col commence à 1 et pour lookup, c'est 0
    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
 

BESQUEUT

Senior Member
#7
Un truc non testé avec un 08M2, à essayer:
J'ai laissé les tables en rem pour des copier-coller, il y a des cas à compléter

Code:
;Afficheur driver MAX7219
;Matrice de leds 8x8
;JR 15/18/2017

;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 m32
    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    CAPT   = C.4	;valeur capteur bdv
    symbol    LEN    = 1      ;durée impulsion 1ms
    symbol    col    = b27    ;n° de colonne dans le registre w13= (b27;b26)
    symbol    cpt    = b2      ;compteur
	
    symbol calv  = w10 ;valeur de la tension du capteur en volt au momment de la mesure        
   
    low DIN
    low LOAD
    low CLK
#rem
;***** description des colonnes (digits) en RAM:

;chiffre "1":
    table 10,(0,0,0,%11111111,%11111111,0,0,0)
;chiffre "2":   
    table 20,(0,%11111011,%11111011,%11011011,%11011011,%11011111,%11011111,0)
;chiffre "3":   
    table 30,(0,%11000011,%11000011,%11011011,%11011011,%11111111,%11111111,0)
;chiffre "4":  
    table 40,(0,%00111111,%00111111,%001100000,%11111000,%11111000,%00110000,0)
;chiffre "5":
    table 50,(0,%11011111,%11011111,%11011011,%11011011,%11111011,%11111011,0)
;chiffre "6":
    table 60,(0,%11111111,%11111111,%11011011,%11011011,%11111011,%11111011,0)
;lettre N    
    table 70,(0,%11111111,%11111111,%00001110,%000111110,%11111111,%11111111,0)
;lettre R
    table 80,(0,%11111111,%11111111,%00011011,%00111011,%11101111,%11001111,0)
#endrem  
       
;******** initialisation 7219 *******
    b27=$09  'mode décodage
    b26=%00000000  'pas de décodage code B mais segments
    gosub shiftt
 
    b27=$0b  'limite scanner = Nbre de digits
    b26=$07    '$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
      
    b27=$0f  'display test
    b26=$00  '=normal
    gosub shiftt  
	 do
	 		readadc10 capt,  calv
			select calv
				case < 20
					gosub cas1	;chiffre 1
				case 25 to 240
					gosub cas2
				case 250 to 490
					gosub cas3
				case 500 to 1150
					gosub cas4
				case 1200 to 1850
					gosub cas5
				case 1900 to 2650
					gosub cas6
				case 2700 to 3450
					gosub cas7
				case 3500 to 4950
					gosub cas8			
				case > 4950
					gosub cas9
			endselect
			
		cas1:	;chiffre 1  col=b27, ici, c'est le n° de colone de la matrice et b26 sa description en bits
				for col=0 to 7
					lookup col ,(0,0,0,%11111111,%11111111,0,0,0),b26
					gosub shiftt
				next
				return
		cas2:	;chiffe 2	
				for col=0 to 7
					lookup col ,(0,%11111011,%11111011,%11011011,%11011011,%11011111,%11011111,0),b26
					gosub shiftt
				next		
				return
		cas3:	;chiffe 3	
				for col=0 to 7
					lookup cpt ,(0,%11000011,%11000011,%11011011,%11011011,%11111111,%11111111,0),b26
					gosub shiftt
				next		
				return
		cas4:
				return
		cas5:
				return	
		cas6:
				return
		cas7:
				return	
		cas8:
				return
		cas9:
				return

	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
MM
Le LOOP devrait être immédiatement après le ENDSELECT
Avec ce programme, cas1 est exécuté à chaque boucle, et de plus empile un RETURN sans GOSUB...

Il me semble qu'à chaque appel de shiftt, b27 est perdu, et donc il semble manquer un
b27=$0f
par exemple avant le RETURN.

Accessoirement, il me semble possible d'optimiser en vitesse de traitement :
for col=0 to 7
lookup col ,(0,%11111111,%11111111,%00011011,%00111011,%11101111,%11001111,0
gosub shiftt
next
à remplacer par
b26=%11111111: gosub shiftt
b26=%11111111: gosub shift
b26=%00011011: gosub shiftt
b26=%00111011: gosub shiftt
b26=%11101111: gosub shiftt
b26=%11001111: gosub shiftt
b26=0: gosub shiftt

On peut aussi optimiser en utilisant w0 à la place de w13 (et donc b0, b1 à la place de b26, b27) et du coup le premier bit à gauche est directement disponible dans bit15.

Perso je trouve la structure
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
un peu complexe. Pourquoi ne pas écrire :
if w12=0 then
low DIN
else
high DIN
endif
voire
DIN=bit15
et encore plus simplement, pourquoi ne pas utiliser shiftout ?
 
Last edited:

MGU

Senior Member
#8
Bonjour,

Merci pour le temps passé sur ce bout de programme

Le loop est un loupé, c'est sûr.

Le lookup, c'est vrai que d'autres structures sont peut être plus rapides. Mais col est b27 et c'est un des octets du registre (ici le n° de colonne à un près et je viens de m&#8217;apercevoir que sans changement de variable, ça colle pas).
la commande shiftout n'existe pas pour la série M2, le sous programme est directement pompé de la doc picaxe pour la remplacer. Je me suis aussi demandé pourquoi ils n'utilisaient pas if/ else, je pense que c'est une question de rapidité.

Je n'aime pas trop utiliser w0, que je réserve pour un découpage éventuel en bits.

Merci, je vais revoir tout ça.

MM
 
Last edited:

MGU

Senior Member
#9
Cette fois ci, j'ai testé, ça fonctionne..mais on peut toujours améliorer

Code:
;Afficheur driver MAX7219
;Matrice de leds 8x8
;JR 15/18/2017
;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
#no_data
    setfreq m32
    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    CAPT   = C.4	;valeur capteur bdv
    symbol    LEN    = 4    ;durée impulsion 
    symbol    col    = b2   ;n° de colonne du chiffre, dans le registre b27=col+1; w13= (b27;b26)
    symbol    cpt   = b3   ;compteur	
    symbol	 calv  	= w10 	;valeur de la tension du capteur en volt au momment de la mesure        
   
    low DIN
    low LOAD
    low CLK
       
;******** initialisation 7219 *******
    b27=$09  'mode décodage
    b26=%00000000  'pas de décodage code B mais segments
    gosub shiftt
 
    b27=$0b  'limite scanner = Nbre de digits
    b26=$07    '$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
      
    b27=$0f  'display test
    b26=$00  '=normal
    gosub shiftt  
	 do
	 		readadc10 capt,  calv
			select calv
				case < 4
					gosub casEE	;lettre E
				case 4 to 50
					gosub casR
				case 51 to 102
					gosub casN
				case 103 to 245
					gosub cas1
				case 246 to 389
					gosub cas2
				case 390 to 552
					gosub cas3
				case 553 to 716
					gosub cas4
				case 717 to 911
					gosub cas5
				case 912 to 1013
					gosub cas6			
				case > 1013
					gosub casEE
			endselect
	loop

		casEE:	;lettre E
				for col=0 to 7
					lookup col ,(0,%11111111,%11111111,%11011011,%11011011,%11000011,%11000011,0),b26			
					gosub shiftt1
				next
				return
		casR:
				for col=0 to 7
					lookup col ,(0,%11111111,%11111111,%00011011,%00111011,%11101111,%11001111,0),b26			
					gosub shiftt1
				next
				return
		casN:
				for col=0 to 7
					;lookup col ,(%11111111,%11111111,%00000110,%00001100,%00011000,%00110000,%11111111,%11111111),b26
					lookup col ,(0,%11111111,%11111111,%00000110,%00001100,%11111111,%11111111,0),b26
					gosub shiftt1
				next
				return			
		cas1:	;chiffre 1  col=b27, ici, c'est le n° de colone de la matrice et b26 sa description en bits
				for col=0 to 7
					lookup col ,(0,0,0,%11111111,%11111111,0,0,0),b26					
					gosub shiftt1
				next
				return
		cas2:	;chiffe 2	
				for col=0 to 7
					lookup col ,(0,%11111011,%11111011,%11011011,%11011011,%11011111,%11011111,0),b26
					gosub shiftt1
				next		
				return
		cas3:	;chiffe 3	
				for col=0 to 7
					lookup col ,(0,%11000011,%11000011,%11011011,%11011011,%11111111,%11111111,0),b26
					gosub shiftt1
				next		
				return
		cas4:
				for col=0 to 7					
					lookup col ,(0,%0011111,%00011111,%00011000,%00011000,%11111111,%11111111,0),b26	
					gosub shiftt1
				next		
				return
		cas5:
				for col=0 to 7
					lookup col ,(0,%11011111,%11011111,%11011011,%11011011,%11111011,%11111011,0),b26
					gosub shiftt1
				next		
				return	
		cas6:
				for col=0 to 7
					lookup col ,(0,255,255,219,219,251,251,0),b26	;binaire remplacé par décimal
					gosub shiftt1
				next		
				return	
    
;******** 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
shiftt1:
	b27=col+1					;le n° de col commence à 1 et pour lookup, c'est 0
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
PS, j'ai remplacé le précédent code, avec une légère modif des caractères

MM
 
Last edited:

JRTEC

Senior Member
#10
Cette fois ci, j'ai testé, ça fonctionne..mais on peut toujours améliorer

Code:
;Afficheur driver MAX7219
;Matrice de leds 8x8
;JR 15/18/2017
;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
#no_data
    setfreq m32
    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    CAPT   = C.4	;valeur capteur bdv
    symbol    LEN    = 4    ;durée impulsion 
    symbol    col    = b2   ;n° de colonne du chiffre, dans le registre b27=col+1; w13= (b27;b26)
    symbol    cpt   = b3   ;compteur	
    symbol	 calv  	= w10 	;valeur de la tension du capteur en volt au momment de la mesure        
   
    low DIN
    low LOAD
    low CLK
       
;******** initialisation 7219 *******
    b27=$09  'mode décodage
    b26=%00000000  'pas de décodage code B mais segments
    gosub shiftt
 
    b27=$0b  'limite scanner = Nbre de digits
    b26=$07    '$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
      
    b27=$0f  'display test
    b26=$00  '=normal
    gosub shiftt  
	 do
	 		readadc10 capt,  calv
			select calv
				case < 4
					gosub casEE	;lettre E
				case 4 to 50
					gosub casR
				case 51 to 102
					gosub casN
				case 103 to 245
					gosub cas1
				case 246 to 389
					gosub cas2
				case 390 to 552
					gosub cas3
				case 553 to 716
					gosub cas4
				case 717 to 911
					gosub cas5
				case 912 to 1013
					gosub cas6			
				case > 1013
					gosub casEE
			endselect
	loop

		casEE:	;lettre E
				for col=0 to 7
					lookup col ,(0,%11111111,%11111111,%11011011,%11011011,%11000011,%11000011,0),b26			
					gosub shiftt1
				next
				return
		casR:
				for col=0 to 7
					lookup col ,(0,%11111111,%11111111,%00011011,%00111011,%11101111,%11001111,0),b26			
					gosub shiftt1
				next
				return
		casN:
				for col=0 to 7
					;lookup col ,(%11111111,%11111111,%00000110,%00001100,%00011000,%00110000,%11111111,%11111111),b26
					lookup col ,(0,%11111111,%11111111,%00000110,%00001100,%11111111,%11111111,0),b26
					gosub shiftt1
				next
				return			
		cas1:	;chiffre 1  col=b27, ici, c'est le n° de colone de la matrice et b26 sa description en bits
				for col=0 to 7
					lookup col ,(0,0,0,%11111111,%11111111,0,0,0),b26					
					gosub shiftt1
				next
				return
		cas2:	;chiffe 2	
				for col=0 to 7
					lookup col ,(0,%11111011,%11111011,%11011011,%11011011,%11011111,%11011111,0),b26
					gosub shiftt1
				next		
				return
		cas3:	;chiffe 3	
				for col=0 to 7
					lookup col ,(0,%11000011,%11000011,%11011011,%11011011,%11111111,%11111111,0),b26
					gosub shiftt1
				next		
				return
		cas4:
				for col=0 to 7					
					lookup col ,(0,%0011111,%00011111,%00011000,%00011000,%11111111,%11111111,0),b26	
					gosub shiftt1
				next		
				return
		cas5:
				for col=0 to 7
					lookup col ,(0,%11011111,%11011111,%11011011,%11011011,%11111011,%11111011,0),b26
					gosub shiftt1
				next		
				return	
		cas6:
				for col=0 to 7
					lookup col ,(0,255,255,219,219,251,251,0),b26	;binaire remplacé par décimal
					gosub shiftt1
				next		
				return	
    
;******** 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
shiftt1:
	b27=col+1					;le n° de col commence à 1 et pour lookup, c'est 0
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
PS, j'ai remplacé le précédent code, avec une légère modif des caractères

MM
bonjour
j ai ete absent quelques jours
mais du coup je n y comprends plus rien dans le programme

quand vous ecrivez ceci : "readadc10 capt, calv
select calv"
vous prsume que le capteur va donne une tension de combien ? parce si calv est supeieur a 1013 , moi je ne sait pas ce que c est

et pourquoi avoir fai cela ? " cas6:
for col=0 to 7
lookup col ,(0,255,255,219,219,251,251,0),b26 ;binaire remplacé par décimal"

et la ? casN:
for col=0 to 7
;lookup col ,(%11111111,%11111111,%00000110,%00001100,%00011000,%00110000,%11111111,%11111111),b26
lookup col ,(0,%11111111,%11111111,%00000110,%00001100,%11111111,%11111111,0),b26
gosub shiftt1

ne metrisant rien de ce programme je ne comprends rien
 

MGU

Senior Member
#11
ne metrisant rien de ce programme je ne comprends rien
Bonjour,

C'est pas très compliqué:

L'alimentation du µC est un 5v régulé.

readadc10 transforme cette tension de 0 à 5v en un nombre de 0 à 1023 (plus précis que readadc, avec un nombre de 0 à 255)
Les tensions en mv du premier programme sont donc traduites par règle de 3 en nombres de 0 à 1023 pour comparaison.
Select case envoie vers un sous programme en fonction de la tranche correspondant au nombre donné par redadc10.
Ce sous programme décrit le caractère affiché sur la matrice 8x8.
En binaire, on voit bien les pixels allumés dans chaque colonne, mais si on écrit ce nombre binaire en décimal, c'est pareil, en plus compacte, et ça donne la variante du n°6
Le shiftt1, c'est simplement pour ajuster le n° de colonne. le lookup numérote de 0 à 7 et le 7219 de 1 à 8

J'ai un peu modifié le dessin du N et du 4 , avec l'ancienne version du N en commentaire

Une vidéo du résultat suit

La voila: https://youtu.be/DOcvN3QDG-I.

MM
 
Last edited:
Top