학습목표    1

학습주제    1

예습내용    1

실습방법    1

        6

카운터제작

학습목표

제품이 생산되는 개수를 포토센서로 세어서 통신(RS232) 통하여 표시한다.

학습주제

1.       포토센서로 AVR 외부인터럽트에 연결하여 상승에지 카운트하는 시스템을 구성한다.

2.       7세그먼트로 입력된 수자를 표시하는 시스템을 만든다.

3.       RS232통신으로 시스템을 연결한다.

예습내용

포토센서 오토닉스 BM3M

7세그먼트 컴파일사

실습방법

   

카운터 본체 회로도 이다. LCD 리얼시스 회사 제품을 사용한다. 그리고 근접센서는 24V 사용하고 12V사용시에는 R3,R5 크기를 1/2 작게 하면 된다.

1.       카운터 보드 제작

아래 그림과 같이 보드를 제작한다. LCD “A”채널에 연결하여 제작한다.

2. 카운터 프로그램

File->New->Project 선태한다.

 

 

카운트 프로그램

통신의 시작은 0x02 보내고 카운트 수자는 4개의 문자로 바꾸어서 전송하여 4개의 7세그먼트가 동작하도록 한다.

#include <mega128.h>

 

// Alphanumeric LCD Module functions

#asm

   .equ __lcd_port=0x1B

#endasm

#include <lcd.h>

 

void SendData();

 

char sbuf[20];

int count0=0;

 

// External Interrupt 0 service routine

interrupt [EXT_INT0] void ext_int0_isr(void)

{

              count0++;     // 이터럽트가 때마다 1 증가

              SendData();

}

 

// Standard Input/Output functions

#include <stdio.h>

 

// Declare your global variables here

 

void main(void)

{

// Declare your local variables here

 

// Input/Output Ports initialization

// Port A initialization

// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In

// State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T

PORTA=0x00;

DDRA=0x00;

 

// Port B initialization

// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In

// State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T

PORTB=0x00;

DDRB=0x00;

 

// Port C initialization

// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In

// State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T

PORTC=0x00;

DDRC=0x00;

 

// Port D initialization

// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In

// State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T

PORTD=0x00;

DDRD=0x00;

 

// Port E initialization

// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In

// State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T

PORTE=0x00;

DDRE=0x00;

 

// Port F initialization

// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In

// State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T

PORTF=0x00;

DDRF=0x00;

 

// Port G initialization

// Func0=In Func1=In Func2=In Func3=In Func4=In

// State0=T State1=T State2=T State3=T State4=T

PORTG=0x00;

DDRG=0x00;

 

// Timer/Counter 0 initialization

// Clock source: System Clock

// Clock value: Timer 0 Stopped

// Mode: Normal top=FFh

// OC0 output: Disconnected

ASSR=0x00;

TCCR0=0x00;

TCNT0=0x00;

OCR0=0x00;

 

// Timer/Counter 1 initialization

// Clock source: System Clock

// Clock value: Timer 1 Stopped

// Mode: Normal top=FFFFh

// OC1A output: Discon.

// OC1B output: Discon.

// OC1C output: Discon.

// Noise Canceler: Off

// Input Capture on Falling Edge

TCCR1A=0x00;

TCCR1B=0x00;

TCNT1H=0x00;

TCNT1L=0x00;

OCR1AH=0x00;

OCR1AL=0x00;

OCR1BH=0x00;

OCR1BL=0x00;

OCR1CH=0x00;

OCR1CL=0x00;

 

// Timer/Counter 2 initialization

// Clock source: System Clock

// Clock value: Timer 2 Stopped

// Mode: Normal top=FFh

// OC2 output: Disconnected

TCCR2=0x00;

TCNT2=0x00;

OCR2=0x00;

 

// Timer/Counter 3 initialization

// Clock source: System Clock

// Clock value: Timer 3 Stopped

// Mode: Normal top=FFFFh

// OC3A output: Discon.

// OC3B output: Discon.

// OC3C output: Discon.

TCCR3A=0x00;

TCCR3B=0x00;

TCNT3H=0x00;

TCNT3L=0x00;

OCR3AH=0x00;

OCR3AL=0x00;

OCR3BH=0x00;

OCR3BL=0x00;

OCR3CH=0x00;

OCR3CL=0x00;

 

// External Interrupt(s) initialization

// INT0: On

// INT0 Mode: Rising Edge

// INT1: Off

// INT2: Off

// INT3: Off

// INT4: Off

// INT5: Off

// INT6: Off

// INT7: Off

EICRA=0x03;

EICRB=0x00;

EIMSK=0x01;

EIFR=0x01;

 

// Timer(s)/Counter(s) Interrupt(s) initialization

TIMSK=0x00;

ETIMSK=0x00;

 

// USART0 initialization

// Communication Parameters: 8 Data, 1 Stop, No Parity

// USART0 Receiver: On

// USART0 Transmitter: On

// USART0 Mode: Asynchronous

// USART0 Baud rate: 9600

UCSR0A=0x00;

UCSR0B=0x18;

UCSR0C=0x06;

UBRR0H=0x00;

UBRR0L=0x67;

 

// Analog Comparator initialization

// Analog Comparator: Off

// Analog Comparator Input Capture by Timer/Counter 1: Off

// Analog Comparator Output: Off

ACSR=0x80;

SFIOR=0x00;

 

// LCD module initialization

lcd_init(16);

 

// Global enable interrupts

#asm("sei")

 

// 시작을 LCD 표시

sprintf(sbuf,"START");

lcd_gotoxy(0,0);      

lcd_puts(sbuf);

 

while (1)

      {

      // Place your code here

 

      };

}

 

void SendData()

{

              char string[12]="";

              sprintf(sbuf,"Count:%d",count0);

             lcd_gotoxy(0,0);

             lcd_puts(sbuf);

              

             sprintf(string,"%c%4d",0x02,count0);

             puts(string);

}

 

3. 디스플레이 보드의 제작

아래 그림은 수자표시 보드의 회로도이다.

 

4. 수자표시 프로그램

A,B,C,D포트와 F 0,1,2,3 포트를 출력으로 한다.

RS232 RX 인터럽트 함수를 만든다.

 

 

수자표시 프로그램

0x02 문자가 오면 4개의 문자를 받아 4자리의 7세그먼트로 표시한다.

0023 같이 앞에 0 앞에 오면 이는 표시하지 않게 했다.

#include <mega128.h>

#include <stdio.h>

#include <string.h>

#include <delay.h>

#include <stdlib.h>

 

#define RXB8 1

#define TXB8 0

#define UPE 2

#define OVR 3

#define FE 4

#define UDRE 5

#define RXC 7

 

#define FRAMING_ERROR (1<<FE)

#define PARITY_ERROR (1<<UPE)

#define DATA_OVERRUN (1<<OVR)

#define DATA_REGISTER_EMPTY (1<<UDRE)

#define RX_COMPLETE (1<<RXC)

 

void DispalyNumber();

 

// USART0 Receiver buffer

#define RX_BUFFER_SIZE0 8

char rx_buffer0[RX_BUFFER_SIZE0];

unsigned char rx_wr_index0,rx_rd_index0,rx_counter0;

// This flag is set on USART0 Receiver buffer overflow

bit rx_buffer_overflow0;   

 

char rmCount;

int i,j;

char string[4];

 

// USART0 Receiver interrupt service routine

#pragma savereg-

interrupt [USART0_RXC] void uart0_rx_isr(void)

{

char status,data;

#asm

    push r26

    push r27

    push r30

    push r31

    in   r26,sreg

    push r26

#endasm

status=UCSR0A;

data=UDR0;

 

if(data == 0x02) {//전송시작 표시

              rx_wr_index0 = 0;  

              rmCount = 0;

} 

 

if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)

   {

   rx_buffer0[rx_wr_index0]=data;

   if (++rx_wr_index0 == RX_BUFFER_SIZE0) rx_wr_index0=0;

   if (++rx_counter0 == RX_BUFFER_SIZE0)

      {

      rx_counter0=0;

      rx_buffer_overflow0=1;

      };

   };

#asm

    pop  r26

    out  sreg,r26

    pop  r31

    pop  r30

    pop  r27

    pop  r26

#endasm

 

if(rx_buffer0[0]==0x02 && rmCount==5) {

              //초기화

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

                             string[i]=0x00;

              j=0;

 

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

                            if(rx_buffer0[i+1]!=0x20)

                                         string[j++]=rx_buffer0[i+1];

 

              DispalyNumber();

}

rmCount++;

}

#pragma savereg+

 

#ifndef _DEBUG_TERMINAL_IO_

// Get a character from the USART0 Receiver buffer

#define _ALTERNATE_GETCHAR_

#pragma used+

char getchar(void)

{

char data;

while (rx_counter0==0);

data=rx_buffer0[rx_rd_index0];

if (++rx_rd_index0 == RX_BUFFER_SIZE0) rx_rd_index0=0;

#asm("cli")

--rx_counter0;

#asm("sei")

return data;

}

#pragma used-

#endif

 

// Standard Input/Output functions

#include <stdio.h>

 

// Declare your global variables here

 

void main(void)

{

// Declare your local variables here

 

// Input/Output Ports initialization

// Port A initialization

// Func0=Out Func1=Out Func2=Out Func3=Out Func4=Out Func5=Out Func6=Out Func7=Out

// State0=0 State1=0 State2=0 State3=0 State4=0 State5=0 State6=0 State7=0

PORTA=0x00;

DDRA=0xFF;

 

// Port B initialization

// Func0=Out Func1=Out Func2=Out Func3=Out Func4=Out Func5=Out Func6=Out Func7=Out

// State0=0 State1=0 State2=0 State3=0 State4=0 State5=0 State6=0 State7=0

PORTB=0x00;

DDRB=0xFF;

 

// Port C initialization

// Func0=Out Func1=Out Func2=Out Func3=Out Func4=Out Func5=Out Func6=Out Func7=Out

// State0=0 State1=0 State2=0 State3=0 State4=0 State5=0 State6=0 State7=0

PORTC=0x00;

DDRC=0xFF;

 

// Port D initialization

// Func0=Out Func1=Out Func2=Out Func3=Out Func4=Out Func5=Out Func6=Out Func7=Out

// State0=0 State1=0 State2=0 State3=0 State4=0 State5=0 State6=0 State7=0

PORTD=0x00;

DDRD=0xFF;

 

// Port E initialization

// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In

// State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T

PORTE=0x00;

DDRE=0x00;

 

// Port F initialization

// Func0=Out Func1=Out Func2=Out Func3=Out Func4=In Func5=In Func6=In Func7=In

// State0=0 State1=0 State2=0 State3=0 State4=T State5=T State6=T State7=T

PORTF=0x00;

DDRF=0x0F;

 

// Port G initialization

// Func0=In Func1=In Func2=In Func3=In Func4=In

// State0=T State1=T State2=T State3=T State4=T

PORTG=0x00;

DDRG=0x00;

 

// Timer/Counter 0 initialization

// Clock source: System Clock

// Clock value: Timer 0 Stopped

// Mode: Normal top=FFh

// OC0 output: Disconnected

ASSR=0x00;

TCCR0=0x00;

TCNT0=0x00;

OCR0=0x00;

 

// Timer/Counter 1 initialization

// Clock source: System Clock

// Clock value: Timer 1 Stopped

// Mode: Normal top=FFFFh

// OC1A output: Discon.

// OC1B output: Discon.

// OC1C output: Discon.

// Noise Canceler: Off

// Input Capture on Falling Edge

TCCR1A=0x00;

TCCR1B=0x00;

TCNT1H=0x00;

TCNT1L=0x00;

OCR1AH=0x00;

OCR1AL=0x00;

OCR1BH=0x00;

OCR1BL=0x00;

OCR1CH=0x00;

OCR1CL=0x00;

 

// Timer/Counter 2 initialization

// Clock source: System Clock

// Clock value: Timer 2 Stopped

// Mode: Normal top=FFh

// OC2 output: Disconnected

TCCR2=0x00;

TCNT2=0x00;

OCR2=0x00;

 

// Timer/Counter 3 initialization

// Clock source: System Clock

// Clock value: Timer 3 Stopped

// Mode: Normal top=FFFFh

// OC3A output: Discon.

// OC3B output: Discon.

// OC3C output: Discon.

TCCR3A=0x00;

TCCR3B=0x00;

TCNT3H=0x00;

TCNT3L=0x00;

OCR3AH=0x00;

OCR3AL=0x00;

OCR3BH=0x00;

OCR3BL=0x00;

OCR3CH=0x00;

OCR3CL=0x00;

 

// External Interrupt(s) initialization

// INT0: Off

// INT1: Off

// INT2: Off

// INT3: Off

// INT4: Off

// INT5: Off

// INT6: Off

// INT7: Off

EICRA=0x00;

EICRB=0x00;

EIMSK=0x00;

 

// Timer(s)/Counter(s) Interrupt(s) initialization

TIMSK=0x00;

ETIMSK=0x00;

 

// USART0 initialization

// Communication Parameters: 8 Data, 1 Stop, No Parity

// USART0 Receiver: On

// USART0 Transmitter: On

// USART0 Mode: Asynchronous

// USART0 Baud rate: 9600

UCSR0A=0x00;

UCSR0B=0x98;

UCSR0C=0x06;

UBRR0H=0x00;

UBRR0L=0x67;

 

// Analog Comparator initialization

// Analog Comparator: Off

// Analog Comparator Input Capture by Timer/Counter 1: Off

// Analog Comparator Output: Off

ACSR=0x80;

SFIOR=0x00;

 

// Global enable interrupts

#asm("sei")

 

PORTF=0x0f;

 

while (1)

      {

      // Place your code here

 

      };

}

 

void DispalyNumber()

{

                             //포트 초기화

      PORTA=0;

      PORTB=0;

      PORTC=0;

      PORTD=0;

     

      PORTA.4=1;

      PORTA.5=1;

      PORTA.6=1;

      

      PORTB.4=1;

      PORTB.5=0;

      PORTB.6=1;

     

      PORTC.4=1;

      PORTC.5=0;

      PORTC.6=1;

     

      PORTD.4=1;

      PORTD.5=0;

      PORTD.6=1;

      

     

      j=strlen(string);

      i=0;  

      while(j>0) {

          switch(i) {

                        case 0 :

                                      PORTA=string[j-1];

                                      break;

                        case 1 :

                                      PORTB=string[j-1];

                                      PORTB.5=1;

                                      break;

                       case 2 :

                                      PORTC=string[j-1];

                                      PORTC.5=1;

                                      break;

                       case 3 :

                                      PORTD=string[j-1];

                                      PORTD.5=1;

                                     break;

          }

          j--;

          i++;

      }

 

}

 

처음