뉴스
뉴스
MCU의 가장 강력한 대중 과학 요약 [추천 컬렉션] (2)
2022-03-17 230

6

마이크로컨트롤러 프로그래밍


 

MCU 프로그래밍과 PC 프로그래밍에는 큰 차이가 있습니다. C 기반 MCU 개발 도구가 점점 더 보편화되고 있지만, 효율적인 프로그램 코드를 선호하고 어셈블리 언어를 사용하는 것을 좋아하는 설계자에게는 어셈블리 언어가 여전히 가장 간결하고 효과적인 프로그래밍 언어입니다.


MCU 프로그래밍의 기본 프레임워크는 대체로 동일하며, 크게 초기화 부분(이 부분이 MCU 프로그래밍과 PC 프로그래밍의 가장 큰 차이점입니다), 메인 프로그램 루프 본문, 그리고 인터럽트 처리기의 세 부분으로 나뉩니다. 각각에 대한 설명은 다음과 같습니다.
  1. 초기화:모든 MCU 프로그램 설계에서 초기화는 가장 기본적이고 중요한 단계이며, 일반적으로 다음과 같은 내용을 포함합니다.
  모든 인터럽트를 마스크하고 스택 포인터를 초기화합니다.초기화 과정에서는 일반적으로 인터럽트가 발생하지 않도록 설계되어 있습니다.  
  시스템의 RAM 영역을 지우고 메모리 정보를 표시합니다.때로는 완전히 필수적이지 않을 수도 있지만, 신뢰성과 일관성 측면에서, 특히 예상치 못한 오류를 방지하기 위해 좋은 프로그래밍 습관을 기르는 것이 좋습니다.  
  IO 포트 초기화:프로젝트의 애플리케이션 요구 사항에 따라 해당 IO 포트의 입력 및 출력 모드를 설정하십시오. 입력 포트의 경우 풀업 또는 풀다운 저항을 설정해야 하며, 출력 포트의 경우 불필요한 오류를 방지하기 위해 초기 출력 레벨을 설정해야 합니다.  
  인터럽트 설정:프로젝트에서 사용해야 하는 모든 인터럽트 소스는 활성화하고 인터럽트 발생 조건을 설정해야 하며, 사용하지 않는 중복 인터럽트는 비활성화해야 합니다.  
  다른 기능 모듈의 초기화:MCU의 모든 주변 기능 모듈에 대해 프로젝트 응용 프로그램의 요구 사항에 따라 해당 설정을 해야 합니다. 예를 들어, UART 통신의 경우 보드율, 데이터 길이, 검증 방식 및 정지 비트 길이를 설정해야 합니다. 프로그래머 타이머의 경우 클록 소스, 주파수 분할 수 및 재로드 데이터를 설정해야 합니다.  
  매개변수 초기화:MCU 하드웨어 및 리소스 초기화가 완료되면 프로그램에서 사용되는 일부 변수와 데이터를 초기화해야 합니다. 이 부분의 초기화는 특정 프로젝트 및 프로그램의 전체적인 구성에 따라 설계해야 합니다. 프로젝트에서 미리 만들어진 데이터를 저장하기 위해 EEPROM을 사용하는 일부 애플리케이션의 경우, 프로그램의 데이터 접근 속도를 향상시키고 시스템의 전력 소모를 줄이기 위해 초기화 중에 관련 데이터를 MCU의 RAM으로 복사하는 것이 좋습니다(원칙적으로 외부 EEPROM에 접근하면 전원 공급 장치의 전력 소모가 증가합니다).  
  2. 메인 프로그램 루프 본문:대부분의 MCU는 장시간 연속적으로 작동하므로, 메인 프로그램 본문은 기본적으로 반복문으로 설계됩니다. 여러 작동 모드를 가진 애플리케이션의 경우, 상태 플래그를 통해 변환되는 여러 개의 반복문이 존재할 수 있습니다. 메인 프로그램 본문은 일반적으로 다음과 같은 모듈로 구성됩니다.
  계산 절차:계산 프로그램은 일반적으로 시간이 많이 소요되므로, 특히 곱셈과 나눗셈 연산의 경우 인터럽트 발생 시 처리하는 것을 강력히 반대합니다.  
실시간 요구 사항이 낮거나 없는 프로그램 처리;
 
  전송 절차를 보여주세요:주로 외부 LED 및 LCD 드라이버를 사용하는 애플리케이션을 대상으로 합니다.  
  3. 인터럽트 처리기:인터럽트 프로그램은 주로 외부의 갑작스러운 신호 감지, 버튼 감지 및 처리, 타이밍 카운팅, LED 디스플레이 스캔 등과 같이 높은 실시간성이 요구되는 작업 및 이벤트를 처리하는 데 사용됩니다.  
일반적인 상황에서 인터럽트 프로그램은 가능한 한 간결하고 짧게 작성해야 합니다. 실시간으로 처리할 필요가 없는 기능의 경우, 인터럽트에서 트리거 플래그를 설정하고 메인 프로그램에서 특정 작업을 수행하도록 할 수 있습니다. 이는 특히 모든 인터럽트에 신속하게 응답해야 하는 저전력, 저속 MCU에서 매우 중요합니다.  
  4. 서로 다른 작업 본체의 배열을 위해, 서로 다른 MCU는 서로 다른 처리 방식을 가지고 있습니다.  
 예를 들어, 저속, 저전력 MCU(Fosc=32768Hz) 애플리케이션의 경우, 휴대용 기기에서 일반 LCD 디스플레이를 사용하는 프로젝트라면 키 입력 및 화면 표시 응답에 높은 실시간 성능이 요구되므로 일반적으로 타이밍 인터럽트를 사용하여 키 입력 동작 및 데이터 표시를 처리합니다. 반면, Fosc>1MHz와 같은 고속 MCU 애플리케이션의 경우, MCU가 메인 프로그램 루프 본문을 실행할 충분한 시간이 있으므로 해당 인터럽트에 다양한 트리거 플래그만 설정하고 모든 작업을 메인 프로그램 본문에 넣어 실행할 수 있습니다.  
  5. MCU 프로그래밍에서 특별히 주의해야 할 점은 다음과 같습니다.

인터럽트와 메인 프로그램 본문에서 동일한 변수나 데이터에 동시에 접근하거나 값을 설정하는 것을 방지해야 합니다. 효과적인 방지 방법은 이러한 데이터 처리를 모듈로 분리하고, 트리거 플래그를 통해 관련 연산 수행 여부를 결정하는 것입니다. 다른 프로그램 본문(주로 인터럽트)에서는 데이터 처리가 필요한 부분에만 트리거 플래그를 설정합니다. 이렇게 하면 데이터 실행이 예측 가능하고 고유하게 이루어집니다.

7

마이크로컨트롤러 프로그래밍에 대한 엔지니어의 요약



 

1,요약하는 좋은 습관을 기르세요. 요약은 단순히 자신의 학습 내용을 정리하는 것뿐만 아니라, 학습 과정을 복습하고 심화하는 데에도 도움이 됩니다. 또한, 같은 실수를 반복하지 않도록 해줍니다.


  2,프로그램을 작성하기 전에 먼저 프로젝트를 충분히 이해하고, 전체적인 틀을 구상해야 합니다. 레이아웃을 어떻게 구성할지, 가장 효율적인 레이아웃은 무엇일지 신중하게 고려하는 것이 매우 중요합니다. 어떤 모듈부터 개발할지, 해당 모듈의 구체적인 단계는 무엇인지, 각 함수의 이름은 어떻게 지을지, 다른 모듈과의 연관성은 무엇인지 등을 분석해야 합니다. 중요한 과정을 적어두는 것도 좋은 방법입니다.  
  3,C 언어에서 모듈식 프로그래밍을 하려면 먼저 각 모듈을 나누고, 모듈별로 프로그래밍하며, 순서를 정하고, 그 순서를 따라 프로그래밍한 후 다음 모듈을 작성해야 합니다. 헤더 파일의 경우, 모듈 작성이 완료된 후에 해당 모듈의 헤더 파일을 작성합니다.  
  4,경고 메시지가 나타나면 무시하지 마세요. 프로그램에 뭔가 문제가 있다는 뜻입니다. 문제의 원인을 파악하고 해결책을 찾아야 합니다. 원인을 찾을 때는 구체적으로 접근하세요. 인터넷에서 관련 정보를 검색하거나 다른 사람에게 조언을 구할 수도 있습니다. 예를 들어, 다른 프로젝트의 핵심 기능이 이 프로젝트에 추가된 경우처럼, 함수 이름이 중복되는 경우도 있습니다. 이처럼 실험적인 현상을 분석하고 단계적으로 진행하는 것이 중요합니다. 포트를 정의할 때 잘못된 인터페이스를 선택한 경우도 있을 수 있습니다. 도저히 해결이 안 될 때는 잠시 쉬면서 생각해 보는 것도 좋습니다. 아무리 간단한 문제라도 실수를 발견할 수 있으니 주의를 기울여야 합니다.   
마이크로컨트롤러 응용 프로그램 개발에는 코드 사용 효율성, 간섭 방지 성능, 마이크로컨트롤러의 신뢰성 등의 문제가 여전히 해결해야 할 과제로 남아 있습니다. 본 글에서는 마이크로컨트롤러 개발에 있어 반드시 숙달해야 할 몇 가지 기본 기술을 정리했습니다.        
         

8

마이크로컨트롤러 개발 기술


   
       

1.프로그램의 버그를 줄이는 방법

프로그램 버그를 줄이는 방법에 관해서는 시스템 운영 중에 고려해야 할 다음과 같은 범위 초과 관리 매개변수를 먼저 살펴보아야 합니다.


  • 물리적 매개변수: 이러한 매개변수는 주로 시스템의 입력 매개변수이며, 여기에는 여기 매개변수, 데이터 수집 처리 중 작동 매개변수 및 처리 완료 후 결과 매개변수가 포함됩니다.

  • 리소스 매개변수: 이러한 매개변수는 주로 시스템 내 회로, 장치 및 기능 단위의 리소스이며, 메모리 용량, 저장 장치 길이 및 적층 깊이 등이 포함됩니다.

  • 응용 프로그램 매개변수: 이러한 응용 프로그램 매개변수는 종종 일부 마이크로컨트롤러 및 기능 장치의 응용 프로그램 조건으로 나타납니다. 프로세스 매개변수: 시스템 작동 중에 순차적으로 변화하는 매개변수를 말합니다.


2.C 언어 프로그래밍 코드의 효율성을 높이는 방법

마이크로컨트롤러 개발 및 응용 분야에서 C 언어를 이용한 프로그래밍은 필연적인 추세입니다. C 프로그래밍 효율을 극대화하려면 사용 중인 C 컴파일러에 익숙해지는 것이 중요합니다. 먼저 각 C 언어 컴파일러의 컴파일 효율을 확인하기 위해 어셈블리 언어 명령문의 줄 수를 측정해 보는 것이 좋습니다. 이를 통해 컴파일 효율이 가장 높은 명령문을 선택하여 프로그래밍을 진행하십시오. 각 C 컴파일러마다 컴파일 효율이 다르기 때문에 컴파일 효율 또한 차이가 발생할 수 있습니다. 임베디드 시스템용으로 성능이 우수한 C 컴파일러를 사용했을 때, 동일한 기능을 어셈블리 언어로 작성했을 때보다 코드 길이와 실행 시간이 5~20% 정도만 더 길어지는 것을 확인할 수 있습니다.


개발 시간이 촉박한 복잡한 프로젝트의 경우 C 언어를 사용할 수 있지만, MCU 시스템의 C 언어 및 C 컴파일러에 대한 충분한 이해가 필수적입니다. 특히 C 컴파일 시스템에서 지원하는 데이터 유형과 알고리즘에 주의해야 합니다. C 언어는 가장 널리 사용되는 고급 언어이지만, MCU 제조사마다 C 언어 컴파일 시스템이 다르고, 특히 일부 특수 기능 모듈의 동작 방식이 다를 수 있습니다. 따라서 이러한 특징을 제대로 이해하지 못하면 디버깅 과정에서 많은 문제가 발생하여 어셈블리 언어보다 실행 효율이 떨어질 수 있습니다.


       3.마이크로컨트롤러의 간섭 방지 문제를 해결하는 방법간섭을 방지하는 가장 효과적인 방법은 간섭원을 제거하고 간섭 경로를 차단하는 것이지만, 현실적으로 그렇게 하기가 어려운 경우가 많습니다. 따라서 마이크로컨트롤러의 간섭 방지 능력이 충분한지 여부만 확인할 수밖에 없습니다. 하드웨어 시스템의 간섭 방지 능력을 향상시키는 동시에, 소프트웨어 간섭 방지 기술은 유연한 설계, 하드웨어 자원 절약, 그리고 높은 신뢰성 덕분에 점점 더 주목받고 있습니다.  
마이크로컨트롤러 간섭의 가장 흔한 현상은 리셋입니다. 프로그램이 폭주하는 경우, 소프트웨어 트랩과 워치독을 사용하여 프로그램을 리셋 상태로 되돌릴 수 있습니다. 따라서 마이크로컨트롤러 소프트웨어가 간섭에 강하려면 리셋 상태를 제대로 처리하는 것이 가장 중요합니다.  
일반적으로 마이크로컨트롤러에는 리셋 원인을 판별하는 데 사용할 수 있는 플래그 레지스터가 있습니다. 또한, 사용자가 직접 RAM에 플래그를 저장할 수도 있습니다. 프로그램이 리셋될 때마다 이러한 플래그를 통해 리셋 원인을 파악하고, 각 원인에 따라 해당 프로그램으로 바로 점프할 수 있습니다. 이를 통해 프로그램은 중단 없이 계속 실행될 수 있으며, 사용자는 프로그램 실행 중에 리셋되었다는 사실을 인지하지 못하게 됩니다.  
       4.마이크로컨트롤러 시스템의 신뢰성을 테스트하는 방법마이크로컨트롤러 시스템 설계가 완료되면, 각 마이크로컨트롤러 시스템 제품마다 다양한 테스트 항목과 방법이 있지만, 반드시 테스트해야 하는 항목들이 있습니다.
 
  • 마이크로컨트롤러 소프트웨어 기능의 완성도를 테스트합니다.
  • 전원 켜짐 및 전원 꺼짐 테스트
  • 노화 시험
  • ESD 및 EFT와 같은 테스트

때로는 사람이 사용하는 동안 발생할 수 있는 손상을 시뮬레이션할 수도 있습니다. 예를 들어, 정전기 방지 능력을 테스트하기 위해 마이크로컨트롤러 시스템의 접촉 포트를 사람의 신체나 옷감에 의도적으로 문지르거나, 전자기 간섭 저항 능력을 테스트하기 위해 고출력 전동 드릴을 마이크로컨트롤러 시스템 가까이에서 사용할 수 있습니다.  
요약하자면, 단일칩 마이크로컴퓨터는 컴퓨터 개발 및 응용 분야에서 중요한 부분을 차지하게 되었습니다. 단일칩 마이크로컴퓨터 응용의 중요한 의미는 기존의 제어 시스템 설계 개념과 설계 방식을 근본적으로 변화시켰다는 점입니다.  
이전에는 아날로그 회로나 디지털 회로로 구현해야 했던 대부분의 기능들을 이제는 마이크로컨트롤러를 이용한 소프트웨어 방식으로 구현할 수 있습니다. 하드웨어를 소프트웨어로 대체하는 이러한 제어 기술을 마이크로컨트롤러 기술이라고 하며, 이는 기존 제어 기술에 혁명을 일으킨 것입니다.  
또한 개발 및 적용 과정에서 기술을 숙달하고 효율성을 향상시켜 더 넓은 범위에서 활용될 수 있도록 해야 합니다.  
         

9

칩 작동 요약


 
 

칩에서의 연산은 주로 칩 내 레지스터에 대한 연산으로 이루어집니다. 칩의 레지스터는 메모리에 매핑된 고유한 주소를 가지고 있으며, 해당 주소에 대한 연산이 바로 그 레지스터에 대한 연산입니다. 칩을 살펴볼 때는 먼저 타이밍 다이어그램을 확인하고, 각 레지스터의 작동 방식을 이해한 후, 프로그램에서 식별할 수 있는 필요한 포트를 정의하고, 쓰기 연산 절차와 읽기 연산 절차를 작성해야 합니다.


칩에 데이터를 쓰는 방법, 데이터를 읽는 방법, 그리고 어떤 포트를 통해 입력하거나 읽어야 하는지(가장 중요한 부분).  
버스를 통해 칩을 연결할 때는 먼저 버스의 프로토콜을 이해해야 합니다. I2C 버스에 연결된 칩은 주로 이 버스를 통해 다른 칩을 제어합니다.  
  1,격자 구조 내의 74hc595 중 하나는 열 선택에 사용되고, 나머지 두 개는 색상 선택에 사용됩니다. 이 격자 구조는 다이오드들의 집합과 같습니다.
한쪽 끝에 높은 레벨을, 다른 쪽 끝에 낮은 레벨을 가했을 때만 다이오드에 불이 들어옵니다. 다만, 한쪽 끝에 가해지는 전압을 다르게 설정하면 다른 색깔의 불이 들어옵니다.  
타이머 동작 모드 선택: 상위 4비트는 타이머 T1을 설정하고, 하위 4비트는 T0을 설정합니다. 각 모드의 마지막 두 자리는 동작 모드를 설정합니다. 두 개의 타이머를 설정할 때는 연산자(|)를 사용하여 선택 여부를 결정해야 합니다. 인터럽트를 사용할 때는 인터럽트 발생 후 지워야 할 항목을 반드시 지워야 합니다.  
  2,시리얼 포트 송수신기: 보드율은 일반적으로 모드 2(초기값으로 자동 재설정)로 설정됩니다. 장치마다 데이터 처리 능력이 다르기 때문에 보드율 설정은 주로 저속 장치와의 통신을 원활하게 하기 위한 것입니다. 인터럽트 플래그 비트는 소프트웨어로 반드시 해제해야 합니다. 시리얼 포트 인터럽트를 설정할 때, 송신 또는 수신 시 발생하는 인터럽트 모두 인터럽트 기능에 진입할 수 있으므로 인터럽트 기능 설정에 주의해야 합니다. (일반적으로 호스트 컴퓨터 또는 슬레이브 컴퓨터 중 하나에 따라 기능을 설정합니다.)  
인터럽트를 사용하여 데이터를 전송하려면 처음 인터럽트에 진입하는 방법을 알아야 합니다. 즉, 먼저 한 번 데이터를 전송한 다음 인터럽트에 진입해야 합니다. 한 번에 한 바이트만 전송할 수 있으며, 다음 비트는 TI가 설정된 후에만 전송할 수 있습니다.  
  3,PCF8591AD 변환기는 4개의 입력 채널을 가지고 있습니다. PCF8591을 읽을 때, 선택된 채널의 입력 전압을 읽습니다. 변환된 데이터는 칩에 저장된 후 출력됩니다. 읽을 때는 먼저 칩의 주소를 기록하고, 그 다음 장치의 서브 주소(0x40|채널 번호)를 기록한 후 데이터를 읽습니다.  
  4,Da 변환은 먼저 장치 주소를 칩에 기록하고, 그 다음 하위 주소(0x40)를 기록하고, 마지막으로 변환할 디지털 값을 기록하는 방식으로 진행됩니다. 장치 주소 칩 정보가 도입됩니다.  
  5,LCD 디스플레이의 경우, 데이터가 기록되어 표시되면 지속적인 새로 고침 없이 항상 표시됩니다. 데이터를 변경하려면 다시 입력해야 합니다.  
  6,DS1302 클록 칩의 경우, 데이터를 읽을 때 첫 번째 데이터는 8번째 클록의 하강 에지에서 읽고, 데이터를 쓸 때는 다음 출력을 준비합니다. 프로그램의 데이터 쓰기 방식과 반환 값의 위치에 주의해야 합니다.  
  7,DS1302에서는 먼저 레지스터를 지정한 다음 해당 레지스터에 데이터를 씁니다. 칩 데이터의 레지스터는 주소를 나타냅니다. (쓰기 방지 프로그램에 대해서는 아직 잘 이해가 안 됩니다. 항상 쓰기가 이루어지는 것 아닌가요? 왜 쓰기 방지가 켜져 있는 거죠?)
(앞서 언급하신 분의 의견에 따르면, 초기화 시간 이후에 플래그를 설정할 수 있다고 합니다. 이 플래그가 있으면 초기화 시간을 따로 설정할 필요가 없습니다. 하지만 전원이 꺼지면 MCU의 RAM에 이 플래그가 저장되지 않으므로, DS1302의 RAM을 이용하여 플래그를 저장하고 전원을 켠 후에 읽어오는 방법이 있습니다. 저도 초보자이고 최근에 DS1302를 사용해 보려고 하는데, 이 방법이 맞는지 잘 모르겠고 아직 구현도 해보지 않았습니다. 더 자세한 내용을 공유해 주시면 감사하겠습니다.)
  8,나중에 잊어버릴 경우를 대비해 초기화 정보를 적어두는 것이 좋습니다. 읽기 또는 쓰기 시 최하위 비트와 최상위 비트 중 어느 비트가 먼저 연산되는지 타이밍 다이어그램을 통해 확인하는 것이 중요합니다.  
  9,적외선 송수신기는 수신 시 두 개의 하강 에지 사이의 시간 간격을 기준으로 높은 레벨인지 낮은 레벨인지 판단합니다. 프로그램을 작성할 때는 먼저 타이머를 사용하여 시간을 측정하고 저장한 다음, 이를 이진수로 변환합니다 (이러한 프로그램을 작성하는 방법에 대한 자세한 내용은 관련 자료를 참고하세요).  
  10,스테퍼 모터: 주로 스위칭 용도로 사용됩니다. 스테퍼 모터는 회전 속도가 증가함에 따라 토크가 감소합니다. 주로 공작기계에서 가공된 부품의 자동 이송에 사용되며, 높은 정밀도가 요구되는 제어 분야에도 사용될 수 있습니다.  
스테퍼 모터는 전기 펄스 신호를 각 변위 또는 선형 변위로 변환하는 개루프 제어 소자입니다. 과부하가 없는 조건에서 모터의 속도와 정지 위치는 펄스 신호의 주파수와 펄스 개수에만 의존하며 부하 변화의 영향을 받지 않습니다. 스테퍼 드라이버가 펄스 신호를 수신하면 스테퍼 모터를 설정된 방향으로 고정된 각도(스텝 각도)로 회전시킵니다. 회전은 고정된 각도로 단계적으로 진행됩니다. 펄스 개수를 제어하여 각 변위를 정밀하게 위치 제어할 수 있으며, 동시에 펄스 주파수를 제어하여 모터 회전 속도와 가속도를 조절하여 속도 제어가 가능합니다.  
  11,서보 모터: 서보 모터는 서보 시스템에서 기계 부품의 작동을 제어하는 ​​모터를 말합니다. 모터를 보조하는 간접 동력 전달 장치입니다. 서보 모터는 속도와 위치 정밀도를 매우 정확하게 제어할 수 있으며, 전압 신호를 토크와 회전 속도로 변환하여 제어 대상을 구동합니다. 서보 모터의 회전 속도는 입력 신호에 따라 제어되며 빠른 응답 속도를 가집니다. 자동 제어 시스템에서는 액추에이터로 사용되며, 작은 전기기계적 시정수, 높은 선형성, 낮은 시동 전압 등의 특징을 가지고 있습니다. 수신된 전기 신호를 모터 축의 각 변위 또는 각속도 출력으로 변환합니다. 서보 모터는 DC 서보 모터와 AC 서보 모터의 두 가지 유형으로 나뉩니다. 주요 특징은 신호 전압이 0일 때 회전하지 않고, 토크가 증가함에 따라 회전 속도가 일정한 속도로 감소한다는 것입니다. DC 서보 모터는 적용 범위가 넓어 주로 소형 차량에 사용됩니다.


면책 조항: 본 기사는 "국제 전자상거래정보"에서 발췌한 내용입니다. 본 기사는 전적으로 필자의 개인적인 견해이며, 사코마이크로 및 업계의 공식적인 입장을 대변하는 것은 아닙니다. 재인쇄 및 공유는 지적 재산권 보호를 위해 허용되며, 재인쇄 시 원문 출처와 저자를 명시해 주시기 바랍니다. 저작권 침해 사항이 있을 경우 삭제를 위해 당사에 연락해 주십시오.

회사 전화번호: +86-0755-83044319
팩스: +86-0755-83975897
이메일: 1615456225@qq.com
QQ: 3518641314 리 관리자

QQ: 332496225 Qiu 관리자

주소: 중국 선전시 룽화신구 민즈대로 1079번지 전타오테크놀로지빌딩 C동 809호

whatsapp

서비스 핫라인

tel: +86 755 83044319

WhatsApp

Whatsapp:+8618073002950