마이크로 컨트롤러 기본 탐색

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





마이크로 컨트롤러 IC의 장점 중 하나는 전 세계 거의 모든 지역과 전자 소매 업체에서 구할 수 있다는 점입니다.

소개

기본적으로 마이크로 컨트롤러 장치는 주변 환경 및 유사한 전자 장치의 평가와 관련된 애플리케이션에서 널리 사용됩니다.



모터 제어 애플리케이션, LED 조명, 기울기 센서, 가속도계, 속도계, 데이터 로거, 온도 컨트롤러, 키보드 등과 같은 다양한 유형의 센서에서 특정 매개 변수를 표시하는 데 이러한 장치가 사용되는 것을 찾을 수 있습니다.

마이크로 컨트롤러에 대한 기본적인 이해는 AVR Amega32 마이크로 컨트롤러를 참조하여 얻을 수 있습니다. AVR Amega32 마이크로 컨트롤러는 매우 발전하여 때로는 칩 내의 컴퓨터라고도합니다.



이 장치는 프로그램을 형성하기 위해 일련의 명령을 수행하도록 지정됩니다.

여기에서 보게 될 프로그램의 언어는 C ++입니다. 이 과정에서이 언어를 더 깊이 배울 수 있습니다.

MCU에 관해서는 모든 핀아웃을 제어하고 구성 할 수있는 옵션이 있습니다.

이것으로 조금 피곤하다면, 그냥 진정해. 전혀 복잡하지 않기 때문이다. 우리가 앞으로 나아갈 때 모든 측면을 꾸준히하지만 단호하게 풀어줄 것이다.

MCU 칩에서 칩의 전원 핀인 Vdd 및 Vss를 제외한 모든 핀은 독점 지정으로 할당 될 수 있습니다.

핀아웃 세부 정보

상단에서 칩을 훑어 보면 핀아웃이 시작되는 지점을 나타내는 작은 삼각형 노치를 찾을 수 있습니다.이 노치 바로 아래에서 칩의 # 1 핀이 시작되는 카운트입니다.

이 핀에서 시작하여 그 쪽 하단 (왼쪽)까지 20 개의 핀이 있고 다른 쪽 (오른쪽)에는 오른쪽 하단에서 위로 계속되는 다른 20 개의 핀이 있습니다.

노치에서 시작하는 처음 8 개 핀은 여기의 모든 프로그램이 인덱스 0으로 시작하기 때문에 IC의 인덱스 핀을 형성하는 PBO-7입니다.

위의 일련의 핀아웃을 PORT B라고 부르는 반면 A에서 D로 할당 된 다른 동일한 포트 세트가 있습니다.

이러한 포트는 INPUT이라고하는 공급 된 데이터를 받아들이고 인식하고 OUTPUT이라고하는 특정 형식으로 데이터를 전송하도록 할당 될 수 있습니다.

일반 범주에 속하는 두 개의 핀은 Vdd 및 GND라고도하는 (+) / (-) 핀입니다.

PORT D (PDO-6)의 한 핀은 하단 영역의 칩 왼쪽에 있습니다.

PORT D의 7 번 핀인 PD7은 홀로 서서 오른쪽 핀아웃 시리즈를 시작으로 추적 할 수 있습니다.

이제 PORT D가 끝나는 칩의 오른쪽에서 PORT C는 순서대로 카운트를 시작합니다.

이것은 아날로그에서 디지털에 이르기까지 MCU의 많은 흥미로운 핀에 기여합니다.

이 핀은 외부에서 구성된 아날로그 회로 단계를 통해 많은 매개 변수를 감지하기위한 감지 입력이됩니다.

위의 핀은 PORT A를 구성합니다.

위의 핀에서 아날로그에서 디지털로의 변환은 서미스터와 같은 일반 센서를 사용하여 감지 된 아날로그 온도 레벨이 MCU에 의해 쉽게 승인되고 변환되는 PORT A 핀 중 하나에 적용되는 예를 통해 이해할 수 있습니다. 0에서 255 F까지의 디지털 판독 값을 생성합니다 (10 비트 출력을 달성하기 위해 업그레이드 할 수있는 8 비트 수치).

MCU에서 추가로 목격 할 수있는 또 다른 기능은 사용 가능한 프로그래밍 공간 또는 마이크로 컨트롤러에 지정된 변수 및 프로그램을위한 공간을 결정하는 메모리입니다.

또한 MCU에는 관련 매개 변수를 계산하기 위해 할당 된 내장 클럭이 있습니다.

클럭 기능을 통해 MCU는 특정 장치의 사양에 따라 마이크로 초 범위에서 빠르며 원하는 범위로 느려질 수있는 다양한 계산 프로세스에 자체적으로 적용 할 수 있습니다.

지금 쯤이면 마이크로 컨트롤러 개념과 포트 및 핀에 대해 어느 정도 이해했을 것입니다.

프로그래머에서 마이크로 컨트롤러로 연결되는 SPI 커넥터를 만드는 방법

이제 주제에 대해 좀 더 깊이 들어가 프로그래밍의 세계를 조사 할 때입니다.

그러나 칩에 프로그램을로드하기 전에 SPI (Serial Peripheral Interface) 커넥터를 MCU와 통합하는 적절한 방법을 찾아야합니다.

그러나이 후에도 SPI를 MCU 핀아웃에 밀어 넣을 수는 없습니다. 또한 SPI의 연장 된 와이어가 브레드 보드에 직접 삽입되도록 할 수 없습니다. 이것은 또한 잘못된 연결을 만드는 잘못된 핀과 연결된 잘못된 와이어 설정을 유발할 수 있습니다.

따라서 모든 것을 완벽하게 만들기 위해 작은 베로 보드를 통해 절차를 수행하여 '헤더'라고도하는 필요한 연결 금속 핀을 납땜합니다. 이 헤더 핀은 이제 SPI 커넥터와 연결하는 데 사용할 수 있습니다. 이 헤더의 연결은 브레드 보드 연결에 사용될 수있는 다른 병렬 헤더 핀으로 종단 될 수 있습니다.

따라서 위의 어셈블리는 이제 SPI와 MCU를위한 편안하고 안정적인 중간 연결 플랫폼을 형성합니다.

지금까지는 모든 것이 완벽 해 보이기 때문에 PC와 MCU 사이에 필요한 프로그래머와 관련하여 수익을 올리도록하겠습니다.

이러한 프로그래머 장치를 만들고 판매하는 많은 회사가있을 수 있으므로 Adafruit Industries, USBtinyISP 또는 Sparkfun 등과 같이 이러한 장치를 조달하는 것은 문제가되지 않습니다.

이들 중 일부는 기존 유형과 완전히 다르게 보일 수 있지만 기본적으로 모든 것이 동일하고 표준 프로그래밍 규칙을 따르며 PC와 AVR 마이크로 컨트롤러 간의 인터페이스로 사용될 수 있습니다.

그러나 AVR Atmega32가 아닌 다른 MCU를 사용하는 경우 해당 특정 MCU 칩에 대해 호환 가능한 프로그래머를 확인해야 할 수도 있습니다.

이러한 프로그래머 중 상당수가 동일한 드라이버를 사용하는 것을 관찰 할 수 있으며,주의해야 할 사항은 다음 장에서 자세히 알아볼 것입니다.

PC를 마이크로 컨트롤러 칩과 연결하는 것은 진정으로 기본이며이를 위해 절차가 얼마나 간단한 지 알게되어 기뻐할 것입니다. 그러니 바로 버튼을 누르자 J

위에서 설명한 SPI 인터페이스 보드를 만드는 것은 어렵지 않습니다. 작은 범용 보드에 표시된 두 개의 핀 헤더 행에 걸쳐 모든 연결을 통해 납땜 인두가 작동하도록하는 것입니다.

위의 그림은 헤더 사이의 와이어를 상호 연결하는 동안 따라야하는 연결 세부 정보를 보여줍니다.

더 간단하게하기 위해 위의 이미지를 참조하여 동일하게 다음 연결 세부 정보를 살펴 보겠습니다.

왼쪽 상단에서 시작하는 SPI 핀은 'Master IN, Slave OUT'(MISO)로 이동합니다.

왼쪽 중앙의 SPI 핀이 클럭 핀 (SCK)과 연결됩니다.

왼쪽 하단의 SPI 핀이 재설정과 결합됩니다. (다음 튜토리얼에서이 핀에 대해 자세히 알아볼 것입니다.)

오른쪽 하단에 관련된 SPI는 MCU의 GND 핀과 연결되며, GND는 공급의 제로 공급 라인 또는 음극 (상대) 레일을 형성하는 핀을 나타냅니다.

오른쪽 중간 헤더에서 종료되는 SPI는 MCU의 'Master Out, Slave IN'(MOSI) 핀과 연결됩니다.

오른쪽 상단 헤더에서 나오는 SPI는 MCU의 (+)와 연결되어 있습니다. 이는 분명히 MCU의 Vdd 또는 양극 공급 핀입니다.

그게 다야.

설명 된대로 두 개의 커넥터를 연결하면 SPI 인터페이스 보드가 필요한 작업을 수행 할 준비가됩니다.

추가 도움이 필요하면 위에 표시된 그림을 참조 할 수 있습니다. 위의 설명을 통해 모든 와이어 연결이 적절하게 완료되면 최종 인터페이스 보드가 다음과 같이 보일 것입니다.

이전 자습서에서 설명한대로 SPI 인터페이스를 이미 구성했으면 좋겠습니다. 이제 컴퓨터가 PC와 MCU 사이에 통합해야하는 프로그래머를 수용하는지 확인해야합니다.

MCU를위한 간단한 프로그래밍 코드 만들기

컴퓨터를 마이크로 컨트롤러와 연결하기 위해 Sparkfun에서 제공하는 USBTinyISP 장치를 사용합니다.

Windows와 같은 모든 컴퓨터 운영 체제는 드라이버가 필요하지 않은 경우 컴퓨터에 아무것도로드 할 수 없으므로 프로그래머가 컴퓨터에로드하려면 드라이버가 필요합니다.

컴퓨터 OS에 드라이버를 설치하는 데 필요한 절차를 살펴 보겠습니다. 여기서는 32 비트 또는 64 비트 사양의 Windows 7 OS를 예로 들어 보겠습니다.

sparkfun.com을 열고 '포켓 AVR 프로그래머 페이지'를 클릭합니다. 링크는 페이지 내에서 쉽게 시각화 할 수 있습니다.

다음으로 문서에서 'Windows 드라이버'를 찾아 클릭하면됩니다.

그러면 컴퓨터에 pocketprog-driver.zip 파일이 제공됩니다.

컴퓨터로 이동하여 다운로드 위치를 찾은 다음 다운로드 한 파일을 폴더에 압축을 풉니 다.

컴퓨터가 64 비트 OS 인 경우 아래에 제공된 몇 가지 단계를 더 수행해야합니다. 32 비트 OS에서는 압축을 푼 파일에서 직접 설치를 시작할 수 있습니다.

64 비트의 경우 다음을 따르고, 32 비트의 경우 무시하십시오.

Google 'libusb sourceforge'를 클릭하고이 링크 최신 버전을 클릭하십시오.

몇 가지 추가 파일이 표시되지만 bib 파일 (libusb-win32-bin-#. #. #. #. zip)을 찾는 데 관심이 있습니다.

이제 컴퓨터에서이 다운로드 위치를 찾아 압축을 풀고 폴더 중 하나에 저장하십시오.

이 폴더에서 bin 폴더를 탐색하여 amd64 폴더로 이동합니다.

여기에는 ghcalled libusb0.dll 및 libusb0.sys와 같은 두 개의 폴더가 있습니다.

libusb0_x64.dll 및 libusb0_x64.sys로 이름을 바꿀 수 있습니다.

이제 위의 파일을 pocketprog-driver 폴더에 복사하고 기존 버전의 파일을 덮어 쓰면됩니다.

위의 드라이버를 설치하려면 해당 유형이 다소 일반적이지 않은 다음 방법이 흥미로울 것입니다.

'레거시 하드웨어 추가'모드입니다.

'시작 메뉴'를 클릭합니다.

그런 다음 '컴퓨터'를 마우스 오른쪽 버튼으로 클릭하여 진행하십시오.

'관리'를 클릭하고 마지막으로 '장치 관리자'를 클릭합니다.

다음으로 메뉴 내에서 '레거시 하드웨어 추가'를 선택합니다.

마법사가 삽입 될 때까지 '다음'을 누르십시오.

지침에 따라 '고급 목록에서 선택해야하는 하드웨어 설치'를 클릭하면 해당 특정 선택 항목에 라디오 버튼 아이콘이 표시됩니다. 실제로 내부에 둥근 파란색 파일이있는 작은 원처럼 나타나는 창 제어 버튼입니다.

이제 '다음'을 클릭하십시오.

클릭해야하는 '모든 장치 표시'메뉴가 표시됩니다.

그런 다음 '디스크 있음'아이콘을 클릭합니다.

'찾아보기'아이콘을 사용하여 pocketprog-driver 폴더 위치로 이동합니다. 선택이 올바르게 수행 된 경우 특정 폴더에있는 pocketprog.inf 파일을 시각화 할 수 있습니다.

이 파일을 두 번 클릭하면 드라이버가 PC에 설치되는 것을 확실히 볼 수 있습니다.

끝났다 !! 다음 페이지에서 다음 자습서를 계속 진행하겠습니다.

이제 필요한 소프트웨어를 설치하고 SPI 인터페이스를 구축했을 수 있습니다.

프로그램을 마이크로 컨트롤러 칩으로 전송하는 방법

다음 단계에서는 브레드 보드, LED 및 의도 된 애플리케이션에 대한 계산 된 저항과 같은 몇 가지 구성 요소가 필요합니다.

이 섹션에서는 프로그래머의 테스트 방법을 배우고 관련 드라이버 및 소프트웨어의 설치를 확인합니다.

드라이버와 소프트웨어가 올바르게 설치되었는지 확인하기 위해 avrdude라는 간단한 프로그램을 구현합니다.

AVRdude는 최신 WinAVR 설치와 관련된 프로그램으로,이 프로그램이 없으면 MCU로 파일을 실제로 전송할 수 없습니다.

이 프로그램은 필요한 실행을 위해 MCU가 본질적으로 이해할 수있는 .hex 파일 형식입니다.

확인에 실패하면 프로그래머는 파일 전송을 수행 할 수 없습니다.

다음 지침을 사용하여 테스트 절차를 구현하는 방법을 빠르게 살펴 보겠습니다.

'시작 메뉴'를 클릭하고 주어진 검색 상자에 cmd.exe를 입력하여 DOS (디스크 운영 체제) 프롬프트를 엽니 다.

이제 DOS 프롬프트에서 avrdude –c usbtiny –p m32를 입력하여 AVRdude를 수행 할 수 있습니다. 이것이 구현 되 자마자 DOS는 연결이 성공했는지 즉시 인식합니다.

위 명령에서 '-c'는 'usbtiny'프로그래머 매개 변수 사양을 포함하는 알림 플래그이고 '-p'태그는 마이크로 컨트롤러 장치를 식별합니다 ( 'm32는 Atmega32를 나타냄).

다른 MCU를 사용한 경우 구현을위한 관련 접두사를 포함해야합니다.

위의 절차가 완료되면 DOS 프롬프트에 'exit'를 입력하면 창 밖으로 이동할 수 있습니다.

실제 프로그래밍 세부 사항에 대해 진지하게 궁금하다면 먼저 프로그램을 구현할 수있는 외부 아날로그 LED 회로를 납땜하고 구성해야합니다. MCU의 응답을 인식하는 시스템이 없으면 프로그래밍 마이크로 컨트롤러의 실행은 무의미합니다.

LED 보드를 만드는 것은 매우 간단합니다. LED의 두 리드를 베로 보드 위에 납땜하고 저항을 LED 리드 중 하나에 연결하는 것입니다. 이 LED의 역할은 MCU 출력의 과도한 전압 및 전류로 인해 타지 않도록 LED에 대한 전류를 제한하는 것입니다.

저항 값은 다음과 같은 간단한 공식을 사용하여 계산할 수 있습니다.

R = (Ub-LEDfwd) / I

Ub가 공급 전압 인 경우 LEDfwd는 사용 된 LED의 최적 작동 전압이고 I는 최적 암페어입니다.

LED 순방향 전압 = 2.5V이고 전류 I = 20mA 인 RED LED를 사용한다고 가정하면 위의 방정식은 다음과 같이 해결할 수 있습니다.

MCU의 전압은 5V이므로 다음과 같이 표현할 수 있습니다.

R = (5 – 2.5) /. 02 = 125ohm, ¼ 와트, 가장 가까운 값은 120ohm입니다.

이제 LED, 120ohm 저항 및 veroboard가 있으며 다이어그램에 표시된대로 마이크로 컨트롤러와 위의 구성 요소를 상호 연결하기 만하면됩니다.

이 작업이 완료되면 위의 LED 설정에서 의도 한 응답을 위해 MCU를 프로그래밍 할 수 있습니다.

다음은 MCU 프로그래밍입니다.

마이크로 컨트롤러가 의미있는 구현을 수행 할 수 있도록하려면 적절한 명령을 MCU에 작성해야합니다.

프로그래밍 환경을 설치하고 WinAVR을 조사하는 방법

이를 위해 우리는 우리의 PC에서 우리 자신의 '텍스트 편집기'를 사용할 수있을 것입니다. 그러나 우리 중에는 일반 텍스트 편집기 대신보다 전문적인 '프로그래밍 환경'을 사용하는 것이 좋을 것입니다. 이 '프로그래밍 환경'패키지 내에 내장 된 흥미로운 기능.

다른 언어를 통해 프로그램을 만들고 편집하는 것을 지원하고 마이크로 컨트롤러 칩에서 쉽게 이해하고 수용 할 수있는 전달 가능한 모드로 컴파일합니다.

궁극적으로 이것은 WinAVR에 의해 지원되고 관련 MCU 칩으로 전송됩니다.

WinAVR은 또한 프로그램 문제 해결, 가능한 구문 및 컴파일 실수 및 오류에 대한 경고와 같은 다른 많은 작업을 실행할 수 있습니다. 이에 대해서는 이후 튜토리얼에서 설명하겠습니다.

WinAVR의 설치 과정은 매우 빠르고 신속합니다. 다음 사항에 대해 자세히 살펴 보겠습니다.

WinAVR 소스 포지 파일 폴더에서 최신 버전을 다운로드해야합니다. 공식 웹 사이트에서이 다운로드와 관련된 유용한 정보를 볼 수 있습니다.

다운로드를 원할 경우 응답 할 수 있도록 보안 쿼리에 대한 메시지가 표시됩니다. 다운로드 할 파일이 실행 파일인지 확인합니다.

파일을 다운로드하고 클릭하여 실행 프로세스를 시작하십시오. 설치를 시작하십시오.

이 프로세스는 사용자의 편의에 따라 설치를 간소화 할 수 있도록 몇 가지 대답 가능한 질문으로 안내합니다. 이들 중 많은 것을 기본 양식으로 무시하고 싶을 것이며, 행동에 가장 적합하다고 생각되는 것을 선택하는 것은 모두 당신에게 달려 있습니다.

지금까지 당신은 모든 것이 매우 평범하고 쉬운 것을 발견하고 몇 가지 옵션을 찾을 것입니다. 걱정하지 마세요. 이들 중 일부만 실제로 '프로그래머 메모장'이라는 이름의 템플릿 중 하나만 사용합니다.

이 아이콘을 클릭하면 프로그램 작성 (예 : 작성 및 편집)을 적용 할 수 있도록 사용자 인터페이스가 시작됩니다. 또한 코드를 컴파일하고 마이크로 컨트롤러에 임베드하는 데 도움이되는 메뉴 명령으로 구성된 프로그램을 볼 수 있습니다.

위의 프로그래머 메모장의 기본 작업은 작성하는 사람이 읽을 수있는 코드를 MCU에서만 이해할 수있는 일련의 명령으로 변환하는 것입니다.

다음 튜토리얼에서는 위의 프로그래머를 테스트하여 Windows와의 호환성 및 마이크로 컨트롤러 IC와 완벽하게 '핸드 셰이 킹'하는지 여부를 확인할 수 있습니다.

LED를 켜기위한 MCU를 프로그래밍하는 방법

이것이 확인되면 코드 전송 절차에 오류가 발생하지 않도록하기 위해 작은 '아무것도하지 않는'코드를 생성합니다.

물론 이제 MCU 내에서 첫 번째 프로그램을 구현할 준비가되었습니다. 그 전에 이전 튜토리얼 과정에서 수행 한 작업을 빠르게 요약하는 것이 흥미로울 것입니다.

우리는 여기에서 요구되는 사양에 따라 AVR Atmel 마이크로 컨트롤러를 구매했으며 그림에는 ATMega32를 사용했으며 다음으로 마이크로 컨트롤러 기본 사항과 프로그램을 MCU 칩으로 전송하는 프로그래머 유닛에 대해 배웠습니다.

또한 프로그래밍 작업을 위해 컴퓨터를 마이크로 컨트롤러와 연결할 수 있도록 필수적인 SP 인터페이스 커넥터를 구축했습니다.

그런 다음 32 비트 및 64 비트 운영 체제 용 컴퓨터에 드라이버가 올바르게 설치되었는지 확인했습니다.

다음으로 Win AVR이라는 프로그래밍 환경을 설치하여 코드를 마이크로 컨트롤러에 쉽게 작성하고, PC와 마이크로 컨트롤러가 상호 연결되어있는 프로그래머를 검증하기위한 avrdude를 구현했습니다.

마지막으로 이전 장에서 LED / 저항 회로 구축을 완료하고 관련 MCU 출력에 연결했습니다.

그것은 참으로 많은 작업이지만, 이제는 실제 프로그래밍 작업에 바로 들어가야 할 때입니다!

우선 우리는 마이크로 컨트롤러를 세 가지 범주로 나누고 싶을 것입니다. 이것은 우리의 이해를 많이 단순화 할 것입니다.

제어, 감지 및 통신

위의 기능이 여러 가지 방법으로 프로그래밍 될 수 있다는 사실은 흥미로울 것입니다.

첫 번째 프로그램에서는 마이크로 컨트롤러가 외부 매개 변수를 '제어'하도록 명령하려고합니다. 맞습니다. 최근에 만든 LED가 맞습니다.

정확히 말하면 MCU에 연결된 LED를 켜도록 지시 할 것입니다. 예, 이것은 매우 원시적으로 보이지만 시작 단계는 항상 쉬워야합니다.

현재 작업을 진행하면서 MCU를 LED로 제어하는 ​​것은 실제로 매우 간단합니다.

이를 위해 PORT B의 핀 # 0에 LED에 필요한 5V를 생성하도록 지시합니다.

이전 튜토리얼에서 우리는 LED의 양극을 위에서 언급 한 MCU의 핀에 연결했습니다.

MCU의이 핀에 주소를 지정하는 데 필요한 두 가지 필수 사항이 있습니다. 1) 출력 및 2) 5V

특정 핀이 MCU의 출력이되도록 지시하는 방법을 배우겠습니다.

칩의 출력으로 설정되면 애플리케이션에 따라 '높음'(5V) 또는 '낮음'(0V)으로 지정할 수 있습니다.

MCU와 같은 모든 로직 회로의 핀은 출력 또는 입력이 시들고 로직 하이 또는 로직 로우를 생성하도록 구성 될 수 있으므로 핀은 논리적 하이 또는 논리적 로우로 지정하기 만하면됩니다. , 마이크로 컨트롤러 또는 해당 문제에 대한 디지털 IC에 대한 이러한 두 가지 상태 이외의 중간 또는 정의되지 않은 상태는 없습니다. 또한 MCU의 모든 핀에 대해서도 동일하게 적용됩니다.

입력 및 출력 핀 할당과 관련하여 입력은 외부 아날로그 단계의 신호를 수신하도록 배치되고 출력은이를 지정된 논리 상태 또는 주파수로 해석하는 역할을합니다.

위의 할당은 다양한 방법으로 수행 할 수 있지만 간단하게하기 위해 그중 하나에 대해 논의 할 것입니다. 그러나 지금 소개 할 것이 쉽고 흥미로워 보이지만 모든 MCU 애플리케이션에 대해 그렇게 실행 가능하지 않으며 권장되는 유형이 아닙니다. 같은 이유로 나중에 더 인기있는 프로그래밍 방법에 대해 소개하게됩니다. . 이러한 프로그램은 다른 기능을 수행하기 위해 이미 할당되었을 수있는 다른 인접 요소에 영향을주지 않고 사양에 따라 원하는 핀만 할당 할 수 있도록합니다.

그러나 지금 당장은 다른 핀에 대해 그다지 신경 쓰지 않고 관심있는 관련 핀만 사용하여 복잡성을 어느 정도 피할 것입니다.

핀을 출력으로 할당하려면 데이터 방향 레지스터 (DDR)를 사용해야합니다. 여기서 레지스터가 무엇을 의미하는지 궁금하다면 마이크로 컨트롤러가 특정 방식으로 응답 할 수 있도록하는 것은 MCU의 공간 일뿐입니다.

DDR을 사용하여 '출력'과 같은 데이터를 보내거나 '입력'형태의 데이터를 받아들이도록 핀을 설정할 수 있습니다.

그러나 단어에 대해 혼란 스러울 수 있습니다. 이것은 무엇을 의미합니까? 데이터는 연속적으로 로직 0 (0V) 또는 로직 하이 (5V)로 지정 될 수있는 핀에 3 차원을 추가하지만 펄스 주파수와 같이 빠르게 변할 수있는 신호는 어떻습니까? 주파수는 지정된 간격 또는 주기로 진동하는 높고 낮은 로직 (5V 및 0V)을 수반하므로 시간 지향적이되고 시간에 따라 조정될 수 있습니다. 이것이 바로 '데이터'로 식별하는 이유입니다. 다른 기능 (논리 상태 및 시간)에 상대적인 기능.

pin0을 출력으로 할당하는 한 가지 방법은 다음 코드를 작성하는 것입니다.

DDRB = 0b00000001

위 프로그램에서 DDRB는 PORT B ​​0b에 대한 데이터 방향 레지스터를 의미하며, 표현식 끝에있는“1”은 pin0의 위치, 즉 형식의 위치를 ​​나타내는 반면 숫자의 다음 이진 표현식에 대해 컴파일러에 지시합니다. PORT B의 첫 번째 핀의

PORT B가 8 개의 핀을 연결한다는 것을 알고 있다면 (0에서 핀 7까지) 위 코드에도 8 자리가 있습니다. 즉, 각 숫자는 PORT B의 8 핀을 의미합니다.

이제 다음 절차는이 핀 (pin0)에 5V를 할당하는 것입니다. 다시 한 번 작동 원리는 다음 바이너리 코드를 통해 표현 된 DDR과 동일합니다.

PORTB = 0b00000001

알 수 있듯이 위 코드와 이전 코드의 유일한 차이점은이 코드에서 PORT 레지스터를 사용했다는 것입니다. 이 레지스터는 특히 MCU 내부에 배치 된 특정 포트의 핀 할당을 처리합니다. 따라서 이러한 핀아웃에 대해 실제 데이터 로직 (0 또는 1)을 할당 할 수 있습니다.

이제 우리는 프로그램의 대략적인 세부 사항에 대해 몇 가지 논의하는 데 관심이있을 수 있습니다. 모든 프로그램은 실행을 시작하기 위해 특정 공간이 필요하다는 것을 알고 있기 때문에 특정 조리법과 관련된 모든 재료를 알고 있지만 시작 위치에서 지시를받지 않은 요리사와 비교할 수 있습니다.

여기서 'main'함수는 각 C / C ++ 프로그램이 실행을 시작하는 위치입니다. 따라서 메인은 다음과 같이 생성 될 수 있습니다.

int main (void)
{
}

그러나 프로그램이 DDR 및 PORT 레지스터 세부 정보와 MCU 칩 내부의 기능을 해석 할 수 있도록하려면 AVR MCU와 관련된 모든 데이터로 구성 될 수있는 추가 명령문을 포함해야합니다. 아마도 우리는 모든 프로그램에이 포함을 추가하고 싶을 것입니다.

#포함
int main (void)
{
}

컴파일이 시작 되 자마자 컴파일러의 전 처리기 섹션은 'io.h'파일을 식별하기 위해 AVR 디렉토리에 집중합니다. 여기에서 '.h'확장자는 파일이 헤더 파일임을 나타내며 파일 내부의이 코드는 생성되는 소스 파일의 시작 (헤드)에 도입되므로 이름이 '헤더'입니다.

io.h 헤더 파일을 추가하면 컴파일러가 관련 명령을 내렸을 것이기 때문에 여기에서 DDR 및 PORT 문을 코드에 도입 할 수 있습니다.

#포함

int main (void)

{

DDRB = 0b00000001 // 데이터 방향 레지스터는 pin0을 출력으로 설정하고 나머지 핀을 입력으로 설정합니다.

PORTB = 0b00000001 // 핀 0을 5 볼트로 설정

}

위는 핀 0의 방향을 출력으로 고정하고 크기는 5V입니다. 그러나이 핀에 대해 결정되지 않은 한 가지 문제가 있습니다. 즉, MCU에 전원이 공급되는 한이 핀이 무기한으로 켜지도록 지시되지 않은 것입니다. 이 무한 피드백 루프는 MCU의이 핀이 꺼지지 않고 5V 출력으로 무한정 계속되도록합니다.

핀에 대해 루프 명령을 적용하는 방법에는 여러 가지가 있지만 여기서는 'while'루프를 사용해 보겠습니다. 이름에서 알 수 있듯이 'while'루프는 할당 된 핀아웃에 대해 할당 된 5V로 활성화 상태를 유지하는 데 필요한 전원을 '동안'사용할 수 있음을 마이크로 컨트롤러에 알려줍니다.

#포함

int main (void)

{

DDRB = 0b00000001 // 데이터 방향 레지스터는 pin0을 출력으로 설정하고 나머지 핀을 입력으로 설정합니다.

PORTB = 0b00000001 // 핀 0을 5 볼트로 설정

동안 (1)

{

// 반복해서 실행해야하는 경우 여기에 코드가 있습니다.

}

}

여기서는 '0'을 제외한 모든 항목이 논리적 '참'으로 간주 될 수 있으므로 'while'루프에 대한 인수 형식으로 '1'을 사용했습니다.

즉, 'while'루프 고려 사항은 논리적 'true'를 제외하고는 어떤 것도 책임지지 않습니다. 즉, 특정 핀이 지정된 상태로 무기한 고정된다는 의미입니다.

MCU가 Vdd 및 Vss를 통해 전력을 수신하는 한 LED는 할당 된 핀에서 영구적으로 켜져있는 것을 볼 수 있습니다.

이제 우리는 원하는 결과를 얻었고 많은 노력 끝에 마침내 그것을 볼 수 있지만 그럼에도 불구하고 우리의 노력의 달콤한 결과를 보는 것은 너무 만족 스럽습니다.

다음 자습서에서는 위의 LED에 '시간'차원을 추가하는 방법, 즉 특정 지정된 속도로 깜박이도록하는 방법에 대해 알아 봅니다.

실제로 위의 구현에서 LED는 실제로 깜박이지만 루프 속도가 너무 빠르기 때문에 거의 LED 조명을 켜는 영구 스위치와 같습니다.

LED가 지연된 속도로 깜박이도록하기 위해이 루프를 원하는대로 지연으로 추가하는 방법을 살펴 보겠습니다.

AVR 마이크로 컨트롤러를 사용하여 LED 깜박임을 만드는 방법

지난 토론에서 우리는 마이크로 컨트롤러를 통해 LED 스위치를 켜는 방법을 배웠습니다. 그렇게 많지 않을 수도 있습니다!

여기서는 양방향 기능을 사용하여 위의 LED 조명을 향상시키는 방법을 배웁니다. 즉, 특정 주파수 또는 속도로 깜박이거나 깜박이도록 시도합니다. 또한 사용자가 원하는대로이 비율을 높이거나 낮출 수있는 방법도 알아 봅니다.

이에 대해 살펴 보겠습니다.

#포함

#포함

int main (void)

{

DDRB | = 1<< PINB0

동안 (1)

{

PORTB ^ = 1<< PINB0

_delay_ms (100)

}

}

위의 표현에 사용 된 이상한 기호 (&, ^, | 등) (&는 없지만 다른 유사한 코드에서 사용할 수 있음)에 대해 당혹 스러우면 여기에 대해 알고 싶은 관련 정보가 있습니다. :

여기에는 일반적으로 위의 코드와 함께 사용되는 AND, OR, NOT 및 XOR과 같은 많은 표준 논리 알고리즘이 포함됩니다.

이러한 논리적 기능은 할당 된 진리표에 따라 두 비트 '1'과 '0'을 구체적으로 비교합니다.

다음 비트 배열을 분석하여 아이디어를 얻습니다.

01001011 및
10001101
같음
00001001

위 코드에서 &는 C 프로그래밍에서 사용되는 AND를 나타냅니다.

행을 세로로 읽으면 0과 1이 0, 1과 같고 0도 0, 0과 0과 0, 1과 1이 1과 같다는 것을 암시합니다. 읽는 것은 그렇게 간단합니다. 이는 AND 연산자의 진리표에 따른 것입니다.

다음 표를 평가하면 '|'기호를 나타냅니다. 'OR'기능의 사용을 나타내는 '|' 컴퓨터 키보드의 '백 스페이스'왼쪽에서 찾을 수 있습니다.

01001011 |
10001101
같음
11001111

동일하게 OR 논리 기능의이 진리표는 비트 0 또는 1이 1과 같고, 1 또는 0이 1과 같고, 0 또는 0이 0과 같고, 1 또는 1이 1과 같음을 나타냅니다.

다음 비트 조합은 ^로 표시된 XOR 논리 연산자 용이며 AND, OR 진리표에서했던 것처럼 연구 할 수 있습니다.

01001011 ^
10001101
같음
11000110

이제 첫 번째 프로그램을 계속 진행하고 다음 줄이 의미하는 바를 알아 보겠습니다.

#포함

이전 자습서를 통해 표현식이 어떻게 작동하는지 알고 있으므로 반복하지는 않겠지 만 조사해야 할 #include로 표현 된 새로운 'include'인 것 같습니다.

이 '포함'에서 delay.h는 몇 가지 쉬운 구현 방법을 제공합니다.

이름에서 알 수 있듯이 delay.h는 특정 프로그램에서 지연을 유도 할 수 있습니다.

다음 표현식 int main (void)은 이전 게시물에서 이미 다루었으므로 진행중인 토론에서 생략 할 수 있습니다.

다음은 변경된 DDRB입니다.

다음은 0에서 7까지의 모든 핀이 입력을 형성하도록 전환되었으므로 핀을 할당하는 더 좋은 방법이 아닌 이전 형식을 보여줍니다. 그러나 다른 기능을 위해 이러한 핀이 필요한 더 긴 프로그램을 만들고 싶다면 상황이 어떨까요? 예를 들어, 기기의 원격 스위칭을 적용하려면 pin2가 필요할 수 있습니다. 이 경우 시행 착오를 통해 입력과 동일하게 할당하는 것은 좋지 않습니다. 이는 원격 송신기에서 기기 수신기로의 잘못된 응답을 의미 할 수 있습니다.

DDRB = 0b00000001

우리는 이진 마스킹을 통해 실행될 수있는 'OR'기능을 살펴보면서 1 비트, hat pin0 비트에만 영향을주고 자합니다.

DDRB = DDRB | 0b00000001

여기에 'OR'마스크로 가려져 있습니다 : 0b00000001, 비록 이전 DDRB의 경우에는 진짜 이진수 인 것처럼 보이지만 : 0b01001010, 마스킹을 통해 여기에 OR을 적용하면 다음을 얻을 수 있습니다. 0b01001010 | 0b00000001 = 0b01001011.

확인할 수있는 결과 차이는 비트가 변경된 pin0에서만 발생합니다!

C ++를 통해 위의 문을 더 압축하면 다음과 같은 결과가 나타납니다.

DDRB | = 0b00000001

그러나 우리는 주어진 프로그램에 더 많은 것이 있음을 발견했습니다. 매우 합법적이고 명백해 보일 수 있지만, 특히 편의를 위해 기본적으로 생성 된 경우 io.h 헤더 파일의 일부 명령문을 활용해야합니까?

따라서“DDRB | = 1<< PINBO, why it’s like that?

1<< PINBO is implemented for applying the masking effect. The “1” indicates what may be introduced inside the mask, while the < < is simply the left shift functionality. It executes exactly as it’s named, and PINBO is the number of locations that the “1” would sequence across the left hand side. To be precise PINBO may be equivalent of a 0.

그래서 우리는 0b00000000으로 시작하고 '1'을 넣어 0b0000001을 생성 한 다음 왼쪽 0 위치로 옮깁니다. 이것은 위와 정확히 동일한 0b00000001을 제공합니다.

이제 PINB4라고 가정하면 다음과 같이 표현할 수 있습니다.<< PINB4. I this case the “1” would be pushed to the left 4 locations producing: 0b00010000.

우리는“1”뒤에 4 개의 0이 있음을 의미하는 제로 인덱스를 사용하고 있음을주의하십시오.

이제 'while'루프로 넘어 가서 이전에 '무한 루프'를 살펴 보았습니다. 그러나 이제 우리는 마이크로 컨트롤러가 원하는 실행 중 일부를 구현하기를 원할 것입니다. 이것은 주어진 루프 내에서만 가능할 수 있습니다. 특정 시퀀스가 ​​계속 반복되는 루프입니다.

실행이 루프 이전에 배치되는 경우 한 번만 구현되었을 것입니다.

그러나 LED가 무한정 깜박이도록하려면 루프 내에서 PINB0을 교대로 ON / OFF 전환해야합니다. 여기서 우리는 또한 LED의 깜박임이 불가능한 지연이 도입되는 것을 발견했습니다. 그러나 이것은 LED가 육안으로 인식하기 어려운 매우 빠른 속도로 깜박이도록 강제 할 수 있습니다. 우리 눈으로 식별 할 수 있으려면 약간의 속도를 늦춰야합니다.

이진수에서 특정 비트의 설정 절차를 알고 있지만 아직 '1'인 경우 특정 비트 '0'을 적용하는 방법은 확실하지 않습니다.

다음 프로그램이이 작업을 수행하는 것을 볼 수 있지만 프로그램에서 보이지 않을 수도 있습니다.

처음 두 개의 문은 비트를 '1'(5V, LED 표시 등)로 변경 한 다음 100ms 동안 일시 중지됩니다.

다음 두 줄은 PINB0 비트를 '0'(제로 전압, LED 꺼짐)으로 변경하지만 AND 비교는 비트에서 '0'을 실행할 수 없지만 NOT '~'를 사용하면 바이너리 마스크의 경우 모든 0을 1로 전환하거나 그 반대로 전환 할 수 있습니다.

이렇게하면 PINB0 비트에만 영향을 미치고 '0'으로 뒤집을 수 있습니다. 괄호는 마스킹 실행을 포함하기 위해 포함되어 NOT 연산이 왼쪽 시프트 이전의 '1'위에 적용되는 것이 아니라 전체 마스크에 적용될 수 있습니다.<<”.

PORTB | = 1<< PINB0
_delay_ms (100)
PORTB & = ~ (1<< PINB0)
_delay_ms (100)

ON OFF 지연 또는 동일한 기간을 생성하기 위해 이전 4 개 라인을 2 개로 줄이고 XOR 기능을 적용 할 수 있습니다. XOR 실행시 1에 할당 된 핀이 0 인 경우에주의해야하며 그 반대의 경우도 마찬가지입니다. 이 실행은 PINB0에만 영향을 미칩니다. 명령이 적용될 때와 마찬가지로 단순히 비트를 기존 논리의 반대 방향으로 전환합니다.

PORTB ^ = 1<< PINB0
_delay_ms (100)

끝난! 당신의 LED는 설정 속도에 따라 지금 깜빡입니다…. 간단하지 않습니까?




이전 : 여러 기기 원격 제어 회로 다음 : AC 위상, 중립, 접지 오류 표시기 회로