이전 튜토리얼에서 PIC 마이크로 컨트롤러를 사용하여 LED를 깜박이는 방법을 배웠고 Perf 보드에 동일한 회로를 구축했습니다. 그런 다음 PICkit 3, ICSP 및 MPLAB IPE 를 사용하여 프로그램을 Perf 보드에 덤프했습니다. 이제이 튜토리얼에서는 PIC 마이크로 컨트롤러에서 더 많은 핀을 사용하는 방법을 살펴 보겠습니다. 7 개의 출력 (LED)과 1 개의 입력을 사용합니다. 이 튜토리얼에서는 이전 Perf 보드 (아래에 표시됨)를 사용하고 베르그 스틱을 추가하여 두 번째 LED 보드에 필요한 핀을 뽑습니다. 이 튜토리얼의 끝에서는 PIC 마이크로 컨트롤러 PIC16F877A를 사용하여 깜박이는 LED 시퀀스를 생성하고 여러 입력 및 출력을 사용하는 방법, 'for'루프 및 함수 호출에 대한 몇 가지 기본 사항을 학습합니다.
LED 보드는 전류 제한 저항 (아래 참조)으로 LED를 납땜하는 또 다른 성능 보드 일뿐입니다. 또한 시퀀스 LED 깜박임을 시작하는 푸시 버튼을 추가합니다.
회로도:
PIC 마이크로 컨트롤러 PIC16F877A LED 깜박임 시퀀스 코드 및 작동 설명:
완전한 코드가 아래에 주어졌습니다 (마지막에 확인), 여기에서 한 줄씩 코드를 얻을 것입니다. 이 코드는 누름 버튼을 누를 때 순차적으로 LED가 켜지 기 시작합니다. 시퀀스를 이해 하려면 튜토리얼 끝에 있는 비디오 를 시청하십시오. 비디오에 표시된 출력을 아래 코드와 비교하고 프로그램을 이해하는 것이 좋습니다.
코드를 한 줄씩 살펴 보겠습니다. 처음 몇 줄은 이전 자습서에서 설명한 구성 비트를 설정하기위한 것이므로 지금은 건너 뛰겠습니다. 프로그램을 이해하는 가장 좋은 방법은 main ( void main () ) 함수에서 시작하는 것이므로 그렇게합시다
TRISB0 = 1; // PORTB 핀 0이 버튼의 입력으로 사용됨을 MCU에 지시합니다. TRISD = 0x00; // 모든 핀이 출력되도록 MCU에 지시 PORTD = 0x00; // 모든 핀을 0으로 초기화
TRIS 라는 단어 는 핀이 입력 / 출력으로 사용되는지 여부를 정의하는 데 사용되며 PORT 라는 단어 는 핀을 High / Low로 만드는 데 사용됩니다. 라인 TRISB0 = 1 은 PORT B의 0 번째 핀을 입력으로 만듭니다. 이것이 우리의 푸시 버튼 이 될 것 입니다. 라인 TRISD = 0x00; PORTD = 0x00; 포트 D의 모든 핀을 출력으로 만들고 해당 핀에 LOW의 초기 값을 할당합니다.
B0이 입력으로 사용된다고 말 했으므로 푸시 버튼의 한쪽 끝을 핀 B0에 연결하고 다른 쪽 끝을 접지에 연결합니다. 그때까지 버튼을 누를 때마다 핀은 위의 연결 다이어그램과 같이 접지에 고정됩니다. 그러나이를 위해서는 버튼을 누르지 않을 때 핀이 높게 유지되도록 풀업 저항을 사용해야합니다. 풀업 저항은 이와 같은 것입니다.
그러나 우리의 PIC MCU에는 내부에 약한 풀업 저항이 있어서 소프트웨어로 활성화 할 수있어 많은 번거 로움을 덜어줍니다 (더 많은 버튼을 연결해야 할 때).
약한 풀업 저항이란 무엇입니까?
풀업 저항에는 두 가지 유형이 있습니다. 하나는 Weak Pull Up이고 다른 하나는 Strong Pull Up 입니다. 약한 풀업 저항은 값이 높기 때문에 약한 전류가 흐를 수 있고 강한 풀업 저항은 값이 낮으므로 강한 전류가 흐를 수 있습니다. 모든 MCU는 대부분 약한 풀업 저항을 사용합니다. PIC MCU에서이를 활성화하려면 아래 스냅 샷과 같이 OPTION_REG (옵션 레지스터)에 대한 데이터 시트를 살펴 봐야 합니다.
비트 7은 약한 풀업 저항을 다룹니다. 활성화하려면 0으로 만들어야합니다. 이것은 OPTION_REG <7> = 0에 의해 수행됩니다. 이것은 특히 다른 비트를 기본값으로 남겨 두는 비트 7을 다룹니다. 이것으로 우리는 while 루프에 들어가서 if (RB0 == 0) 을 사용하여 버튼이 눌 렸는지 확인합니다 . 조건이 충족되면 매개 변수 1, 3, 7 및 15로 함수를 호출합니다.
sblink (1); // FUNCTION CALL 1 with parameter 1 sblink (3); // FUNCTION CALL 3 with parameter 3 sblink (7); // 파라미터 7이있는 함수 호출 7 sblink (15); // 파라미터 15가있는 FUNCTION CALL 4
함수를 사용하는 이유는 무엇입니까?
함수는 코드에서 줄 수를 줄이는 데 사용됩니다. 이것은 우리 대부분이 알았을 것입니다. 그러나 특히 MCU 프로그래밍과 관련하여 라인 수를 줄여야하는 이유는 무엇입니까? 그 이유는 프로그램 메모리의 제한된 공간 때문입니다. 코드를 제대로 최적화하지 않으면 메모리 공간이 부족할 수 있습니다. 이것은 긴 페이지의 코드를 작성할 때 유용합니다.
모든 함수에는 함수 정의 (이 경우 sblink (int get) )와 함수 호출 (이 경우 sblink (1) )이 있습니다. 함수 선언을하는 것은 선택 사항입니다.이를 방지하기 위해 함수를 기본 함수에 호출하기 전에 함수 정의를 배치했습니다.
함수 매개 변수는 함수 호출에서 함수 정의로 전달되는 값입니다. 우리의 경우 정수 값 (1, 3, 7, 15)은 함수 호출에서 전달되는 매개 변수이고 변수 "get" 은 매개 변수 값을 함수 정의로 가져와 처리합니다. 함수는 둘 이상의 매개 변수를 가질 수 있습니다.
함수가 호출되면 함수 정의의 아래 줄이 실행됩니다.
for (int i = 0; i <= 7 && RB0 == 0; i ++) {PORTD = get << i; // LED 이동 왼쪽 시퀀스 __delay_ms (50); } for (int i = 7; i> = 0 && RB0 == 0; i--) {PORTD = get << i; // LED 이동 왼쪽 시퀀스 __delay_ms (50); }
이제이 줄은 이상하게 보입니다: PORTD = get << i . 여기서 실제로 무슨 일이 일어나고 있는지 설명하겠습니다.
"<<"는 모든 비트를 왼쪽 위치로 이동하는 왼쪽 이동 연산자입니다. 이제 매개 변수 '1'을 sblink (1) 로 하여 sblink (int get) 함수를 호출하면 'get'의 값 이 1이되며 이진수는 0b00000001입니다. 따라서이 줄은 PORTD = 0b00000001 << i 와 같습니다.
(int i = 0; i <= 7 && RB0 == 0; i ++)에 대해 'for 루프' 를 사용했기 때문에 "i"의 값은 0에서 7까지 다양 합니다. 'i'값이 0에서 7까지이면 다음과 같이 결과가 변경됩니다.
보시다시피 나머지는 꺼진 상태로 유지하여 한 번에 하나의 LED (왼쪽에서 오른쪽으로)를 켰습니다. (int i = 7; i> = 0 && RB0 == 0; i--)에 대한 다음 'for 루프' 도 동일하게 수행되지만 이번에는 LED가 순서대로 오른쪽에서 왼쪽으로 켜집니다. 7에서 시작하여 0으로 내려갑니다. LED가 켜지고 꺼지는 것을 시각화 할 수 있도록 200ms의 지연을 사용했습니다.
이제 sblink (int get) 함수 에서 값 3을 전달하면 sblink (3) 함수 가 실행되어 'get'값을 0b00000011로 만들므로 PORTD의 결과는 다음과 같습니다.
이제 이번에는 sblink (3)를 사용하여 주어진 시간에 두 개의 LED가 켜집니다 . sblink (7) 및 sblink (15 ) 와 유사하게 3 개 및 4 개의 LED가 순차적으로 켜집니다. 이 작업이 완료되면 PORTD = 0xFF 라인을 사용하여 모든 LED가 켜지도록합니다 . 전체 데모는 아래 비디오를 확인하십시오.
코드를 이해하고 함수, 'for'및 'while'루프 를 사용하여 원하는 출력을 얻는 방법을 배웠기 를 바랍니다. 이제 코드를 조정하여 다른 순서의 LED 깜박임을 얻을 수 있습니다. 계속해서 코드를 컴파일하고 MCU에 덤프하고 출력을 즐기십시오. 어딘가에 막히면 댓글 섹션을 사용할 수 있습니다. 여기에 시뮬레이션 및 프로그램 파일도 첨부했습니다.
지금 은 다음 튜토리얼에서 지연 기능을 사용하는 대신 PIC16F877A 타이머를 사용하는 방법을 배웁니다. 여기에서 모든 PIC 마이크로 컨트롤러 자습서를 찾아 볼 수 있습니다.