우선 기본적인 테스트를 어떻게 진행을 할까 고민을 해보았다.

해볼수 있는 환경이라는 것이 극히 제한 적이라...또 한편으로는 가지고 있는 지식이 매우 협소하여 어떻게 어디서 부터 시작을 할지 몰라 막히기 시작을 했던 부분 이었다..


우선 가지고 있는 보드 중에 사용할 수 있는 보드가 Atmega2560을 사용하여 프로그램을 구성하기로 결정하였고 시뮬레이션을 하기위해 Proteus를 사용하기로 결정 하였다..


Atmega2560 프로그래맹을 사용하기위해 현재 까지 최신 버젼인 AVR Studio 5.1 버젼을 다운받아 설치를 하였다.

(위 관련 설정에 관한 내용은 나중에 다시한번 정리를 해보기로 하고.....)


기본적인 테스트 코드는 다음과 같이 작성하였다..다시한번 말을 하지만 어디까지나 테스트 코드 이므로 빨래줄 코드의 진수를 보여준다는 것을 ....*^^* 분명히 수정이 되어야 할 부분이 많지만 어디까지나 지금은 테스트 이니까..ㅎㅎㅎ


///////////////////////////////////////////////////////////////////////////////////////////////////////////

우선 기본적으로 Interrupt를 사용하여 코드를 작성 하였다. Atmega2560또한 8개의 인터럽트 포트가 있으니 최소 4개의 카드를 읽을 수 있는 포트를 구현 할수 있지 않을까 생각을 해본다.


/*

 * Wiegand2560.c

 *

 * Created: 3/21/2012 2:42:18 PM

 *  Author: Sunny

 */ 


#include <avr/sfr_defs.h>

#include <avr/io.h>

#include <avr/iom2560.h>

#include <avr/interrupt.h>

#include <stdio.h>

#include <string.h>

#include <stdint.h>

#include <stdlib.h>

#include <util/delay.h>


#define FOSC 14745600// Clock Speed

#define BAUD 38400

#define MYUBRR FOSC/16/BAUD-1


volatile int W3Count;  // 변수 타입 선언 중요...( volatile를 선언 하지 않으면  변수의 값이 변화되지 않는다)

volatile int W3_BUF[39];  // 40비트


void MCU_initialize(void);

void USART_Init( unsigned int ubrr );

void USART0_Transmit( unsigned char data );

unsigned char USART0_Receive( void );

void USART1_Transmit( unsigned char data );

unsigned char USART1_Receive( void );

int USART0_putchar(char c);

void Out_Int_interrupts(void);




ISR(USART0_RX_vect);

ISR(INT2_vect);

ISR(INT3_vect);


EMPTY_INTERRUPT(BADISR_vect);



void Converter_Data(volatile int Temp[])

{

volatile int count,count1=0;

volatile int _data[3];

volatile int final_data=0;


printf("\r\nConversion Code : ");

while(count<10)

{

_data[0]=Temp[count+count1];

_data[1]=Temp[count+count1+1];

_data[2]=Temp[count+count1+2];

_data[3]=Temp[count+count1+3];

final_data=(_data[0]*8)+(_data[1]*4)+(_data[2]*2)+(_data[3]);

printf("%X",final_data);

count1=count1+3;

count++;

}

}


void Check_Sum(volatile int Temp[])

{

volatile int count,count1=0;

volatile int _data[4];

volatile int final_data=0;


while(count<5)

{

_data[0]=Temp[count+count1];

_data[1]=Temp[count+count1+1];

_data[2]=Temp[count+count1+2];

_data[3]=Temp[count+count1+3];

_data[4]=Temp[count+count1+4];

_data[5]=Temp[count+count1+5];

_data[6]=Temp[count+count1+6];

_data[7]=Temp[count+count1+7];

final_data=(_data[0]*128)+(_data[1]*64)+(_data[2]*32)+(_data[3]*16)+(_data[0]*8)+(_data[1]*4)+(_data[2]*2)+(_data[3]);

_data[count]=final_data;

count1=count1+3;

count++;

}

if ((_data[0]^_data[1]^_data[2]^_data[3])==_data[4])

{

printf("\r\nOK");

}

else

{

printf("\r\nError");

}

}


void delay_us(unsigned char time_us)

{

  register unsigned char i;

  for ( i =0 ; i< time_us ;i++)

  {

    asm volatile (" PUSH R0 ");

    asm volatile (" POP  R0 ");

    asm volatile (" PUSH R0 ");

    asm volatile (" POP  R0 ");

    asm volatile (" PUSH R0 ");

    asm volatile (" POP  R0 ");

    asm volatile (" PUSH R0 ");

    asm volatile (" POP  R0 ");

  }

}

void delay_ms(unsigned int time_ms)

{

  register unsigned int i;

  

  for ( i=0 ; i < time_ms ; i++)

  {

    delay_us(250);

    delay_us(250);

    delay_us(250);

    delay_us(250);

  }

}



int main(void)

{

cli();

delay_ms(5000);

MCU_initialize();

USART_Init ( MYUBRR );  //UART Init

Out_Int_interrupts();

sei(); // Don't remember This one

fdevopen(USART0_putchar,0); 

printf("Wiegand Ver1.0 \n\r");

W3Count=0;

    while(1)

    {

        //TODO:: Please write your application code 

if (W3Count>=40)

{

printf("\r\nReceive Code : ");

W3Count=0;

while(W3Count<40)

{

//USART0_putchar(W3_BUF[W3Count]);

printf("%d",W3_BUF[W3Count]);

W3Count++;

}

W3Count=0;

Converter_Data(W3_BUF);

Check_Sum(W3_BUF);

}

    }

}


void MCU_initialize(void) /* initialize ATmege128 MCU */

MCUCR=(0<<JTD)|(0<<PUD)|(1<<IVSEL)|(1<<IVCE);//Ox00

DDRA =(0<<DDA7)|(0<<DDA6)|(0<<DDA5)|(0<<DDA4)|(0<<DDA3)|(0<<DDA2)|(0<<DDA1)|(0<<DDA0);

PORTA=(1<<PINA7)|(1<<PINA6)|(1<<PINA5)|(1<<PINA4)|(1<<PINA3)|(1<<PINA2)|(1<<PINA1)|(1<<PINA0);//0xFF

DDRB =(0<<DDB7)|(0<<DDB6)|(0<<DDB5)|(0<<DDB4)|(0<<DDB3)|(0<<DDB2)|(0<<DDB1)|(0<<DDB0);//Input Mode0x00

PORTB=(1<<PINB7)|(1<<PINB6)|(1<<PINB5)|(1<<PINB4)|(1<<PINB3)|(1<<PINB2)|(1<<PINB1)|(1<<PINB0);//0xFF

DDRC =(0<<DDC7)|(0<<DDC6)|(0<<DDC5)|(0<<DDC4)|(0<<DDC3)|(0<<DDC2)|(0<<DDC1)|(0<<DDC0);//Input Mode0x00

PORTC=(1<<PINC7)|(1<<PINC6)|(1<<PINC5)|(1<<PINC4)|(1<<PINC3)|(1<<PINC2)|(1<<PINC1)|(1<<PINC0);//0xFF

DDRD =(0<<DDD7)|(0<<DDD6)|(0<<DDD5)|(0<<DDD4)|(0<<DDD3)|(0<<DDD2)|(0<<DDD1)|(0<<DDD0);//Input Mode0x00

PORTD=(1<<PIND7)|(1<<PIND6)|(1<<PIND5)|(1<<PIND4)|(1<<PIND3)|(1<<PIND2)|(1<<PIND1)|(1<<PIND0);//0xFF

DDRE =(0<<DDE7)|(0<<DDE6)|(0<<DDE5)|(0<<DDE4)|(0<<DDE3)|(0<<DDE2)|(0<<DDE1)|(0<<DDE0);//Input Mode0x00

PORTE=(1<<PINE7)|(1<<PINE6)|(1<<PINE5)|(1<<PINE4)|(1<<PINE3)|(1<<PINE2)|(1<<PINE1)|(1<<PINE0);//0xFF

}


//---------------------Serial Part--------------------------------//

void USART_Init( unsigned int ubrr )

{

/*Port 0 */

/* Set baud rate */

UBRR0H = (unsigned char)(ubrr>>8);

UBRR0L = (unsigned char)ubrr;

UCSR0A = (0<<UDRE0);


/* Enable receiver and transmitter */

UCSR0B = (1<<RXCIE0)|(1<<RXEN0)|(1<<TXEN0);

/* Set frame format: 8data, 2stop bit */

UCSR0C = (1<<UCSZ01)|(0<<USBS0)|(3<<UCSZ00);


}


void USART0_Transmit( unsigned char data )

{

/* Wait for empty transmit buffer*/

while ( !( UCSR0A & (1<<UDRE0)) )

/* Put data into buffer, sends the data */

UDR0 = data;

}


void USART1_Transmit( unsigned char data )

{

/* Wait for empty transmit buffer*/

while ( !( UCSR1A & (1<<UDRE1)) )

/* Put data into buffer, sends the data */

UDR1 = data;

}


unsigned char USART0_Receive( void )

{

/* Wait for data to be received*/

while ( !(UCSR0A & (1<<RXC0)) )

/* Get and return received data from buffer */

return UDR0;

}


unsigned char USART1_Receive( void )

{

/* Wait for data to be received*/

while ( !(UCSR1A & (1<<RXC1)) )

/* Get and return received data from buffer */

return UDR1;

}


int USART0_putchar(char c)

{

    loop_until_bit_is_set(UCSR0A,UDRE0);//RXC);

    UDR0=c;

    return 0;

}

//---------------------Serial Part--------------------------------

ISR(USART0_RX_vect)

{

UDR1=UDR0;

}


ISR(USART1_RX_vect)

{

UDR0=UDR1;

}

//---------------------Interupt Part--------------------------------//

void Out_Int_interrupts(void)

{

EICRA=(1<<ISC31)|(0<<ISC30)|(1<<ISC21)|(0<<ISC20)|(1<<ISC11)|(0<<ISC10)|(1<<ISC01)|(0<<ISC00);

EICRB=(1<<ISC71)|(0<<ISC70)|(1<<ISC61)|(0<<ISC60)|(1<<ISC51)|(0<<ISC50)|(1<<ISC41)|(0<<ISC40);

EIMSK=(0<<INT7)|(0<<INT6)|(0<<INT5)|(0<<INT4)|(1<<INT3)|(1<<INT2)|(0<<INT1)|(0<<INT0);

}


ISR(INT2_vect)

{

W3_BUF[W3Count]=0;

W3Count++;

}

ISR(INT3_vect)

{

W3_BUF[W3Count]=1;

W3Count++;

}