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