R E P O R T기초기계공학실험 ( 인장 실험 )교 수 님 :학 과 :학 번 :이 름 :제출일자 :1.시험 목적재료의 변형 과정과 응력의 변화를 조사하며 (특히 응력-변형률 선도에 의하여), 인장강도, 항복점, 연신율, 단면수축률, 탄성한도, 비례한도, 탄성계수 등을 구하여, 재료의 기계적 거동을 파악함으로써, 기계나 구조물의 설계 및 해석에 유용한 기초자료로 이용하는데 있다.2.시험에 관련된 이론※ 인장 시험이란?재료에서 인장시편을 깎아내어 인장시험기에 고정시켜서 시험을 한다. 인장시험편에 서서히 인장하중을 가해서 재료의 항복점·내력(耐力)·인장강도·신장(伸長)·드로잉(drawing) 등 기계적인 여러 성질을 측정한다. 인장시험에서는 이 밖에 비례한도·탄성한도(彈性限度)·탄성계수·일용량 등도 측정할 수 있으며, 가해진 하중과 신장과의 관계를 나타내는 선도(線圖)도 구할 수 있다.인장하중에 의해서 생기는 응력(應力)을 인장응력이라고 하는데, 인장응력과 신장의 관계를 나타내는 응력-변형도 선도는 재료의 성질을 나타내는 중요한 것이다. 이 선도에서 최대점의 응력을 인장강도라고 한다. 인장시험은 항상 동일한 조건하에서 실시할 수 있으므로 측정결과의 신뢰성이 높으며, 기계나 기계부품의 설계에 직접 필요한 자료가 되므로 이전부터 공업적 시험의 하나로서 널리 채택되어왔다. - 백과사전※ 용어정리*응력 (stress) : 단위면적에 대한 힘, 또는 주어진 단면에 분포된 힘의 세기를 그 단면의 응력 (stress)이라고 하고, 그리스 문자 σ (시그마)로 표시한다. 그러므로 단면적 A인 부재가 축하중 P를 받을 때의 응력은 하중 P를 면적 A로 나누어 얻는다.σ =*변형률 : 일반적으로 신장량은 그 길이를 전체길이 L로 나누고 여기에 전체 신장량 δ를 곱한 것과 같다. 따라서 단위 길이를 가진 봉의 신장량은 1/L과 δ를 곱한 것과 같다. 그리스 문자 ε (엡시론)으로 표시한다.ε =*탄성한도 (elastic limit),: 응력을 제거하면 스트레인이 0으로 복귀하는 응력의 상한치이다. 0의 여부는 측정정도에 의존하므로 보통 잔존하는 스트레인 (이것을 영구 스트레인이라함)이 0.03% 또는 0.005%가 될 때의 응력을 취한다.=*비례한도 (Proportional limit),: Hook의 법칙이 성립하는 응력의 상한치이며, 이것도 측정의 정도에 의존한다.와는 대체로 같다.=*상한복점 (upper yield point),: 항복 개시 전의 최대 응력이다.=*하항복점 (lower yield point),항복이 진행중의 거의 일정한 하중을 원단멱적으로 나눈 값이다. (-)를 항복점 강하 (yield drop)라고 하고 항복에 의한 스트레인을 항복점 연신 ( εy, yield elongation)이라고 한다.에 이르기 전에 생기는 미소의 소성스트레인을 micro-yielding 혹은 pre-yielding이라고 한다. 대개 그냥 항복점이라고 할 때에는 하항복점을 말한다.=*인장강도 (tensile strength 혹은 ultimate strength),최고 하중을 원단면적으로 나눗 값 즉, 공칭응력을 말한다.=*연신율 (파단연신) (% elongation, strain), ε파단후의 영구연신 (permanent set)을 나타내며, 파단연신은 국부수축이 시작할 때까지의 균열연신 (uniform elongation)과 국부수축 시작에서 파단까지에 생기는 국부연신 (local elongation)으로 나눈다.ε ==*단면수축률 (contraction of area),파단후의 최소단면적과 그 원단면적과의 차이의 원단면적에 대한 백분율이다.=x 100(%)*파단강도 (rupture strength),파단하중 P가 작용하고 있을 때 이 하중 P를 그때의 실제 단면적로 나눗 값.=*인장흡수에너지 (tensile energy absorption)응력-변형률 선도내의 면적으로서, 인성을 나타낸다.※실험방법 및 절차1) 실험전 (표점거리 표시 및 시험편의 치수 측정)준비된 시험편에 대하여 50mm의 표점거리(gage length)를 정확히 마킹게이지를 이용하여 표시하고, 표 3.5에 의하여 정확하게 5회 측정하여 평균치를 기록한다.2) 실험전 (시험기의 준비)컨트롤러의 전원을 입력한다.다음에 시험기의 척, 조(jaw), 유압 호스, 신장계, 로드셀, 서보 밸브, 엑츄레이터, pc, 프린터, 기록지 등을 체크하여 실험에 이상이 없는지 확인하여야 한다.3) 실험방법 (시험전 준비)① 시험기의 지그/ 조/ 척을 설치한다.* 이때 조의 방향이 바뀌지 않도록 주의하여 짝을 잘 맞추어 사용하여야 한다.② 시험편을 장착한다.* 상부핸들을 반시계 방향으로 돌리면 척과 조가 위로 올라가 간격이 발생 한다.* 시험편을 끼우고 생부 핸들을 시계방향으로 돌려 시험편의 윕 부분을 고 정 한다.* 디케이터 영점을 맞춘다.* 크로스 헤드를 적당한 위치(시험편 고정)까지 올린다* 하부 핸들을 돌려 시험편의 아래 부분을 고정한다.* 척을 크로스 헤드에 설치한 다음 반드시 상 하부의 안전 밴드를 설치한 다.* 시편 고정 후 핸들을 분리한다.③ 주 전원스위치를 켠다.④ 컴퓨터 및 서보 컨트롤러의 전원을 켠다.⑤ 시험편에 신장계를 부착한다.⑥ 시험 프로그램 상태에서 하중 및 위치가 영점으로 돌아오는지를 확인한 다.4) 실험 방법 (시험 시작)① 시험전 준비가 완료되면 하중 표시 및 위치를 설정한다.② 안전을 위하여, 시험 종료 조건의 하나인 하중 및 위치 한계(LIMIT)를 설정한다.③ 시험 속도 및 기준을 정한다.④ 컨트롤러에서 인장 모드(MODE)을 선택한다.⑤ 시편의 형상 및 크기 등을 입력한다.⑥ 모든 사항이 완료되면 시작(START) 버튼을 눌러 시험을 시작한다.⑦ 시험조건에 의하여 실험이 종료되면 데이터를 저장하고 시험을 종료한다.5) 실험방법 (시험 종료 후)① 시험이 종료되면 시편을 제거한다.② 시편이 물린 상태에서 크로스 헤드를 이동시키면 크로스 헤드 이동 모터의 과부하로 모터가 손상될 우려가 있으므로 주의를 요한다.③ 보고서 작성을 위한 실험 결과 데이터를 저장 혹은 출력한다.④ 제거한 시험편에 대하여 실제 늘어난 길이 및 단면 감소 직경을 측정한다.⑤ 실험실을 원래의 상태로 정리 정돈 한다.3.시험기의 종류 및 기구→ 시편 ( S45C )표준번호 :?KS B 0801 표준명(한글) :?금속 재료 인장 시험편표준명(영문) :?TEST PIECES FOR TENSILE TEST FOR METALLIC MATERIALS제정내용 :?금속재료의인장시험에사용하는인장시험편규정?적용범위 :?이 규격은 금속재료의 인장 시험에 사용하는 인장 시험편(이하 시험편이라 한다)에 대하여 규정한다.※ 인장 시험기주요사항1. 모델명 : UH-F100A( 구입년도 : 2000년 10월 20일 )2. 금액 : 153,000 (천원)3. 주요구성 및 성능▶ Loading unit▶ Automatic load measuring unit▶ Automatic load control unit▶ High Temperature Tensile Test Device4. 사용예▶ 최대 100톤 하중속도 자동컨트롤▶ 재료의 인장, 압축, 굽힘강도를 측 정▶ 콘크리트의 압축강도 측정※ 유압조절 장치 ※ 컴퓨터※버니어캘리퍼스 (vernier calipers)노기스라고도 하는데, 이것은 독일어의 노니우스(Nonius)라는 발음이 잘못된 것이라고 한다. 원형으로 된 것의 지름, 원통의 안지름 등을 측정하는 데 주로 사용된다. 본척(本尺)과 본척 위를 이동하는 버니어[副尺]로 되어 있는데, 본척의 선단과 버니어 사이에 측정물을 끼우고, 본척 위의 눈금을 버니어를 사용해서 읽는다. 보통 사용되고 있는 것은 본척의 한 눈금이 1mm이고, 버니어의 눈금은 본척의 19눈금을 20등분한 것이다.이것에 의하면, 읽을 수 있는 최소치수는 1/20mm이다. 이 밖에 최소치수가 1/50mm인 것도 있다. 사용방법이 간단하여 기계공장 등에서 널리 사용되고 있다.4.실험 과정4.시험 결과측정종류실험전실험후표점거리5050.71평행부의 지름12.510.3파단율14.2%지름수축률
REPORT(마이크로프로세서응용 및 실험)제출일자: 2011. 11. 15 학번:이름:조 :설계과제스위치 입력은 External interrupt 사용Timer interrupt 사용 ?정확한 시간 측정 필요10msec마다 interrupt발생 및 LED 밝기 결정입력 : 스위치 1개, 출력 : LED 4개, 7-segment1번 스위치 입력 ?밝기 주기 결정1번 스위치 입력이 있을 때 마다밝기 주기 변경 (“1초”a“ 2 초” a“ 3 초”a“ 4 초”a“1 초”a…)7-sengment 출력1초마다 시간(초) 표시LED 밝기 조절PWM 주기 = 10msecⅠ. 설계 목표7-segment와 LED를 설계과제에 맞게 구현 될 수 있도록 회로를 설계하고프로그램 소스를 설정하여 Timer/Counter기능을 이용해 원하는 출력을 얻을 수 있다.Ⅱ. 관련이론(1) 인터럽트 소스인터럽스 소스는 인터럽트를 요청한 곳을 지칭하는 것-총 35개의 인터럽트 소스-Reset-8개 외부 인터럽트 (INT0 ~ INT7)-Timer compare (TIMER0..3 COMP)-Timer overflow (TIMER0..3 OVF)-Timer capture (TIMER1 CAPT, TIMER3 CAPT)-SPI 전송완료-UART 수신완료, 송신완료, data register empty-ADC 변환완료-EEPROM Ready-Analog comparator(2) 인터럽트 벡터인터럽트 벡터는 인터럽트가 발생했을 때 요청한 인터럽트를 처리해 주기 위해서는 그에 합당한 프로그램을 작성하여야 하는데 이 프로그램을 인터럽트 서비스 루틴이라고 한다(3) 인터럽트 우선순위벡터번호가 미리 하드웨어적으로 지정되어 있는데 번호가 낮을수록 우선순위가 높다.(4) 인터럽트 작동인터럽트를 사용하기 위해서 ATmega32에서는 GICR이라는 인터럽트 허용 레지스터를 사용하여야 한다. 위의 그림을 보면, 인터럽트2와 인터럽트1을 사용하기 위해서는 비트5와 비트7이 허용되어야 하는 것을 알 수 있다. 인터럽트를 산하는 반도체소자.7-Segment7개의 LED를 이용 10진수를 표현 가능Ⅳ. 설계과제 진행 과정①타이머 인터럽트를 통해서 1초 시간 만들기-맨 처음 과제를 받게 되었을 때 제일 먼저 해야 할 것은 1초의 시간을 만드는 것 이었다. 1초를 만들기 위해서는 ATmega32의 클럭을 알고 분주비와 TCNTn의 값을 확인을 해봐야 했다. 확인한 결과 TCNTn의 값은 0x64, 분주비는 1024 였다. 이 두 개의 값을 이용하여 1초 주기로 7-segment의 출력의 변화를 확인 할 수 있었다.②PWM을 사용하기 위한 레지스터 확인하기-PWM을 사용하기에 앞서서 PWM출력이 나오는 포트를 연결하기 위하여서 데이터 시트를 통해 확인하고 포트와 LED를 연결하였다.③PWM을 통해 LED1개 출력하기먼저 우선 필요한 것은 LED의 한 개의 출력을 제어 하는 것이 필요 했다. 그래서 우리 조는 PWM을 이용해서 과정을 수행하였다. 그 결과 LED 1개가 출력이 되는 것을 확인할 수가 있었다. 그리고 다음 과정으로써 LED의 최대 출력과 최소출력 값을 확인 하기 위하여 OCn 의 값을 세분화였다.④PWM으로 LED 4개 제어하기앞선 과정을 통하여서 LED 하나를 제어했었다. 이 다음은 사용할 LED의 개수 4개를 PWM을 사용하여 모두 제어하는 것이었다. 주어진 과제의 요구사항은 각각의 LED의 밝기가 주기가 달라야 했다. 이 요구사항을 만족시키기 위하여서 OCn의 값을 다르게 주었다. 그 결과 각각의 LED가 다른 주기로써 밝기가 다르게 작동하는 것을 확인할 수가 있었다.⑤ 최종 과제 구현푸쉬스위치를 입력 할때마다 LED에 외부 인트럽트가 주어져서 처음에 1초주기를 시작으로 2초,3초,4초 주기로 작동해야했다. 그래서 우리조는 각각의 듀티비를 계산해 설정을 해주었다. 7-segment는 타이머 1개를 사용하여 계속 1초씩 증가하고 LED는 타이머 2개를 사용하여 주기를 조절하는 것으로 과제의 요구사항을 만족시킬 수 있었다.최종적으로 설계가 끝난 사진Ⅴ 설계과정을 통해 얻 쉽게 접근 할 수 있었다. 이번 과제에서는 LED의 주기를 푸쉬스위치를 누를 때 마다 1~4초까지 제어하는 것이 힘들었다. 오랜 시간 후에 조교님의 간단한 힌트와 데이터시트를 참고 함으로써 해결이 가능하였다.이번 과제는 요구사항을 만족시켜 성공한 조가 우리 조를 포함해서 2개의 조 밖에 없었다. 그 결과 조별평가도 아주 만족스러운 결과를 얻을 수가 있었다. 그만큼 이 과제를 해결했다는 것에 대한 보람이 다른 과제에 비해서 높았고 자신감도 더 생기게 되었다. 하지만 이번 과제에서 결정적인 실수를 함으로써 아쉬움이 많이 남았다. 다음 과제에서는 좀 더 신중하게 과제에 접근하여 실수없이 요구사항을 만족할 수 있도록 노력해야겠다.Ⅶ 부록(1) 프로그램 코드① 수정 전#include#include#includevoid delay_us(unsigned int time_us);void delay_ms(unsigned int time_ms);void initialize(void); //외부인터럽트 초기화 함수volatile unsigned int seg_count=0,count=0,count0=0,count1=0;//세그먼트 외부인터럽트 시간 을 위한 변수volatile unsigned int delay=39;// 1초 2초 3초 4초 를 위한 딜레이volatile unsigned int t1=0,t2=0; // led시간 카운트unsigned char segment[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90};// FND 출력을 위한 값 배열unsigned char duty11[] = {0,50,100,150,200,250,200,150,100,50};//duty설정 LED1unsigned char duty21[] = {150,200,250,200,150,100,50,0,50,100};//duty설정 LED2unsigned char duty31[] = {50,0,50,100,150,200,250,200,150,100y설정 LED3unsigned char duty43[30] = {250,233,216,200,183,167,150,133,116,100,83,67,50,33,16,0,16,33,50,67,83,100,116,133,150,167,183,200,216,233};//duty설정 LED4//3초 LED듀티unsigned char duty14[40] = {0,12,25,37,50,62,75,87,100,112,125,137,150,162,175,187,200,212,225,237,250,237,225,212,200,187,175,162,150,137,125,112,100,87,75,62,50,37,25,12};//duty설정 LED1unsigned char duty24[40] = {87,100,112,125,137,150,162,175,187,200,212,225,237,250,237,225,212,200,187,175,162,150,137,125,112,100,87,75,62,50,37,25,12,0,12,25,37,50,62,75};//duty설정 LED2unsigned char duty34[40] = {175,187,200,212,225,237,250,237,225,212,200,187,175,162,150,137,125,112,100,87,75,62,50,37,25,12,0,12,25,37,50,62,75,87,100,112,125,137,150,162};//duty설정 LED3unsigned char duty44[40] = {250,237,225,212,200,187,175,162,150,137,125,112,100,87,75,62,50,37,25,12,0,12,25,37,50,62,75,87,100,112,125,137,150,162,175,187,200,212,225,237};//duty설정 LED4//4초 LED듀티 설정SIGNAL(SIG_OUTPUT_COMPARE0) //timer0 outputcompare interrupt{count0++;if(co인터럽트 초기화 함수 호출DDRD = 0xB0; // INT 0, PWM출력 포트 설정3bitDDRB = 0x08; // PWM 출력 방향 1bitDDRC = 0xff; // FND 출력 방향PORTD = 0x00; // 내부 풀업사용 안함(외부사용)PORTB = 0x00; // 내부 풀업사용 안함(외부사용), LED 초기 끔while(1); // 인터럽트를 기다리며 무한 동작return 0; // 정상종료일때 '0' 리턴}void initialize(void){GICR = 0x40; //외부 인터럽트 0번 사용MCUCR = 0x0a; //폴링 엣지 사용 선언 1010//PD2 -> INT0TCNT0 = 0x64; //{(0xff-0x64)+1} * 1024 * (1/16Mhz) = 10ms 우린 16MHZTCCR0 = 0x65; //timer0 prescaler=1024 , PWM , ouputcompareTCNT1L= 0x64;// timer1 로우 비트 설정TCCR1A = 0xA1;// PWM , ouputcompareTCCR1B = 0x04; //PWM , ouputcompareTCNT2 = 0x64;//(0xff-0x64)+1} * 1024 * (1/16Mhz) = 10ms 우린 16MHZTCCR2 = 0x67;//timer2 prescaler=1024 , PWM , ouputcompareTIMSK = 0x9A; //output compare 0,1A,1B,2 on PWM 사용가능sei(); //enable all interrupts}void delay_us(unsigned int time_us){register unsigned int i;for(i=0;i99){count1=0;seg_count++;PORTA = segment[seg_count];if(seg_count>9){seg_count=0;}}switch(count){case 0:OCR2 = duty1[t1];case 1:OCR2 = duty2[t1];case 2:OCR2 = duty3[t1];i
REPORT(마이크로프로세서응용 및 실험)제출일자: 2011. 11. 29 학번:이름:조 :설계과제아날로그 전압 값을 읽고, 그 값의 소수점 첫째 자리 숫자를 PC 사용자가 맞추는 프로그램을 작성-제한 조건준비물 : 가변저항(1개), 마이컴, 직렬통신선, LED 5개입력전압 범위 : 0 ~ 5V마이컴은 A/D 값을 읽어 소수점 앞자리 숫자에 해당하는 LED 수를 점등소수점 첫째 자리 숫자와 PC로 부터 전송 받은 숫자를 비교하여 크기정보를 PC로 전송AD 첫째자리 숫자 > PC전송숫자인 경우 : increaseAD 첫째자리 숫자 < PC전송숫자인 경우 : decreaseAD 첫째자리 숫자 = PC전송숫자인 경우 : right 표시 후 AD전압 값을PC로 전송소수점 2자리까지 표시전송문자: 숫자, ‘V’, 줄 바꿈 문자 전송(‘ kr’ 와 ‘n’)인터럽트 사용(ADC, UART RX, UART TX 등)Ⅰ. 설계 목표7-segment와 LED를 설계과제에 맞게 구현 될 수 있도록 회로를 설계하고프로그램 소스를 설정하여 ADC/USART를 이용해 원하는 출력을 얻을 수 있다.Ⅱ. 관련 이론(1) ADCATmega32-10-bit ADC 1개-8개의 입력신호 처리 가능(MUX)-기준 전압 ?아날로그 공급전압, 외부 AREF 핀 전압, 내부 2.56V전압관련 레지스터-ADC Multiplexer Select ?ADMUX-ADC Control and Status Register ?ADCSRA-ADC data register ?ADCH/ADCL-ADMUX 레지스터-① 기준전압 : AREF 전압, 내부전압, 아날로그 공급전압을 설정② ADC변환 레지스터 : MUX 4 3 2 1 0-ADCSR 레지스터-① ADEN 비트를 통해 ADC 변환 활성화② ADIE 비트는 ADC인터럽트를 활성화③ ADPS2,1,0 비트를 통해서 분주비를 설정(2) USART 직렬통신-Serial 통신의 개요-하나의 데이터 선을 이용하여 한 번에 1-비트씩 데이터를 전송-원거리 통신에 이용-UCSRA-① 통신속도를 제어② 전체적인 송수신을 제어-UCSRB-① USART통신의 송 수신 기능을 활성화② 송수신 비트의 크기를 설정-UCSRC-① 동기 및 비동기 모드와 5~9비트의 문자사이즈를 설정Ⅲ. 설계 과정 중 사용한 장비 및 특징가변저항저항 값을 바꿀 수 있는 저항기LED갈륨비소 등의 화합물에 전류를 흘려 빛을 발산하는 반도체소자.직렬통신선USART통신을 하기 위한 선Ⅳ. 설계과제 진행 과정①ADC 인터럽트를 이용하여 LED 점등하기맨 처음 ADC인터럽트를 이용하여 ADC값을 통해 LED의 발광 개수를 제어하는 것으로 이번 과제에 접근 하였다. 이때 ADC(H/L) 에 저장되는 값을 상수화하는 것이 필요했다. 그래서 ADC관련 식을 이용하였고 그 결과 상수 값으로 얻어낼 수 있었다. 이 상수 값을 통하여 LED를 제어하여 LED가 전압의 값에 따라서 0~5까지 발광을 하도록 하였다.②USART를 이용하여 MCU와 PC통신USART 통신은 우선 통신 속도를 115200bps 로 설정하여 ADC에서 얻은 전압을 컴퓨터의 하이퍼터미널에 출력하는 것부터 시작하였다. 먼저 전압값의 가변을 출력을 했다. 그 다음 과정으로 과제의 목표인 GUESS를 출력하고 전압 값을 출력하도록 하였다.최종적으로 설계가 끝난 사진Ⅴ 설계과정을 통해 얻은 결과첫 번째 과정에서 ADC를 통해서 기준전압과 관련하여 AD0 포트에 인가되는 전압값의 변화를 측정 할 수 있었다. 이 값들이 저장되는 위치로 ADCH, ACDL, ADC를 확인 할 수 있었다. 그러나 이 값들은 10비트의 크기를 가지고 있었다. 그러므로 이 10비트의 값들을 변환식을 이용하여 변환 해야한다는 것을 알 수 있었다. 두 번째 과정에서 맨 처음 MCU에서 발생한 데이터를 PC로 전송하여 출력값이 가변되어 나타나는 것을 확인 할 수가 있었고 이것으로 작성한 소스와 레지스터 설정 상태도 확인 할 수 있었다. 그러나 컴퓨터 하이퍼터미널에 키보드를 이용하여 타이핑을 하면 MCU로 송신이 되지 않았다. 이러한 이유를 분석해본 결과 USART 기능에서 입력값을 받는 루틴을 빠트린 것 같았다. 그러나 결국 이 부분은 해결 하지 못한 체 과제를 마무리 할 수 밖에 없었다.Ⅵ 고찰새로운 과제를 받을 때마다 어려워진다는 것은 알았지만 이번 과제는 최고로 어려운 과제였다. 가변저항을 사용하는 것은 교수님 설명과 조교님 설명을 듣고 나니 쉽게 해결 할 수 있었다. 그 후에 통신 케이블을 연결하여 하이퍼 터미널에 전압값과 GUESS를 출력 시키는 것도 쉽게 해결 할 수 있었다. 하지만 하이퍼터미널에 키보드로 입력이 되질 않았다. 조교님이 힌트를 살짝 주셨지만 우리 조는 결국 완벽하게 성공을 하지 못하고 말았다. 결국 이 수업을 들으면서 받은 과제 중 처음으로 실패라는 것을 경험하였다. 하지만 이러한 경험을 함으로써 우리 조는 더욱 더 성장해나갈 것이다. 마지막으로 이제 텀프로젝트가 남았다. 실패는 이번 실패가 마지막이라는 마음가짐으로 우리 조의 강한 팀워크를 발휘하여 텀프로젝트를 완벽하게 해내겠다고 다짐했다.Ⅶ 부록(1) 프로그램 코드#include #include #include void initialize(void);int led_count[]={0X00,0X01,0X03,0X07,0X0F,0X1F};// led 0 1 2 3 4 5volatile float volt=0, volt_tr;//ADC 값 저장 , 변환을 위한 변수volatile unsigned int temp;volatile unsigned int num=0;volatile unsigned int fnum1=0,fnum2=0;//소수점 저장을 위한 변수void initialize_usart(unsigned int baud);void TX1_Byte(unsigned char data);unsigned char RX1_Byte(void);unsigned char receive_comp=0,receive_data;unsigned char RX1_Byte(void);void OPENING_USART(void);void voltage(void);void LARGE(void);void SMALL(void);SIGNAL(SIG_ADC){volt = ADC;volt_tr = volt*5.0/1023.0;//ADC 값 변환num = volt_tr;fnum1 = (volt_tr - num)*10;//소수점 저장 1fnum2 = ((((volt_tr - num)*10)-fnum1)*10);// 소수점 저장 2PORTB = led_count[num];//LED 출력}SIGNAL(SIG_UART_RECV){receive_data = UDR;//UDR 에 저장receive_comp = 1;//전송 완료}int main(void){DDRB = 0XFF;//B 포트 출력 설정DDRA = 0XFE;//AD0 입력 설정initialize();initialize_usart(8);//통신속도 설정 115200OPENING_USART();while(1){receive_data=RX1_Byte();TX1_Byte('n');TX1_Byte('r');if((UDR*0x30)>fnum1){LARGE();}else if((UDR*0x30)> 8);UBRRL = (unsigned char)baud;UCSRA = 0x00; //asynchronous normal modeUCSRB = 0x18; //Rx(Bit4)/Tx(Bit3) enable;UCSRC = 0x86; //no parity, 1 stop, 8 data}void TX1_Byte(unsigned char data)//PC출력{while(!(UCSRA & 0x20));UDR = data;}unsigned char RX1_Byte(void)//PC 입력{while(!(UCSRA & 0x80));return UDR;}void OPENING_USART(void)//시작될때 출력{TX1_Byte('G');TX1_Byte('u');TX1_Byte('e');TX1_Byte('s');TX1_Byte('s');TX1_Byte(':');}void voltage(void)//전압값 출력{TX1_Byte((num & 0x0F) + 0x30); // 정수부분 표시, ASCII code 변환TX1_Byte('.');TX1_Byte((fnum1 % 10) + 0x30); // ASCII code 변환TX1_Byte((fnum2 % 10) + 0x30); // ASCII code 변환TX1_Byte('V');TX1_Byte('r');TX1_Byte('n');}void SMALL(void)//작을때 in 출력{TX1_Byte('r');TX1_Byte('n');TX1_Byte('i');TX1_Byte('n');
마이크로프로세서 응용 및 실험학 번:이 름:학 과:당 당 교 수:제 출 일 자:1. 설계과제의 목표 및 제한조건2. 서론○설계과제관련 이론 배경- 컴퓨터(computer)- 브레드보드(bread board) - 회로의 개발을 위하여 사용하는 기판 브레드보드 사진 브레드보드 연결 상태?브레드 보드브레드보드(breadboard), 속칭 빵판 또는 빵틀은 전자 회로의 시제품을 만드는 데 사용하는 재사용할 수 있는 무땜납 장치이다. 이것은 스트립기판과 현저하게 다르고 영구적이거나 1회용 시제품을 만들때 사용하고, 쉽게 재사용할 수 없는, 초기 인쇄회로기판과 비슷하다. 일반적인 브레드보드는 버스 스트립으로 알려진, 내부연결 전기단자의 스트립이 있고, 주장치의 일부나 격리된 블록처럼 한쪽이나 양쪽은 전원선을 확장하도록 끼워져 있다.현대의 무땜납 브레드보드는 천공아래에 많은 납이 도금된 인청동 스프핑 클립이 있는 플라스틱 천공블록으로 구성된다. 두개의 일련 패키지(Dual In-Line Package, DIP)인 집적회로(IC)는 블록의 중앙선을 벌려서 삽입할 수 있다. 내부연결 전선과 (축전기, 저항기, 코일, 등과 같은) 각각 부품핀은 회로 위상을 완성하기 위해서 여전히 남는 구멍에 삽입할 수 있다. 이렇게, 다양한 전자 시스템은 소형 회로에서 완벽한 중앙 처리 장치(CPU)까지, 시제품화 될 것이다. 그러나, (접점당 2 ~ 25 pF으로 발생되는) 큰 공전 커패시턴스때문에, 무땜납 빵판은 상대적으로 낮은 주파수로 동작이 제한된다. 일반적으로 회로의 특성에 따라서 10 MHz보다 느리게 동작한다.? LED- LED는 반도체 DIODE로 단지 한쪽 방향으로만 전류가 흘러가는 전자 제품이다. 이 DIODE는 서로 다른 두 개의 물질이 P, N 결합점(JUNCTION)을 형성하도록 만든 것이다.(양성자).; PN상에서 'P‘는 잉여분의 양자를 'N'은 잉여분의 전자를 지니고 있다(전자). (“HOLE"은 전자가 없는 상태를 말한다.- LED의 특징발열이 거의 없으며, 소길다……………- 전기적 특징극성이 있다.일정 이상의 순방향 전압을 인가해야 한다. LED 사진발광을 위한 최저 전압 = 1.8 ~ 2.0V전류에 한계가 있다. (25~35mA)역 전압은 3~4V이다. segment의 모양? 7-segment- 7개의 세그먼트를 이용해서 숫자를 표시하는 장치? 도선브레드 보드위의 부품들을 연결한다(푸시 스위치, 토글스위치, 저항 등)? AvrEdit3.6, PonyProg2000 프로그램? 푸쉬 스위치- 눌러서 전류의 흐름을 조절하는 스위치3. 본론 푸쉬 스위치 사진? 외부 인터럽트 사용- 실습에서는 외부 인터럽트 소스에서 INT0을 사용하여 주기를 변경했다.- 우리가 사용하는 포트를 보면- INT0은 PD2에 연결 되어 있어서 포트를 사용하려면 저항을 여기와 스위치에 연결한다.-벡터 번호가 낮을수록 우선 순위가 높으므로 벡터 번호 2인 INT0이 우선 순위가 높다.? SREG 레지스터- 상태 레지스터로 하나의 인터럽트라도 허용하려면 SEI() 명령으로 1비트를 해준다.- 전원 리셋 후에 이 비트는 자동적으로 0으로 클리어 되므로 리셋 후에는 반드시 세트 시키지 않으면 모든 인터럽트는 금지 됨.- Enable : SREG.7 = 1, sei()- Disable : SREG.7 = 0, cli()? EIMSK Register- 우리는 GICR 명령어를 사용- INT1과 INT0을 사용 함으로 1 1 0 0 | 0 0 0 0 GICR = 0Xc0;를 사용한다.- 개별 외부 인터럽트의 허용 또는 금지 설정- 인터럽트 허용 : 해당 bit = 1- 인터럽트 금지 : 해당 bit = 0? EICRA 레지스터- 우리는 명령어로 MCUCR을 사용했다.- 표와 같이 0 0 이면 INTn의 저레벨 인터럽트가 요청 되고- 10 이면 하강에지에서 요청되고 11이면 상승에지에서 요청 된다.- 해당 플래그 비트에 1을 쓰면 클리어 되어 인터럽트를 다시 허용 할 수 있다.? EIFR- External Interrupt Flag Register- 인터럽트로 set- 실제 인터럽트의 수행은 MASK 레지스터 및- global interrupt enable bit의 상황에 따라 결정- ISR 실행시 자동 clear? 7-segment 연결g f a bh g f e d c b a1 = 0 1 1 1 1 0 1 1 = 0x7b2 = 0 0 1 0 1 1 0 0 = 0x2c3 = 0 0 1 0 1 0 0 1 = 0x294 = 0 1 0 0 1 0 1 1 = 0x4b5 = 1 0 0 0 1 0 0 1 = 0x896 = 1 0 0 0 1 0 0 0 = 0x887 = 0 0 0 1 1 0 1 1 = 0x1b8 = 0 0 0 0 1 0 0 0 = 0x089 = 0 0 0 0 1 0 0 1 = 0x080 = 0 0 0 1 1 0 0 0 = 0x18abfgcehde d c h○설계과제 진행 과정이번이 마이크로 프로세서에서 하는 두 번째 과제였다. 첫 번째 과제에는 세그먼트가 뭔지 토글스위치가 무엇인지 소스가 어떻게 돌아가는지 잘 몰라서 오랜 시간이 걸렸다. 하지만 이번 과제는 기초적인 것을 공부했기 때문에 인터럽트를 공부하는 것을 집중 적으로 했다. 인터럽트의 기본적인 것을 공부를 하고 시작하니 첫 번째 과제는 쉽게 해결됐다. 책에 있는 소스를 공부하면서 SIGNAL(SIG_INTERRUPT0)과 SIGNAL(SIG_INTERRUPT1)번 소스는 인터럽트카운트라는 변수를 주어 하나씩 증가하게 언어를 구성했고 하나는 하나씩 감소하게 언어를 구성했다. 이것을 적용시키는 방법에서 잠시 생각을 했다. 이것을 어떻게 불러들여야 할지 고민했다. 함수의 경우 void abc; 라는 함수를 지정하고 abc를 통해서 불러 들인다. 하지만 인터럽트에서는 cli();와 sei();를 통해서 플래그를 제거하고 다시 인터럽트를 불러들이는 형식으로 했다. 먼저 인터럽트 함수를 사용하기 위해 void initialize(void); 함수를 선언하고 마지막에void initialize(void){GICR = 0xc0;MCUCR = 0xff;sei();}를 선언했다. 처음에는 GICR과 MCUCR이 무슨 말인지 잘 몰랐으나 부록을 찾아보면서 1 1 0 0 | 0 0 0 0 이 돼서 0xc0;이 되고 0 0 0 0 | 1 1 1 1 이 돼서 우리가 사용하는 뒷부분 4개를 사용하므로 ox0f가 된다. 하지만 우리가 실습에서 아무 이유도 모르고 0xff로 해서 감점을 당했다. 그리고 이렇게 첫 번째 과제가 수업시간에 완료 되었다. 하지만 두 번째 과제를 끝내지 못해서 수업시간이 아닌 월요일에 우리조는 모여서 실습을 계속 했다. 두 번째 과제는 생각보다 복잡하다고 생각했지만 단순하게 생각해보면 똑같은 문제였다. 먼저 스위치를 누르면 바뀌어야 하기 때문에 인터럽트0을 C==2이면 C==3으로 C=3이면 C=2로 두어서 누를 때 마다 LED와 7-Segment로 바뀌게 했다. 두 번째 인터럽트에서는 제일 처음 과제 했을 때와 같이 변수를 주어 계속 증가하다가 내가 원할때까지 불이 켜지면 그 후로는 초기값인 0을 주어 다시 켜 직게 하는 것이다. 이런 인터럽트를 짜서 메인함수를 시작하고 인터럽트를 선언하면서 저번시간에 한 DDRC와 DDRA를 출력으로 0xff;로 지정하고 인터럽트를 불러 들여서 코드를 완성했다. 처음에는 책에 있는{GICR = 0xc0;MCUCR = 0x0f;sei();}이 소스가 무슨 말인지 몰랐으나 확실하게 알고나니 인터럽트를 사용방법이 간단했다. GICR은 외부 인터럽트의 비트를 1로 하면 개별적으로 인터럽트가 허용되고 0으로 하면 해당 외부인터럽트를 금지 된다. 그래서 부록에서 첫 번째와 두 번째가 사용 되므로 0xc0;이 되는 것이다. 모든 과제를 완성하고 수업시간에 들어갔으나 바운스 현상을 제거 하지 못한 상태였다. MCUCR도 위에서 설명한 바와 같이 11을 사용하므로 0 0 0 0 | 1 1 1 1 이므로 0x0f;가 맞는 것이다. 이렇게 하나하나 공부하면서 소스를 완성했다. 모든 과제를 완성하고 수업시간에 들어갔으나 바운스 현상을 제거 하지 못한 상태였다. 바운스 현상을 제거하기 위해서 처음보고 GIFR |= 0x80의 소스도 추가 해보았지만 쉽게 제거 되지 않았다. 그래서 한참을 고민한 끝에 플래그의 제거 방법을 생각했다. 무한 반복문에서while(1){PORTC = fnd[interrup_count];cli();delay(1000, 1000);sei();}}딜레이 사이에 cli();와 sei();를 주어 제거 하고 다시 허용함을 무한 반복문에 넣어주니 바운스 없이 깔끔하게 되었다. 이렇게 하나하나 배워 보니 앞으로 더 배운다면 전자 시계도 만들 수 있을 거라는 생각이 들었다.○설계과제를 통해서 얻은 결과 정리지금 현재 프로그램에서 2개의 인터럽트를 사용하여 2개의 과제를 했는데 먼저 기본적인 인터럽트의 구조에 대해서 공부했다. 8개의 외부 인터럽트와 26개의 내부 인터럽트가 총 35개의 인터럽트로 구성 된다. 주 프로그램을 실행하다가 인터럽트가 발생하면 인터럽트 서비스 루틴을 실행하고 다시 주 프로그램으로 돌아 오는 형식이다. 우리가 사용하는 것에서는 INT0과 INT1이 있는 벡터NO 2와 3으로 외부인터럽트0과 외부인터럽트1을 사용했다. 첫 번째 과제에서는 인터럽트0을 LED수를 증가 시키는 방식으로 설정했고 인터럽트1은 LED수를 감소 시키는 방식으로 설정했다. 두 번째 과제에서는 인터럽트0을 누를 때마다 7-segment와 LED를 바뀌도록 설정했으며 인터럽트1은 LED출력이면 점등된 LED수를 증가 시키고 7-segment출력이면 표시 숫자를 증가 시켰다. 표시 숫자는 7-segment의 불을 모두 키고 전선을 하나씩 뽑아가면서 소스를 찾았으면 그 결과는 “? 7-segment 연결“ 에 표시했다. 인터럽트의 우선순위는 벡터번호가 낮을수록 우선순위가 높았다. 그리고 앞에서 설명 한 바와같이 GICR과 MCUCR에 대해서 공부했다. 마지막으로 가장 오랜시간 동안 고민했던 바운스 현상의 제거 방법에 대해서도 알아봤다. GIFR을 통하여 플래그를 강제 클리어 하는 방법과 딜레이 사이에 cli();와 sei();를 주어 제거 하고 다시 허용
REPORT(마이크로프로세서응용 및 실험)제출일자: 학번:이름:조 :설계과제(1) 모든 스위치 입력 처리는 인터럽트만 사용-입력 : push switch ?2개-출력 : LED - 8개, 7-segment - 1개-LED 점등1번 스위치를 누르면 점등된 LED 수 증가2번 스위치를 누르면 점등된 LED 수 감소(2) LED 또는 7-segment로의 선택적 점등1번 스위치를 누를 때마다 LED 또는 7-segment로의 출력을 바꾸어 선택2번 스위치 입력이 1번 있을 때 현재 상태에서LED 출력이면 점등된 LED 수 증가7-segment 출력이면 표시 숫자 증가Ⅰ. 설계 목표7-segment와 LED를 설계과제에 맞게 구현 될 수 있도록 회로를 설계하고프로그램 소스를 설정하여 interrupt를 이용해 원하는 출력을 얻을 수 있다.Ⅱ. 관련이론Interrupt 란?인터럽트는 MCU에 어떠한 특정 동작을 시키기 위해서 하드웨어적인 방법으로 부여한 기능으로서 MCU가 입력이나 출력기능을 수행하는데 매우 중요한 기능이며 프로그램을 수행하면서 매우 빈번히 사용하는 기능이다.(1) 인터럽트 소스인터럽스 소스는 인터럽트를 요청한 곳을 지칭하는 것-총 35개의 인터럽트 소스-Reset-8개 외부 인터럽트 (INT0 ~ INT7)-Timer compare (TIMER0..3 COMP)-Timer overflow (TIMER0..3 OVF)-Timer capture (TIMER1 CAPT, TIMER3 CAPT)-SPI 전송완료-UART 수신완료, 송신완료, data register empty-ADC 변환완료-EEPROM Ready-Analog comparator(2) 인터럽트 벡터인터럽트 벡터는 인터럽트가 발생했을 때 요청한 인터럽트를 처리해 주기 위해서는 그에 합당한 프로그램을 작성하여야 하는데 이 프로그램을 인터럽트 서비스 루틴이라고 한다(3) 인터럽트 우선순위벡터번호가 미리 하드웨어적으로 지정되어 있는데 번호가 낮을수록 우선순위가 높다.(4) 인터럽트 작동인터럽트를 사용하기 위해서 ATmega32에서는 GICR이라는 인터럽트 허용 레지스터를 사용하여야 한다. 위의 그림을 보면, 인터럽트2와 인터럽트1을 사용하기 위해서는 비트5와 비트7이 허용되어야 하는 것을 알 수 있다. 인터럽트를 사용하기 위해서는 사용하려는 인터럽트에 해당하는 각각의 인터럽트 활성 레지스터를 '1'로 지정해 주어야 한다.※ 바운스 현상바운스 현상이란 채터링이라고도 한다. 키를 입력할 때에 입력되는 부분이 자신은 한번 입력하였지만 기계적인 진동에 의하여 출력을 마이크로프로세서가 읽어들이게 되면 키를 여러번으로 누른 것으로 잘못 인식될 수가 있다. 이런 현상을 바운스 현상이라 한다.Ⅲ. 설계 과정 중 사용한 장비 및 특징토글스위치버튼을 손가락 끝으로 세우고 눕히고 하여 조작하는 소형 스위치.푸쉬 스위치버튼을 누름으로써 온-오프 하게 되어 있는 스위치.LED갈륨비소 등의 화합물에 전류를 흘려 빛을 발산하는 반도체소자.7-Segment7개의 LED를 이용 10진수를 표현 가능Ⅳ. 설계과제 진행 과정ⓛ ATMEGA32를 이용하여 인터럽트를 설정하여 LED의 출력이 되는지 확인전체적으로 첫 번째 실험과제와 비교했을 때 거의 똑같고 interrupt를 사용하는 것만 차이를 보였다. 그래서 먼저 인터럽트를 설정하였을 때 LED의 출력의 유무를 확인 해보았다. 그 첫 번째 과정으로 데이터 시트를 참고하여 인터럽트에서 외부인터럽트 INT0/INT1의 포트를 확인하여 회로를 구성하였다. 인터럽트 사용을 위한 레지스터와 기본 적인 출력문을 통하여 인터럽트를 발생시킬 시에 LED 불빛이 점등되는 것을 확인 할 수가 있었다.② 프로그래밍을 통해 SEGMENT가 0~9,LED가 각각 0~8 의 출력을 보이기위에서 말했다 시피 첫 번째 과제와 거의 동일하였다. 그래서 7-segment와 LED의 출력값을 첫 번째 과제의 소스를 참고하여 확인 할 수 있었다. 또한 5장의 비트쉬프팅 부분을 통해 LED의 새로운 출력방법을 확인 할 수가 있었다.③ 인터럽트를 사용했을때 생기는 바운싱 현상확인 및 해결GIFR 레지스터를 사용하기 전에 다른 레지스터(SREG, GICR, MCUCR)만 사용 했을 때에는 폴링엣지와 라이징엣지에도 바운싱 현상이 발생함을 확일 할 수 있었다. 그래서 GIFR 레지스터를 사용하고 딜레이함수를 사용함으로써 바운싱 현상을 해결 할 수 있었다.④ 과제의 요구사항 구현이번 과제는 인터럽트를 이용하여 LED와 7-segment를 인터럽트의 개수만큼 증가시키거나 인터럽트를 측정하여서 출력의 방법을 바꿔 주는 것이었다.인터럽트를 발생시키는 것은 푸쉬스위치를 이용하여 발생시킴으로써 각각의 요구사항을 만족하는 프로그램 소스를 완성시켰다.최종적으로 설계가 끝난 사진Ⅴ 설계과정을 통해 얻은 결과인터럽트발생시의 LED불빛의 점등을 확인 하기 위해서 우리 조는 외부인터럽트 INT0/INT1의 포트를 확인하고 데이터시트를 확인 후에 바로 실습으로 들어 갔다. 전체적으로 무리 없이 LED점등을 확인 할 수 있었다. 그리고 LED의 점등을 1번스위치를 사용했을 때에는 증가, 2번 스위치를 사용시에는 감소할 때 과정에서 소스는 비트연산자를 이용하여서 전체적인 LED수를 제어 할 수 있었다. 이번과제에서 우리조의 발목을 잡은 것은 하드웨어문제도 전체적인 소스의 문제도 아니었다. 바로 바운싱 현상이었다. 바운싱현상을 잡기위해 데이터 시트와 책을 꼼꼼히 읽어본 결과 GIFR을 사용하여 바운싱현상을 해결하는 것을 알 수 있었다. 하지만 이것만으로는 뭔가 부족해보였다. 그래서 우리조는 GIFR 레지스터와 딜레이함수를 함께 사용하여 바운싱 현상을 깔끔하게 해결 할 수 있었다.Ⅵ 고찰첫 번째 과제를 수행할 당시에는 막막하다는 기분이 앞서있었다. 하지만 이번 과제를 할 때에는 저번 과제를 할 당시의 C++언어를 공부한데다가 첫 번째 과제와 비슷한 부분이 많았고, 거기에 약간의 추가적인 내용인 Interrupt의 사용법과 바운싱 현상을 제거하는 내용이 들어가 있을 뿐이었다. Interrupt의 사용법을 교수님께 배울 때 교수님의 설명을 들어도 이해안가는 부분이 꽤 많았다. 하지만 데이터시트를 부과적으로 공부를 더 함으로써 교수님의 설명 중 이해가 어려웠던 부분을 다시 해결할 수 있었다. 이번 과제에는 첫 번째 과제와 달리 한번 해봐서 그런지 조원들과 더더욱 단합된 모습으로 과제를 단계적으로 차근차근 잘 진행 할 수 있었다. 다음번 과제도 조원들과 잘 단합하여 차근차근 과제를 잘 전개해 나간다면 막힘없이 어려움없이 잘 해결 해 나갈 수 있을 것 같다.Ⅶ 부록(1) 프로그램 코드①번째 과제 소스#include#include#include//char led_count[9]={0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};// led 0 1 2 3 4 5 6 7 8void delay_us(unsigned int time_us);void delay_ms(unsigned int time_ms);volatile unsigned int inter_count=0;volatile unsigned int ledmax=0xff;volatile unsigned int led=0;void initialize(void);SIGNAL(SIG_INTERRUPT0) //External Interrupt0 1번 스위치 D2{inter_count++;if(inter_count>8){inter_count=0;}led = (ledmax >> (8-inter_count));delay_ms(400);GIFR |= 0x40;//플레그 레지스터 인터럽트 0번 플레그 설정}SIGNAL(SIG_INTERRUPT1) //External Interrupt1 2번 스위치 D3{inter_count--;if(inter_count> (8-inter_count));delay_ms(400);GIFR |= 0x80;//플레그 레지스터 인터럽트 1번 플레그 설정}int main(void){initialize();DDRD = 0x00; // INT 0,1 입력 방향DDRA = 0xff; // LED 출력 방향PORTA = 0x00; // LED 처음에 끔while(1){PORTA = led;}return 0;}void initialize(void){GICR = 0xc0; //외부 인터럽트 0,1(INT0,1) 사용MCUCR = 0x0f; //라이징 엣지 사용sei(); //SREG의 최상의 비트 I를 1로 설정 - enable all interrupt}void delay_us(unsigned int time_us){register unsigned int i;for(i=0;i> (8-led_count));delay_ms(400);GIFR |= 0x80;}if(sw_flag==1){seg_count++;if(seg_count>9){seg_count = 0;}delay_ms(400);GIFR |= 0x80;}}int main(void){initialize();DDRA = 0xff;DDRC = 0xff;while(1){PORTA = led;PORTC = segment[seg_count];}}void initialize(void){GICR = 0xc0; //external interrupt 0,1(int0, int1) usingMCUCR = 0x0a; //falling edge interrupt requestsei();//SERG 레지스터 최상위 비트 1설정}void delay_us(unsigned int time_us){register unsigned int i;for(i=0;i