Compressão de bytes

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Mensagempor Jozias del Rios » 13 Nov 2009 09:53

O link que vc postou não faz exatamente isso, mas a mesma fabricante desse chip, a FTDI, tem o VNC1L que o faria com um firmware closed-source apropriado disponível no site.

O problema é que este chip custa mais que muitos micro-controladores 32bits por ai. E é só o chip. Ela vende também o VDRIVE2, que já é a interface toda pronta, mas pelo triplo do preço: esse bixo não chega aqui por menos de R$ 60...
Os vencedores são aqueles que sabem o que fazer se perderem.
Os perdedores são aqueles que não sabem o que fazer se ganharem.
Avatar do usuário
Jozias del Rios
Byte
 
Mensagens: 279
Registrado em: 31 Out 2009 03:36
Localização: SJCampos-SP

Mensagempor Jozias del Rios » 13 Nov 2009 09:57

Quanto a conseguir alocar lossless 5 amostragens de um escalar inteiro limitado ao intervalo [0,51] em um espaço de 8 bits, te pago uma cerveja se conseguir. ;-)
Os vencedores são aqueles que sabem o que fazer se perderem.
Os perdedores são aqueles que não sabem o que fazer se ganharem.
Avatar do usuário
Jozias del Rios
Byte
 
Mensagens: 279
Registrado em: 31 Out 2009 03:36
Localização: SJCampos-SP

Mensagempor fabim » 13 Nov 2009 10:13

to pensano aqui,
de 8 bits, máximo utilizado = 6.

6 para 8 = 2
então em 3 bytes = 24 bits, da pra alocar 4 medidas.

seria algo do tipo binario tipo

char data[200];

struct{
amos_1 : 6;
amos_2 : 6;
amos_3 : 6;
amos_4 : 6;

} *amos4rs;

*amos4rs = &data[0];
primeira_temp = amos4rs.amos_1;

....

sucessivo, a sintaxi não bate pois estou com pregui. mais para cada 3 bytes seria 4 valores de no máximo 6 bits...

Será que isto não atende ?

Abraços
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Beeeem mais facil...

Mensagempor albertorcneto » 13 Nov 2009 10:34

Talvez o autor do post ate ja tenha resolvido o problema. Mas vou colocar aqui para futuras referencias.

Essa eh uma tecnica usada para armanezar dados de uma planta de automacao.

Como a variacao deve ser pequena, ela poderia ser armanezada so a diferenca, como foi falado antes, em 3 bits e complemento de 2.

011: 3
010: 2
001: 1
000: 0
111: -1
110: -2
101: -3

O suposto 100: 4 eh deixado para avisar que a variacao foi maior que 3 graus, o que implica que as proximas 2 series de 3 bits sao o valor absoluto da medida.

Sem propagacao de erro e com probabilidade de comprimir isso tudo com uma taxa media de 3,alguma coisa bits por medida.

E melhor: pode ser feito com meia duzia de linhas em C. Ou uma duzia de linhas em ASM.
"Nothing travels faster than the speed of light, with the possible exception of bad news, which obeys its own set of laws" ~ Douglas Adams
albertorcneto
Byte
 
Mensagens: 269
Registrado em: 28 Mar 2007 14:08

Mensagempor ze » 13 Nov 2009 10:38

tens razão amigo do rios. é que me lembrei de um chip, na verdade uma pci com chip e conector usb p pendrive que faz aquilo que mencionastes: espeto o pd e posso manipular via terminal (serial) tipo dando dir, cd, igual ao DOS (não sei se sabe o que é). sendo assim ficaria fácil implementar com uC. Só num me lembro direito. Na hora me pareceu mui simplista. O probl. é que esqueci qual é o dispositivo e não acho a fiodumaputa da revista que não sei se é elektor ou saber que vi este trem! Seria este tal de vnc1l? Se um dia eu achar a revista, dou uma 'revista' e atualizo as info.
Quanto ao desafio primordial do amigo do tópico vou (ou não) focar em fazer caber 100K em 64k com 4.78bits de resol. e só de reiva mando a solução SÓ pra ele. rs.
Este considero um desafio particularmente interessante pois possuímos um produto no mercado que usa tal memória e alguns itens de configuração usam 1 byte pra aproveitar 1 bit! Eventualmente posso fazer um upgrade no fw "aumentando" a memória.
living&learning
fabim cheguei a pensar naquilo mas pasme! a minha pregui é maior que a tua.
abç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor Jozias del Rios » 13 Nov 2009 10:44

Excelente modificação, Alberto!
Embora deixe de ser determinístico com relação ao tempo que vai levar para encher a memória, ele não terá erros nas medições.
Cabe ao criador do tópico decidir se isso é um requisito importante no projeto.
Os vencedores são aqueles que sabem o que fazer se perderem.
Os perdedores são aqueles que não sabem o que fazer se ganharem.
Avatar do usuário
Jozias del Rios
Byte
 
Mensagens: 279
Registrado em: 31 Out 2009 03:36
Localização: SJCampos-SP

Mensagempor MOR_AL » 13 Nov 2009 10:56

Alberto.
Parece que você encontrou uma ótima solução. :idea:
Simples e funcional.
É isso aí. Parabéns!!
MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor Diego_Oliveira » 16 Nov 2009 08:18

Seguinte eu já encontrei uma solução, assim que sobrar um tempinho posto o que fiz para vocês.


:D
Avatar do usuário
Diego_Oliveira
Nibble
 
Mensagens: 79
Registrado em: 05 Abr 2008 15:18
Localização: Rio Grande do Sul

Mensagempor Diego_Oliveira » 16 Nov 2009 08:48

Seguinte para entenderem melhor o que fiz, vou explicar como que trabalho.

Imajinem um cabo com 16 sensores (exemplo), parte destes 16 sensoes ficam no meio do produto, outra parte deles ficam fora....

Digamos que 8 estão fora do produto e 8 estão no meio do produto.

os 8 que estão dentro dele digamos que estaram assim :

20°C - 21°C - 20°C - 22°C - 21°C - 20°C - 22°C - 20°C

os que estão fora do produto, estaram assim :

35°C - 36°C - 36°C - 37°C - 36°C - 37°C - 38°C - 35°C

Demostra uma caracteristica, as temperaturas vão ficar en torno de um maximo e de um minimo....

O que eu fiz, armazeno a teperatura minima e a temperatura maxima....

e fiz um struct da seguinte forma :

struct{
maximo : 8;
minimo : 8;
amos_1 : 4;
amos_2 : 4;
......
......
amos_15 : 4;
amos_16 : 4;

} *amostrs;

leio os 16 sensores e armazeno as diferenças... mas da seguinte forma.

os dados nas variaveis de 4 bits ficariam assim :

1111 - somo 0 a menor temperatura para obter a temperatura do sensor.
1110 - somo 1 a menor temperatura para obter a temperatura do sensor.
1101 - somo 2 a menor temperatura para obter a temperatura do sensor.
......
......
1001 - somo 6 a menor temperatura para obter a temperatura do sensor.
1000 - somo 7 a menor temperatura para obter a temperatura do sensor.
0111 - subtraio 6 da maior temperatura para ob. a temp. do sensor.
0110 - subtraio 5 da maior temperatura para ob. a temp. do sensor.
......
......
0011 - subtraio 2 da maior temperatura para ob. a temp. do sensor.
0010 - subtraio 1 da maior temperatura para ob. a temp. do sensor.
0001 - subtraio 0 da maior temperatura para ob. a temp. do sensor.
0000 - sensor com defeito

Observem que deixei o maior RANGE de 0 a 7 para as temperaturas mais baixas que são os sensores que estão dentro do produto, e são as temperaturas que devo analizar... as outras não presisam ser exatamente certas são valores altos que estão fora do produto...

ai eu crio uma função pra codificar e outra pra decodificar que leve en consideração a temperatura maxima e minima...

Acabei usando dois consetos que os colegas que apresentaram ai, um que utiliza um struct do fabim se não me engano e outro do colega que sugeriu salvar apenas as diferenças.

Quando li a sugestão de salvar apenas as diferenças, pedi para clientes algums relatorios deles e analizei que considerando a minima e a maxima temperatura o resto dos sensores giram em torno dessas "referencias", variando muito pouco.

com isso para salvar 16 registrou ou temperaturas como preferirem, uso 10 bytes:

Quero salvar 100 mil :

10000 / 16 = 6250 cabos de 16 sensores

6250 * 10 (numeros de bytes utilizados para salvar cada cabo) = 62500 bytes

ainda sobra um espacinho pra salvar outras coisinhas :D
Avatar do usuário
Diego_Oliveira
Nibble
 
Mensagens: 79
Registrado em: 05 Abr 2008 15:18
Localização: Rio Grande do Sul

Mensagempor Djalma Toledo Rodrigues » 16 Nov 2009 09:31

20°C - 25°C - 20°C - 20°C - 21°C - 20°C - 22°C - 20°C

Máx 25
Min 20
Código: Selecionar todos
           somo 0 a menor temperatura para obter a temperatura do sensor.
           somo 1 a menor temperatura para obter a temperatura do sensor.
           somo 2 a menor temperatura para obter a temperatura do sensor.
......
......

           subtraio 2 da maior temperatura para ob. a temp. do sensor.
           subtraio 1 da maior temperatura para ob. a temp. do sensor.
           subtraio 0 da maior temperatura para ob. a temp. do sensor                     


20°C - 21°C - 22°C - 23°C - 22°C - 23°C - 24 °C - 25°C

Vai dar Zebra. rs
Editado pela última vez por Djalma Toledo Rodrigues em 16 Nov 2009 09:46, em um total de 2 vezes.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor Diego_Oliveira » 16 Nov 2009 09:39

Não compreendi porque vai dar zebra...

o que mostrei não foi como os dados ficariam na variavel segundo meu exemplo, e sim o que cada dado da variavel de 4 Bits irásuiguinificar para o programa analizar e decidir o que faz com a informação...

Não cheguei a colocar como ficaria meu exemplo já convertido...
Avatar do usuário
Diego_Oliveira
Nibble
 
Mensagens: 79
Registrado em: 05 Abr 2008 15:18
Localização: Rio Grande do Sul

Mensagempor Jozias del Rios » 16 Nov 2009 09:41

Vai dar zebra naum! rs..
Os vencedores são aqueles que sabem o que fazer se perderem.
Os perdedores são aqueles que não sabem o que fazer se ganharem.
Avatar do usuário
Jozias del Rios
Byte
 
Mensagens: 279
Registrado em: 31 Out 2009 03:36
Localização: SJCampos-SP

Mensagempor Djalma Toledo Rodrigues » 16 Nov 2009 11:04

O que eu quiz dizer com a zebrinha é que ficaria sempre em ordem crescente, e

lógicamente, distante da medição real.

Mas, essa Coleta de Dados de Temperatura é sempre do mesmo produto ?
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor Diego_Oliveira » 16 Nov 2009 13:13

Sim seria sim...
Avatar do usuário
Diego_Oliveira
Nibble
 
Mensagens: 79
Registrado em: 05 Abr 2008 15:18
Localização: Rio Grande do Sul

Mensagempor guest2003 » 21 Nov 2009 17:35

Nao sei se o amigo ja resolveu o caso :)

Mas ele queria apenas guardar um numero de 0 a 50 mais 1 bit de falha em apenas 1 byte...

O pessoal gosta de complicar sempre :)

Para guardar:
ByteEprom = Falha*0x80 + Temp;

Para ler:
Falha = ByteEprom >> 7; (pode ser 0 ou 1)
Temp = ByteEprom & 0x7F; (pode ir de 0 a 127)

pronto...
http://www.sethi.com.br (Institucional)
http://www.sethi3d.com.br (Impressoras 3d)
http://www.sethi.com.br/blog (Blog Impressoras 3d)
Avatar do usuário
guest2003
Word
 
Mensagens: 746
Registrado em: 13 Out 2006 11:48
Localização: Campinas - SP

AnteriorPróximo

Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x