codigo de barras

Software e Hardware para linha x51

Moderadores: 51, guest2003, Renie, gpenga

codigo de barras

Mensagempor edusoppa » 07 Ago 2007 14:31

Olá pessoal,
Estou desenvolvendo um leitor de codigo de barras, mas estou com uma dificuldade em pegar o valor das barras, estou fazendo assim:
Quando muda de nivel o sinal eu gero uma interrupcao externa e comeco a contar o tempo ate que gere uma nova interrupcao, ai eu consigo saber se tenho uma barra ou duas barras.

Mas nao esta dando muito certo o tempo é muito variavel e nao consigo ter precisao, alguem tem alguma dica?

Obrigado.
edusoppa
Nibble
 
Mensagens: 55
Registrado em: 23 Out 2006 15:55

Mensagempor rocknroll » 07 Ago 2007 17:01

Realmente vai ser dificil medir alguma coisa se vc se basear em tempos fixos. A passagem de um código varia de acordo com a pessoa que passa e mesmo esta dificilmente conseguirá repetir a velocidade.

Talvez o ideal seja você marcar alguns tempos conforme a pessoa for passando o código para que assim voce consiga determinar o tempo correto entre barras grossas e finas. Assim voce teria o tempo de passagem atual.

flw
Rock N Roll
rocknroll
Byte
 
Mensagens: 218
Registrado em: 11 Out 2006 14:19
Localização: Butantã - São Paulo - SP

Mensagempor helton » 08 Ago 2007 08:39

Eu me fiz da seguinte maneira... ( talvez existam maneiras melhores de se fazer isso ...)

#1 -> eu ligo o pino do sensor em dois pinos de interrupção Ext0 e Ext1.
#2 -> configuro Ext0 como borda de subida e Ext1 como borda de descida.
#3 -> crio um timer de 25us ( timer 0 )
#4 -> Dentro desse timer eu incremento uma variável, que é o tempo de largura da barra.
#5 -> Toda vez que ocorre uma interrupção ( ext0 ou ext1 ) capturo o valor da variável que está no timer e capturo o tipo da interrupção

Código: Selecionar todos
 struct barcode{
  bool type:1;
  unsigned char interval:1;
 };

struct bacode card[32]; //nem um pouco economico na memória...
unsigned char cardpt;

void timer{
 tmp_barcode++;
}

void ext0{ //board de subida
  card[cardpt].type = 0;
  card[cardpt].interval = tmp_barcode;
  tmp_barcode = 0x00;
  cardpt++;
}

void ext1{ //board de descida
  card[cardpt].type = 1;
  card[cardpt].interval = tmp_barcode;
  tmp_barcode = 0x00;
  cardpt++;
}



#6 -> feito isso...gera uma média aritmética da largura dos pulsos para saber se são barras simples ou barras duplas.
#7 -> a partir desse ponto voce sabe se são barras simples, ou duplas e se são brancas ou escuras...
#8 -> ir em: http://www.barcodeisland.com/ e procuar o padrão que voce utiliza ( code39, code128, interleaved 2 of 5 )

Bem...é o que eu fiz e funciona legal...a unica coisa ruim é que utiliza muitos recursos do micro....

att
Helton Marques
"Priorize as Prioridades"
helton
Byte
 
Mensagens: 146
Registrado em: 16 Out 2006 09:18
Localização: São José-SC


Voltar para 8051

Quem está online

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

x