Tiens, pour exemple je t'ai filé l'encodeur décodeur de bits que j'ai fait pour ma puce.
La puce qui est contrôlé est une ULN2003a. La puce que me fait communication et le transports des bits
dans le Bus que j'ai placé entre le COM et l'UNL2003a, est codé sur 8Bits... Logique il y a 8 entrées.
Code : Tout sélectionner
;-----------------------------------------------------------------------------------
;
; Modèle PUREBASIC : 2.6
;
;-----------------------------------------------------------------------------------
;
;-
;
; Titre du programme :
;- Auteur : MAD
;- Version : 0
;- Date de création :
;- Date de modification :
;
; Commentaires et remarques :
; ---------------------------
;
;
;
;
;
;-
;-----------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------
;- Comportement et directives de compilation (pour le compilateur)
;-----------------------------------------------------------------------------------
EnableExplicit
;EnableASM
;-----------------------------------------------------------------------------------
;- Définition des Structures
;-----------------------------------------------------------------------------------
Structure ConfigReveilleActionPort ; Conçu pour la fonction qui programme un bit du FIFO sur un temp donnée
ID_PeripheriqueUSB.i
Port.a
EtatPort.b
Duree.i ; Exprimer en millisecondes
EndStructure
;-----------------------------------------------------------------------------------
;- Définition des constantes
;-----------------------------------------------------------------------------------
; code erreur
Enumeration
#FT_OK
#FT_INVALID_HANDLE
#FT_DEVICE_NOT_FOUND
#FT_DEVICE_NOT_OPENED
#FT_IO_ERROR
#FT_INSUFFICIENT_RESOURCES
#FT_INVALID_PARAMETER
#FT_INVALID_BAUD_RATE
#FT_DEVICE_NOT_OPENED_FOR_ERASE
#FT_DEVICE_NOT_OPENED_FOR_WRITE
#FT_FAILED_TO_WRITE_DEVICE
#FT_EEPROM_READ_FAILED
#FT_EEPROM_WRITE_FAILED
#FT_EEPROM_ERASE_FAILED
#FT_EEPROM_NOT_PRESENT
#FT_EEPROM_NOT_PROGRAMMED
#FT_INVALID_ARGS
#FT_NOT_SUPPORTED
#FT_OTHER_ERROR
#FT_DEVICE_LIST_NOT_READY
EndEnumeration
Enumeration
#FT_DEVICE_BM
#FT_DEVICE_AM
#FT_DEVICE_100AX
#FT_DEVICE_UNKNOWN
#FT_DEVICE_2232C
#FT_DEVICE_232R
#FT_DEVICE_2232H
#FT_DEVICE_4232H
#FT_DEVICE_232H
EndEnumeration
;Constantes pour la fonction FT_SetBitMode
#FT_BITMODE_RESET = $00
#FT_BITMODE_ASYNC_BITBANG = $01
#FT_BITMODE_MPSSE = $02
#FT_BITMODE_SYNC_BITBANG = $04
#FT_BITMODE_MCU_HOST = $08
#FT_BITMODE_FAST_SERIAL = $10
#FT_BITMODE_CBUS_BITBANG = $20
#FT_BITMODE_SYNC_FIFO = $40
;
; Bit d'arrêt (Stop Bits)
;
#FT_STOP_BITS_1 = "0"
#FT_STOP_BITS_1_5 = "1"
#FT_STOP_BITS_2 = "2"
;
; Parité (Parity)
;
#FT_PARITY_NONE = "0"
#FT_PARITY_ODD = "1"
#FT_PARITY_EVEN = "2"
#FT_PARITY_MARK = "3"
#FT_PARITY_SPACE = "4"
;
; Contrôle de flux (Flow Control)
;
#FT_FLOW_NONE = $0000
#FT_FLOW_RTS_CTS = $0100
#FT_FLOW_DTR_DSR = $0200
#FT_FLOW_XON_XOFF = $0400
;
; Encode des bits de la puce FIFO
;
;Représente les pins FIFO codé sur 8 bits.
#FIFO_D0 = %00000001
#FIFO_D1 = %00000010
#FIFO_D2 = %00000100
#FIFO_D3 = %00001000
#FIFO_D4 = %00010000
#FIFO_D5 = %00100000
#FIFO_D6 = %01000000
#FIFO_D7 = %10000000
#FIFO_FULL = #FIFO_D0|#FIFO_D1|#FIFO_D2|#FIFO_D3|#FIFO_D4|#FIFO_D5|#FIFO_D6|#FIFO_D7
;-----------------------------------------------------------------------------------
;- Définition des prototypes
;-----------------------------------------------------------------------------------
Prototype.b FT_Open (NumUSB.i,*ID_USB)
Prototype.b FT_Close (ID_USB)
Prototype.b FT_Read (ID_USB,*RecuperationBiT,NombreBitsARecuperer,*RetourNBBit)
Prototype.b FT_Write (ID_USB,*CodeBinATransmettre,TailleBuffer_CodeBinATransmettre,*RetourNBBitEnvoye)
Prototype.b FT_SetBitMode (ID_USB, BitModeMask, ValeurUcMode)
;-----------------------------------------------------------------------------------
;- Définition des variables
;-----------------------------------------------------------------------------------
Global MUT_InstructionFIFO.i
;-----------------------------------------------------------------------------------
;- Ajout de modules
;-----------------------------------------------------------------------------------
;Import ".\FTDI_whql\static\i386\FTD2XX.obj"
;EndImport
;-----------------------------------------------------------------------------------
;- Ajout de données (DATASECTION)
;-----------------------------------------------------------------------------------
DataSection
EndDataSection
;-----------------------------------------------------------------------------------
;- Déclaration des procédures
;-----------------------------------------------------------------------------------
Declare.b ReveilleActionPort(*Config.ConfigReveilleActionPort)
;-----------------------------------------------------------------------------------
;- Définition des Objets
;-----------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------
;- Appel de pile / Initialisation de module (initNetwork())
;-----------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------
;- Execution du code
;-----------------------------------------------------------------------------------
MUT_InstructionFIFO = CreateMutex()
;-----------------------------------------------------------------------------------
;- Définition des Fonctions
;-----------------------------------------------------------------------------------
Procedure.i ChargeLibrairieFTDI(EmplacementLibrairie$="ftd2xx.dll")
Define ID_OuvertureLibrairieFTD2XX.i
;Shared ID_OuvertureLibrairieFTD2XX.i
Global FT_Open.FT_Open, FT_Close.FT_Close, FT_Write.FT_Write, FT_Read.FT_Read, FT_SetBitMode.FT_SetBitMode
EmplacementLibrairie$ = madlib_CodeNDF(EmplacementLibrairie$)
ID_OuvertureLibrairieFTD2XX = OpenLibrary(#PB_Any,EmplacementLibrairie$)
;Récupération des différentes Fonctions listé en prototype.
FT_Open = GetFunction(ID_OuvertureLibrairieFTD2XX,"FT_Open")
FT_Close = GetFunction(ID_OuvertureLibrairieFTD2XX,"FT_Close")
FT_Write = GetFunction(ID_OuvertureLibrairieFTD2XX,"FT_Write")
FT_Read = GetFunction(ID_OuvertureLibrairieFTD2XX,"FT_Read")
FT_SetBitMode = GetFunction(ID_OuvertureLibrairieFTD2XX,"FT_SetBitMode")
ProcedureReturn ID_OuvertureLibrairieFTD2XX
EndProcedure
Procedure.a EncodeBinFIFO(Port.a,EtatPort=#PB_Ignore)
Static CodeBinActuel.a
;Encode des bits avec les bits déja existants
;EncodageBin = RecupereCodeBinaire(ID_PeripheriqueUSB)
Debug "EncodeBinFIFO : Avant encodage => "+RSet(Bin(CodeBinActuel),8,"0")
Debug "EncodeBinFIFO : Port demandé => "+RSet(Bin(Port),8,"0")
;Si l'état du port est égal a False alors sous traction binaire du port
If EtatPort = #True
CodeBinActuel | Port
ElseIf EtatPort = #False
CodeBinActuel & ~Port
ElseIf EtatPort = #PB_Ignore
CodeBinActuel = Port
EndIf
Debug "EncodeBinFIFO : Après encodage => "+RSet(Bin(CodeBinActuel),8,"0")
Debug " -------------------------------"
ProcedureReturn CodeBinActuel
EndProcedure
Procedure.b ConfigureModeBitBang(ID_USB,PortFIFO.b=#FIFO_FULL,Mode=#FT_BITMODE_ASYNC_BITBANG)
Global MUT_InstructionFIFO
LockMutex(MUT_InstructionFIFO)
FT_SetBitMode(ID_USB,PortFIFO,Mode)
;CallFunction(1,"FT_SetBitMode",ID_USB,$FF,Mode)
UnlockMutex(MUT_InstructionFIFO)
EndProcedure
Procedure.a RecupereCodeBinaire(ID_PeripheriqueUSB,NombreBitARecuperer=8)
;Shared ID_OuvertureLibrairieFTD2XX
Protected RetourNBBits.a, RecuperationBiT.a, REF.a
Global MUT_InstructionFIFO
LockMutex(MUT_InstructionFIFO)
;CallFunction(ID_OuvertureLibrairieFTD2XX,"FT_Read",ID_PeripheriqueUSB,@RecuperationBiT,NombreBitsARecuperer,@RetourNBBits)
FT_Read(ID_PeripheriqueUSB,@RecuperationBiT,NombreBitARecuperer,@RetourNBBits)
REF = RecuperationBiT
UnlockMutex(MUT_InstructionFIFO)
ProcedureReturn REF
EndProcedure
Procedure.a EnvoyeCodeBinaire(ID_PeripheriqueUSB,CodeATransmettre.a) ; Sert juste a envoyer le code binaire au fifo via usb
;Shared ID_OuvertureLibrairieFTD2XX
Protected RetourNBBits.a, REF.a
Global MUT_InstructionFIFO
LockMutex(MUT_InstructionFIFO)
Debug "Envoye sur le port usb N° "+Str(ID_PeripheriqueUSB)
Debug "EnvoyeCodeBinaire : Envoye code binaire :> "+Bin(CodeATransmettre)+ " = "+Str(CodeATransmettre)
REF = FT_Write(ID_PeripheriqueUSB,@CodeATransmettre,SizeOf(CodeATransmettre),@RetourNBBits)
;CallFunction(ID_OuvertureLibrairieFTD2XX,"FT_Write",ID_PeripheriqueUSB,@CodeATransmettre,SizeOf(RecuperationBiT),@RetourNBBits)
UnlockMutex(MUT_InstructionFIFO)
ProcedureReturn REF
EndProcedure
Procedure.b SignalePortFIFO(ID_PeripheriqueUSB,Port.a,EtatPort.b=#False,Duree.i=#PB_Ignore)
Protected REF.a, ConfigurationDuReveilleDuPort.ConfigReveilleActionPort, *AdresseMem
;Envoye du mot binaire
REF = EnvoyeCodeBinaire(ID_PeripheriqueUSB,EncodeBinFIFO(Port,EtatPort))
Debug REF
;Si durée attente puis inversion du code binaire
If Duree > #False
Debug "Mise en route d'un THD pour le port FIFO"
If EtatPort = #False
EtatPort = #True
Else
EtatPort = #False
EndIf
*AdresseMem = AllocateMemory(SizeOf(ConfigReveilleActionPort))
ConfigurationDuReveilleDuPort\ID_PeripheriqueUSB = ID_PeripheriqueUSB
ConfigurationDuReveilleDuPort\Port = Port
ConfigurationDuReveilleDuPort\EtatPort = EtatPort
ConfigurationDuReveilleDuPort\Duree = Duree
CopyMemory(@ConfigurationDuReveilleDuPort,*AdresseMem,SizeOf(ConfigurationDuReveilleDuPort))
Debug "--- thd"
Debug CreateThread(@ReveilleActionPort(),*AdresseMem)
;Attente de l'acquitement
EndIf
ProcedureReturn REF
EndProcedure
Procedure.b ReveilleActionPort(*Config.ConfigReveilleActionPort)
Debug "OK"
Delay(*Config\Duree)
SignalePortFIFO(*Config\ID_PeripheriqueUSB,*Config\Port,*Config\EtatPort)
FreeMemory(*Config)
Debug "Fin THD"
EndProcedure
Procedure.b PulseSignalePortFIFO(ID_PeripheriqueUSB.i,Port.a,EtatPortDemarrage.b=#True,DureeImpulsion.i=1,NBImpulsion.i=1)
Protected ind_NBImpulsion.i, EtatPortFinImpulsion.b
If EtatPortDemarrage = #True
EtatPortFinImpulsion = #False
Else
EtatPortFinImpulsion = #True
EndIf
For ind_NBImpulsion = 1 To NBImpulsion
SignalePortFIFO(ID_PeripheriqueUSB,Port,EtatPortDemarrage)
Delay(DureeImpulsion)
SignalePortFIFO(ID_PeripheriqueUSB,Port,EtatPortFinImpulsion)
Next
EndProcedure
;-----------------------------------------------------------------------------------
;- FIN
;-----------------------------------------------------------------------------------