• R/O
  • SSH
  • HTTPS

pasripherals: Commit


Commit MetaInfo

Revision26 (tree)
Zeit2019-08-23 11:46:31
Autorderekwildstar

Log Message

- Implementadas mais 3 propriedades para o ADS1115

Ändern Zusammenfassung

Diff

--- trunk/src/lib/UADS1115.pas (revision 25)
+++ trunk/src/lib/UADS1115.pas (revision 26)
@@ -18,8 +18,32 @@
1818 //: escrever o valor ordinal de um dos elementos desta enumeração no
1919 //: registrador POINTER, é feita a seleção do registrador correspondente, o
2020 //: qual é acessado em operações subsequentes
21- TADS1115Register = (arConversion,arConfig,arLoThresh,arHiThresh);
21+ //: @Value(arConversion Valor que corresponde ao registrador CONVERSION)
22+ //: @Value(arConfig Valor que corresponde ao registrador CONFIG)
23+ //: @Value(arLoThresh Valor que corresponde ao registrador LO_THRESH)
24+ //: @Value(arHiThresh Valor que corresponde ao registrador HI_THRESH)
25+ //: @Value(arUnknown Este é o valor inicial retornado por esta classe quando
26+ //: se quer saber qual registrador está selecionado. Como não é possível ler o
27+ //: registrador POINTER, a biblioteca mantém um campo interno para isso e este
28+ //: é o valor inicial, o qual será alterado para o valor correto, tão logo a
29+ //: primeira leitura de registradores for realizada)
30+ TADS1115Register = (arConversion,arConfig,arLoThresh,arHiThresh,arUnknown);
2231
32+ //: Esta enumeração representa os possíveis valores disponíveis para o campo
33+ //: COMP_QUE do registrador CONFIG. Consulte as páginas 15 e 19 do DataSheet
34+ //: para maiores informações de como usar este campo e para que ele serve
35+ TADS1115ComparatorQueue = (acqAfterOne,acqAfterTwo,acqAfterFour,acqDisabled);
36+
37+ //: Esta enumeração representa os possíveis valores disponíveis para o campo
38+ //: COMP_LAT do registrador CONFIG. Consulte as páginas 15 e 19 do DataSheet
39+ //: para maiores informações de como usar este campo e para que ele serve
40+ TADS1115ComparatorLatching = (aclNonLatchingComparator,aclLatchingComparator);
41+
42+ //: Esta enumeração representa os possíveis valores disponíveis para o campo
43+ //: COMP_POL do registrador CONFIG. Consulte as páginas 15 e 19 do DataSheet
44+ //: para maiores informações de como usar este campo e para que ele serve
45+ TADS1115ComparatorPolarity = (acpActiveLow,acpActiveHigh);
46+
2347 //: Esta classe provê acesso simplificado ao ADS1115, um conversor
2448 //: analógico-digital de 16 bits muito popular
2549 //: @Member(AIn0 Obtém o valor da entrada analógica 0, que pode variar de 0
@@ -34,16 +58,26 @@
3458 private
3559 FI2CController: TPRI2CController;
3660 FSlaveAddress: TPRI2CSlaveAddress;
61+ FRegisterSelected: TADS1115Register;
3762
3863 //: Seleciona um dos registros do ADS1115. Este método funciona escrevendo
3964 //: dois bits no registrador POINTER a fim de informar ao ADS1115 qual
40- //: registrador será referenciado nas operações subsequentes. A tabela 6 do
41- //: datasheet contém os valores possíveis (p. 18). Este método levanta
42- //: exceções caso, por algum motivo, não seja possível escrever no
65+ //: registrador será referenciado nas operações de leitura subsequentes. A
66+ //: tabela 6 do datasheet contém os valores possíveis (p. 18). Este método
67+ //: levanta exceções caso, por algum motivo, não seja possível escrever no
4368 //: registrador POINTER.
69+ //:
70+ //: É possível configurar o registrador POINTER sozinho, em uma operação de
71+ //: escrita exclusiva e posteriormente realizar uma leitura do registrador
72+ //: que ele aponta. Não é necessário configurar este registrador antes de
73+ //: cada leitura porque o estado do registrador é persistido no ADS. Nas
74+ //: operações de escrita, entretanto, é sempre necessário configurar o
75+ //: registrador POINTER, juntamente com os dados que serão escritos,
76+ //: portanto, esta função não pode ser usada em operações de escrita com o
77+ //: intuito de selecionar o registrador onde se quer escrever
4478 //: @Param(ARegister Registrador que se quer selecionar)
4579 //: @SeeAlso(TADS1115Register)
46- procedure SelectRegisterForReadOperation(ARegister: TADS1115Register);
80+ procedure SelectRegister(ARegister: TADS1115Register);
4781 //: Obtém o valor completo do registrador CONFIG, ou seja, todas as
4882 //: configurações
4983 //: @Returns(Valor do registrador CONFIG)
@@ -65,6 +99,10 @@
6599 function GetGainAplifier: TADS1115GainAplifier;
66100 function GetDataRate: TADS1115DataRate;
67101 function GetMode: TADS1115Mode;
102+ function GetComparatorQueue: TADS1115ComparatorQueue;
103+ function GetComparatorLatching: TADS1115ComparatorLatching;
104+ function GetComparatorPolarity: TADS1115ComparatorPolarity;
105+
68106 //function GetAIn0: SmallInt;
69107 //function GetAIn1: SmallInt;
70108 //function GetAIn2: SmallInt;
@@ -73,6 +111,9 @@
73111 procedure SetGainAplifier(AGainAmplifier: TADS1115GainAplifier);
74112 procedure SetDataRate(ADataRate: TADS1115DataRate);
75113 procedure SetMode(AMode: TADS1115Mode);
114+ procedure SetComparatorQueue(AComparatorQueue: TADS1115ComparatorQueue);
115+ procedure SetComparatorLatching(ALatchingComparator: TADS1115ComparatorLatching);
116+ procedure SetComparatorPolarity(AComparatorPolarity: TADS1115ComparatorPolarity);
76117 public
77118 constructor Create(AI2CController: TPRI2CController; ASlaveAddress: TPRI2CSlaveAddress); reintroduce;
78119
@@ -79,6 +120,9 @@
79120 property GainAplifier: TADS1115GainAplifier read GetGainAplifier write SetGainAplifier;
80121 property DataRate: TADS1115DataRate read GetDataRate write SetDataRate;
81122 property Mode: TADS1115Mode read GetMode write SetMode;
123+ property ComparatorQueue: TADS1115ComparatorQueue read GetComparatorQueue write SetComparatorQueue;
124+ property ComparatorLatching: TADS1115ComparatorLatching read GetComparatorLatching write SetComparatorLatching;
125+ property ComparatorPolarity: TADS1115ComparatorPolarity read GetComparatorPolarity write SetComparatorPolarity;
82126
83127 { -37768 até 32767}
84128 //property AIn0: SmallInt read GetAIn0;
@@ -109,23 +153,72 @@
109153 CONFIG_MUX = 12; CONFIG_MUX_SOZE = 3;
110154 CONFIG_OS = 15; CONFIG_OS_SIZE = 1;
111155
112-// É possível configurar o registrador POINTER sozinho, em uma operação de
113-// escrita exclusiva e, posteriormente, realizar a leitura do registrador que
114-// ele aponta. Não é necessário configurar este registrador antes de cada
115-// leitura. Nas operações de escrita, entretanto, é sempre necessário configurar
116-// o registrador POINTER, juntamente com os dados que serão escritos, portanto,
117-// a função abaixo não pode ser usada em operações de escrita com o intuito de
118-// selecionar o registrador onde se quer escrever. O nome dela foi pensado para
119-// lembrar que isso não pode ser feito
120-procedure TADS1115.SelectRegisterForReadOperation(ARegister: TADS1115Register);
156+
157+{
158+ Ao escrever
159+
160+ byte 1 = endereço **
161+ byte 2 = pointer
162+ byte 3 = MSB a escrever no registrador indicado no pointer *
163+ byte 4 = LSB a escrever no registrador indicado no pointer *
164+
165+ ** não é necessário, o RPI já envia o endereço automaticamente
166+ * é opcional e depende do registrador que se deseja escrever
167+
168+
169+
170+
171+ Ao ler, simplesmente leia. O valor a ser lido é o valor do ultimo registrador
172+ selecinado com uma operação de escrita no registrador POINTER
173+
174+
175+1. O registro POINTER só pode ser escrito, logo, seu status é guardado em um
176+ campo privado da classe tão logo ele for alterado (escrito) a fim de evitar
177+ operações de escrita desnecessárias para mudança do registro apontado. Este
178+ registrador mantém seu estado entre as operações
179+
180+2. Operações de leitura lêem diretamente o registrador que foi selecionado
181+ anteriormente no registrador POINTER.
182+
183+3. Para ler um dos dois registradores legíveis (CONVERSION E CONFIG), primeiro
184+ use uma operação de escrita para escrever no registrador POINTER o valor que
185+ corresponde ao registrador a ser lido. Esta etapa não precis aser realizada
186+ caso o registrador POINTER já tenha sido configurado para apontar para o
187+ registrador a ser lido em uma operação anterior.
188+
189+ Em uma segunda operação, agora de leitura, leia o registrador desejado.
190+
191+4. Para escrever nos registradores escrevíveis (POINTER e CONFIG) a operação
192+ precisa ser feita de uma só vez, levando em conta a ordem da informação que o
193+ ADS espera receber. Veja a seção "Ao escrever" mostrada anteriormente. O ADS
194+ espera receber um máximo de 4 bytes e um mínimo de 2 bytes. Os dois bytes
195+ obrigatórios são o byte 1 que define o endereço com a operação de gravação e
196+ o byte 2 que escreve no registrador POINTER. Os bytes opcionais são os bytes
197+ 3 e 4. Ao se gravar o registrador POINTER, são necessários apens 2 bytes. Ao
198+ se gravar no registrador CONFIG são necessários de 3 a 4 bytes: 2 bytes
199+ obrigatórios (endereço + pointer) e os 2 bytes (16 bits) referentes aos
200+ valores contidos no registrador CONFIG. O terceiro byte (primeiro opcional)
201+ recebe o MSB do registrador config. O quarto byte (segundo opcional) recebe o
202+ LSB do registrsdor config.
203+
204+ MSB = most significant byte
205+ LSB = less significant byte
206+
207+}
208+
209+procedure TADS1115.SelectRegister(ARegister: TADS1115Register);
121210 begin
122- I2C[FI2CController,FSlaveAddress].Write8Bits(Byte(ARegister),'Erro ao selecionar o registrador "' + GetEnumName(TypeInfo(TADS1115Register),Ord(ARegister)));
211+ if ARegister <> FRegisterSelected then
212+ begin
213+ I2C[FI2CController,FSlaveAddress].Write8Bits(Byte(ARegister),'Erro ao selecionar o registrador "' + GetEnumName(TypeInfo(TADS1115Register),Ord(ARegister)));
214+ FRegisterSelected := ARegister;
215+ end;
123216 end;
124217
125218 function TADS1115.GetConfigRegister: UInt16;
126219 begin
127220 // Seleciona o registrador de configurações
128- SelectRegisterForReadOperation(arConfig);
221+ SelectRegister(arConfig);
129222
130223 // Lê todo o registrador de configurações
131224 I2C[FI2CController,FSlaveAddress].Read16Bits(Result,'Erro ao ler o registrador de configurações',True);
@@ -137,8 +230,13 @@
137230 begin
138231 GetMem(WBuffer,3);
139232 try
233+ // A operação de escrita vai invariavelmente alterar o POINTER, logo, é
234+ // preciso configurar o campo de registro selecionado
235+ FRegisterSelected := arConfig;
236+
140237 // Para modificar o registrador de configurações, são necessários 3 bytes
141- WBuffer[0] := Byte(arConfig); // Aponta para o registrador CONFIG
238+ WBuffer[0] := Byte(FRegisterSelected); // Aponta para o registrador CONFIG
239+
142240 WBuffer[1] := Hi(AConfigurations); // Byte mais significante das configurações
143241 WBuffer[2] := Lo(AConfigurations); // Byte menos significante das configurações
144242
@@ -195,6 +293,21 @@
195293 Result := TADS1115Mode(GetConfigField(CONFIG_MODE,CONFIG_MODE_SIZE));
196294 end;
197295
296+function TADS1115.GetComparatorQueue: TADS1115ComparatorQueue;
297+begin
298+ Result := TADS1115ComparatorQueue(GetConfigField(CONFIG_COMP_QUE,CONFIG_COMP_QUE_SIZE));
299+end;
300+
301+function TADS1115.GetComparatorLatching: TADS1115ComparatorLatching;
302+begin
303+ Result := TADS1115ComparatorLatching(GetConfigField(CONFIG_COMP_LAT,CONFIG_COMP_LAT_SIZE));
304+end;
305+
306+function TADS1115.GetComparatorPolarity: TADS1115ComparatorPolarity;
307+begin
308+ Result := TADS1115ComparatorPolarity(GetConfigField(CONFIG_COMP_POL,CONFIG_COMP_POL_SIZE));
309+end;
310+
198311 //function TADS1115.GetAIn0: SmallInt;
199312 //begin
200313 //{ Configure o mux para single end (100) antes de ler o valor
@@ -221,24 +334,40 @@
221334
222335 procedure TADS1115.SetGainAplifier(AGainAmplifier: TADS1115GainAplifier);
223336 begin
224- SetConfigField(CONFIG_PGA,CONFIG_PGA_SIZE,Byte(AGainAmplifier));
337+ SetConfigField(CONFIG_PGA,CONFIG_PGA_SIZE,UInt8(AGainAmplifier));
225338 end;
226339
227340 procedure TADS1115.SetDataRate(ADataRate: TADS1115DataRate);
228341 begin
229- SetConfigField(CONFIG_DR,CONFIG_DR_SIZE,Byte(ADataRate));
342+ SetConfigField(CONFIG_DR,CONFIG_DR_SIZE,UInt8(ADataRate));
230343 end;
231344
232345 procedure TADS1115.SetMode(AMode: TADS1115Mode);
233346 begin
234- SetConfigField(CONFIG_MODE,CONFIG_MODE_SIZE,Byte(AMode));
347+ SetConfigField(CONFIG_MODE,CONFIG_MODE_SIZE,UInt8(AMode));
235348 end;
236349
350+procedure TADS1115.SetComparatorQueue(AComparatorQueue: TADS1115ComparatorQueue);
351+begin
352+ SetConfigField(CONFIG_COMP_QUE,CONFIG_COMP_QUE_SIZE,UInt8(AComparatorQueue));
353+end;
354+
355+procedure TADS1115.SetComparatorLatching(ALatchingComparator: TADS1115ComparatorLatching);
356+begin
357+ SetConfigField(CONFIG_COMP_LAT,CONFIG_COMP_LAT_SIZE,UInt8(ALatchingComparator));
358+end;
359+
360+procedure TADS1115.SetComparatorPolarity(AComparatorPolarity: TADS1115ComparatorPolarity);
361+begin
362+ SetConfigField(CONFIG_COMP_POL,CONFIG_COMP_POL_SIZE,UInt8(AComparatorPolarity));
363+end;
364+
237365 constructor TADS1115.Create(AI2CController: TPRI2CController; ASlaveAddress: TPRI2CSlaveAddress);
238366 begin
239367 inherited Create;
240368 FI2CController := AI2CController;
241369 FSlaveAddress := ASlaveAddress;
370+ FRegisterSelected := arUnknown;
242371 end;
243372
244373 end.
Show on old repository browser