collapse

* Posts Recentes

O que é isto ? por SerraCabo
[12 de Abril de 2024, 14:20]


Amplificador - Rockboard HA 1 In-Ear por almamater
[11 de Abril de 2024, 20:46]


Emulador NES em ESP32 por dropes
[10 de Abril de 2024, 15:30]


Meu novo robô por josecarlos
[29 de Março de 2024, 18:30]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: PAN3101 - OPTICAL MOUSE SENSOR  (Lida 16980 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline Dave

  • Mini Robot
  • *
  • Mensagens: 368
    • "O Engenhocas"
Re: PAN3101 - OPTICAL MOUSE SENSOR
« Responder #15 em: 25 de Dezembro de 2012, 19:55 »
Após uns testes no PROTEUS e olhar os gráficos dos vários sinais... algo aqui não bate certo.

Quando estou a receber, perco o sinal de clock.
David Martins
Eng. Electrotécnica e de Computadores, UBI

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: PAN3101 - OPTICAL MOUSE SENSOR
« Responder #16 em: 25 de Dezembro de 2012, 20:01 »
Mas estás a simular isso?
Estou fartinho de ler problemas com o Proteus, principalmente quando é a simular micros...
Avr fanboy

Offline Dave

  • Mini Robot
  • *
  • Mensagens: 368
    • "O Engenhocas"
Re: PAN3101 - OPTICAL MOUSE SENSOR
« Responder #17 em: 25 de Dezembro de 2012, 20:43 »
No proteus não consigo simular o PAN3101...

Só que agora lembrei-me de ver o que tinha nos pinos de comunicação, pois estive a ver com o osciloscópio e o clock não está lá sempre.
Ele ligar apenas para fazer o out dos dados e depois desliga...
Não estou a fazer algo bem.


Estou a usar um PIC16F88
David Martins
Eng. Electrotécnica e de Computadores, UBI

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: PAN3101 - OPTICAL MOUSE SENSOR
« Responder #18 em: 25 de Dezembro de 2012, 21:05 »
É normal, o SPI não tem sempre o clock activo, porque os dispositivos SPI funcionam como um shift-register, a cada clock é enviado e recebido um bit.
Mas já agora, tens a polaridade e o idle do SPI como manda esse chip, é que o SPI tem 4 modos, primeira transição do clock a high ou a low, e latching dos dados na transição ascendente ou descente do sinal de clock.
Avr fanboy

Offline Dave

  • Mini Robot
  • *
  • Mensagens: 368
    • "O Engenhocas"
Re: PAN3101 - OPTICAL MOUSE SENSOR
« Responder #19 em: 25 de Dezembro de 2012, 21:28 »
É normal, o SPI não tem sempre o clock activo, porque os dispositivos SPI funcionam como um shift-register, a cada clock é enviado e recebido um bit.

Aqui está a confusão... mas como é possível ao mesmo tempo que eu envio o enderesso, o sensor estar já a colocar o valor do mesmo.
Ele não sabe qual vai ser...  :o
David Martins
Eng. Electrotécnica e de Computadores, UBI

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: PAN3101 - OPTICAL MOUSE SENSOR
« Responder #20 em: 25 de Dezembro de 2012, 21:38 »
O problema é que tu não sabes usar dispositivos SPI, devias dar uma olhadela melhor nas datasheets..
Normalmente escreves o endereço que queres, e o que recebes quando envias esse endereço é lixo, para teres os dados correctos fazes um ou mais dummy writtes e lês os dados reais e não lixo/ruido na leitura, aliás, nesse caso para receberes nem sequer tens de enviar nada, só tens de meter o clock a correr, porque isso tem só um pino para leitura e escrita, mas como estás a usar o controlador SPI por hardware tens de fazer escritas, mas como tens os pinos de escrita e leitura juntos não sei até que ponto é que isso vai funcionar perfeitamente bem.
Avr fanboy

Offline Dave

  • Mini Robot
  • *
  • Mensagens: 368
    • "O Engenhocas"
Re: PAN3101 - OPTICAL MOUSE SENSOR
« Responder #21 em: 25 de Dezembro de 2012, 21:56 »
Aquela questão dos acertos de clock (polariadade etc) em principio está certo.
Pelo menos bate certo a imagem do datasheet do PAN com a do datasheet do micro, usando CKE=0 e CKP=1.

Código: [Seleccione]
//SPI
SSPSTATbits.SMP = 0;
SSPSTATbits.CKE = 0;

SSPCONbits.SSPEN = 1;
SSPCONbits.CKP   = 1;
SSPCONbits.SSPM  = 0b0010; //freq clkout=62k500hz




Mas assim não deveria dar alguma coisa?
*limpo a flag;
*envio 0x03;
*aguardo pela flag;
*limpo o lixo que fica no buffer e faço uma "escrita" - isto dá-me mais 8 clock's para receber;
*limpo a flag;
*preparo o pino para receber;
*aguardo pela flag;
*faço leitura do buffer

Está feito...


Código: [Seleccione]
while(1)
{

PIR1bits.SSPIF=0;
SSPBUF=0x03;
while(!PIR1bits.SSPIF);
SSPBUF=0; //limpo o lixo e faço uma "escrita"
PIR1bits.SSPIF=0;
TRISB2=1; //tri-state
while(!PIR1bits.SSPIF); //espera resposta
A[0]=SSPBUF;
TRISB2=0; //output again
__delay_ms(100);
}


Emulei um sinal no PROTEUS para fazer a leitura do mesmo.
Era suposto receber 10101010 e é mesmo isso que recebo...
O problema poderá é estar naquele período morto...

David Martins
Eng. Electrotécnica e de Computadores, UBI

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: PAN3101 - OPTICAL MOUSE SENSOR
« Responder #22 em: 25 de Dezembro de 2012, 21:58 »
Supostamente o primeiro bit não tem de estar a 1, ou seja HIGH?
Logo não devia ser 0x03..
Avr fanboy

Offline Dave

  • Mini Robot
  • *
  • Mensagens: 368
    • "O Engenhocas"
Re: PAN3101 - OPTICAL MOUSE SENSOR
« Responder #23 em: 25 de Dezembro de 2012, 23:54 »
Supostamente o primeiro bit não tem de estar a 1, ou seja HIGH?
Logo não devia ser 0x03..

Isso era para escrita, para leitura é mesmo só "0x03".

Primeiro bit:
1 - escrita
0 - leitura
David Martins
Eng. Electrotécnica e de Computadores, UBI

Offline Dave

  • Mini Robot
  • *
  • Mensagens: 368
    • "O Engenhocas"
Re: PAN3101 - OPTICAL MOUSE SENSOR
« Responder #24 em: 26 de Dezembro de 2012, 02:03 »
Ele está a enviar alguns valores enquanto o vou mexendo e dá zero, quando eu paro de lhe mexer.
Mas não acho que os valores sejam muito correctos...

David Martins
Eng. Electrotécnica e de Computadores, UBI

Offline tr3s

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 811
  • char x=1, y=5; x^=y^=x^=y;
Re: PAN3101 - OPTICAL MOUSE SENSOR
« Responder #25 em: 26 de Dezembro de 2012, 11:55 »
Então mas espera lá, esse sensor dá-te deltas ou valor absoluto? Se for deltas, se o páras dá-te zero claro, está parado.
Tr3s
Daniel Gonçalves

Offline tr3s

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 811
  • char x=1, y=5; x^=y^=x^=y;
Re: PAN3101 - OPTICAL MOUSE SENSOR
« Responder #26 em: 26 de Dezembro de 2012, 11:58 »
Esse sensor dá-te deltas, a cada leitura os registos são esmagados. Tabela Pág. 7 do datasheet:

Citar
Register 0x16 allows the user to determine if motion has occurred since the last time it was read. If
so, then the user should read registers 0x17 and 0x18 to get the accumulated motion. It also tells if
the motion buffers have overflowed since the last reading. The current resolution is also shown.
Reading this register freezes the Delta_X and Delta_Y register values. Read this register before
reading the Delta_X and Delta_Y registers. If Delta_X and Delta_Y are not read before the motion
register is read a second time, the data in Delta_X and Delta_Y will be lost.

Citar
X movement is counts since last report. Absolute value is determined by resolution. Reading clears
the register. Report range –128~+127.

Citar
Y movement is counts since last report. Absolute value is determined by resolution. Reading clears
the register. Report range –128~+127.
Tr3s
Daniel Gonçalves

Offline Dave

  • Mini Robot
  • *
  • Mensagens: 368
    • "O Engenhocas"
Re: PAN3101 - OPTICAL MOUSE SENSOR
« Responder #27 em: 26 de Dezembro de 2012, 14:43 »
No entanto, eu nunca tenho valores grandes, tipo 100 ou -100.

Eu sou capaz mexer um bocado grande e a próxima leitura ser tipo 2, ou 3.
Haveria de ser 127, por exemplo, pois a cada 31.75µm ele deveria incrementar 1, certo?
David Martins
Eng. Electrotécnica e de Computadores, UBI

Offline microbyte

  • Mini Robot
  • *
  • Mensagens: 1.322
    • http://ricardo-dias.com/
Re: PAN3101 - OPTICAL MOUSE SENSOR
« Responder #28 em: 26 de Dezembro de 2012, 17:30 »
Mas tu não podes deixar isso acumular muito, porque vai-te dar overflow, o que tens de fazer é leituras "o mais rápido possível", gravas os dados para o PC, por exemplo, e fazes um gráfico.

O que vais é amostrar um valor de um acumulador, se demoras muito tempo a ler, o mais certo é o acumulador ter dado a volta...

Tens de garantir que lês antes do acumulador chegar ao valor máximo (127 ou -127)

Offline Dave

  • Mini Robot
  • *
  • Mensagens: 368
    • "O Engenhocas"
Re: PAN3101 - OPTICAL MOUSE SENSOR
« Responder #29 em: 28 de Dezembro de 2012, 02:47 »
Comecei a guardar os valores todos, a cada 10ms.

Obtive a lista de valores em baixo.

Citar
Update Address Symbol Name Value  Decimal    Binary   

          020 main@A      ""                   
          023 [3]            '.'      1     00000001
          024 [4]            '.'      0     00000000
          025 [5]            '.'      0     00000000
          026 [6]            '.'      0     00000000
          027 [7]            '.'      0     00000000
          028 [8]            '.'      0     00000000
          029 [9]            '.'      0     00000000
          02A [10]           '.'      0     00000000
          02B [11]           '.'      0     00000000
          02C [12]           '.'      0     00000000
          02D [13]           '.'      0     00000000
          02E [14]           '.'      0     00000000
          02F [15]           '.'      0     00000000
          030 [16]           '.'      0     00000000
          031 [17]           '.'      0     00000000
          032 [18]           '.'      0     00000000
          033 [19]           '.'      0     00000000
          034 [20]           '.'      0     00000000
          035 [21]           '.'     -1     11111111
          036 [22]           '.'      0     00000000
          037 [23]           '.'      0     00000000
          038 [24]           '.'      0     00000000
          039 [25]           '.'      0     00000000
          03A [26]           '.'      0     00000000
          03B [27]           '.'      0     00000000
          03C [28]           '.'      0     00000000
          03D [29]           '.'      0     00000000
          03E [30]           '.'      0     00000000
          03F [31]           '.'      0     00000000
          040 [32]           '.'      0     00000000
          041 [33]           '.'      1     00000001
          042 [34]           '.'      5     00000101
          043 [35]           '.'      2     00000010
          044 [36]           '.'      1     00000001
          045 [37]           '.'      0     00000000
          046 [38]           '.'      0     00000000
          047 [39]           '.'      0     00000000
          048 [40]           '.'      0     00000000
          049 [41]           '.'      0     00000000
          04A [42]           '.'      0     00000000
          04B [43]           '.'      0     00000000
          04C [44]           '.'      0     00000000
          04D [45]           '.'      0     00000000
          04E [46]           '.'      0     00000000
          04F [47]           '.'      0     00000000
          050 [48]           '.'      0     00000000
          051 [49]           '.'      0     00000000
          052 [50]           '.'      0     00000000
          053 [51]           '.'      0     00000000
          054 [52]           '.'      0     00000000
          055 [53]           '.'      0     00000000
          056 [54]           '.'      0     00000000
          057 [55]           '.'      0     00000000
          058 [56]           '.'      0     00000000
          059 [57]           '.'      0     00000000
          05A [58]           '.'      0     00000000
          05B [59]           '.'      0     00000000


Usei este código:
Código: [Seleccione]
i=3;

while(i<50)
{
PIR1bits.SSPIF=0;
SSPBUF=0b00000011;
while(!PIR1bits.SSPIF);
A[2]=SSPBUF;
SSPBUF=0;
TRISB2=1;     //tri-state

while(!SSPSTATbits.BF);  //espera resposta
A[i]=SSPBUF;

TRISB2=0;     //output again
__delay_ms(100);
i++;
}


Das duas uma, ou não estou a conseguir falar "falar bem", ou então ele chateou-se comigo e não "fala" mais nada!
David Martins
Eng. Electrotécnica e de Computadores, UBI