//************************************************************************ // leitor de cartão akiyama (PE310) // Version : 1.0 // microcontrolador : AVR ATMega8 // Autor : Aguivone // descrição : usando protocolo wigand // data : 15/07/2011. // //************************************************************************ #include <avr/io.h> #include <avr/interrupt.h> #include <stdio.h> #include <util/delay.h> #include <string.h> #define F_CPU 4000000UL // 4 MHz deve vir antes das interrupçoes ////////////////////////////definicões auxiliares////////////////////////////////////////// #define alterna_pino(x,y) x ^= _BV(y) ////////////////////////////parametrização////////////////////////////////////////// #define LEITOR1_B PD2 #define LEITOR1_A PD3 #define PROCESSA PD5 #define LEITOR_SAIDA PORTD ////////////////////////////variaveis usadas //////////////////////////////////////// int conta=0,ID,fac_code; int num=0; char teste[27]; ///////////////////////////////////////////////funçoes usadas pela usart//////////////////////////////////////////////// void serial_inicializa(unsigned int BAUD) { unsigned int valor = F_CPU/16/BAUD-1; //é recomendavel ver o data sheet para ter certeza se está formula irá funcionar na sua mcu /* baud rate */ UBRRH = (unsigned char)(valor>>8); UBRRL = (unsigned char)valor; UCSRA = 0X20; /* habilita receiver and transmitter buffers */ UCSRB = 0X98;//deve se habilitar somente a interrupção de recepção para não travar o microcontrolador /* 8 bits , 1 stop bit, assincrono , sem paridade */ UCSRC = 0X86; } void impri_serial(const char frase[80]) { unsigned int indice=0; unsigned int tamanho = strlen(frase); while(indice<=tamanho)///veja que o programa pode travar se aqui não tiver as duas aspas { while ( !( UCSRA & (1<<UDRE)) ); //espera transmitir para enviar um novo UDR =frase[indice]; indice++; } } void put_serial( char carac) { while ( !( UCSRA & (1<<UDRE)) ); //espera transmitir para enviar um novo UDR = carac; } void inicializa_interrupt(void) { MCUCR = 0X0A;//configura a interrupção 1 e 0 para borda de descida GICR = 0xC0;//habilita int1 e int0 sei(); //habilita interrupções } //////////////////////////interrupções externas /////////////////////////////////// ISR(INT0_vect ) //int0 { teste[num]='0'; num++; } ISR(INT1_vect ) //int1 { teste[num] = '1'; num++; } //////////////////////////////////////////////função principal/////////////////////////////////////////// int main(void) { inicializa_interrupt(); serial_inicializa(4800);//configura serial para 4800 DDRD = 0xF0; //inicializa portd LEITOR_SAIDA = 0X0F; impri_serial("leitor de cartão inicializado! \n\r"); sei(); num=0; while(1) { if(num > 25) { num=0; impri_serial("codigo :"); while(num<27) { put_serial(teste[num]); num++; } impri_serial(" \n\r"); num=0; } alterna_pino(LEITOR_SAIDA,PROCESSA); //só para simular _delay_ms(100); //faz nada! } return(0); } /////////////////////////////////////////////////////////////////////////////////////////////////////////
Engenheiro eletricista - Desenvolvedor de hardware. Protótipos e projetos. Desenvolvimento de software de interface.(aguivone@gmail.com)
sexta-feira, 15 de julho de 2011
Protocolo wiegand com micrococontrolador ATMEGA 8 (usando o avr studio) :
Assinar:
Postar comentários
(
Atom
)
Nenhum comentário :
Postar um comentário
olá,digite aqui seu comentário!