PIC 튜토리얼-레지스터에서 인터럽트로

문제를 제거하기 위해 도구를 사용해보십시오





PIC 프로그래밍의 세부 사항에 들어가기 전에 먼저 몇 가지 좋은 프로그래밍 방법을 배우는 것이 중요합니다.

레지스터 이해

우선 프로그램의 어느 지점에서든 (세미콜론)을 입력한다고 가정하면이 세미콜론 뒤에 오는 모든 것은 물론 캐리지가 위치로 돌아올 때까지 컴파일러에서 무시됩니다.



위의 기능을 사용하면 프로그램의 일부가되지 않도록 의견이나 발언을 추가 할 수 있지만 옆에있는 의견을 통해 프로그램을 쉽게 식별 할 수 있습니다. IC를 프로그래밍하는 동안 주석을 추가하는 것이 좋습니다.

이 과정에서 다음으로 중요한 것은 다양한 상수에 이름을 할당하는 것입니다 (나중에 자세히 배울 것입니다). 이 aso를 사용하면 포함 된 숫자와 혼동하는 대신에 쓰여진 내용 또는 관련 값을 이해하는 것이 더 간단 해집니다.



위의 내용은 즉석 인식을 위해 실제 이름의 형태로 수행해야합니다 (예 : COUNT). 여기서 모든 대문자를 사용하여 구별하고 상수 값임을 나타냅니다.


보시다시피, 위의 내용은 세미콜론으로 만든 상자 형태로 이루어 졌기 때문에 깔끔하게 보입니다. 또한 종이에 프로그램을 문서화 해보십시오.이 연습은 단계적으로 이해하는 데 도움이 될 것입니다.

2. 레지스터.

PIC 내의 레지스터는 서면 세부 정보를 받아들이고 읽을 수있는 영역입니다. 내용을 시각화하고 위에 적어 추가 할 수있는 종이와 비교할 수 있습니다.

아래 그림은 PIC16F84에 내장 된 일반적인 레지스터 파일 맵을 보여줍니다. 형식은 실제로 PIC 내부에 설정되어있는 것이 아니라 단순히 비트가 칩 내부에 배치되는 방식을 나타내고 관련 명령 중 일부를 이해하기위한 것입니다.

기본적으로 뱅크 0과 뱅크 1로 나뉘어져 있음을 알 수 있습니다. 뱅크 1은 PIC의 실제 작업을 제어하는 ​​역할을합니다. 예를 들어 포트 A의 비트가 입력으로 할당되고 출력으로 할당되는 PIC에 전화를 겁니다.

뱅크 2는 정보를 조작하기위한 것입니다.

다음 예를 통해 이해해 보겠습니다.

PortA 하이에서 1 비트를 할당한다고 가정합니다. 이를 위해 먼저 뱅크 1로 이동하여 출력 형식으로 포트 A에서 지정된 비트 또는 핀을 설정해야합니다. 그 후 뱅크 0으로 돌아가 특정 핀에 로직 1 (비트 1)을 전달합니다.

뱅크 1에서 사용하고 싶은 가장 일반적인 레지스터는 STATUS, TRISA 및 TRISB입니다.

STATUS는 뱅크 0으로 돌아가는 데 도움이되고, TRISA는 포트 A의 어떤 핀이 출력이고 어떤 핀이 입력이 될지 선택할 수있게 해주는 반면, TRISB는 포트 B에서 출력과 입력 핀 사이에서 선택을 용이하게합니다 .BANK 0의 SELECT 레지스터는 사용자를 허용합니다. 뱅크 1로 전환합니다.

다음 설명으로 전체 개념을 요약 해 보겠습니다.

상태:

뱅크 0에서 뱅크 1로 전환하기 위해 STATUS 레지스터를 명령합니다. 이것은 STATUS 레지스터의 비트 # 5를 1로 설정하여 구현됩니다. 뱅크 0으로 돌아 가기 위해 STATUS 레지스터의 비트 5를 0으로 할당합니다. STATUS 레지스터는 주소 03h에 위치하며 여기서 h는 숫자를 나타냅니다. 16 진수 일 수 있습니다.

TRISA 및 TRISB :

이들은 주소 85h와 86h에 상응합니다. 핀을 출력 또는 입력으로 프로그래밍하기 위해 레지스터의 특정 비트에 0 또는 1을 전달합니다. 이제 이것은 바이너리 또는 Hex를 통해 두 가지 방법으로 수행 될 수 있습니다. 매개 변수를 변환 할 수없는 경우 값을 구현하기 위해 공학용 계산기를 사용할 수 있습니다.

이제 포트 A에 5 개의 핀이 있으며 이는 5 개의 핀에 해당합니다. 핀 중 하나를 입력으로 고정하려는 경우 특정 비트에 '1'을 전달합니다.

핀 중 하나를 출력으로 할당하려는 경우 특정 핀을 '0'으로 설정합니다. 비트는 비트에 따라 정확하게 지원됩니다. 또는 더 정확한 비트 0은 RA0이고, 비트 1은 RA1, 비트 2 = RA2 등입니다. 다음과 같이 이해합시다.

RA0, RA3 및 RA4를 출력으로 수정하고 RA1 / RA2를 i / ps로 수정한다고 가정하면 00110 (06h)을 전송하여이를 수행합니다. 여기에 표시된대로 비트 0이 오른쪽을 향하고 있는지 확인하십시오.

포트 A 핀 RA4 RA3 RA2 RA1 RA0

비트 번호 4 3 2 1 0

이진 000110

TRISB도 마찬가지입니다.

PORTA 및 PORTB

출력 핀 중 하나를 하이로 유도하기 위해 PORTA 또는 PORTB 레지스터의 각 비트에 '1'을 제공합니다. TRISA 및 TRISB 레지스터에 대해서도 동일한 절차를 따를 수 있습니다. 첫 번째 예제 코딩을 시작하기 전에 더 많은 레지스터, 즉 w 및 f의 쿠페를 이해하겠습니다.

W와 F

W 레지스터는 원하는 값을 할당 할 수있는 일반 레지스터입니다. W에 크기를 지정하자마자 이것을 다른 값에 추가하거나 간단히 이동할 수 있습니다. 다른 값이 할당되면 세부 정보가 W에서 덮어 쓰여집니다.

F 레지스터는 기록 된 내용을 레지스터로 전달합니다. 레지스터 위에 값을 할당하려면이 F 레지스터가 필요합니다. STATUS 또는 TRISA 레지스터 위에있을 수 있습니다. 이러한 레지스터는 값을 바로 위에 놓을 수 없기 때문입니다. 예제 프로그램

위의 지침이 구현되는 방법을 보여주고 과정에서 몇 가지 지침을 확인할 수있는 다음 예제 코드를 살펴 보겠습니다.

위에서 설명한대로 포트 A를 수정하는 것으로 시작하겠습니다.

이를 위해 Bank 0에서 Bank1로 이동해야합니다. 이는 주소 03h, 비트 5에서 1에 위치한 STATUS 레지스터를 설정하여 수행됩니다.

BSF 03h, 5

BSF는 비트 세트 F를 의미합니다.이 명령어 뒤에는 STATUS 레지스터 주소 인 03h와 비트 번호에 해당하는 5 번 두 개의 숫자를 사용합니다.

그래서 우리가 말하는 것은“03h 주소에서 비트 5를 1로 설정”입니다.

우리는 이제 뱅크 1에 있습니다.

MOVLW 00110b

이진 값 00110 (문자 b는 숫자가 이진수임을 의미)을 범용 레지스터 W에 넣습니다. 물론 16 진수로이 작업을 수행 할 수 있습니다.이 경우 명령은 다음과 같습니다.

MOVLW 06h

둘 다 작동합니다. MOVLW는 '리터럴 값을 W로 이동'을 의미하며 영어로 바로 뒤에 오는 값을 W 레지스터에 넣는 것을 의미합니다.

이제이 값을 TRISA 레지스터에 입력하여 포트를 설정해야합니다.

MOVWF 85h

이 명령은 'W의 내용을 뒤에 오는 레지스터 주소로 이동'을 나타내며,이 경우 주소는 TRISA를 나타냅니다.

이 시점의 TRISA 레지스터에는 숫자 00110이 표시되거나 그래픽으로 표시됩니다.

포트 A 핀 RA4 RA3 RA2 RA1 RA0

이진 000110

입력 / 출력 O O I I O

이제 포트 A 핀이 있으므로 정보 중 하나를 조정하려면 뱅크 0으로 돌아 가야합니다.

BCF 03h, 5

이 명령은 BSF의 반대를 수행합니다. 'Bit Clear F'를 의미합니다. 해당하는 숫자 쌍은 레지스터의 주소 (여기서는 STATUS 레지스터)와이 경우 비트 5의 비트 그림입니다. 현재 정확히 완료 한 것은

STATUS 레지스터를 0으로

이 시점에서 뱅크 0에 반환되었습니다.
다음은 한 블록의 코드입니다.

BSF 03h, 5 뱅크 1로 이동
MOVLW 06h 00110을 W에 넣어
MOVWF 85h 00110을 TRISA로 이동
BCF 03h, 5 뱅크 0으로 돌아옵니다.

마지막 지침에서 PIC의 IO 포트 핀을 입력 또는 출력 가능하게 설정하는 방법을 확인했습니다.

이 과정을 통해 포트로 데이터를 전송하는 데 도움을 드리겠습니다.

포트로 데이터 보내기

후속 자습서에서는 PIC가 예상 한대로 정확하게 수행되는 것을 볼 수 있도록 전체 프로그램 세부 정보와 간단한 회로 다이어그램으로 구성된 LED를 켜고 끄는 것으로 완료합니다.

아래 결과는 그림 일 뿐이므로 PIC를 함께 조합하고 프로그래밍하지 마십시오. 처음에는 포트 A 비트 2를 출력으로 설정합니다.

이것은 이전 교육에서 알아볼 수 있습니다. 유일한 차이점은 0h를 tri-state 레지스터에 전달하여 A의 모든 핀을 출력으로 고정 할 수 있다는 것입니다. 이제 그가해야 할 일은 LED를 켜는 것입니다.

핀 중 하나 (LED가 연결된 핀)를 높게 예약하여이를 수행합니다. 다르게 말하면 핀에 '1'을 적용합니다. 이것이 정확히 수행되는 방식입니다 (모든 줄에 대한 설명을 보려면 주석을 참조하십시오).

따라서 이제 우리가 달성 한 것은 LED를 한 번 켰다 끄는 것입니다. 우리가 원하는 것은 LED가 계속해서 켜지는 것입니다.

우리는 처음으로 돌아가는 프로그램을 얻음으로써 이것을 달성합니다. 우리는 프로그램을 시작할 때 처음에 태그를 설정 한 다음 프로그램에 다시 진행하도록 알림으로써이를 수행합니다. 태그를 아주 간단하게 지정합니다.

용어를 입력하고 START라고 말한 다음 코드를 입력합니다.

앞에서 설명한 것처럼 처음에는 프로그램 시작 부분에서 바로 '시작'이라는 표현을 언급했습니다.

다음으로 프로그램이 끝날 때 '시작으로 이동'을 분명히 언급했습니다. 'goto'명령어는 선언 된대로 수행합니다.

이 프로그램은 회로에 전원을 공급할 때마다 LED를 지속적으로 켜고 끄며, 일단 전기를 제거하면 꺼지는 경향이 있습니다. 프로그램을 다시 확인해야 할 수도 있습니다.

확실히 우리는 주석을 생략했지만 여전히 지침과 번호를 관찰 할 수 있습니다.

나중에 프로그램 문제 해결을 시도하고 코드를 작성하는 동안 주소를 모두 기억 한 경우 약간 혼란 스러울 수 있습니다.

주석이 여전히 배치 될 수 있지만 약간 어수선해질 수 있습니다. 이것은 숫자 이름을 지정해야하며 추가 명령으로 수행 할 수 있습니다. 'equ' 'equ'명령은 일부 항목이 다른 항목과 동일 할 수 있음을 암시합니다.

이것은 어셈블러 용이 아니라 PIC 용 명령어가 아닐 수도 있습니다. 이 명령어를 사용하면 레지스터 주소 위치에 이름을 할당하거나 프로그래밍 용어에 상수를 쉽게 할당 할 수 있습니다.

프로그램에 대한 몇 가지 상수를 설정하고 프로그램을 얼마나 간단하게 읽는지 확인합니다.

이제 상수 값을 수정 했으므로 프로그램에 설정하여 진행할 수 있습니다. 상수 값은 사용하기 전에 지정해야합니다.

따라서 항상 프로그램 시작 부분에 배치해야합니다. 이전 라벨링과 최신 라벨링을 비교하기 위해 코멘트를 제외한 프로그램을 다시 작성하겠습니다.

상수가 프로그램을 조금 더 쉽게 이해할 수있게 해준다는 것을 눈치 채 셨겠지만 아직 완료되지 않았기 때문에 아직 주석이 없습니다. 걱정할 필요는 없습니다.

깜박이는 LED 프로그램에 약간의 단점이있을 수 있습니다.
모든 명령어를 완료하려면 1 개의 클럭 시퀀스가 ​​필요합니다. 4MHz 크리스털을 사용하는 경우 모든 명령은 1 / 4MHz 또는 1uS를 완료해야합니다.

5 개의 명령 만 사용했기 때문에 LED는 5uS에서 활성화되었다가 꺼집니다. 이것은 사람들이 눈치 채기에는 너무 빠르며 LED가 완전히 켜진 것처럼 보일 것입니다.

대신 우리가 달성해야하는 것은 LED를 켜고 끄는 것 사이에 억제를 생성하는 것입니다. 억제 이론은 우리가 이전 수량에서 카운트 다운하기 때문에 0이되면 카운트를 그만 둡니다.

0 값은 지연의 결론을 나타내며 프로그램 전체에 걸쳐 프로세스 작업을 계속합니다. 따라서 가장 먼저해야 할 일은 카운터로 사용할 상수를 결정하는 것입니다.

이 상수를 COUNT라고합시다. 그 후, 우리는 계산을 시작할 숫자의 중요성을 결정해야합니다. 확실히, 우리가 포함 할 수있는 가장 큰 숫자는 255 또는 16 진수의 FFh입니다. 이전 튜토리얼에서 언급했듯이 equ 명령어는 레지스터 상황에 표현식을 할당합니다.

이것은 우리가 COUNT를 할당하는 수량에 관계없이 레지스터의 항목과 일치한다는 것을 의미합니다. FFh 값을 지정하려고하면 프로그램을 컴파일하면 실수가 발생합니다.

위치가 FFh 인 이유는이므로 액세스 할 수 없습니다. 그렇다면 정품 번호는 어떻게 지정해야합니까? 확실히, 그것은 약간의 측면 숙고가 필요할 것입니다.

예를 들어 COUNT를 주소 08h로 지정하면 기본 목표 레지스터 대상을 나타냅니다. 기본적으로 손대지 않은 영역은 FFh로 설정됩니다. 결과적으로 COUNT가 08h로 연결되면 처음 전원을 켜는 동안 FFh 값을 보게됩니다. 그럼에도 불구하고 COUNT를 다른 번호로 고정하려면 어떻게해야합니까? 우리가 적용하는 것은 먼저이 목적지로 평가를 '이동'하는 것입니다.

예를 들어, COUNT가 85h의 값을 갖기를 원한다고 가정하면 COUNT equ 85h는 포트 A에 대한 Tri-State 레지스터의 위치이므로 언급 할 수 없습니다. 정확히 우리가 수행하는 것은 다음과 같습니다. movlw 85h W 레지스터 movwf 08h의 85h 값

이제 08h 레지스터로 이동하십시오. 결과적으로 COUNT equ 08h를 표현하면 COUNT는 85h 값과 일치합니다. 섬세하지 않나요! 따라서 처음에 상수를 결정합니다. COUNT equ 08h 다음으로이 COUNT를 0이 될 때까지 1 씩 줄여야합니다.

단순히 'goto'와 태그를 사용하여이를 수행하도록 설계된 하나의 명령이 존재합니다.

적용 할 명령어는 다음과 같습니다. DECFSZ COUNT, 1이 명령어는 쉼표를 추적하는 번호로 '레지스터 (여기서는 COUNT)를 감소시킵니다. 0에 도달하면 두 단계 앞쪽으로 뛰어 오르십시오.”코스에 배치하기 전에 먼저 실제 동작을 찾아 보겠습니다.

우리가 수행 한 것은 처음에 상수 COUNT를 255로 설정하는 것입니다. 후속 세그먼트는 decfsz 명령어 가까이에 LABEL이라는 태그를 배치합니다.

decfsz COUNT, 1은 COUNT의 값을 1 씩 줄이고 최종 결과를 COUNT에 그대로 유지합니다. 또한 COUNT의 값이 0인지 확인합니다.

그렇지 않은 경우 프로그램이 다음 줄로 이동하도록 트리거합니다. 이제 decfsz 지침으로 돌아가는 'goto'선언이 있습니다.

COUNT의 값이 동일하게 수행되는 경우 decfsz 명령은 프로그램이 2 단계 앞서 도약하도록하고 'Carry on here'를 주장한 위치로 전송됩니다.

따라서 관찰 할 수 있기 때문에 진행하기 전에 예정된 시간 동안 한 자리에 앉는 프로그램을 가져 왔습니다. 이것은 지연 루프라고 할 수 있습니다.

지연 루프 이해

더 많은 지연이 필요한 경우 다음 루프를 하나씩 추구 할 수 있습니다. 추가 루프는 지연을 연장합니다. LED 플래시를 관찰하고 싶다고 가정하고 적어도 두 개는하겠습니다. 이러한 지연 루프를 프로그램에 배치하고 주석을 도입하여 실제 프로그램으로 렌더링하여 수행합니다.

이 프로그램을 컴파일 한 후 PIC를 프로그램 할 수 있습니다. 분명히 회로가 실제로 작동하는지 확인하기 위해 회로를 시도하십시오. 다음은 PIC를 프로그래밍하자마자 구성해야하는 회로도입니다.


잘하셨습니다. 실제로 첫 번째 PIC 프로그램을 구성하고 LED를 켜고 끄는 회로를 구성 할 수 있습니다. 지금까지이 과정을 이수했다면 35 개 중 7 개 명령을 전체적으로 배웠을 수도 있지만 지금까지 I / O 포트를 제어하고있을 수도 있습니다.

LED 플래시를 더 빨리 렌더링하기 위해 지연 루프를 변경해 보시겠습니까? 기본적으로 LED 플래시를보기 위해 COUNT의 최소값으로 나타나는 것은 무엇입니까? 또는 LED를 안정화하기 위해 초기 지연 루프 이후에 세 번째 또는 추가 지연 루프를 포함 할 수 있습니다. 각 지연 루프에 대한 고유 상수.

그런 다음 실제로 지연 루프를 조작하여 예를 들어 1 초 후에 특정 속도로 LED 플래시를 렌더링 할 수 있습니다. 다음 강의에서 우리가 어떻게 서브 루틴으로 알려진 것을 활용하여 프로그램을 압축하고 기본적으로 유지할 수 있는지 살펴 보겠습니다. 서브 루틴은 필요할 때 참조 할 수있는 코드 또는 프로그램의 필수 부분입니다. 서브 루틴은 동일한 기능을 자주 수행하는 경우에 사용됩니다.

서브 루틴이란?

서브 루틴을 사용하는 이점은 프로그램 전체에서 10 번을 사용하는 대신 서브 루틴 내부에서 한 번 값을 수정하는 것이 더 간단 할뿐만 아니라 프로그램이 내부에서 사용하는 메모리 수준을 줄이는 데 크게 기여한다는 것입니다. PIC. 서브 루틴을 확인합니다.

처음에는 서브 루틴에 지정을 제공해야하는데이 상황에서는 ROUTINE을 선택했습니다. 그 다음에는 정상적으로 수행하고 싶은 코드를 입력합니다. 그래서 우리는 깜박이는 led 프로그램에서 지연을 선택했습니다. 마지막으로 RETURN 명령어를 입력하여 서브 루틴을 마무리합니다.

프로그램의 어느 곳에서나 서브 루틴을 시작하려면 CALL 명령을 입력 한 다음 서브 루틴 지정을 빠르게 입력합니다.

우리는 이것을 좀 더 깊이 고려할 것입니다. 프로그램의 섹션에 도달하면 xxx는 서브 루틴의 이름입니다. 여기서 xxx는 서브 루틴 xxx가 설치된 곳으로 도약합니다. 서브 루틴 내부의 명령이 수행됩니다.

RETURN 명령이 완료 될 때마다 프로그램은 CALL xxx 명령 이후의 명령으로 주요 프로그램으로 되돌아갑니다.

원하는대로 유사한 서브 루틴을 여러 번 호출 할 수 있습니다. 이는 서브 루틴을 사용하면 프로그램의 일반적인 기간이 줄어드는 이유를 설명합니다.

그럼에도 불구하고 알아야 할 몇 가지 요소가 있습니다. 처음에는 주요 프로그램과 마찬가지로 특정 상수를 사용하기 전에 확인해야합니다.

이는 서브 루틴 자체 내에서 또는 주 프로그램 시작시 직접 인식 될 수 있습니다. 나는 당신이 메인 프로그램을 시작할 때 모든 것을 인정할 것을 제안합니다. 그 이후로 당신은 사물이 동일한 위치에 있다는 것을 인식하기 때문입니다. 다음으로, 메인 프로그램이 서브 루틴을 건너 뛰는 지 확인해야합니다.

제가 암시하는 것은 기본 프로그램의 끝 부분에 서브 루틴을 직접 배치해야한다는 것입니다. 단, 'Goto'선언을 사용하여 서브 루틴이있는 곳에서 도약하는 경우 프로그램은 계속해서 서브 루틴을 구현합니다. 필요하거나 그렇지 않습니다.

PIC는 서브 루틴과 주 프로그램을 구별하지 않습니다. 깜박이는 led 프로그램을 확인 하겠지만 이번에는 지연 루프를위한 서브 루틴을 사용할 것입니다. 이상적으로는 프로그램이 얼마나 덜 복잡하게 나타나는지 발견 할 수있을뿐만 아니라 서브 루틴이 실제로 어떻게 적용되는지 찾을 수 있습니다.

결국 지연 루프에 서브 루틴을 사용하여 프로그램의 크기를 줄일 수 있다는 것을 알 수 있습니다.

지연을 원할 때마다, 가능하면 LED가 켜지거나 꺼질 때 기본적으로 지연 서브 루틴이라고합니다. 서브 루틴이 끝나면 프로그램은 '통화'명령을 따르는 라인으로 돌아갑니다. 위의 그림에서 우리는 LED를 켭니다.

그 후 우리는 서브 루틴에 연락합니다. 그런 다음 LED를 끌 수 있도록 프로그램이 다시 나타납니다. 서브 루틴이 완료되었을 수있는 경우를 대비하여 서브 루틴을 한 번 더 호출합니다. 프로그램이 돌아오고 인식하는 후속 명령어는 '시작으로 이동'입니다. 흥미를 느끼는 사람이라면 첫 번째 프로그램은 120 바이트 길이였습니다.

서브 루틴을 사용하여 프로그램 크기를 103 바이트로 줄일 수있었습니다. 이것은 환상적으로 들릴 수는 없지만 PIC 내부에 전체적으로 1024 바이트 만 있다는 사실을 고려할 때 모든 작은 이점이 있습니다.

다음 교육 내에서 포트에서 읽은 내용을 확인하겠습니다.

지금까지 LED를 켜고 끌 수 있도록 포트 A로 구성했습니다. 이 시점에서 우리는 포트의 I / O 핀을 어떻게 읽는지 볼 것입니다.

입력 / 출력 포트 읽기

이것은 우리가 외부 회로를 연결하고 그것이 제공하는 특정 출력에 영향을 미칠 수 있는지 확인하기위한 것입니다.

I / O 포트를 설정하려면 이전 과정을 기억하고 있다면 뱅크 0에서 뱅크 1로 이동해야했습니다. 처음에는 다음을 수행 할 것입니다.

이 시점에서 우리는 입력 할 포트 A의 비트 0을 고정했습니다. 이제 핀이 높거나 낮은 지 검사해야합니다. 이를 위해 다음 두 가지 지침 중 하나만 사용할 수 있습니다.

BTFSC 및 BTFSS.

BTFSC 명령어는 '우리가 지정한 비트뿐만 아니라 레지스터에서도 비트 테스트를 수행합니다.

0 인 경우 다음 명령어를 생략합니다.’ BTFSS는 '우리가 설정 한 레지스터와 비트에서 비트 테스트를 수행합니다. 1로 설정된 경우 후속 명령을 무시합니다.

우리가 활용하는 것은 입력을 연구하는 동안 프로그램이 어떻게 반응하기를 원하는지에 따라 정확하게 결정됩니다. 예를 들어, 입력이 1이되기를 기다리는 경우 다음과 같은 방식으로 BTFSS 명령어를 사용할 수 있습니다.

여기에 코드 :

BTFSS PortA, 0Goto 시작 여기에 계속 :
:

PortA의 비트 0이 1로 예약되어 있으면 프로그램은 'Carry on here'로 이동합니다.

우리는 현재 한 가지 속도로 LED를 표시 할 수있는 프로그램을 작성할 것입니다. 그러나 스위치가 갇혀 있으면 LED가 두 배 더 느리게 깜박입니다.

이 프로그램을 스스로 실행하는 것이 가능할 수도 있지만 여전히 목록을 어떻게 든 통합했습니다.

원칙을 이해했는지 확인하기 위해 전체 프로그램을 시도하고 작성할 수 있습니다. PIC의 RA0에 연결된 스위치와 전원의 양극 레일을 포함하여 이전과 같은 등가 회로를 사용할 것입니다.

여기서 우리가 달성 한 것은 LED를 켜는 것입니다. 나중에 스위치가 닫혀 있는지 확인합니다.

제한되어있는 경우에는 다음으로 지연 서브 루틴에 연결합니다. 이는 이전과 동일한 지연을 제공하지만이 시점에서 두 번 연락하고 있습니다.

LED가 꺼질 때마다 동일한 사항이 적용됩니다. 스위치가 닫히지 않은 경우 이전에 켜짐 및 꺼짐 기간이 기록됩니다.

처음부터이 레슨을 따랐 으면 현재 PIC 16F84에 대한 35 개 지침 중 10 개를 발견했음을 파악하려고 할 수 있습니다! 그리고 이러한 모든 부분은 LED를 켜고 끄는 것만으로도 학습 할 수 있습니다.

지금까지 우리는 PIC가 LED를 켜고 끄는 것을 구성했습니다.

그 후 우리는 스위치를 포함하여 PIC를 사용하여 플래시 속도를 변경할 수있었습니다.

메모리 공간을 효율적으로 사용

유일한 문제는 프로그램이 상당히 길고 메모리 공간이 비효율적이라는 것입니다. 처음으로 명령을 포함하는 동안 괜찮아 보였지만 실행하는 더 쉬운 방법이 있어야합니다. 긍정적으로 우리는 문자 그대로 LED를 켜고 끄는 방법을 분석 할 것입니다.

movlw 02hmovwf PORTAmovlw 00hmovlw PORTA

처음에 우리는 w 레지스터를 02h로 채운 다음, LED를 켜기 위해 PortA 레지스터로 전송했습니다. 그것을 끄기 위해 우리는 w를 00h로 묶은 후 PortA 레지스터로 옮겼습니다.

이 모든 루틴 사이에서 우리는 LED 깜박임을 관찰 할 수 있는지 확인하기 위해 서브 루틴과 연락해야했습니다.

따라서 두 세트의 정보를 두 번 (한 번은 w 레지스터로 전송 한 다음 PORTA로) 전송하고 서브 루틴을 두 번 호출해야했습니다 (한 번은 on, 한 번은 off). 따라서 효율성을 추가하여이를 어떻게 달성 할 수 있습니까? 아주 간단합니다.

우리는 XORF로 알려진 다른 명령어를 사용합니다. XORF 명령어는 우리가 제공하는 정보로 규정 한 레지스터에서 배타적 OR 함수를 작동합니다. 계속 진행하기 전에 전 세계에서 독점 수술이 무엇인지 명확히해야한다고 생각합니다. 두 개의 입력과 하나의 출력이있는 경우 입력은 두 입력이 다른 경우에만 1이 될 수 있습니다. 동일하지만 출력은 아마도 0이 될 것입니다. 다음은이를 확인하기로 선택한 개인을위한 진리표입니다.

A B F0 0 00 1 11 0 11 1 0

이 시점에서 이전 출력과 마찬가지로 B를 렌더링하고 A의 값을 변경하면 어떻게되는지 확인합니다.

A B F
0 0 0
0 0 0
10 1
1 1 0
10 1

A의 값을 1과 동일하게 유지하고 Exclusive OR 출력과 합치면 출력이 토글됩니다. 진리표에서 이것을 알 수없는 경우 아래에서 바이너리를 사용하여 목격 할 수 있습니다.

0 전류 출력
1 1 새로운 출력이있는 EX-OR
1 0 새 출력이있는 EX-OR

출력을 1로 배타적 OR로 연결하면 출력을 0에서 1에서 0으로 전환 할 수 있습니다.
따라서 LED를 켜고 끄려면 몇 가지 문장 만 있으면됩니다.

MOVLW 02h
XORWF 도어, 1

정확히 우리가 성취 할 것은 02h에 w 레지스터를 추가하는 것입니다. 우리는 PortA에 무엇이 있든 상관없이이 번호를 독점 ORing합니다. 비트 1이 1이면 0으로 변경됩니다. 비트 1이 0이면 1로 변경됩니다.이 코드를 한두 번 검사하여 바이너리 실행 방식을 표시해 보겠습니다.


00010
xorwf 00000
xorwf 00010
xorwf 00000
xorwf 00010

실제로 매번 w 레지스터에 동일한 값을로드 할 필요가 없으므로 처음에이 작업을 한 번만 수행하고 간단히 toggle 명령으로 돌아갈 수 있습니다. 또한 PortA 레지스터의 값을 수정할 필요가 없습니다. 이유? 확실히 전원을 켰을 때 1이기 때문에 쉽게 토글 할 수 있습니다. 전원을 켤 때 0이 아니면 이제 토글합니다.

따라서 새로 형성된 코드를보고 싶을 것입니다. 첫 번째는 깜박이는 LED 코드를 나타내고 두 번째는 스위치가 추가 된 코드를 나타냅니다.

간단한 지침 하나만 사용하여 프로그램의 규모를 줄였습니다. 진실은 우리가 프로그램을 얼마나 줄일 수 있는지 보여주기 위해 아래 표에서 두 프로그램, 구성 요소 및 치수를 시연했습니다.

프로그램 변경 차원 (바이트)
깜박이는 LED 원본 120
깜박이는 LED 서브 루틴 추가됨 103
깜박이는 LED XOR 기능 사용 91
스위치 원본 132를 가진 LED
스위치 XOR 기능이 사용 된 LED 124.

따라서 몇 가지 새로운 지침을 발견했을뿐만 아니라 스크립팅 크기도 줄였습니다!

아래에서는 개별 비트를 흔들고 특정 간단한 산술을 수행하는 방법과 데이터 테이블을 분석 할 것입니다.

논리 관리자

지난 튜토리얼에서 배타적 OR 연산을 소개했습니다. ExOR 함수는 논리 연산자로 이해됩니다.

이 튜토리얼에서는 PIC가 권장하는 추가 논리 연산자를 설명합니다. 포인트 프로그램에는 어떤 경우도 없겠지만 작은 영역의 코드를 적용하여 연산자를 사용하는 쉬운 방법을 배우겠습니다.

AND AND 함수는 기본적으로 두 비트를 분석하여 동일 여부에 관계없이 1을 전달하고 구별되는 경우 0을 전달합니다. 예를 들어 1 AND 1을 언급 한 경우 결과는 1이고 1 AND 0을 선언 한 경우 결과는 0이됩니다.

말할 필요도없이, 우리는 단어를 평가할 수 있으며, AND 함수가 수행하는 모든 것은 두 용어를 조금씩 검토하는 것입니다. 아래 예는 제품과 함께 AND가되는 두 개의 8 비트 단어를 보여줍니다.

11001011
및 10110011
10000011과 같음

나는 당신이 동의하기를 바랍니다. 결과는 한 쌍의 단어에서 2 개의 1이 서로 손을 잡을 때마다 단순히 1을 가질 것입니다. 예를 들어 AND 기능을 사용하여 포트를 확인할 수 있습니다.

회로에 연결된 몇 개의 I / O 핀을 확인하고 몇 개의 핀만 높은 특정 상황을 주시해야하는 경우,이 경우에는 거의 읽을 수 있습니다. 포트, 그리고 우리가 조사한 조건의 결과는 위의 인스턴스와 동일합니다.

PIC는 AND에 대한 두 가지 요소를 제공합니다.
ANDLW 및 ANDWF입니다. ANDLW를 사용하면 W 레지스터의 세부 정보와 규정 한 금액으로 AND 함수를 수행 할 수 있습니다.

구문은 다음과 같습니다. ANDLW 여기서는 정확히 우리가 W의 내용과 함께 할 것입니다.

AND 함수의 결과는 W 레지스터에 직접 저장됩니다.
ANDWF를 사용하면 W 레지스터와 다른 레지스터 (예 : PORT)에서 AND 함수를 수행 할 수 있습니다. 구문은 다음과 같습니다. ANDWF, d는 우리가 열광하는 레지스터입니다. PORTA 및 d는 결과를 배치해야하는 PIC를 표시합니다. d = 0이면 결과가 W 레지스터에 저장되고 d = 1이면 최종 결과가 우리가 규정 한 레지스터에 저장됩니다. 아래 코드의 두 부분은 각 AND 함수의 좋은 예를 보여줍니다.

이니셜은 입력이 1100인지 확인해야하는 PORTA의 상태를 검사하는 것입니다. 결과를 W 레지스터에 다시 넣을 수 있습니다.

movlw 1100
ANDWF 05h, 0 두 번째 그림은 이제 W 레지스터의 내용을 확인할 수 있습니다.
ANDLW 1100

또는

우리는 이제 XOR을 정확하게하기 위해 하나의 OR 함수를 발견했습니다. 두 비트가 동일하지 않지만 다른 경우 1로 발전합니다. 포함 OR 인 IOR이라는 또 다른 OR 함수를 찾을 수 있습니다. 이 함수는 두 비트 중 하나가 1 인 경우 1을 생성하지만 추가로 각 비트가 1 인 경우에는이를 설명하는 명확한 진리표가 있습니다.

A B O / P
0 0 0
0 1 1
10 1
1 1 1

산술 연산자 란?

더하다

이 기능은 일반적으로 주장하는 것을 수행합니다. 두 개의 숫자를 제공합니다! 두 숫자를 더한 결과가 8 비트를 초과 할 경우 CARRY 플래그가 설정 될 것입니다. CARRY 플래그는 주소 03h 비트 0에 있습니다.

이 비트가 예약되면 두 숫자가 8 비트를 초과했습니다. 0이면 결과는 8 비트 내에 위치합니다. 이전과 마찬가지로 PIC는 두 가지 스타일의 ADD, 특히 ADDLW 및 ADDWF를 제공합니다. 짐작 하셨겠지만 이것은 위의 기능과 매우 유사합니다. ADDLW는 우리가 규정 한 W 레지스터의 내용을 제공합니다. 구문은 다음과 같습니다. ADDLW ADDWF는 W 레지스터의 내용과 우리가 지정한 다른 레지스터를 추가합니다.

구문은 다음과 같습니다. ADDWF, d는

보결

이 시점에서이 기능이 무엇을 수행하는지 짐작할 수 없습니다! 사실, 당신은 그것을 의심,이 기능
다른 것에서 한 비트를 뺍니다. 다시 PIC는 SUBLW와 SUBWF의 두 가지 맛을 제공합니다. 구문은 ADD 함수 대신 SUB를 입력한다는 점을 제외하면 정확히 ADD 함수와 유사합니다!

Increment PIC의 숫자에 1을 포함시키려는 경우 ADD 기능을 절대적으로 사용하고 숫자 1을 활용할 수 있습니다. ~ 이것의 어려움은 먼저 Figure를 W 레지스터에 배치 한 다음 ADDLW 1 컨트롤을 사용하여 증가시켜야한다는 것입니다. 레지스터에 1을 포함하려는 경우 여전히 더 나쁠 수 있습니다. 먼저 ADDWF, 1을 사용하여 W 레지스터에 숫자 1을 배치해야합니다. 따라서 예를 들어 위치 0C에 1을 포함하려면 스크립트의 다음 부분을 소유해야합니다.

movlw 01
addwf 0c, 1

이를 수행하는 더 쉬운 방법이 있습니다. INCF 명령을 실행할 수 있습니다. 구문은 다음과 같습니다. INCF, d 여기서는 우리가 관심을 갖는 레지스터 또는 장소이고 d는 결과를 배치해야하는 PIC를 나타냅니다. d = 0 인 경우 결과는 W 레지스터 내에 있고 d = 1 인 경우 결과는 우리가 규정 한 레지스터에 설정됩니다.

이 개별 지침을 활용하면 실제로 코딩의 50 %를 수행 할 수 있습니다. 결과를 W 레지스터로 복원하려는 경우 위의 인스턴스를 사용하는 경우에는 0C 항목을 W 레지스터로 다시 이동하는 추가 명령을 포함해야 할 수 있습니다. 그런 다음 0C 레지스터를 다시 no로 설정해야합니다. 그것이 무엇이든 상관 없습니다.

증가 명령이 있습니다. INCFSZ입니다. 이 명령은 우리가 규정 한 레지스터를 증가시킬 수 있지만, 증가 후 레지스터가 0과 같으면 (1에서 127까지 포함하는 동안 발생) PIC는 아마도 후속 명령을 통과 할 것입니다. 아래 코드 부분은이를 반영합니다.

루프 incfsz 0C
고토 루프
:
:
프로그램의 나머지.

위의 코드 부분에서 0C는 1 씩 증가합니다. 다음으로 PIC에 Loop라는 태그로 돌아가고 0C를 1 씩 증가시키는 명령을 소유합니다. 이것은 0C가 127이 될 때까지 계속됩니다.이 상황에서 0C를 1 씩 증가 시키면 0C는 이제 0과 일치하게됩니다. INCFSZ 명령은 PIC에 다음 명령을 생략하도록 매우 잘 알릴 수 있습니다.이 경우에는 goto 선언입니다. 따라서 PIC는 나머지 프로그램과 함께 진행됩니다.

감소

지금까지 이전 훈련에서 감소 함수에 대해 논의 했으므로 더 이상 수정하지 않겠습니다.

보어

이 논의의 마지막 명령어는 우리가 규정 한 레지스터의 모든 단일 비트를 뒤집습니다. 구문은 다음과 같습니다. COMF, d 여기서

비트 연산 이해

예를 들어 이는 포트의 핀을 출력에서 ​​입력으로 신속하게 교체하는 데 활용 될 수 있습니다. 비트 함수를 사용하면 표현식 내에서 단일 비트를 만들 수 있습니다. 그들은 우리가 규정 한 레지스터 나 숫자에서 단일 비트를 진행, 설정 및 제거 할 수 있도록합니다.

이 과정을 마치면 앞으로 진행 한 다음 반대 방향으로 진행되는 일련의 시퀀싱 조명을 생성하도록 설계된 프로그램을 공개합니다. 우리는 배타적 OR 함수를 조사했을 때 이전에 이것을 관찰했습니다. 여기서 우리는 표현식으로 포트를 배타적으로 OR 처리했습니다. 지금까지 PIC에 포트를 설정할 때 몇 가지 기능을 발견했습니다.

여기서 이들의 활용도를 반복하겠습니다.

BCF

이 명령은 우리가 지정한 레지스터에 규정 한 비트를 지울 것입니다. 구문
is :
BCF,

이전에 STATUS 레지스터에서 비트를 제거하여 페이지 1에서 페이지 0으로 변경하기 위해 이것을 사용했습니다. 마찬가지로 다른 레지스터 / 위치에서 비트를 0으로 고정하는 데 사용할 수 있습니다. 예를 들어 섹션 0C에 저장된 11001101의 3 번째 비트를 0으로 설정하려는 경우
끼워 넣다:

BCF 0C, 03

BSF

이 명령어는 우리가 나타내는 모든 레지스터에서 1로 규정 한 모든 비트를 고정합니다. 이전에 이것을 활용하여 페이지 0에서 페이지 1로 진행했습니다. 구문은 BSF이며 위의 BCF와 정확히 동일한 방법으로 사용됩니다.

지금까지 레지스터에서 비트를 설정하거나 지울 수 있습니다. 그러나 기본적으로 레지스터에서 비트가 1인지 0인지 확인해야한다고 상상해보십시오.

확실히 BTFSC를 사용할 수 있습니다. 비트 테스트 레지스터 F를 나타내며, 클리어되면 건너 뜁니다. 이 명령어는 레지스터에서 지정한 비트를 분석 할 것입니다. 비트가 0 인 경우 명령은 후속 명령을 전달하여 PIC에 알립니다.

캐리 플래그와 같은 플래그를 확인하려는 경우이 명령어를 사용할 수 있습니다. 이렇게하면 고정 된 플래그를 알아보기 위해 STATUS 레지스터를 읽고 개별 비트를 검색 할 필요가 없습니다. 29 예를 들어 2 개의 숫자를 추가 한 후 Carry 플래그가 1로 설정되었는지 확인하려는 경우 다음을 입력 할 수 있습니다.

BTFSC 03h, 0
1로 설정된 경우 여기에서 계속
또는 여기에 0으로 설정하면

비트의 상태가 1이면 BTFSC 이후의 명령이 완료됩니다. 0으로 설정되어있는 경우 다음 명령을 건너 뜁니다. 코드의 다음 부분은 그것이 사용될 수있는 것을 보여줍니다.

루프 :
:
:
BTFSC 03,0
고토 루프

위의 코드에서 PIC는 STATUS 레지스터 (또는 Carry 플래그)의 비트 0이 0으로 정의 된 경우 단순히 루프를 벗어나게됩니다. 그렇지 않으면 goto 명령이 수행됩니다.

BTFSS

이 명령어는 비트 테스트 레지스터 F 및 설정된 경우 건너 뛰기를 나타냅니다. 이것은 우리가 평가 한 비트가 0이 아닌 1로 설정된 경우 PIC가 후속 명령어를 생략한다는 점을 제외하면 BTFSC 명령어와 비교할 수 있습니다.

CLRF

이 명령어는 레지스터의 전체 세부 사항을 0으로 고정합니다. 구문은 다음과 같습니다.

CLRF
이전에 CLRF 85h를 적용하여 포트의 출력을 0으로 설정하기 위해 이것을 사용했습니다. 또한 CLRF를 사용하여 출력 할 모든 핀을 포함하도록 포트를 고정하는 데 사용했습니다.
05h.

CLRW

이것은 W 레지스터를 지우는 것을 제외하고는 CLRF 명령어와 비슷할 수 있습니다. 구문은 매우 간단합니다.

CLRW

RLF와 RRF

이러한 방향은 레지스터의 비트를 레지스터의 왼쪽 (RLF) 또는 오른쪽 (RRF)으로 단일 슬롯으로 전송합니다. 예를 들어 00000001이 필요하고 RLF를 사용했다면 00000010을 소유 할 수 있습니다.이 시점에서 10000000이 있고 RLF 명령을 적용하면 어떻게 될까요? 확실히 1은 캐리 플래그에 위치합니다. RLF 명령어를 한 번 더 적용하면 1이 처음에 다시 나타납니다. RRF 명령어의 경우에도 마찬가지입니다. 아래의 사례는 RLF 명령어에 대해 이것을 보여줍니다. 여기서 우리는 레지스터의 8 비트와 캐리 플래그를 볼 수 있습니다.

C 87654321
0 00000001
RLF 0 00000010
RLF 0 00000100
RLF 0 00001000
RLF 0 00010000
RLF 0 00100000
RLF 0 01000000
RLF 0 10000000
RLF 1 00000000
RLF 0 00000001

예제 프로그램

이제 컴파일하고 구동 할 수있는 예제 코드를 볼 것입니다. PortA 비트 0에서 시작하여 PortB 비트 8로 이동하는 시퀀싱 라이트를 생성합니다.
그런 다음 돌아옵니다.
LED를 각 포트 핀에 연결합니다. 우리는 약간의 비트를 가질 것입니다
이 자습서에서 지적한 절차.

TIME EQU 9FH 딜레이 루프를위한 변수.
PORTB EQU 06H 포트 B 주소.
TRISB EQU 86H 포트 B Tristate 주소.
PORTA EQU 05H 포트 A 주소.
TRISA EQU 85H 포트 Tristate 주소입니다.
STATUS EQU 03H 페이지 선택 레지스터.
COUNT1 EQU 0CH 루프 레지스터.
COUNT2 EQU 0DH 루프 레지스터.

BSF STATUS, 5 1 페이지로 이동
MOVLW 00H 및 설정
MOVWF TRISB 포트 A 및 B 모두
MOVLW 00H 출력,
MOVWF TRISA 다음으로 돌아 가기
BCF 상태, 5 0 페이지.
MOVLW 00H 포트 A를 지 웁니다.
MOVWF 도어

메인 프로그램 시작

RUNMOVLW
01H 첫 번째 bitMOVWF 설정
포트 B.CALL의 PORTB
DELAY 잠시만 요 CALL
지연
포트 B의 비트를 왼쪽으로 이동 한 다음 일시 중지합니다.
PORTB, 1CALL
DELAYCALL
DELAYRLF
PORTB, 1CALL
DELAYCALL
DELAYRLF
PORTB, 1CALL
DELAYCALL
DELAYRLF
PORTB, 1CALL
DELAYCALL
DELAYRLF
PORTB, 1CALL
DELAYCALL
DELAYRLF
PORTB, 1CALL
DELAYCALL
DELAYRLF
PORTB, 1CALL
DELAYCALL
DELAYRLF
PORTB, 1 비트를 캐리 플래그로 이동합니다.
이제 포트 A로 이동하고 비트를 왼쪽으로 이동합니다.
PORTA, 1 이것은 0 플래그에서 PortACALL로 비트를 이동합니다.
DELAYCALL DELAYRLF
문, 1CALL
DELAYCALL
DELAYRLF
문, 1CALL
DELAYCALL
DELAYRLF
문, 1CALL
DELAYCALL
지연
포트 ARRF에서 비트를 다시 이동
문, 1CALL
DELAYCALL
DELAYRRF
문, 1CALL
DELAYCALL
DELAYRRF
문, 1CALL
DELAYCALL
DELAYRRF
PORTA, 1 이것은 비트를 제로 플래그로 이동합니다. 이제 비트를 이동합니다.
포트 BRRF로 돌아 가기
PORTB, 1CALL
DELAYCALL
DELAYRRF
PORTB, 1CALL
DELAYCALL
DELAYRRF
PORTB, 1CALL
DELAYCALL
DELAYRRF
PORTB, 1CALL
DELAYCALL DELAYRRF
PORTB, 1CALL
DELAYCALL
DELAYRRF
PORTB, 1CALL
DELAYCALL
DELAYRRF
PORTB, 1CALL
DELAYCALL
DELAY 이제 시작했던 곳으로 돌아 왔습니다. GOTO
RUN 다시 가자.

학습 세트에는 데이터 테이블을 사용할 수있는 훌륭한 옵션이 있습니다.

데이터 테이블은 몇 가지 고려 사항을 기반으로 모두 검토되는 데이터 인용 목록입니다.
예를 들어, 입력 핀이 1 초 안에 높아지는 인스턴스의 수를 계산하는 PIC를 사용하는 회로를 가질 수 있습니다. 그 후 7 세그먼트 디스플레이에 번호를 표시 할 수 있습니다.

타이밍이 시작 되 자마자 PIC는 핀이 높아지는 횟수를 계산하기 시작합니다. 1 초 후 테이블을 방문하여 데이터를 한 눈에 확인합니다. 핀이 높은 상황의 양을 상징하는 숫자를 디스플레이에 표시해야합니다. 이는 PIC가 추정치를 달성 할 때까지 수치가 무엇인지 결정할 수 없기 때문에 유익 할 수 있습니다.

테이블을 사용하여 PIC가 어떤 인물을 묘사할지 결정하도록 할 수 있습니다. 이 시점에서 데이터 테이블이 어떻게 작동하는지 계속 보여주기 전에 PIC가 프로그램이 작동하는 동안 프로그램에서 위치의 경로를 유지한다는 것을 알려야 할 수도 있습니다.

그것은 BASIC에서 특정 프로그래밍을 수행 한 사람들을 위해 용이합니다. 그렇지 않으면 걱정하지 말고 이론에 대해 계속 배우고 싶을 수 있습니다. 아래 제시된 것과 유사한 BASIC 프로그램이 있다고 상상해보십시오.

10 년 K = 0
11K = K + 1
12 If K> 10 THEN GOTO 20 ELSE GOTO 11
20 인쇄 K
21 끝

프로그램은 10 행에서 시작합니다. K가 0으로 예약되면 다음으로 11 행으로 진행됩니다. 1에서 K까지 포함시킨 후 12 행으로 진행합니다.

이 시점에서 우리는 K가 10보다 높은지 궁금 할 것입니다. 만약 그렇다면, 다음으로 20 번 줄로 가거나 그렇지 않으면 11 번 줄로 돌아갑니다.

20 행은 K를 문서화하고 21 행은 프로그램을 종료합니다. BASIC은 레이블이 승인되지 않았기 때문에 프로그래머가 문제가있는 위치를 기록 할 수 있도록 라인 통계를 사용합니다. PIC는 레이블을 사용하여 목적지 사이를 탈출합니다. 아니면 실제로 할 수 있습니까?

우리는 라벨을 사용하여 문제가있는 위치를 인식하고 검색 할 위치를 간단하게 PIC에 알릴 수 있도록합니다.

정확히 발생하는 것은 PIC가 프로그램 카운터라고하는 내부 라인 카운터를 이용하는 것입니다. 현재 명령어가있는 메모리 대상의 프로그램 카운터 (PC로 축약 됨) 추적입니다.

PIC에 선택한 레이블을 방문하도록 알릴 때마다 메모리 스팟을 이해하므로 해당 메모리 대상을 볼 때까지 PC를 확장합니다. 이것은 위의 BASIC 프로그램을 확인하는 것과 똑같은 방법입니다. 다음은 모든 명령어 옆에 메모리 공간 또는 PC 항목이있는 코드 세그먼트입니다.

PC Instruction0000 movlw 03
0001 movwf 0C
0002 루프 decfsc 0C
0003 goto 루프
0004 끝

위의 데모에서는 PC를 0000으로 고정했습니다. 여기에는 movlw 03 명령이 있습니다. PIC가이 데이터를 구현하면 후속 명령이 스캔되도록 PC를 증가시킵니다. 이 시점에서 PIC는 movwf 0C를 봅니다. PC가 다시 증가합니다.

이제 PIC는 decfsc 0C를 연구합니다. 0C의 내용이 0이 아닌 경우 PC가 1 씩 증가하고 다음 명령어 인 goto Loop는 해당 Loop가있는 위치 0003으로 복귀하도록 PC에 알립니다. 0C의 세부 사항이 0 인 경우 PC는 2 씩 증가하도록 권장되며, 단순히 후속 명령을 생략하십시오.

데이터 테이블 이해

이렇게하면 PC가 위치 0004에 배치되고 프로그램이 종료됩니다. 대상은 어셈블러에 의해 고정되며 일반적으로 PC가 수행하는 작업에 대해 걱정할 필요가 없습니다. 그 전까지는 데이터 테이블을 사용할 때처럼 제어 할 필요가 있습니다. 데이터 테이블의 기능을 설명하는 가장 편리한 방법은 그림으로 시작하는 것입니다.

PC equ 02
movlw 03
통화 테이블
:
테이블 addwf PC
retlw 01
retlw 02
retlw 03
retlw 04
retlw 05
retlw 06
retlw 07
반환

초기 명령은 레이블 PC에 프로그램 카운터 (02h)의 주소를 할당하는 것입니다. 03h 값을 w 레지스터에 넣은 후 곧 나올 것입니다. 그 후에 우리는 테이블과 통신합니다. 서브 루틴 테이블의 맨 앞줄은 W 레지스터 (03h)의 세부 사항을 프로그램 카운터로 확장합니다.

이렇게하면 프로그램 카운터가 3 씩 상승하거나 다른 방식으로 배치하면 프로그램 카운터가 3 줄 아래로 진행하도록 자극합니다. 카운터가 3 줄 아래로 도착하는 동안 PIC는 명령 retlw를 인식합니다. 이 명령은 그 뒤에 오는 값을 W 레지스터로 전송 한 다음 서브 루틴에서 돌아옵니다. RETLW는 기본적으로 Return, Literal to W를 의미합니다.

Return이라는 단어 뒤에 쉼표를 넣었습니다.를 참조하십시오. 우리는 서브 루틴에 있기 때문에 표면에 리턴 명령이 필요합니다. 따라서 명령의 RET. RETLW 명령어 뒤에는 숫자가 있고 이것은 정확히 W 레지스터에 입력 된 것입니다.

이 예에서는 그림 3입니다. W 레지스터에 임의의 수량을 지정할 수 있습니다.이 그림이 테이블 서브 루틴의 프로그램 카운터와 결합되는 한 retlw 명령을 발견 할 것입니다. 위의 그림에서 이것은 1에서 7까지의 숫자를 가질 수 있음을 의미합니다. 서브 루틴을 지나서 진행하는 경우 프로그램의 추가 섹션 수행을 완료 할 수 있습니다. 이러한 이유로 데이터 테이블을 PIC 프로그램의 끝 부분에 정확히 배치하는 것은 일반적으로 현명한 조치이므로이 경우 오버 슈트를 수행하면 어쨌든 프로그램의 결론에 도달하게됩니다.

인터럽트의 주제는 가장 길고 힘든 일이 될 것입니다.

인터럽트를 자세히 설명하는 복잡하지 않은 방법은 찾을 수 없지만이 부분이 끝날 무렵에 약간의 운이 있으면 자신의 프로그램에 인터럽트를 적용 할 수 있습니다.
섹션을 2 단계로 분리했습니다. 즉, 주제를 섹션으로 분리하고 이해하기 쉽도록 편리한 플리트를 제공합니다.

인터럽트 란 정확히 무엇입니까? 확실히 용어에서 알 수 있듯이 인터럽트는 마이크로 프로세서 / 마이크로 컨트롤러가 수행하는 작업에서 다른 일이 발생할 수있는 것을 방지하는 기술 또는 신호입니다.

제가 당신에게 매일의 삽화를 드리겠습니다. 자신의 집에서 휴식을 취하고 다른 사람과 대화하고 있다고 생각하십시오. 갑자기 전화가 울립니다.

당신은 말을 그만두고 전화를 잡고 발신자와 이야기합니다. 전화 상호 작용을 마치면 전화가 울리기 전에 해당 개인에게 다시 대화하기로 결정합니다. 누군가와 채팅하는 동안 주요 루틴을 고려할 수 있습니다. 전화 벨소리가 대화를 방해하고 루틴의 중단은 전화로 말하는 방법입니다.

전화 토론이 끝나는 동안 기본 채팅 루틴으로 돌아갑니다. 이 그림은 프로세서가 조치를 취하는 방법을 정확하게 보여줍니다.

기본 프로그램이 작동하여 회로에서 특정 기능을 수행하지만 중단이 발생하면 다른 루틴이 수행되는 동안 기본 프로그램이 중지됩니다. 루틴이 종료되면 프로세서는 이전과 마찬가지로 기본 루틴으로 돌아갑니다.

인터럽트 이해

PIC에는 4 개의 인터럽트 소스가 있습니다. 두 그룹으로 나눌 수 있습니다. 두 개는 PIC 외부로 활용 될 수있는 인터럽트의 소스이고 다른 두 개는 내부 프로세스입니다. 여기서 두 가지 외부 유형을 명확히하겠습니다. 다른 두 가지는 타이머에 도착하고 데이터를 저장하면 다른 튜토리얼에서 설명 될 것입니다.

PIC의 핀아웃을 확인하면 핀 6이 RB0 / INT임을 알 수 있습니다. 이 시점에서 RB0은 분명히 Port B 비트 0입니다. INT는 외부 인터럽트 핀으로 구성 될 수도 있음을 나타냅니다. 또한 포트 B 핀 4 ~ 7 (핀 10 ~ 13)도 인터럽트에 사용할 수 있습니다. INT 또는 다른 Port B 핀을 사용하려면 먼저 두 가지 작업을 수행해야합니다. 가장 먼저 PIC에 인터럽트를 사용할 것임을 알려야합니다.

다음으로 I / O 핀이 아닌 인터럽트로 사용할 포트 B 핀을 지정해야합니다. PIC 내부에서 INTCON이라는 레지스터를 찾을 수 있으며 주소 0Bh에 있습니다. 이 레지스터에서 활성화 또는 비활성화 할 수있는 8 비트를 찾을 수 있습니다. INTCON의 비트 7은 GIE로 알려져 있습니다. 이것이 Global Interrngupt Enable입니다. 이것을 1로 고정하면 PIC에 인터럽트를 사용할 것임을 알립니다.

INTCON의 비트 4는 INTE, INTerrupt Enable로 알려져 있습니다. 이 비트를 1로 설정하면 RB0이 인터럽트 핀이 될 것이라는 것을 PIC에 전달합니다. RBIE라고하는 비트 3을 구성하면 PIc에 포트 B 비트 4 ~ 7을 사용할 것임을 알립니다.이 시점에서 PIC는이 핀이 언제 높거나 낮을 수 있는지 이해하고 수행중인 작업을 중단하고 인터럽트를 진행해야합니다. 일상. 이 시점에서 인터럽트가 신호의 상승 에지 (0V ~ + 5V) 또는 드롭 에지 (+ 5V ~ 0V) 변환에있을 가능성이 있는지 PIC에 알려야합니다.

간단히 말해, 신호가 낮음에서 높음으로 또는 높음에서 낮음으로 이동할 때마다 PIC가 중단되기를 원합니까? 연체에 의해 이것은 상승 에지에 배치되도록 설정할 수 있습니다.

에지 '트리거링'은 주소 81h의 OPTION 레지스터라는 추가 레지스터에서 예약됩니다. 우리가 열광하는 비트는 종종 INTEDG라고 불리는 비트 6입니다.

이 값을 1로 설정하면 PIC가 장착 가장자리 (기본 상태)에서 중단되고 0으로 설정하면 PIC가 슬라이딩 가장자리에서 중단되도록 자극합니다. 상승 에지에서 PIC를 활성화하려면이 비트에 대해 아무것도 할 필요가 없습니다.

이 시점에서 슬프게도 옵션 레지스터는 뱅크 1에 있습니다. 즉, 뱅크 0에서 뱅크 1로 수정하고 옵션 레지스터에 비트를 설정 한 다음 뱅크 0으로 돌아갑니다. 여기서 핵심은 모든 비트를 수행하는 것입니다. 예를 들어, 포트 핀을 설정 한 후 완료되면 뱅크 0으로 돌아갑니다.

좋습니다. 따라서 PIC에 어떤 핀이 인터럽트가 될 것인지, 트리거 할 에지, 인터럽트가 발생할 때마다 프로그램과 PIC에서 무슨 일이 발생하는지 알 렸습니다. 몇 가지 일이 발생합니다. 가장 먼저 '깃발'이 예정되어 있습니다.

이것은 인터럽트가 발생했음을 PIC의 내부 프로세서에 알립니다. 다음으로, 프로그램 카운터 (이전 튜토리얼에서 언급 했음)는 PIC 내의 특정 주소에 대한 팁입니다. 이 모든 것을 개별적으로 빠르게 확인합시다. 인터럽트 플래그 INTCON 레지스터에서 비트 1은 INTF라고하는 인터럽트 플래그입니다. 이 시점에서 인터럽트가 발생할 때마다이 플래그는 1로 고정 될 수 있습니다.

인터럽트가 없으면 플래그는 0에 배치됩니다.뿐만 아니라 거의 모든 작업이 수행됩니다. 이 시점에서 '포인트가 무엇입니까?'를 숙고하고있을 수 있습니다.이 플래그가 1로 예약되어 있어도 PIC는 다른 인터럽트에 반응 할 수없고 반응하지 않을 것입니다. 그러므로 우리가 인터럽트를 가져온다는 것을 표현합시다. 플래그는 1로 고정되고 PIC는 인터럽트 작업을 위해 루틴으로 이동할 수 있습니다.

이 플래그가 1로 고정되지 않았고 PIC가 인터럽트에 계속 응답하도록 허용 된 경우 핀을 계속 펄싱하면 PIC가 인터럽트 루틴의 시작으로 돌아가도록 유지할 수 있으며 결코 완료하지 못할 수 있습니다. 내 그림으로 돌아가서 전화기를 들어 올리는 것과 비슷하며, 논의를 진행하면 다른 사람이 당신과 대화를 원하기 때문에 즉시 다시 울리기 시작합니다.

하나의 대화를 완료 한 다음 전화를 다시 잡고 후속 개인과 대화하는 것이 좋습니다. 이 플래그로 작은 문제를 찾을 수 있습니다. PIC는이 플래그를 빠르게 1로 설정하지만 다시 0으로 설정하지 않습니다! 그 활동은 프로그래머, 즉 귀하가 수행해야합니다. 이 작업은 쉽게 수행 할 수 있습니다. PIC가 인터럽트 루틴을 수행 한 후에 수행해야하는 것이 확실하기 때문입니다.

메모리 위치 처음에 PIC의 전원을 켤 때마다 또는 리셋이있는 경우 프로그램 카운터는 0000h 주소를 팁으로 지정하며, 이는 프로그램 메모리의 시작 부분에서 즉시 발생할 수 있습니다. 그러나 인터럽트가 발생하는 경우 프로그램 카운터는 주소 0004h를 표시합니다.

따라서 인터럽트가 발생할 프로그램을 구성하는 동안 먼저 PIC에 주소 0004h를 넘기도록 알려야하며 프로그램의 나머지 부분과 별 개인 주소 0004h에서 시작하는 인터럽트 루틴을 유지해야합니다.

이는 번거 로움없이 수행 할 수 있습니다. 처음에는 ORG라는 명령으로 프로그램을 시작합니다. 이 명령은 Origin 또는 start를 나타냅니다. 우리는 주소로 그것을 고수합니다. PIC는 주소 0000h에서 시작하므로 ORG 0000h를 입력합니다. 그 후에 주소 0004h를 우회해야합니다. 우리는 기본 프로그램에 대한 팁과 함께 GOTO 지침을 넣어이를 수행합니다.

그 후 우리는 하나 이상의 ORG로이 GOTO 명령을 준수합니다.이 순간에는 주소 0004h를 사용합니다. 이 명령 뒤에 인터럽트 루틴을 삽입합니다. 이 시점에서 두 번째 ORG 명령 다음에 곧바로 인터럽트 루틴을 입력 할 수도 있고 인터럽트 루틴을 가리키는 GOTO 문을 배치 할 수도 있습니다.

그것은 진정으로 귀하의 옵션과 관련이 있습니다. 제공하는 PIC를 알리기 위해 인터럽트 루틴이 끝날 때까지 RTFIE 명령을 루틴 끝에 배치해야합니다. 이 명령은 인터럽트 루틴에서 복귀를 의미합니다. PIC가이를 인식하는 동안 프로그램 카운터는 인터럽트가 발생하기 전에 PIC가 있었던 최종 위치를 나타냅니다. 위의 내용을 표시하기 위해 코드의 간단한 섹션을 아래에 설정했습니다.

인터럽트를 사용할 때 알아야 할 몇 가지 사항이 있습니다. 초기 프로그램은 기본 프로그램과 인터럽트 루틴에서 동일한 레지스터를 사용하는 경우 인터럽트가 발생할 때 레지스터의 세부 사항이 변경 될 가능성이 가장 높다는 점을 염두에 두는 경향이 있습니다.

예를 들어 w 레지스터를 사용하여 데이터를 포트 A 기본 프로그램으로 전달하므로 인터럽트 루틴의 w 레지스터를 추가로 활용하여 한 대상에서 다른 대상으로 데이터를 이동할 수 있습니다.

주의하지 않는 경우 w 레지스터는 인터럽트 루틴에있는 동안 수신 한 마지막 값을 포함하므로 인터럽트에서 복귀하면이 정보가 이전에 소유 한 값이 아닌 포트 A로 전달됩니다. 인터럽트가 발생했습니다.

이 문제를 해결하는 방법은 인터럽트 루틴에서 다시 사용하기 전에 w 레지스터의 세부 정보를 일시적으로 저장하는 것입니다. 두 번째는 하나의 인터럽트가 발생하는 시점과 후속 인터럽트가 발생할 수있는 시점 사이에 지연을 찾을 수 있다는 사실입니다. 이해하는 동안 PIC는 외부 클록을 가지고 있는데, 이는 아마도 크리스탈 일 수도 있고 저항-커패시터 콤보 일 수도 있습니다.

이 클럭의 주파수에 관계없이 PIC는이를 4로 나눈 후 내부 타이밍에이를 사용합니다. 예를 들어 PIC에 연결된 4MHz 크리스털이있는 경우 PIC는 1MHz에서 명령을 수행합니다. 이 내부 타이밍을 명령주기라고합니다. 이 시점에서 데이터 시트는 인터럽트 사이에 3-4 개의 명령어 라운드를 활성화해야한다고 주장합니다 (확실히 축소 인쇄).

나는 4 라운드를 활성화하는 것입니다. 지연의 원인은 PIC가 인터럽트 주소, 플래그로 도약하고 인터럽트 루틴에서 다시 도착하는 데 시간이 필요하기 때문입니다. 따라서 PIC에 대한 인터럽트를 활성화하기 위해 대체 회로로 작업하는 경우이를 염두에 두십시오.

이 시점에서 요점은 포트 B의 비트 4 ~ 7을 인터럽트로 사용하는 경우입니다. 인터럽트로 작동하도록 포트 B의 특정 핀을 선택할 수 없습니다.

따라서 이러한 핀을 허용하는 경우 모두 얻을 수 있습니다. 따라서 예를 들어 단순히 비트 4와 5를 가질 수는 없습니다. 비트 6과 7은 동시에 권한이 부여 될 것입니다. 인터럽트를 나타 내기 위해 4 비트를 얻는 목적은 정확히 무엇입니까? 확실히, 당신은 PIC에 연결된 회로를 가질 수 있습니다. 4 개의 라인 중 하나가 하이가되는 경우,이 경우 PIC가 즉시 영향을 주어야하는 문제가 될 수 있습니다.

이에 대한 한 가지 예는 4 개의 센서가 포트 B 핀 4 ~ 7에 연결된 주택 보안 경보 일 수 있습니다. 특정 센서는 PIC에 경보를 트리거하도록 프롬프트 할 수 있으며 경보 신호 루틴은 인터럽트 루틴입니다. 이렇게하면 포트를 지속적으로 검사 할 필요가 없으며 PIC가 다른 문제를 계속할 수 있습니다. 다음 튜토리얼에서는 인터럽트를 관리하는 프로그램을 구성 할 것입니다.

지난 튜토리얼에서 많은 기본 사항을 다루었으므로 첫 번째 프로그램을 구성 할 때가 된 것 같습니다.

우리가 작성할 프로그램은 우리가 스위치를 켠 횟수를 세고 그 숫자를 표시합니다.

이 프로그램은 입력 또는 인터럽트와 함께 RB0에있을 가능성이 높은 4 개의 LED에서 이진 형식으로 볼 수있는 0에서 9까지 계산됩니다.

가장 중요한 것은 인터럽트가 발생할 때마다 프로그램 카운터가 가리키는 주소를 뛰어 넘도록 PIC에 알리는 것입니다.

우리가 16 진수를 표시하는 고유 한 방법을 사용하고 있음을 알 수 있습니다. 내가 일어나기 전에 h가 16 진수를 나타내는 F9h를 적용합니다. 이것을 0xF9로 쓸 수 있는데, 이것은 지금부터 사용할 구조입니다.

이제 PIC에 인터럽트를 사용할 것이며 RB0 핀 6을 인터럽트 핀으로 사용하고 있음을 알려야합니다.

bsf INTCON, 7GIE – 글로벌 인터럽트 활성화 (1 = 활성화)
bsf INTCON, 4INTE-RB0 인터럽트 활성화 (1 = 활성화)
만일을 대비하여 인터럽트 플래그를 지울 것입니다 (나는 아무것도 신뢰하지 않습니다!)
bcf INTCON, 1INTF-경우에 대비해 플래그 비트 지우기

현재 우리는 2 개의 포트를 설정해야합니다. 현재 RB0을 인터럽트 핀으로 사용하고 있으므로이를 입력으로 설정해야합니다.

COUNT라는 변수를 사용하여 스위치 수를 저장합니다. 포트 A의 값을 간단히 증가시킬 수 있지만 인터럽트 루틴을 작성할 때 내가 변수를 사용하는 이유를 알 수 있습니다.

따라서 우리의 주요 프로그램이 구성되고이 시점에서 인터럽트가 발생할 때마다 진행 방법을 PIC에 알려야합니다. 이 예에서 인터럽트는 스위치가 될 것입니다. PIC가 원하는 것은 스위치가 갇힐 때마다 조정 가능한 COUNT에 1입니다.

그럼에도 불구하고 우리는 스위치가 0에서 9까지 몇 번 종료되는지 보여주고 싶습니다. 위에서 저는 인터럽트가있을 때마다 포트 A의 값을 간단히 증가시킬 수 있다고 말했습니다. 그러나 포트 A에는 5 비트가 있습니다. 포트를 단순히 증가시킨 경우에는 가장 높은 수의 31을 갖게됩니다. 31까지 이동하지 않기로 선택한 이유에 대한 몇 가지 설명이 있습니다.

처음에는 7- 세그먼트 화면을 사용할 것입니다.이 화면은 최대 0에서 15 (16 진수로 0에서 F)까지만 이동할 수 있습니다. 다음으로 지난 몇 번의 강의에서 우연히 발견 한 몇 가지 산술 명령을 추가로 보여 드리고자합니다.

따라서 우리는 인터럽트 루틴을 계속할 것입니다. 현재 가장 먼저해야 할 일은 w 레지스터의 세부 사항을 간단히 저장하는 것입니다. COUNT의 내용을 PORTA로 이동하기 위해 이것을 적용했기 때문입니다. 저장하지 않으면 산술 때문에 완전히 다른 숫자를 전달할 수 있습니다. 따라서 먼저 수행해 보겠습니다.

이 시점에서 우리는 COUNT의 값이 9 이상인지 이해합니다. 지금 수행해야 할 것은 COUNT가 9보다 크면 0으로 되돌 리거나 메인 프로그램으로 돌아가서 포트 A로 전달할 수 있는지 확인하는 것입니다. BTFSS 명령은 다음 작업을 수행 할 것입니다.
캐리 플래그가 예약 된 경우 명령 (예 : COUNT = 10) :

지금 남은 유일한 일은 집합 적으로 입력하고 상수에 대한 값을 결정하는 것입니다. 이는 프로그램 시작시 바로 수행 할 수 있습니다.

스위치를 켤 때마다 LED는 0000에서 1010까지 2 진수로 계산 된 다음 다시 0000으로 증가합니다.

다음 그림은 위에서 설명한 코드와 호환되는 회로도를 보여줍니다. 흥미롭게도 타이밍 커패시터가 설계에 포함되어 있음을 알 수 있습니다. 이것은 그 시간 동안 당신이 당신과 함께하지 않을 경우 커패시터의 포함을 피할 수있는 자유를 얻는 좋은 작은 계략입니다.

여기서 커패시턴스는 발진기 핀과 접지를 가로 지르는 표유 커패시턴스를 통해 작동합니다.
물론 표유 값이 주어진 조건에 따라 다를 수 있기 때문에 실제로 커패시터를 피하는 매우 지능적인 방법으로 보이지 않을 수 있습니다.

회로에서 목격 할 수있는 또 다른 섹션은 스위치를 통한 네트워크 비난입니다. 이는 기계적 스위칭 동안 간섭을 방지하고 스위칭이 단일 토글 또는 다중 토글 인 경우 PIC가 혼동되는 것을 방지합니다.




이전 : 프로그래밍 가능한 양방향 모터 타이머 회로 Next : 벅 부스트 회로의 작동 방식