Sortie avec registre à decalage et bascule D

DAT44

New Member
Bonjour à tous,
je débute sur les µp, j'ai choisis PIC AXE pour commencé,
pour faire mes premier pas j' utilise un 08M2 , pour augmenté les sorties je pourrais utilisé des modèles avec plus de pattes, mais bon, la c'est pour apprendre, je souhaite utilise un registre a décalage suivit d'une bascule D.
J'ai placé les données en sortie 1, l'horloge du registre à décalage en sortie 2 et la validation des bascule D en sortie 4.
j'ai écrit ce code, mais je le trouve un peu lourd, il y a t'il une écriture plus légère ?

affich:
Code:
	low 2:low 4	'H et L RAZ
	if bit0=0 then low 1 :else high 1:endif	'sortie de W0			
	high 2						'validation data (H registe à décalage)
	low 2
	if bit1=0 then low 1 :else high 1:endif			
	high 2
	low 2
	if bit2=0 then low 1 :else high 1:endif			
	high 2
	low 2
	if bit3=0 then low 1 :else high 1:endif			
	high 2
	low 2
	if bit4=0 then low 1 :else high 1:endif			
	high 2
	low 2
	if bit5=0 then low 1 :else high 1:endif			
	high 2
	low 2
	if bit6=0 then low 1 :else high 1:endif			
	high 2
	low 2
	if bit7=0 then low 1 :else high 1:endif			
	high 2
	low 2
	if bit8=0 then low 1 :else high 1:endif			
	high 2
	low 2
	if bit9=0 then low 1 :else high 1:endif			
	high 2
	low 2
	if bit10=0 then low 1 :else high 1:endif			
	high 2
	low 2
	if bit11=0 then low 1 :else high 1:endif			
	high 2
	low 2
	high 4						'validation bascule D
	low 4
	return
 
Last edited by a moderator:

westaust55

Moderator
Bienvenue sur le forum PICAXE.


Cet exemple de code de programme PICAXE vous aider :

Code:
SYMBOL varout = w0 ; w0 = b1:b0 ;variable soit envoyé/décalé sur
SYMBOL counter = b2  ; compteur de boucle pour le nombre de bits doivent être envoyés
SYMBOL mask = b3  ;   Maintenez le bit le plus significatif de données
SYMBOL bits = 12   ; nombre de bits de données à envoyer

SYMBOL MSBValue = $8000 ; valeur pour le bit le plus significatif de la valeur

;   définir les broches e/s pour les signaux de Registre Maj
SYMBOL sdata = C.1
SYMBOL sclk  = C.2
SYMBOL sload = C.4

Main:
        varout = 321  ;  assigner une valeur à envoyer au registre à décalage
        varout = varout * 16 ; déplacer les 4 bits a laissé pour plus importants bit premier déplacement
        GOSUB shiftout_MSBFirst
        END


‘========================================================================
‘ ***** Shiftout MSB first *****
shiftout_MSBFirst:
    for counter = 1 to bits ‘ number of bits
        mask = var_out & MSBValue ‘ mask MSB
        if mask = 0 then skipMSB
        low sdata ‘ data low
skipMSB: pulsout sclk,1 ‘ pulse clock for 10us
        var_out = var_out * 2 ‘ shift variable left for MSB
    next counter
    return
 

DAT44

New Member
Bonjour westaust55,
le programme ne fonctionne pas , j'ai mis mask sur w1 et conter sur b4, var_out en varout et modifié le if pour sortir les état 1, c'est bon ?

Code:

SYMBOL varout = w0 ; w0 = b1:b0 ;variable soit envoyé/décalé sur
SYMBOL counter = b4 ; compteur de boucle pour le nombre de bits doivent être envoyés
SYMBOL mask = w1 ; Maintenez le bit le plus significatif de données
SYMBOL bits = 12 ; nombre de bits de données à envoyer

SYMBOL MSBValue = $8000 ; valeur pour le bit le plus significatif de la valeur

; définir les broches e/s pour les signaux de Registre Maj
SYMBOL sdata = C.1
SYMBOL sclk = C.2
SYMBOL sload = C.4

Main:
varout = 321 ; assigner une valeur à envoyer au registre à décalage
varout = varout * 16 ; déplacer les 4 bits a laissé pour plus importants bit premier déplacement
GOSUB shiftout_MSBFirst
pulsout sload,1
END


‘========================================================================
‘ ***** Shiftout MSB first *****
shiftout_MSBFirst:
for counter = 1 to bits ‘ number of bits
mask = varout & MSBValue ‘ mask MSB
if mask = 0 then low sdata : else high sdata : endif ' data
skipMSB: pulsout sclk,1 ‘ pulse clock for 10us
varout = varout * 2 ‘ shift variable left for MSB
next counter
return
 

DAT44

New Member
Bonjour,
peut on aussi faire un décalage à droite, cela est-il moins performant ?

Code:

SYMBOL varout = w0 ; w0 = b1:b0 ;variable soit envoyé/décalé sur
SYMBOL counter = b2 ; compteur de boucle pour le nombre de bits doivent être envoyés
SYMBOL mask = b3 ; Maintenez le bit le plus significatif de données
SYMBOL bits = 12 ; nombre de bits de données à envoyer

SYMBOL LSBValue = 1 ; valeur pour le bit le moins significatif de la valeur

; définir les broches e/s pour les signaux de Registre Maj
SYMBOL sdata = C.1
SYMBOL sclk = C.2
SYMBOL sload = C.4

Main:
varout = 5 ' assigner une valeur à envoyer au registre à décalage
GOSUB shiftout_LSBFirst
pulsout sload,1
END


‘========================================================================
‘ ***** Shiftout LSB first *****
shiftout_LSBFirst:
for counter = 1 to bits ‘ number of bits
mask = b0 & LSBValue ‘ mask LSB
if mask = 0 then low sdata : else high sdata : endif ' data
pulsout sclk,1 ‘ pulse clock for 10us
varout = varout / 2 ‘ shift variable right for LSB
next counter
return
 

westaust55

Moderator
Ah oui, je devrais ont utilisé une variable mot pour la variable "mask" :mad:


Décalage vers la gauche avec le bit le moins significatif est tout d'abord aussi possible et non moins efficaces.


Si vous déplacez vers la gauche ou vers la droite dépend de la conception du projet.
Pour une puce comme 74HC595, il n'est pas très important, mais pour certains autres puces à l'aide des registres à décalage, la puce s'attend que les données contenues dans une séquence donnée comme indiqué dans la fiche technique.
 
Top