sexta-feira, 15 de julho de 2011

Protocolo wiegand com micrococontrolador ATMEGA 8 (usando o avr studio) :


//************************************************************************
//                             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);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////

Nenhum comentário :

Postar um comentário

olá,digite aqui seu comentário!