우리는 avr을 프로그래밍합니다. C 프로그래밍 - 마이크로컨트롤러 및 기술

비트 연산은 이전에 다룬 논리 연산을 기반으로 합니다. 이는 AVR 및 기타 유형의 마이크로 컨트롤러를 프로그래밍하는 데 핵심적인 역할을 합니다. 비트 연산을 사용하지 않으면 거의 어떤 프로그램도 수행할 수 없습니다. 그 전에 우리는 MK 프로그래밍 학습 과정을 용이하게 하기 위해 의도적으로 이를 피했습니다.

이전의 모든 기사에서 우리는 I/O 포트만 프로그래밍했으며 타이머, 아날로그-디지털 변환기, 인터럽트 및 MK가 모든 전력을 잃지 않는 기타 내부 장치와 같은 추가 내장 구성 요소를 사용하지 않았습니다.

MK의 내장 장치를 마스터하기 전에 AVR MK 레지스터의 개별 비트를 제어하거나 확인하는 방법을 배워야 합니다. 이전에는 전체 레지스터의 숫자를 확인하거나 설정하는 작업을 한 번에 수행했습니다. 차이점이 무엇인지 알아보고 계속 진행하겠습니다.

비트별 연산

대부분의 경우 AVR 마이크로 컨트롤러를 프로그래밍할 때 이를 사용했습니다. 왜냐하면 초보 MK 프로그래머에 비해 더 시각적이고 잘 이해되기 때문입니다. 예를 들어 포트 D의 세 번째 비트만 설정하면 됩니다. 이를 위해 이미 알고 있듯이 다음 바이너리 코드를 사용할 수 있습니다.

포트D = 0b00001000;

그러나 이 명령을 사용하면 세 번째 숫자를 1로 설정하고 다른 모든 숫자(0, 1, 2, 4, 5, 6 및 7)를 0으로 재설정합니다. 이제 6번째와 7번째 비트가 ADC 입력으로 사용되고 이때 일부 장치의 신호가 해당 MK 핀에 수신되고 위의 명령을 사용하여 이러한 신호를 재설정하는 상황을 상상해 보겠습니다. 결과적으로 마이크로 컨트롤러는 이를 보지 못하고 신호가 도착하지 않았다고 믿습니다. 따라서 이러한 명령 대신 나머지 비트에 영향을 주지 않고 세 번째 비트만 1로 설정하는 다른 명령을 사용해야 합니다. 이를 위해 일반적으로 다음과 같은 비트 단위 연산이 사용됩니다.

포트 |= (1<<3);

아래에서 해당 구문에 대해 자세히 설명하겠습니다. 그리고 이제 또 다른 예입니다. PIND 레지스터의 세 번째 숫자의 상태를 확인하여 버튼의 상태를 확인해야 한다고 가정해 보겠습니다. 이 비트가 0으로 재설정되면 버튼이 눌려진 것을 알 수 있으며 누른 버튼의 상태에 해당하는 명령 코드가 실행됩니다. 이전에는 다음 표기법을 사용했습니다.

if (PIND == 0b00000000)

(모든 코드)

그러나 이를 통해 우리는 세 번째 비트뿐만 아니라 PIND 레지스터의 모든 비트를 한 번에 확인합니다. 따라서 버튼을 눌러 원하는 비트를 재설정하더라도 이때 포트 D의 다른 핀에서 신호가 수신되면 해당 값은 1로 설정되고 괄호 안의 조건은 거짓이 됩니다. 결과적으로 중괄호 안의 코드는 버튼을 눌러도 실행되지 않습니다. 따라서 PIND 레지스터의 개별 3번째 비트 상태를 확인하려면 비트 단위 연산을 사용해야 합니다.

if (~PIND & (1<<3))

(모든 코드)

마이크로컨트롤러의 개별 비트로 작업하기 위해 C 프로그래밍 언어에는 하나 이상의 개별 비트 상태를 한 번에 변경하거나 확인하는 데 사용할 수 있는 도구가 있습니다.

단일 비트 설정

포트 D와 같은 단일 비트를 설정하려면 비트 OR 연산이 사용됩니다. 이것이 기사의 시작 부분에서 사용한 것입니다.

포트D = 0b00011100; // 초기 값

포트D = 포트D | (1<<0); применяем побитовую ИЛИ

포트 |= (1<<0); // сокращенная форма записи

포트D == 0b00011101; // 결과

이 명령은 0비트를 설정하고 나머지는 변경되지 않은 채로 둡니다.

예를 들어 포트 D의 또 다른 6번째 비트를 설치해 보겠습니다.

포트D = 0b00011100; // 초기 포트 상태

포트 |= (1<<6); //

포트D == 0b01011100; // 결과

예를 들어 0, 6, 7 포트와 같이 여러 개별 비트에 1을 동시에 쓰려면 다음 표기법이 적용됩니다.

포트B = 0b00011100; // 초기 값

포트B |= (1<<0) | (1<<6) | (1<<7); //

포트B == 0b1011101; // 결과

개별 비트 재설정(제로화)

단일 비트를 재설정하려면 이전에 설명한 세 가지 명령을 한 번에 사용합니다. .

PORTC 레지스터의 세 번째 비트를 재설정하고 나머지는 변경하지 않고 그대로 두겠습니다.

포트C = 0b00011100;

포트C &= ~(1<<3);

포트C == 0b00010100;

두 번째와 네 번째 숫자에 대해서도 비슷한 작업을 수행해 보겠습니다.

포트C = 0b00111110;

포트C &= ~((1<<2) | (1<<4));

포트C == 0b00101010;

비트 스위칭

설정 및 재설정 외에도 단일 비트를 반대 상태(1에서 0으로 또는 그 반대로)로 전환하는 유용한 명령도 사용됩니다. 이 논리 연산은 새해 화환과 같은 다양한 조명 효과를 만드는 데 널리 사용됩니다. PORTA의 예를 살펴보겠습니다.

포트A = 0b00011111;

포르타 ^= (1<<2);

포트A == 0b00011011;

0, 두 번째 및 여섯 번째 비트의 상태를 변경해 보겠습니다.

포트A = 0b00011111;

포르타 ^= (1<<0) | (1<<2) | (1<<6);

포트A == 0b01011010;

개별 비트의 상태를 확인합니다. I/O 포트 검사(쓰기와 반대)는 PIN 레지스터에서 데이터를 읽어 수행된다는 점을 상기시켜 드리겠습니다.

대부분의 경우 테스트는 두 개의 루프 문(if 및 while) 중 하나에 의해 수행됩니다. 우리는 이전에 이러한 연산자에 대해 이미 잘 알고 있습니다.

다음을 사용하여 비트에 논리 0(재설정)이 있는지 확인합니다. 만약에

if (0==(PIND & (1<<3)))

포트 D의 세 번째 비트가 지워지면 Code1이 실행됩니다. 그렇지 않으면 Code2가 실행됩니다.

다음과 같은 녹음 형식으로 유사한 작업이 수행됩니다.

if (~PIND & (1<<3))

다음을 사용하여 논리 장치(설정)가 있는지 비트를 확인합니다. 만약에

if (0 != (PIND & (1<<3)))

if (PIND & (1<<3))

위의 두 루프는 유사하게 작동하지만 C 프로그래밍 언어의 유연성으로 인해 다른 형식의 표기법을 가질 수 있습니다. != 연산자는 같지 않음을 의미합니다. PD I/O 포트의 세 번째 비트가 1로 설정되면 Code1이 실행되고 그렇지 않으면 Code2가 실행됩니다.

비트가 재설정되기를 기다리는 중 ~하는 동안

동안 (PIND & (1<<5))

PIND 레지스터의 5번째 비트가 설정되어 있는 동안 Code1은 실행됩니다. 재설정하면 Code2가 실행되기 시작합니다.

비트가 설정되기를 기다리는 중 ~하는 동안

여기서 C 구문을 사용하면 가장 일반적인 두 가지 방법으로 코드를 작성할 수 있습니다. 실제로는 두 가지 유형의 녹음이 모두 사용됩니다.

나는 처음으로 마이크로컨트롤러 프로그래밍을 시작하고 이전에 C 언어에 익숙하지 않은 사람들을 위해 짧은 소개 기사를 쓰기로 결정했습니다. 자세한 내용은 다루지 않고 CodeVisionAVR 작업에 대한 일반적인 아이디어를 얻기 위해 모든 것에 대해 조금 이야기하겠습니다.

더 자세한 정보는 CodeVision 사용자 매뉴얼에서 영어로 찾을 수 있습니다. 또한 마이크로컨트롤러에 대한 C에 대한 비디오 강의가 있는 http://somecode.ru 사이트와 Deitel의 책 "How to Program in C"를 추천합니다. 나 자신이 사용한 좋은 책만 시작되었습니다.

우리가 어떤 행동을 하든 결국 모든 것은 마이크로컨트롤러의 펌웨어에 달려 있다는 사실부터 시작해 보겠습니다. 펌웨어 프로세스 자체는 다음과 같이 발생합니다. 특정 프로그램을 사용하여 펌웨어 파일을 선택하고, 매개 변수를 선택하고, 버튼을 누르고 펌웨어가 직접 플래시됩니다. 이는 본질적으로 복사본입니다. 컴퓨터에서 플래시 드라이브로 음악이나 문서를 복사하는 것과 마찬가지로 프로세스의 물리적 원리는 동일합니다.

펌웨어 자체에는 .hex 확장자가 있으며 마이크로컨트롤러가 이해할 수 있는 1과 0 형태의 명령 집합입니다. 펌웨어는 어디서 구할 수 있나요? 전자 웹사이트에서 다운로드하거나 직접 작성할 수 있습니다. 개발 환경이라는 특별한 프로그램에서 작성할 수 있습니다. 나에게 가장 잘 알려진 환경은 AVR Studio, IAR, CodeVision, WinAVR입니다... 이러한 환경 중 어느 것이 더 좋고 나쁜지 각자에게 말하기는 불가능합니다. 이러한 프로그램은 주로 편의성, 프로그래밍 언어 및 가격이 다르다고 말할 수 있습니다. 이 사이트에서는 CodeVision만 고려됩니다.

환경을 정리했으니 이제 펌웨어를 작성하는 과정을 살펴보겠습니다. CodeVision에서는 먼저 프로젝트를 생성해야 합니다. 코드 마법사를 사용하여 생성하거나 비워둘 수 있습니다. 어떤 경우든 사용되는 마이크로컨트롤러 유형을 선택하고 해당 주파수를 표시해야 합니다. 마법사를 사용할 때 초기 설정을 선택하고 해당 설정으로 소스 코드를 생성하라는 메시지가 표시됩니다. 그러면 이 코드를 편집할 수 있는 창이 나타납니다. 메모장에서 소스 코드를 작성한 다음 설정에서 프로젝트에 첨부할 수 있습니다.

소스 코드 파일은 프로그래밍 언어로 된 명령 집합입니다. CodeVision의 임무는 이러한 명령을 바이너리 코드로 변환하는 것이고, 사용자의 임무는 이 소스 코드를 작성하는 것입니다. CodeVision은 C 언어를 이해하며 소스 코드 파일의 확장자는 ".c"입니다. 하지만 CodeVision에는 C에서 사용되지 않는 구조가 있기 때문에 많은 프로그래머들이 이를 좋아하지 않으며, 사용되는 언어도 C와 유사하다고 합니다. 그러나 이것이 심각한 프로젝트 작성을 방해하지는 않습니다. 많은 예제, 코드 생성기 및 대규모 라이브러리 세트는 CodeVision에 큰 이점을 제공합니다. 유일한 단점은 코드 제한이 있는 무료 버전이 있지만 유료라는 것입니다.

소스 코드에는 사용된 마이크로 컨트롤러 유형과 주요 기능이 포함된 헤더가 포함되어야 합니다. 예를 들어 ATtiny13이 사용됩니다.

#포함하다 무효 메인(void) ( ) ;

#포함하다 void main(void) ( );

main 함수 이전에 필요한 라이브러리를 연결하고 전역 변수, 상수 및 설정을 선언할 수 있습니다. 라이브러리는 일반적으로 확장자가 ".h"인 별도의 파일로 이미 미리 작성된 코드가 포함되어 있습니다. 일부 프로젝트에서는 이 코드가 필요할 수 있지만 다른 프로젝트에서는 필요하지 않습니다. 예를 들어, 한 프로젝트에서는 LCD 디스플레이를 사용하지만 다른 프로젝트에서는 사용하지 않습니다. 다음과 같이 LCD 디스플레이 “alcd.h”로 작업하기 위해 라이브러리를 연결할 수 있습니다:

#포함하다 #포함하다 무효 메인(void) ( ) ;

#포함하다 #포함하다 void main(void) ( );

변수는 특정 값을 넣을 수 있는 메모리 영역입니다. 예를 들어 두 개의 숫자를 추가한 경우 나중에 사용할 수 있도록 결과를 어딘가에 저장해야 합니다. 먼저 변수를 선언해야 합니다. 즉, 이에 대한 메모리를 할당합니다. 예를 들면 다음과 같습니다.
int i=0;
저것들. 변수 i를 선언하고 그 안에 값 0을 넣었습니다. int는 변수의 유형, 더 간단히 말하면 할당된 메모리의 크기를 의미합니다. 각 변수 유형은 특정 범위의 값만 저장할 수 있습니다. 예를 들어 int는 -32768부터 32767까지의 숫자로 작성할 수 있습니다. 소수 부분이 포함된 숫자를 사용해야 하는 경우 변수를 float로 선언해야 하며, 문자의 경우 char 유형을 사용합니다.

비트, 비트, _bit 0 또는 1 char -12768에서 32767 int에서 0 ~ 255 int까지 -128 ~ 127 char -32768에서 32767 int까지 0 ~ 65535 -2147483648에서 2147483647에서 2147483647에서 0에서 4294967295로 긴 int에서 int int가 0에서 65535까지 int를 0 ~ 65535까지 int. 38 ~ ±3.402e38

메인 함수 내부에는 메인 프로그램이 이미 실행 중입니다. 함수를 실행한 후 프로그램이 중지되므로 동일한 프로그램을 계속 반복하는 무한 while 루프를 만듭니다.

void main(void) ( while (1) ( ) ; ) ;

void main(void) ( while (1) ( ); );

소스 코드의 어느 부분에나 주석을 작성할 수 있습니다. 이는 프로그램 작동에 어떤 영향도 미치지 않지만 작성된 코드에 메모를 작성하는 데 도움이 됩니다. //두 개의 슬래시를 사용하여 한 줄을 주석 처리할 수 있으며 //그 이후 컴파일러는 전체 줄 또는 여러 줄 /**/을 무시합니다. 예를 들면 다음과 같습니다.

/*기본 수학 연산:*/정수 i= 0; //변수 i를 선언하고 값 0을 할당합니다.//추가: i = 2 + 2 ; //뺄셈: i = 2 - 2 ; //이 표현식을 실행한 후 변수 i는 0이 됩니다.//곱하기: i = 2 * 2 ; //이 표현식을 실행한 후 변수 i는 4와 같습니다.//나누기: i = 2 / 2 ; //이 표현식을 실행한 후 변수 i는 1이 ​​됩니다.

/*기본 수학 연산:*/ int i=0; //변수 i를 선언하고 값 0을 할당합니다. //추가: i = 2+2; //이 표현식을 실행한 후 변수 i는 4와 같습니다. //뺄셈: i = 2-2; //이 표현식을 실행한 후 변수 i는 0이 됩니다. //곱셈: i = 2*2; //이 표현식을 실행한 후 변수 i는 4가 됩니다. //Division: i = 2/2; //이 표현식을 실행한 후 변수 i는 1이 ​​됩니다.

프로그램은 조건에 따라 한 코드에서 다른 코드로 전환해야 하는 경우가 많습니다. 이를 위해 조건부 if() 작업이 있습니다. 예를 들면 다음과 같습니다.

if(i>3) //i가 3보다 크면 i에 0 값을 할당합니다( i=0; ) /* i가 3보다 작으면 조건 본문 다음의 코드로 이동합니다. 대괄호 뒤 ()*/

또한 if는 else와 함께 사용할 수 있습니다. 그렇지 않으면

만약 내가<3) //если i меньше 3, то присвоить i значение 0 { i=0; } else { i=5; //иначе, т.е. если i больше 3, присвоить значение 5 }

비교 연산자 "=="도 있는데 "=" 할당과 혼동해서는 안 됩니다. 반대 연산은 "!="와 같지 않습니다.

if(i==3)//i가 3이면 i에 값 0을 할당합니다( i=0; ) if(i!=5) //i가 5가 아니면 i에 값 0을 할당합니다( i=0; )

더 복잡한 것, 즉 기능으로 넘어 갑시다. 여러 번 반복되는 특정 코드 조각이 있다고 가정해 보겠습니다. 게다가 이 코드는 크기가 상당히 큽니다. 매번 쓰는게 불편하네요. 예를 들어 변수 i를 변경하는 프로그램에서 포트 D의 0번과 3번 버튼을 누르면 동일한 코드가 실행되어 변수 i의 값에 따라 포트 B의 다리가 켜집니다.

void main(void) ( if (PIND.0== 0 ) //PD0의 버튼이 눌렸는지 확인( if (i== 0 ) //i==0이면 PB0을 활성화합니다.( PORTB.0= 1 ; ) if (i== 5 ) // i==5인 경우 PB1을 활성화합니다.( PORTB.1= 1 ; ) ) … if (PIND.3== 0 ) // PD3 버튼을 확인할 때도 같은 작업을 수행합니다.( if (i== 0 ) ( PORTB.0= 1 ; ) if (i== 5 ) ( PORTB.1= 1 ; ) ) )

void main(void) ( if(PIND.0==0) //PD0의 버튼이 눌렸는지 확인합니다. ( if(i==0) //i==0이면 PB0을 켭니다( PORTB.0=1; ) if( i==5) // i==5이면 PB1을 켭니다. ( PORTB.1=1; ) ) ... if(PIND.3==0) // PD3 버튼을 확인할 때도 같은 작업을 수행합니다. ( if(i==0 ) ( PORTB.0=1; ) if(i==5) ( PORTB.1=1; ) ) )

일반적으로 코드는 그다지 크지 않지만 몇 배는 커질 수 있으므로 자신만의 함수를 만드는 것이 훨씬 더 편리할 것입니다.
예를 들어:

void i_check() ( if (i== 0 ) ( PORTB.0= 1 ; ) if (i== 5 ) ( PORTB.1= 1 ; ) )

void i_check() ( if(i==0) ( PORTB.0=1; ) if(i==5) ( PORTB.1=1; ) )

void는 함수가 아무 것도 반환하지 않는다는 것을 의미합니다. 이에 대한 자세한 내용은 i_check() 아래에서 확인하세요. 이것은 함수의 이름입니다. 원하는 대로 호출할 수 있습니다. 저는 정확히 그렇게 불렀습니다. - check i. 이제 코드를 다시 작성할 수 있습니다.

void i_check() ( if(i==0) ( PORTB.0=1; ) if(i==5) ( PORTB.1=1; ) ) void main(void) ( if(PIND.0==0 ) //PD0의 버튼이 눌렸는지 확인합니다. ( i_check(); ) ... if(PIND.3==0) ( i_check(); ) )

코드가 i_check(); 라인에 도달하면; 그런 다음 함수 내부로 점프하여 내부의 코드를 실행합니다. 동의하세요. 코드가 더 간결하고 명확해졌습니다. 함수는 동일한 코드를 단 한 줄로 대체하는 데 도움이 됩니다. 함수는 기본 코드 외부에서 선언됩니다. 주요 기능 전에. 왜 이것이 필요한지 말할 수 있지만 수업을 공부하는 동안 LCD 화면 지우기와 같은 함수를 자주 접하게 됩니다. lcd_clear() - 이 함수는 매개변수를 받아들이지 않고 아무것도 반환하지 않지만 화면. 때때로 이 함수는 거의 모든 라인마다 사용되므로 코드 절약이 분명합니다.

값을 취할 때 함수를 사용하는 것이 훨씬 더 흥미로워 보입니다. 예를 들어 변수 c가 있고 int 유형의 두 값을 취하는 함수 sum이 있습니다. 메인 프로그램이 이 함수를 실행할 때 인수는 이미 괄호 안에 있으므로 "a"는 2가 되고 "b"는 1이 됩니다. 함수가 실행되고 "c"는 3이 됩니다. .

정수 c= 0; void sum(int a, int b) ( c= a+ b; ) void main(void ) ( sum(2 , 1 ) ; )

정수 c=0; void sum(int a, int b) ( c=a+b; ) void main(void) ( sum(2,1); )

가장 일반적인 유사한 기능 중 하나는 LCD 디스플레이에서 커서를 이동하는 것입니다. lcd_gotoxy(0,0); 그건 그렇고, x 및 y 좌표 인수도 사용합니다.

함수를 사용하는 또 다른 옵션은 값을 반환할 때 이제 더 이상 무효가 아닙니다. 두 숫자를 추가하는 함수의 이전 예를 개선해 보겠습니다.

정수 c= 0; int sum(int a, int b) ( return a+ b; ) void main(void) ( с= sum(2, 1) ; )

정수 c=0; int sum(int a, int b) ( return a+b; ) void main(void) ( с=sum(2,1); )

결과는 지난 번 c=3과 동일하지만 변수 "c"에 더 이상 void가 아니지만 int 유형의 두 숫자의 합을 반환하는 함수의 값을 할당한다는 점에 유의하세요. 이렇게 하면 특정 변수 "c"에 얽매이지 않아 함수 사용에 유연성이 추가됩니다. 이러한 함수의 간단한 예는 ADC 데이터를 읽는 것이며, 이 함수는 측정된 값 결과=read_adc();를 반환합니다. 기능에 대해 마무리하겠습니다.

이제 배열로 넘어가겠습니다. 배열은 관련 변수입니다. 예를 들어, 여러 포인트가 있는 사인 테이블이 있는 경우 변수 int sinus1=0을 만들지 않습니다. int sinus2=1; 등. 이를 위해 배열이 사용됩니다. 예를 들어 다음과 같이 세 가지 요소로 구성된 배열을 만들 수 있습니다.
int sinus=(0,1,5);
배열 요소의 총 개수는 대괄호 안에 표시됩니다. 다음과 같이 세 번째 요소의 값을 변수 "c"에 할당할 수 있습니다.
с=부비동;
배열 요소의 번호는 0부터 시작됩니다. "c"는 5가 됩니다. 이 배열에는 sinus 요소가 없습니다!!!
다음과 같이 개별 요소에 값을 할당할 수 있습니다.
부비동=10;

CodeVision에는 문자열 변수가 없다는 것을 이미 알아차렸을 것입니다. 저것들. 변수 문자열 hello=”hello”를 생성할 수 없습니다. 이렇게 하려면 개별 문자의 배열을 만들어야 합니다.

lcd_putchar(안녕하세요); lcd_putchar(안녕하세요); lcd_putchar(안녕하세요);

등.
꽤 번거로운 것으로 밝혀졌습니다. 여기서 사이클이 구출됩니다.
예를 들어 while 루프

동안(PINB.0!=0) ( )

버튼을 누를 때까지 아무 것도 하지 않고 빈 루프를 실행합니다.

또 다른 옵션은 for 루프입니다.

나는 int; (i= 0; 나는< 6 ; i++ ) { lcd_putchar(hello[ i] ) ; }

나는 int; for(i=0;i<6;i++) { lcd_putchar(hello[i]); }

의미는 while과 완전히 동일하며 초기 조건 i=0과 i++주기마다 실행되는 조건만 추가됩니다. 루프 내부의 코드는 최대한 단순화되었습니다.

프로그램을 작성한 후 소스 코드가 컴파일되고 오류가 없으면 프로젝트 폴더에 탐낼 펌웨어가 제공됩니다. 이제 마이크로 컨트롤러를 플래시하고 장치 작동을 즐길 수 있습니다.

펌웨어에서 루프, 배열 및 기능을 즉시 사용하려고 시도해서는 안됩니다. 귀하의 주요 임무는 펌웨어를 작동시키는 것이므로 더 쉽게 수행하고 코드 크기에 신경 쓰지 마십시오. 작동하는 코드를 작성하는 것뿐만 아니라 아름답고 간결하게 작성하고 싶은 때가 올 것입니다. 그러면 C 언어의 세계를 탐구하는 것이 가능할 것입니다. 모든 것을 마스터하고 싶은 분들을 위해 다시 한 번 "C 프로그래밍 방법"이라는 책을 추천합니다. 많은 예제와 작업이 있습니다. Visual Studio를 설치하고, win32 콘솔 애플리케이션을 만들고, 마음껏 연습해 보세요.

AVR 마이크로컨트롤러 프로그래밍을 위한 많은 개발 도구가 있지만 의심할 여지 없이 가장 널리 사용되는 것은 패키지입니다. AVR 스튜디오. 이러한 인기에는 여러 가지 이유가 있습니다. 이는 회사에서 개발한 무료 패키지입니다. ATMEL, 텍스트 편집기, 어셈블러 및 시뮬레이터를 결합합니다. AVR Studio는 하드웨어 디버깅 도구와 함께 사용되기도 합니다. 이 기사에서는 예제를 사용하여 패키지 작업 방법을 논의합니다. 이는 초보 프로그래머가 AVR Studio의 개별 구성 요소 상호 작용을 빠르게 이해하는 데 도움이 됩니다.

기사의 다음 부분에서는 AVR Studio 환경에서 C로 작성된 프로그램 디버깅에 대해 설명합니다.

AVR Studio 패키지는 탄탄한 개발 역사를 가지고 있으며 이는 기존 버전의 수에 반영됩니다. 2003년 말에는 여러 가지 유용한 추가 기능이 포함된 버전 4.08이 출시되었으며, 2004년 초에는 ATmega48 제품군의 3세대 AVR 컨트롤러에 대한 지원을 추가하는 업데이트(서비스 팩 1)가 출시되었습니다. 이 제품군의 초소형 회로 생산은 2004년 하반기로 예정되어 있습니다.

패키지 배포판과 서비스 팩은 웹사이트 www.atmel.com에서 다운로드하거나 ATMEL의 러시아 대리점에서 이 배포판이 포함된 CD를 얻을 수 있습니다.

특정 프로그램에서 AVR Studio 패키지의 작동을 고려하는 것이 편리합니다. 예를 들어, 두 개의 LED를 차례로 켜는 간단한 프로그램을 위한 프로젝트를 만드는 것을 고려해 보겠습니다. 구체적으로 마이크로 회로를 살펴 보겠습니다. Atmega128두 개의 LED를 핀 31과 32에 연결합니다(ATmega128 칩 포트 D의 비트 6과 7입니다). AVR 컨트롤러강력한 출력 단계를 가지며 각 출력의 일반적인 전류는 20mA, 최대 출력 전류는 40mA이며 이는 유입 전류와 유출 전류 모두에 적용됩니다. 이 예에서 LED는 양극을 통해 컨트롤러 단자에 연결되고 음극은 냉각 저항을 통해 접지에 연결됩니다. 이는 해당 포트 핀에 "1"을 적용하여 LED가 켜진다는 의미입니다. 개략도가 그림에 나와 있습니다. 다이어그램에는 프로그램 중 하나에서 사용되는 두 개의 버튼도 표시됩니다.

여기서는 간단한 예를 들어 마이크로 회로 유형을 선택하는 방법에 대해 간략하게 설명하는 것이 적절합니다. 실제로 언뜻 보면 8핀 마이크로 회로로 충분할 수 있는 64핀 패키지에 왜 그렇게 강력한 크리스털이 필요한지 이상하게 보일 수 있습니다. ATtiny12? 그러나 이 접근 방식에는 논리가 있습니다. 거의 모든 AVR 컨트롤러는 동일한 코어를 기반으로 하는 것으로 알려져 있습니다. 컨트롤러는 대체로 메모리 용량, 입출력 포트 수, 주변 모듈 세트가 다릅니다. 각 특정 컨트롤러의 기능은 I/O 레지스터의 논리적 이름을 물리적 주소, 인터럽트 벡터 주소, 포트 비트 정의 등에 바인딩하는 것입니다. AVR Studio 패키지에 포함된 .inc 확장자를 가진 파일에 설명되어 있습니다. 결과적으로 특정 유형의 크리스탈을 사용하면 크리스탈 자체와 주니어 크리스탈 모두에 대해 프로그램을 디버깅할 수 있습니다. 또한 가장 오래된 크리스탈을 디버깅 크리스탈로 사용하는 경우 현재는 ATmega128이며 거의 모든 AVR 컨트롤러에 대한 프로그램을 디버깅할 수 있으며 대상 마이크로 컨트롤러에 없는 하드웨어 리소스를 사용하지 않아도 됩니다. 따라서 예를 들어 ATmega128에서 실행될 프로그램을 디버깅할 수 있습니다. ATtiny13. 이 경우 소스 코드는 거의 동일하게 유지되며 포함된 파일의 이름만 128def.inc에서 tn13def.inc로 변경됩니다. 이 접근 방식에는 장점도 있습니다. 예를 들어 "추가" I/O 포트를 사용하여 연결할 수 있습니다. LCD 표시기, 디버깅 정보가 출력될 수 있습니다. 또는 ATmega128 칩의 JTAG 포트에 연결되는 회로 내 에뮬레이터를 사용하십시오(ATtiny13 컨트롤러에는 이러한 포트가 없음). 따라서 "고급" AVR 컨트롤러가 설치된 단일 디버깅 보드를 사용하여 AVR 마이크로컨트롤러를 기반으로 하는 새로 개발된 시스템을 디버깅할 수 있습니다. 이 보드 중 하나를 AS-megaM이라고 합니다. 기사에 제공된 예제 프로그램을 만드는 데 사용된 것이 바로 이것이었습니다. ATmega128 칩을 기반으로 한 범용 단일 보드 컨트롤러로 외부 RAM, 2개의 포트가 포함되어 있습니다. RS-232, LCD 표시기, 회로 내 프로그래머 및 에뮬레이터를 연결하기 위한 포트 JTAG ICE에서. 보드에는 FLASH-ROM 시리즈 칩의 납땜을 풀 수 있는 공간도 있습니다. AT45 TSOP32/40/48 하우징 및 2채널 DAC 시리즈 AD5302/AD5312/AD5322. 이제 한 쌍의 LED를 점화하기 위해 AVR 몬스터를 사용하는 이유를 설명한 후 계속 진행할 수 있습니다.

AVR Studio 환경에서 프로그래밍할 때 표준 작업 순서를 수행해야 합니다.

  • 편집
  • 프로젝트 생성은 메뉴 표시줄 Project\New Project를 선택하여 시작됩니다. 열리는 “새 프로젝트 만들기” 창에서 프로젝트 이름(이 경우 샘플1)과 초기화 파일 이름을 지정해야 합니다. "다음" 버튼을 클릭하면 "디버그 플랫폼 및 장치 선택" 창이 열리고 여기서 디버그 플랫폼(시뮬레이터 또는 에뮬레이터)과 마이크로컨트롤러 유형을 선택할 수 있습니다.

    제안된 회로 내 에뮬레이터 중 하나를 선택할 수 있습니다. 각 에뮬레이터에는 지원되는 칩의 자체 목록이 있습니다. 고려 중인 예에서는 AVR 시뮬레이터와 ATmega128 칩을 디버깅 플랫폼으로 선택합니다. "마침" 버튼을 클릭하면 아직 비어 있는 AVR Studio 패키지의 실제 작업 창이 표시됩니다. 프로그램의 소스 텍스트를 오른쪽 창에 배치해야 합니다. 이는 편집기 창에 직접 모든 텍스트를 입력하거나 기존 파일을 로드하는 두 가지 방법으로 수행할 수 있습니다. 아래는 주석이 포함된 가장 간단한 프로그램의 전체 텍스트입니다.

    ; 예 "LED 제어"; AS-MegaM 개발 보드용으로 작성되었습니다. 마스터 발진기 주파수 7.37MHz; LED는 핀 PD6 및 PD7에 연결되고 저항을 통해 공통 와이어에 연결됩니다. ; ATmega128 칩용 I/O 설명 파일 연결 .include "m128def.inc" ; 프로그램 시작 시작: ; 첫 번째 작업은 스택 초기화입니다. 이것이 완료되지 않으면 서브루틴이나 인터럽트를 호출하십시오. 제어권을 다시 반환하지 않습니다. 스택 끝에 대한 포인터는 내부 RAM의 마지막 주소로 설정됩니다. RAMEND ldi r16,low(RAMEND) out spl,r16 ldi r16,high(RAMEND) out sph,r16 ; PD6 및 PD7 핀에 연결된 LED를 제어하기 위해, 이러한 결론을 공휴일로 선언할 필요가 있습니다. ; 이렇게 하려면 DDRD(DataDiRection) 레지스터 ldi r16(1)의 해당 비트에 "1"을 써야 합니다.<<6) | (1<<7) out DDRD,r16 ; основной цикл программы loop: ldi r16,(1<<6) ; светится один светодиод out PORTD,r16 rcall delay ; задержка ldi r16,(1<<7) ; светится второй светодиод out PORTD,r16 rcall delay ; задержка rjmp loop ; повторение цикла; процедура задержки; примерно полсекунды при частоте 7,37 МГц; три пустых вложенных цикла соответственно delay: ldi r16,30 ; 30 delay1: ldi r17,200 ; 200 delay2: ldi r18,200 ; и еще 200 итераций delay3: dec r18 brne delay3 dec r17 brne delay2 dec r16 brne delay1 ret ; возврат в главную программу

    프로젝트는 여러 파일로 구성될 수 있으며, 하나의 파일이 기본 파일로 지정됩니다. 모든 작업은 상황에 맞는 마우스 버튼을 사용하여 편리하게 수행됩니다. 소스 파일을 연결한 후 창은 다음과 같습니다.

    프로젝트는 \Project\Build 명령을 사용하거나 F7 버튼을 눌러 컴파일됩니다. 컴파일 프로세스가 "출력" 창에 표시됩니다. 이 창은 \View\Output 명령을 사용하여 꺼낼 수 있습니다.

    원칙적으로 우리는 이미 마이크로 회로에 로드할 수 있고 LED가 깜박이는 .hex 형식의 출력 파일을 받았습니다. 그러나 이 기사의 목적은 AVR Studio 환경에서의 전체 작업 주기를 보여주는 것이므로 디버깅 단계로 넘어갑니다. 이는 \Debug\Start Debugging 명령을 사용하여 수행됩니다.

    이제 프로그램 실행 시간을 정확하게 측정하기 위해 "시뮬레이터 옵션" 창에서 석영 주파수를 7.3728MHz로 설정합니다.

    나머지 옵션은 변경하지 않고 그대로 두어야 합니다. 이제 마우스나 F11 버튼을 사용하여 프로그램을 단계별로 실행할 수 있습니다.

    AVR Studio 패키지에는 디버깅 중인 마이크로 컨트롤러의 내부 레지스터 및 I/O 포트 상태와 프로그램 실행 시간을 보고 편집할 수 있는 강력한 도구가 포함되어 있습니다. 이는 “I/O” 창을 통해 액세스됩니다.

    실제로 AVR Studio의 보기 창을 통해 사용할 수 있는 정보의 양이 너무 많아서 최대한의 편안함을 위해서는 듀얼 모니터 컴퓨터를 사용해야 합니다.

    예제를 디버깅하려면 포트 D 비트에 액세스하려면 I/O ATMEGA128 라인을 확장한 다음 PORTD 라인을 확장해야 합니다. 이제 이 포트의 세 가지 레지스터인 PORTD, DDRD 및 PIND가 모두 표시됩니다. 값, 비트 및 주소 필드를 보려면 창의 오른쪽 테두리를 확장하여 프로그램의 소스 텍스트로 창을 가득 채워야 합니다.

    이제 프로그램을 단계별로 진행하면서 비트 필드에서 이러한 레지스터의 현재 상태 변화를 확인할 수 있습니다. 포트 레지스터의 모든 비트 상태를 신속하게 변경할 수 있으며 이는 값 필드에 새 코드를 작성하거나 원하는 레지스터 비트를 직접 클릭하여 수행할 수 있습니다.

    독립적인 연습을 위해 다음 프로그램이 제공됩니다. 이는 LED 조명이 두 개의 버튼으로 제어된다는 점에서 이전 프로그램과 다릅니다.

    ; 예: "버튼으로 LED 제어"; AS-MegaM 개발 보드용으로 작성되었습니다. LED는 핀 PD6 및 PD7에 연결되고 저항을 통해 공통 와이어에 연결됩니다. ; 버튼 - PE4 및 PE5 .include "m128def.inc" ; 메인 프로그램 시작: ; 스택 초기화 ldi r16,low(RAMEND) out spl,r16 ldi r16,high(RAMEND) out sph,r16 ; LED 초기화 ldi r16,(1<<6) | (1<<7) out DDRD,r16 ; инициализация выводов, к которым подключены кнопки (на вход) ; внутренние подтягивающие резисторы подключены; для этого в PORTE нужно установить соответствующие биты в единицы ldi r16,(1<<4) | (1<<5) out PORTE,r16 ; а в DDRE - в нули ldi r16,0 out DDRE,r16 ; бесконечный цикл forever: in r16,PINE ; теперь в r16 находится текущее "состояние" кнопок com r16 ; кнопка "нажимается" нулем, поэтому инвертируем регистр lsl r16 ; переносим биты 4,5 в позиции 6,7 lsl r16 ; и обновляем "показания" светодиодов andi r16,(1<<6) | (1<<7) out PORTD,r16 rjmp forever ; цикл выполняется бесконечно

    따라서 가장 간단한 프로그램의 예를 사용하여 AVR Studio 패키지의 일부 기능이 표시됩니다. 이것은 패키지의 기본 명령에 빠르게 익숙해질 수 있는 첫 번째 아는 사람일 뿐이라는 것을 이해해야 합니다. 한편, 해당 패키지의 기능은 훨씬 더 광범위합니다. 예를 들어, 여기에서 고급 언어로 작성된 프로그램을 디버그할 수 있습니다. 특히 ImageCraft C 컴파일러는 AVR Studio 디버거를 "네이티브인 것처럼" 사용합니다. 이를 위해서는 소스 코드를 컴파일할 때 AVR Studio와 호환되는 형식으로 출력 파일을 생성하도록 옵션을 설정해야 합니다. 이 경우 소스코드에서 디버깅이 가능해진다.

    AVR Studio 패키지의 또 다른 많은 기능 중 하나는 외부 프로그램을 연결하는 기능입니다. 예를 들어 AS2 회로 내 프로그래머 셸을 호출하려면 몇 가지 간단한 작업을 수행해야 합니다.

    기본 AVR Studio 창의 도구 메뉴에서 사용자 정의를 선택합니다.

    사용자 정의 창에서 도구를 선택하십시오.

    마우스 버튼을 두 번 클릭하거나 키보드에서 삽입을 누르고 목록에 새 명령을 추가하고 이름을 "AS2 Programmer"로 지정합니다.

    "명령" 입력 필드에 직접 입력하거나 이 필드 오른쪽에 있는 "..." 버튼을 클릭하여 프로그래머 실행 파일의 경로를 지정하십시오.

    이제 "AS2 프로그래머" 항목이 도구 메뉴에 나타났습니다.

    AVR Studio 4.08 패키지의 도구를 사용하면 보조 프로그램(플러그인)을 연결할 수 있습니다. AVR Studio의 첫 번째 플러그인은 ATmega169 AVR 컨트롤러로 직접 제어할 수 있는 LCD 디스플레이 초기화 프로세스를 단순화하는 그래픽 편집기 프로그램입니다. LCD 표시기의 최대 논리적 크기는 100개 세그먼트이며 표시기의 각 요소는 컨트롤러의 특수 레지스터에 비트로 할당됩니다. 각 세그먼트에 특정 비트를 할당하는 루틴을 단순화하려면 위 프로그램을 사용할 수 있습니다.

    AVR의 본고장인 ATMEL의 노르웨이 사무소를 방문하는 동안 기사 작성자 중 한 명이 AVR Studio 패키지를 만들고 유지 관리하는 프로그래밍 그룹 책임자인 Lars Kvenild와 이야기를 나눴습니다. 턱수염을 기르고 스웨터를 입고 양말에 샌들을 신은 이 고전적인 프로그래머는 패키지 개발 전망에 대해 이야기했습니다. 다음 버전(4.09)에는 새로운 회로 내 에뮬레이터인 JTAGICE mkII(AT JTAGICE2라고도 함)에 대한 인터페이스가 포함되며, 이는 하반기에 AT JTAGICE를 대체하게 됩니다. 이 에뮬레이터에는 두 가지 중요한 차이점이 있습니다. 한편으로는 주니어 AVR 컨트롤러인 debugWIRE를 위한 새로운 단일 와이어 디버그 인터페이스에 대한 지원이 추가되었습니다. 이 인터페이스는 교환을 위해 마이크로컨트롤러의 리셋 핀을 사용하기 때문에 작동을 위해 마이크로컨트롤러의 추가 핀을 차지하지 않는다는 점에서 흥미롭습니다! 반면에(이 표현을 문자 그대로 받아들일 수 있음) AT JTAGICE2 에뮬레이터는 마침내 컴퓨터와의 통신을 위한 USB 인터페이스를 갖게 됩니다.

    문학

    1. 기술 세미나 AVR 기술 교육 자료. 아트멜. 노르웨이. 2003년 12월.
    2. Nikolay Korolev, Dmitry Korolev 2세대 AVR 마이크로컨트롤러: 개발자 도구. // 부품 및 기술, 2003년 7호
    3. 2세대 AVR 마이크로컨트롤러: 새로운 하드웨어 기능 // 구성 요소 및 기술. 2003. 4호.
    4. 니콜라이 코롤레프, 드미트리 코롤레프. AVR 마이크로컨트롤러: 작은 것 속에 큰 것. // 회로", 2001, No. 5
    5. 니콜라이 코롤레프, 드미트리 코롤레프. AVR 마이크로 컨트롤러: 소프트웨어 // 구성 요소 및 기술, 2000. No. 4.
    6. 니콜라이 코롤레프. AVR: 개발자 하드웨어 // 구성 요소 및 기술, 1999 No. 1
    7. 니콜라이 코롤레프. ATMEL의 RISC 마이크로컨트롤러 //Chip-News 1998, No. 2
    8. Nikolay Korolev, Dmitry Korolev AVR: ATMEL의 새로운 8비트 RISC 마이크로컨트롤러 // Microprocessor Review, 1998, No. 1

    마이크로컨트롤러(이하 MK)는 우리 삶에 확고하게 자리 잡았으며, 인터넷에서는 MK에서 실행되는 흥미로운 회로를 많이 찾을 수 있습니다. MK에 조립할 수 없는 것: 각종 표시기, 전압계, 가전제품(보호 장치, 스위칭 장치, 온도계...), 금속 탐지기, 각종 장난감, 로봇 등 목록을 작성하는 데 시간이 매우 오래 걸릴 수 있습니다. 나는 5~6년 전 라디오 잡지에서 마이크로컨트롤러의 첫 번째 회로를 보았고, 거의 즉시 페이지를 넘기면서 "아직도 조립할 수 없을 것 같다"고 생각했습니다. 실제로 그 당시 MK는 나에게 매우 복잡하고 오해를 받는 장치였습니다. 나는 그것이 어떻게 작동하는지, 어떻게 플래시하는지, 펌웨어가 잘못된 경우 어떻게 해야 하는지 전혀 몰랐습니다. 하지만 약 1년 전 처음으로 MK에 첫 번째 회로를 조립했는데, 이는 7세그먼트 표시기와 ATmega8 마이크로컨트롤러를 기반으로 한 디지털 전압계 회로였습니다. 우연히 마이크로 컨트롤러를 구입했는데, 무선 부품 부서에 서 있었을 때 앞에 있던 남자가 MK를 구입하고 있었고 나도 그것을 구입하기로 결정하고 무언가를 조립하려고했습니다. 내 기사에서 나는 당신에게 말할 것입니다 AVR 마이크로컨트롤러, 작업 방법을 가르쳐 드리고, 펌웨어 프로그램을 살펴보고, 간단하고 신뢰할 수 있는 프로그래머를 만들고, 펌웨어 프로세스를 살펴보고, 가장 중요하게는 발생하지 않을 수 있는 문제를 살펴 보겠습니다. 초보자에게만 해당됩니다.

    AVR 제품군의 일부 마이크로컨트롤러의 기본 매개변수:

    마이크로컨트롤러

    플래시 메모리

    RAM 메모리

    EEPROM 메모리

    I/O 포트

    유파워

    AVR 메가 MK의 추가 매개변수:

    작동 온도: -55…+125*С
    보관 온도: -65…+150*С
    GND에 대한 RESET 핀의 전압: 최대 13V
    최대 공급 전압: 6.0V
    최대 I/O 라인 전류: 40mA
    최대 전원 전류 VCC 및 GND: 200mA

    ATmega 8X 모델 핀아웃

    ATmega48x, 88x, 168x 모델용 핀아웃

    ATmega8515x 모델의 핀 레이아웃

    ATmega8535x 모델의 핀 레이아웃

    ATmega16, 32x 모델의 핀 레이아웃

    ATtiny2313 모델의 핀 레이아웃

    일부 마이크로컨트롤러에 대한 데이터시트가 포함된 아카이브가 기사 끝에 첨부되어 있습니다.

    MK AVR 설치 FUSE 비트

    프로그래밍된 퓨즈는 0이고 프로그래밍되지 않은 퓨즈는 1입니다. 퓨즈를 설정할 때 주의해야 합니다. 잘못 프로그래밍된 퓨즈는 마이크로컨트롤러를 차단할 수 있습니다. 어떤 퓨즈를 프로그래밍해야 할지 확실하지 않은 경우 처음으로 퓨즈 없이 MK를 플래시하는 것이 좋습니다.

    라디오 아마추어들 사이에서 가장 인기 있는 마이크로컨트롤러는 ATmega8이고, ATmega48, 16, 32, ATtiny2313 등이 그 뒤를 따릅니다. 마이크로컨트롤러는 TQFP 및 DIP 패키지로 판매되며, 초보자의 경우 DIP로 구매하는 것이 좋습니다. TQFP를 사면 플래시하는 게 더 문제가 되기 때문에 보드를 사거나 납땜해야 합니다. 그들의 다리는 서로 매우 가깝습니다. 특수 소켓의 DIP 패키지에 마이크로 컨트롤러를 설치하는 것이 좋습니다. 편리하고 실용적입니다. 다시 플래시하려는 경우 MK의 납땜을 풀거나 다른 디자인에 사용할 필요가 없습니다.

    거의 모든 최신 MK에는 회로 내 ISP 프로그래밍 기능이 있습니다. 마이크로컨트롤러가 보드에 납땜되어 있는 경우 펌웨어를 변경하기 위해 보드에서 납땜을 제거할 필요가 없습니다.

    프로그래밍에는 6개의 핀이 사용됩니다.
    초기화- MK 로그인
    VCC- 추가 전원 공급 장치, 3-5V, MK에 따라 다름
    접지- 공통선, 마이너스 전원.
    모시- MK 입력(MK의 정보 신호)
    미소- MK 출력(MK의 정보 신호)
    SCK- MK 입력(MK의 클록 신호)

    때로는 핀 XTAL 1 및 XTAL2도 사용합니다. MK가 외부 발진기에 의해 전원이 공급되는 경우 석영이 이 핀에 부착됩니다. ATmega 64 및 128에서는 MOSI 및 MISO 핀이 ISP 프로그래밍에 사용되지 않습니다. 대신 MOSI 핀은 다음과 같습니다. PE0 핀에 연결되고 MISO는 PE1 핀에 연결됩니다. 마이크로컨트롤러를 프로그래머에 연결할 때 연결선은 최대한 짧아야 하며, 프로그래머에서 LPT 포트로 연결되는 케이블도 너무 길지 않아야 합니다.

    마이크로 컨트롤러 표시에는 Atmega 8L 16PU, 8 16AU, 8A PU 등과 같이 숫자가 포함된 이상한 문자가 포함될 수 있습니다. 문자 L은 MK가 문자 L이 없는 MK보다 낮은 전압(일반적으로 2.7V)에서 작동함을 의미합니다. 하이픈이나 공백 16PU 또는 8AU 뒤의 숫자는 MK에 있는 생성기의 내부 주파수를 나타냅니다. 퓨즈가 외부 석영에서 작동하도록 설정된 경우 석영은 데이터시트에 따라 최대값을 초과하지 않는 주파수로 설정되어야 합니다. 이는 ATmega48/88/168의 경우 20MHz이고 기타 atmega의 경우 16MHz입니다.

    과제: 하나의 LED를 제어하는 ​​프로그램을 개발해 보겠습니다. 버튼을 누르면 LED가 켜지고, 버튼을 떼면 꺼집니다.

    먼저 장치의 개략도를 개발해 보겠습니다. I/O 포트는 외부 장치를 마이크로 컨트롤러에 연결하는 데 사용됩니다. 각 포트는 입력과 출력 모두로 작동할 수 있습니다. 포트 중 하나에 LED를 연결하고 다른 포트에는 버튼을 연결해 보겠습니다. 이 실험에서는 컨트롤러를 사용하겠습니다. Atmega8. 이 칩에는 3개의 I/O 포트가 포함되어 있으며 2개의 8비트 및 1개의 16비트 타이머/카운터가 있습니다. 또한 보드에는 3채널 PWM, 6채널 10비트 아날로그-디지털 변환기 등이 있습니다. 제 생각에는 마이크로컨트롤러는 프로그래밍의 기초를 배우는 데 아주 좋습니다.

    LED를 연결하려면 PB0 라인을 사용하고, 버튼에서 정보를 읽으려면 PD0 라인을 사용합니다. 다이어그램은 그림 1에 나와 있습니다.

    수업 번호 2. LED 스위칭

    수업 번호 3. LED 깜박임

    수업 번호 4. 주행등

    수업 번호 5. 타이머를 이용한 조명 실행

    수업 번호 6. 조명을 실행합니다. 타이머 인터럽트 사용

    수업 번호 7. 비트 제어 연산자

    수업 번호 8. PWM 구현

    예를 들어 마이크로 컨트롤러와 같은 디지털 장치는 두 가지 신호 레벨로만 작동할 수 있습니다. 0과 1 또는 끄기와 켜기. 따라서 LED를 켜거나 끄는 등 부하 상태를 모니터링하는 데 쉽게 사용할 수 있습니다. 또한 적절한 드라이버(트랜지스터, 트라이악, 릴레이 등)를 사용하여 모든 전기 장치를 제어하는 ​​데 사용할 수도 있지만 때로는 장치를 "켜고" "끄는" 것 이상이 필요할 수도 있습니다. 따라서 LED(또는 램프)의 밝기나 DC 모터의 속도를 제어하려는 경우 디지털 신호로는 이를 수행할 수 없습니다. 이러한 상황은 디지털 기술에서 매우 일반적이며, 펄스 폭 변조(PWM).

    공유하다