목차
1. 실험목표
2. 관련이론
3. 데이터시트
4. 실험
5. 실험결과
6. 오차 및 분석
2. 관련이론
3. 데이터시트
4. 실험
5. 실험결과
6. 오차 및 분석
본문내용
반복문에서 사용됩니다.
- ④ void SW0(void):
SW0라는 이름의 함수를 정의합니다. 이 함수는 SW0 스위치가 눌렸을 때 실행되며, LED 패턴 1을 생성합니다.
- Temp를 0x00으로 설정합니다.
- PORTA에 Temp 값을 쓴 후, 500 밀리초 동안 대기합니다.
- PORTA에 Temp의 비트를 반전시키고 다시 500 밀리초 동안 대기합니다.
- 이러한 과정을 반복하여 LED 패턴을 만듭니다.
- ⑤ void SW1(void):
SW1라는 이름의 함수를 정의합니다. 이 함수는 SW1 스위치가 눌렸을 때 실행되며, LED 패턴 2를 생성합니다.
- Temp를 0x7f로 설정합니다.
- 반복문을 통해 Temp 변수를 오른쪽으로 시프트하면서 LED 패턴을 만듭니다.
- ⑥ void main(void):
main 함수를 정의합니다. 프로그램의 시작점입니다.
- DDRA = 0xff;: PORTA를 출력 모드로 설정합니다. 즉, PORTA 핀들을 출력으로 구성합니다.
- DDRD = 0x00;: PORTD를 입력 모드로 설정합니다. 즉, PORTD 핀들을 입력으로 구성합니다.
- 무한 루프 (while(1))가 시작됩니다.
- PORTA=0x33;: PORTA에 0x33 값을 쓴다. 이 값은 기본 LED 패턴을 설정합니다.
- If(PIND.0 == 0): 만약 PORTD의 0번 핀 (PIND.0)이 0이라면 (스위치 SW0이 눌린 경우)
- SW0() 함수를 호출하여 LED 패턴 1을 생성합니다.
- if(PIND.1 == 0): 만약 PORTD의 1번 핀 (PIND.1)이 0이라면 (스위치 SW1이 눌린 경우)
- SW1() 함수를 호출하여 LED 패턴 2를 생성합니다.
4.2 실습 코드 분석(Interrupt 예제)
- ① #include 지시문:
이 부분은 헤더 파일을 포함하는 부분입니다.와 헤더 파일을 포함하여 사용할 라이브러리 및 함수를 정의합니다.
- ② 전역 변수 선언:
- char a = 0x01;: 8비트 문자형 변수 a를 선언하고 0x01로 초기화합니다.
- int i = 0;: 정수형 변수 i를 선언하고 0으로 초기화합니다.
- int time = 100;: 정수형 변수 time을 선언하고 100으로 초기화합니다.
- ③ interrupt [EXT_INT0] void ext_int0_isr(void):
이 부분은 EXT_INT0 외부 인터럽트에 대한 인터럽트 서비스 루틴을 정의합니다. 이 루틴은 외부 인터럽트 0 (INT0)가 발생할 때 실행됩니다.
- time = time - 10;: time 변수를 10만큼 감소시킵니다.
- if(time <= 10): 만약 time이 10 이하로 떨어진다면,
- time = 100;: time을 다시 100으로 설정합니다.
- ④ void main(void):
main 함수를 정의합니다. 이것은 프로그램의 진입점입니다.
- PORTA=0x00;: PORTA를 0으로 초기화합니다.
- DDRA=0xFF;: PORTA를 출력 모드로 설정합니다. 즉, PORTA 핀들을 출력으로 설정합니다.
- EICRA=0x02;: 외부 인터럽트 컨트롤 레지스터 A(EICRA)를 설정하여 INT0 (외부 인터럽트 0)가 하강 에지에서 인터럽트를 활성화합니다.
- EICRB=0x00;: 외부 인터럽트 컨트롤 레지스터 B(EICRB)를 0으로 설정합니다.
- EIMSK=0x01;: 외부 인터럽트 마스크 레지스터(EIMSK)를 설정하여 INT0 인터럽트를 활성화합니다.
- #asm(\"sei\"): 인터럽트를 전역적으로 활성화합니다. 즉, 전체적으로 인터럽트를 허용합니다.
- ⑤ while (1):
무한 루프가 시작됩니다.
- a = 0x01;: 변수 a를 0x01로 설정합니다.
- for(i=0; i<8; i++): 반복문을 사용하여 LED의 이동을 제어합니다. i는 0부터 7까지 증가합니다.
- PORTA=~a;: PORTA에 a의 비트를 반전한 값을 출력하여 LED를 제어합니다.
- a = a << 1;: a를 왼쪽으로 비트 시프트하여 다음 LED를 제어하기 위해 이동합니다.
- delay_ms(time);: time 만큼의 시간 동안 대기합니다. time은 인터럽트에 의해 변경될 수 있으므로 LED 이동 속도를 조절할 수 있습니다.
5. 오차 및 분석
- 나의 예상에는 소자의 불량이라고 생각한다.
현재, 작동이 잘 되지 않는 스위치는 소자의 PD0에 연결된 스위치인데, 남땜과 와이어 모두 3번 이상 확인했고, 4번째 시도 때 실수로 PD0 바로 위인 리셋 단자에 연결했는데, 스위치를 누르자 불이 꺼지는 모습을 볼 수 있었다. 아주 스위치가 잘 작동한 것이다.
이것으로 미루어 보아, 애초에 소자가 문제가 있는 게 아닌가 싶다.
나머지는 내가 생각한 다른 가능성들이다.
- 첫째로, 소자의 불확실성이다. 이번 강의에 사용한 소자는 우리 학교 랩실 인원들이 하나하나 직접 기판에 납땜을 한 소자로서, 그 과정에서 소자가 손상됐을 가능성이 존재한다.
(실제로, 첫 시간에 저항과 전구 등을 납땜하고 노트북과 연결하여 작동을 확인 할 당시, 8개의 전구 중 하나가 계속 불이 들어오지 않아 당황했었는데, 2시간의 피드백 끝에, ATmega128 소자 불량으로 파악되었다. 자세하게는, 49번 핀인 PA2 부분이 제대로 납땜이 되어 있지 않았던 것이다. 그 부분을 인두기로 다시 제대로 납땜하니, 전구는 정상적으로 들어왔다.)
- 둘째로, 점퍼선(와이어)에서도 저항은 존재한다는 것이다. 그러므로 전류가 그 점퍼선(와이어)을 이동하면서 자연스럽게 그 점퍼선 상에 있는 자그마한 저항의 영향을 받기 때문에 시뮬레이션의 결과처럼 이상적이론적 결과는 현실적으로는 불가능하기 때문에 오차가 생긴 것이라고 생각한다.
- 셋째로는, 점퍼선(와이어)의 결함이라고 생각한다.
소자와 소자 사이를 이을 때, 우린 보통 래핑 와이어를 사용하는데, 절연 소자로 감싸져있는 와이어 속이 미세하게 끊어져 있을 수도 있고, 또는 납땜하는 과정에서 미세하게 전류가 통하지 않게 납땜을 했을 가능성 또한 배제할 수 없다고 생각한다.
- ④ void SW0(void):
SW0라는 이름의 함수를 정의합니다. 이 함수는 SW0 스위치가 눌렸을 때 실행되며, LED 패턴 1을 생성합니다.
- Temp를 0x00으로 설정합니다.
- PORTA에 Temp 값을 쓴 후, 500 밀리초 동안 대기합니다.
- PORTA에 Temp의 비트를 반전시키고 다시 500 밀리초 동안 대기합니다.
- 이러한 과정을 반복하여 LED 패턴을 만듭니다.
- ⑤ void SW1(void):
SW1라는 이름의 함수를 정의합니다. 이 함수는 SW1 스위치가 눌렸을 때 실행되며, LED 패턴 2를 생성합니다.
- Temp를 0x7f로 설정합니다.
- 반복문을 통해 Temp 변수를 오른쪽으로 시프트하면서 LED 패턴을 만듭니다.
- ⑥ void main(void):
main 함수를 정의합니다. 프로그램의 시작점입니다.
- DDRA = 0xff;: PORTA를 출력 모드로 설정합니다. 즉, PORTA 핀들을 출력으로 구성합니다.
- DDRD = 0x00;: PORTD를 입력 모드로 설정합니다. 즉, PORTD 핀들을 입력으로 구성합니다.
- 무한 루프 (while(1))가 시작됩니다.
- PORTA=0x33;: PORTA에 0x33 값을 쓴다. 이 값은 기본 LED 패턴을 설정합니다.
- If(PIND.0 == 0): 만약 PORTD의 0번 핀 (PIND.0)이 0이라면 (스위치 SW0이 눌린 경우)
- SW0() 함수를 호출하여 LED 패턴 1을 생성합니다.
- if(PIND.1 == 0): 만약 PORTD의 1번 핀 (PIND.1)이 0이라면 (스위치 SW1이 눌린 경우)
- SW1() 함수를 호출하여 LED 패턴 2를 생성합니다.
4.2 실습 코드 분석(Interrupt 예제)
- ① #include 지시문:
이 부분은 헤더 파일을 포함하는 부분입니다.
- ② 전역 변수 선언:
- char a = 0x01;: 8비트 문자형 변수 a를 선언하고 0x01로 초기화합니다.
- int i = 0;: 정수형 변수 i를 선언하고 0으로 초기화합니다.
- int time = 100;: 정수형 변수 time을 선언하고 100으로 초기화합니다.
- ③ interrupt [EXT_INT0] void ext_int0_isr(void):
이 부분은 EXT_INT0 외부 인터럽트에 대한 인터럽트 서비스 루틴을 정의합니다. 이 루틴은 외부 인터럽트 0 (INT0)가 발생할 때 실행됩니다.
- time = time - 10;: time 변수를 10만큼 감소시킵니다.
- if(time <= 10): 만약 time이 10 이하로 떨어진다면,
- time = 100;: time을 다시 100으로 설정합니다.
- ④ void main(void):
main 함수를 정의합니다. 이것은 프로그램의 진입점입니다.
- PORTA=0x00;: PORTA를 0으로 초기화합니다.
- DDRA=0xFF;: PORTA를 출력 모드로 설정합니다. 즉, PORTA 핀들을 출력으로 설정합니다.
- EICRA=0x02;: 외부 인터럽트 컨트롤 레지스터 A(EICRA)를 설정하여 INT0 (외부 인터럽트 0)가 하강 에지에서 인터럽트를 활성화합니다.
- EICRB=0x00;: 외부 인터럽트 컨트롤 레지스터 B(EICRB)를 0으로 설정합니다.
- EIMSK=0x01;: 외부 인터럽트 마스크 레지스터(EIMSK)를 설정하여 INT0 인터럽트를 활성화합니다.
- #asm(\"sei\"): 인터럽트를 전역적으로 활성화합니다. 즉, 전체적으로 인터럽트를 허용합니다.
- ⑤ while (1):
무한 루프가 시작됩니다.
- a = 0x01;: 변수 a를 0x01로 설정합니다.
- for(i=0; i<8; i++): 반복문을 사용하여 LED의 이동을 제어합니다. i는 0부터 7까지 증가합니다.
- PORTA=~a;: PORTA에 a의 비트를 반전한 값을 출력하여 LED를 제어합니다.
- a = a << 1;: a를 왼쪽으로 비트 시프트하여 다음 LED를 제어하기 위해 이동합니다.
- delay_ms(time);: time 만큼의 시간 동안 대기합니다. time은 인터럽트에 의해 변경될 수 있으므로 LED 이동 속도를 조절할 수 있습니다.
5. 오차 및 분석
- 나의 예상에는 소자의 불량이라고 생각한다.
현재, 작동이 잘 되지 않는 스위치는 소자의 PD0에 연결된 스위치인데, 남땜과 와이어 모두 3번 이상 확인했고, 4번째 시도 때 실수로 PD0 바로 위인 리셋 단자에 연결했는데, 스위치를 누르자 불이 꺼지는 모습을 볼 수 있었다. 아주 스위치가 잘 작동한 것이다.
이것으로 미루어 보아, 애초에 소자가 문제가 있는 게 아닌가 싶다.
나머지는 내가 생각한 다른 가능성들이다.
- 첫째로, 소자의 불확실성이다. 이번 강의에 사용한 소자는 우리 학교 랩실 인원들이 하나하나 직접 기판에 납땜을 한 소자로서, 그 과정에서 소자가 손상됐을 가능성이 존재한다.
(실제로, 첫 시간에 저항과 전구 등을 납땜하고 노트북과 연결하여 작동을 확인 할 당시, 8개의 전구 중 하나가 계속 불이 들어오지 않아 당황했었는데, 2시간의 피드백 끝에, ATmega128 소자 불량으로 파악되었다. 자세하게는, 49번 핀인 PA2 부분이 제대로 납땜이 되어 있지 않았던 것이다. 그 부분을 인두기로 다시 제대로 납땜하니, 전구는 정상적으로 들어왔다.)
- 둘째로, 점퍼선(와이어)에서도 저항은 존재한다는 것이다. 그러므로 전류가 그 점퍼선(와이어)을 이동하면서 자연스럽게 그 점퍼선 상에 있는 자그마한 저항의 영향을 받기 때문에 시뮬레이션의 결과처럼 이상적이론적 결과는 현실적으로는 불가능하기 때문에 오차가 생긴 것이라고 생각한다.
- 셋째로는, 점퍼선(와이어)의 결함이라고 생각한다.
소자와 소자 사이를 이을 때, 우린 보통 래핑 와이어를 사용하는데, 절연 소자로 감싸져있는 와이어 속이 미세하게 끊어져 있을 수도 있고, 또는 납땜하는 과정에서 미세하게 전류가 통하지 않게 납땜을 했을 가능성 또한 배제할 수 없다고 생각한다.
추천자료
실험 7 예비(avr마이크로컨트롤러)
(A+) 마이크로프로세서응용 ATmega128 USART 보고서
(A+) 마이크로프로세서응용 ATmega128 ADC(Analog to Digital Converter) 보고서
(A+) 마이크로프로세서응용 ATmega128 16Bit Timer, Counter, PWM 보고서
(A+) 마이크로프로세서응용 ATmega128 8bit Timer, Counter 보고서
(A+) 마이크로프로세서응용 ATmega128 CLCD 실습 보고서
(A+) 마이크로프로세서응용 ATmega128 Module, 노트북과 ISP 이용한 LED 제어 결과보고서
(A+) 마이크로프로세서응용 ATmega128 Module, Test Board LED 결과보고서
소개글