AVR: AVR Studio 환경에서 프로그래밍합니다. Atmel Avr studio의 통합 디버깅 환경 AVR Studio

AVR Studio 4를 사용하려면 자체적으로 설치해야 합니다. 이미 설치되어 있는 경우 이 단계를 건너뛸 수 있습니다.

설치:
c:/avr/ 디렉터리를 만듭니다. 여기에 작업 프로그램이 위치합니다.
예를 들어 c:/works/와 같은 디렉토리를 만드십시오. 여기에 귀하의 작품이 저장될 것입니다.
문제가 발생하지 않도록 바로가기가 필요합니다.

일반적으로 AVRStudio5가 있지만 AVRStudio4로도 여전히 충분합니다.

모든 작업은 AVRStudio4에서 이루어지며 AVR-GCC 라이브러리 때문에 WinAVR이 필요합니다(C로 작성할 수 있도록).
하지만! 먼저 WinAVR을 설치해야 합니다. 그렇지 않으면 AVR-GCC 라이브러리가 선택되지 않습니다.

내 생각에 당신은 여기서 그것을 알아낼 것입니다.
C로 작성하기 위한 AVR-GCC
Atmel Avr 어셈블러는 각각 어셈블러용입니다.

MK를 처음부터 이해하는 것이 더 좋습니다. 이는 Assembler를 의미합니다. 이는 Atmel AVR Assembler를 생성한다는 의미입니다.

그런 다음 Atmega8 마이크로 컨트롤러를 선택하십시오.

프로젝트가 생성되면 크고 흰색의 빈 슬레이트가 있게 됩니다. 여기에 코드가 있을 겁니다.

이 시트의 내용에 대해 조금

"주석"은 컴파일러가 컴파일할 때 건너뛰는 텍스트입니다.
주석 시작 전에 특수 기호가 있어야 합니다. 저는 해당 기호를 사용합니다. "세미콜론", "이중 슬래시"(//)도 있습니다.
댓글의 예는 다음과 같습니다.

/* * 이 유형의 주석(여러 줄), * 일반적으로 소스 코드에 대한 * 동반 정보에 사용됩니다. * 이름, 개발자 등 */ NOP // 이 주석은 주로 명령이나 코드의 목적을 설명하는 데 사용됩니다. SLEEP ; 이 주석은 이전 주석과 마찬가지로 코드에서 설명(메모용)으로 사용할 수 있습니다.

명령은 각 줄에 기록됩니다. 저것들. 하나의 명령 - 한 줄.
두 개의 "매개변수", 하나가 있거나 아무것도 없는 명령이 있다고 가정해 보겠습니다.

MOV R16, R17 ; 두 개의 매개변수 INC R16 ; 하나의 SEI 매개변수; 매개변수 없이

MOV R16, R17 ; 3바이트 INC R16; 2바이트 SEI; 1바이트

팀 규모와 매개변수 사이의 연관성을 보시나요?

각 마이크로 컨트롤러에는 자체 어셈블러가 있지만 니모닉은 유사합니다. 한 시리즈의 MK에 대한 MOV 명령은 기계어 코드(예: 0x12)와 다른 0x55를 찾습니다.
따라서 컴파일하는 동안 필요한 코드로 컴파일되므로 프로그램을 작성하는 마이크로컨트롤러에 대해 컴파일러에 알려야 합니다.
일반적으로 프로젝트 생성 시 선택됩니다.
이러한 이유로 우리는 Atmega8 마이크로컨트롤러를 선택했습니다.

하지만 그게 전부는 아닙니다. 우리의 삶을 더 쉽게 만들기 위해 AVRStudio4에는 "매크로어셈블러"와 같은 상수 세트가 있습니다.

로드하려면 코드 시작 부분에 해당 줄을 삽입해야 합니다.

"m8def.inc" 포함 // .include 명령을 사용하여 m8def.inc 파일을 로드했으며 이제 더 쉬워졌습니다.)

코드 맨 처음에는 인터럽트 테이블이 배치됩니다. 그것이 무엇인지, 어떻게 작동하는지에 대해서는 다른 포스팅에서 설명하겠습니다. 하지만 지금은 다음과 같이 작성해 보겠습니다.

RJMP 재설정 ; 재설정 처리기 RETI; RJMP EXT_INT0 ; IRQ0 처리기 RETI; RJMP EXT_INT1 ; IRQ1 처리기 RETI; RJMP TIM2_COMP ; Timer2 비교 핸들러 RETI; RJMP TIM2_OVF ; 타이머2 오버플로 처리기 RETI; RJMP TIM1_CAPT ; Timer1 캡처 핸들러 RETI; RJMP TIM1_COMPA ; Timer1 CompareA 처리기 RETI; RJMP TIM1_COMPB ; Timer1 CompareB 처리기 RETI; RJMP TIM1_OVF ; 타이머1 오버플로 처리기 RETI; RJMP TIM0_OVF ; 타이머0 오버플로 처리기 RETI; RJMP SPI_STC ; SPI 전송 완료 처리기 RETI; RJMP USART_RXC ; USART RX 완전한 핸들러 RETI; RJMP USART_UDRE ; UDR 빈 처리기 RETI; RJMP USART_TXC ; USART TX 완전한 핸들러 RETI; RJMP ADC ; ADC 변환 완료 처리기 RETI; RJMP EE_RDY ; EEPROM 준비 처리기 RETI; RJMP ANA_COMP ; 아날로그 비교기 핸들러 RETI; RJMP TWSI; 2선 직렬 인터페이스 핸들러 RETI; RJMP SPM_RDY ; 저장 프로그램 메모리 준비 처리기

그 후에 코드 자체가 나옵니다.

재시작: ; 초기화 토큰 MAIN: NOP ; 메인 루프 마커 RJMP MAIN

그러나 하나의(또는 하나가 아니라 많은) 기능이 있습니다.

코드 작성의 편의, 명확성 및 상대적 전환을 용이하게 하기 위해 마커가 제공되었습니다. 마커는 어떻게 생겼습니까? "RESET:" 및 "MAIN:"은 표시이며 이름에는 거의 모든 라틴 문자와 숫자가 포함될 수 있습니다. 마커에는 "NOP"와 같은 기능 및 명령 이름을 사용할 수 없습니다.
어떻게 그들에게 다가갈 수 있나요? RJMP 명령을 가정해 보겠습니다.

또한 마커에서 서브루틴(프로시저)을 만들 수 있으며, 완료되면 호출된 위치로 돌아갑니다. 호출하려면 “RCALL(서브루틴)” 명령을 사용하고, 서브루틴(프로시저)에서 복귀하려면 “RET” 명령으로 종료해야 합니다. 다음과 같은 코드로 끝나야 합니다.

재시작: 메인: NOP RCALL PPP1 ; 서브루틴 RJMP MAIN PPP1을 호출합니다: NOP RET ; 서브루틴 종료

"RCALL" 명령이 호출되면 호출된 주소가 STACK에 배치되고 "RET" 명령이 호출되면 "스택" 레지스터에서 제거됩니다. STACK을 초기화해야 합니다.

MK로 작업하려면 MK를 초기화해야 합니다. 왜냐하면 mk, 이 장치는 범용이며 많은 입/출력 포트와 주변 장치를 가지고 있습니다. USART, PWM, DAC, ADC 등과 같은 마이크로 컨트롤러를 초기화하는 첫 번째 단계는 "스택"의 시작을 나타내는 것입니다. “RESET:” 마커 이후에 초기화를 수행합니다.

LDI R16, 높음(RAMEND) 출력 SPH, R16 LDI R16, 낮음(RAMEND) 출력 SPL, R16

코드 시작 부분에 .include "m8def.inc" 명령을 입력하지 않았다면 다음과 같이 작성해야 했을 것입니다.

LDI R16,0x04 출력 SPH,R16 LDI R16,0x5f 출력 SPL,R16

제 생각에는 그 차이가 상당합니다.

STACK은 저장형 메모리(후입선출)입니다.
매장 유형은 슈퍼마켓이 아니라 기관총의 경적입니다. 카트리지를 카트리지에 어떻게 로드하고 제거하는 방법을 모두가 상상할 수 있기를 바랍니다.
STACK 메모리에 많은 주의를 기울여야 합니다. 왜냐하면... 작업 시 사소한 실수로 인해 스택 오류가 발생할 수 있습니다. 이것은 매우 중요한 주제이므로 전체 주제를 여기에 전념하기로 결정하고 별도의 메모로 작성하겠습니다.

따라서 우리는 다음과 같은 코드를 얻었습니다.

"m8def.inc"를 포함합니다. RJMP RESET ; 재설정 처리기 RETI; RJMP EXT_INT0 ; IRQ0 처리기 RETI; RJMP EXT_INT1 ; IRQ1 처리기 RETI; RJMP TIM2_COMP ; Timer2 비교 핸들러 RETI; RJMP TIM2_OVF ; 타이머2 오버플로 처리기 RETI; RJMP TIM1_CAPT ; Timer1 캡처 핸들러 RETI; RJMP TIM1_COMPA ; Timer1 CompareA 처리기 RETI; RJMP TIM1_COMPB ; Timer1 CompareB 처리기 RETI; RJMP TIM1_OVF ; 타이머1 오버플로 처리기 RETI; RJMP TIM0_OVF ; 타이머0 오버플로 처리기 RETI; RJMP SPI_STC ; SPI 전송 완료 처리기 RETI; RJMP USART_RXC ; USART RX 완전한 핸들러 RETI; RJMP USART_UDRE ; UDR 빈 처리기 RETI; RJMP USART_TXC ; USART TX 완전한 핸들러 RETI; RJMP ADC ; ADC 변환 완료 처리기 RETI; RJMP EE_RDY ; EEPROM 준비 처리기 RETI; RJMP ANA_COMP ; 아날로그 비교기 핸들러 RETI; RJMP TWSI; 2선 직렬 인터페이스 핸들러 RETI; RJMP SPM_RDY ; 저장 프로그램 메모리 준비 처리기 RESET: LDI R16,HIGH(RAMEND) OUT SPH,R16 LDI R16,LOW(RAMEND) OUT SPL,R16 RGMP RESET MAIN: NOP ; 메인 루프 마커 RJMP MAIN

이 단계에서는 디버깅을 위해 프로젝트를 컴파일하고 실행할 수 있지만 코드는 아무 작업도 수행하지 않으므로 코드에서 구문 오류만 식별할 수 있습니다.

올바른 디버깅 프로세스를 위해서는 MK가 작동하는 빈도를 에뮬레이터에 설정해야 합니다. 이는 컴파일하고 디버깅을 시작한 후에만 수행됩니다.
즉, 메뉴 표시줄에서 "빌드"를 찾아서 열고 "빌드 및 실행"을 보면 코드 목록의 첫 번째 명령 반대편에 노란색 화살표가 표시됩니다. 이제 메뉴 표시줄에서 "디버그"를 찾아 "AVR 시뮬레이터 옵션"을 클릭하면 다음 창이 열립니다.

MK와 주파수를 변경할 수 있으며 오른쪽 패널에서도 MK에 대한 정보(최대 주파수, 메모리 용량(EEPROM, RAM, FLASH))를 볼 수 있습니다. 이제 Atmega8의 203페이지(일반 레지스터 목록) 및 205페이지(일반 명령 목록)의 데이터시트를 열고 프로그램 작성을 시작하세요.
그리고 시뮬레이터로 실험하는 것을 두려워하지 마세요. 시뮬레이터는 깨지지 않을 것입니다!


안녕하세요.

이 기사는 자신이 Arduino에서 "성장"했다고 믿고 "심각한" 마이크로 컨트롤러 프로그래밍의 세계로 들어갈 준비가 된 사람들의 관심을 끌 것입니다. "프로그래머의 기술을 향상"시킬 수 있다는 사실 외에도 프로젝트에 적합한 마이크로컨트롤러를 선택할 수 있는 기회가 주어지며 물론 프로그램의 속도와 프로그램이 차지하는 메모리 크기도 높이 평가하게 될 것입니다.

모든 것이 설명됩니다 (   의 경우), 처음부터 끝까지 - 필요한 소프트웨어 설치 및 준비, 가장 간단한 "Gromov" 프로그래머 조립 (두려워하지 마십시오. 다이오드는 3개와 저항기는 7개뿐입니다.), MK 펌웨어 및 AVR Studio의 코드 작성. 전체 과정에는 그림과 예시가 함께 제공됩니다.

바로 예약하겠습니다. 컴퓨터에 COM 포트가 있어야 합니다(USB-COM 어댑터는 제대로 작동하지 않습니다). 컴퓨터 뒷면에 이러한 커넥터가 없다면 아마도 마더보드에 있을 것입니다(핀 형태). 그러면 모든 것이 이 "배출"로 해결될 수 있습니다.

아아, COM이 없는 랩톱 소유자의 경우 이 기사는 학문적 관심만을 위한 것입니다.

자, 시작해 봅시다…

무엇이 필요합니까?

"부드러운"


유니프로프- 다양한 ATmega 마이크로 컨트롤러를 플래싱하기 위한 범용 프로그램으로 간단하고 편리하며 가장 중요한 것은 우리 프로그래머와 완벽하게 작동합니다. 저자는 러시아 개발자 Mikhail Nikolaev입니다.

물론 AVR Studio에서 MK를 플래시할 수 있지만 이를 위해서는 특별한 프로그래머가 필요합니다. 따라서 우리는 스튜디오에서 코드를 작성하고 집에서 만든 프로그래머를 사용하여 UniProf로 결과 hex 파일을 플래시할 것입니다. 또한 명령줄에서 펌웨어를 플래싱하는 방법도 설명합니다.

Linux 사용자는 가상 머신이나 Wine을 사용해야 합니다. Wine에서는 작동하지 않았고 포트가 전혀 보이지 않으며 가상 머신으로 시도해 본 적이 없습니다.

  Wine에서 완벽하게 작동합니다. (데비안 8.5, 와인1.6).

모든 소프트웨어는 무료입니다.

"철"

우리는 다음과 같은 실험을 수행할 것입니다. 아두이노 프로 미니 ATmega328 칩으로. 석영 주파수 (8/16MHz), 전압도 마찬가지 (3.3/5v), 문제가되지 않는다. (아래 참조)

앞으로는 다양한 Atmel 마이크로컨트롤러를 프로그래밍하게 될 것이지만 처음으로 이 보드가 딱 맞습니다. 배선을 최소화하고 핀을 납땜한 사실상 베어 컨트롤러이기 때문에 좋습니다. 당신에게 꼭 필요한 것.

마이크로컨트롤러의 표시 정보

이름 뒤에는 메모리 양을 나타내는 숫자가 있습니다.

숫자 뒤의 문자는 공급 전압 매개변수를 나타냅니다.

편지 없음- 컨트롤러 공급 전압은 4.5-5.5V 이내입니다.
- 감소된 속도로 작동하는 컨트롤러 버전 (낮은)공급 전압(2.7~5.5V).
V- 낮은 공급 전압에서 작동하는 컨트롤러 버전 (1.8-5.5볼트).
- 초저 공급 전압에서 작동하는 컨트롤러 버전 (0.7-5.5볼트).
- 저전력 버전 (전원 차단 모드에서 최대 100nA).
- 모든 버전의 전체 클록 주파수 범위, 공급 전압 1.8-5.5V를 포괄하는 전류 소비 감소 (일부 모델에서는 이전 버전과의 완벽한 호환성을 유지하면서 새로운 기능과 새로운 레지스터가 추가되었습니다).

마이크로컨트롤러 « " 그리고 "아니- "는 일반적으로 동일한 서명을 가지는데, 이는 퓨즈 비트가 다르기 때문에 약간의 어려움을 야기합니다.

예:

ATmega8- 프로그램 메모리 용량은 8KB, 공급 전압은 4.5-5.5V입니다.
ATmega8L- 프로그램 메모리 용량은 8KB, 공급 전압은 2.7-5.5V입니다.
ATtiny43U- 메모리 용량 4킬로바이트, 수정 - 3, 공급 전압 - 0.7-5.5V.
ATtiny44A- 메모리 용량 4킬로바이트, 수정 - 4, 전류 소비 감소, 공급 전압 1.8-5.5V.

문자가 없는 컨트롤러의 경우 공급 전압이 감소할 수 있습니다(1.7 또는 1.8V). 이는 데이터시트에서 명확히 설명되어야 합니다.

ATtiny841- 메모리 용량 8KB, 수정 - 41, 공급 전압 - 1.7-5.5V.

하이픈 뒤에는 컨트롤러의 최대 주파수를 나타내는 숫자로 구성된 마이크로 컨트롤러 버전이 표시됩니다. (적절한 공급 전압에서), 하우징 옵션, 작동 온도 범위 및 제조 기능을 나타내는 문자로 구성됩니다.

주파수 뒤에 오는 한두 글자는 하우징 유형을 나타냅니다.

유니프로프
프로그램을 작성하는 것은 전투의 절반이므로 여전히 컨트롤러에 프로그램을 밀어 넣어야 합니다. 그러니 이 점에 좀 더 주목해보자.

Arduino에 표준 Blink(공장에서 함께 제공됨)가 로드되어 있으면 좋을 것입니다.

UniProf를 실행해 보겠습니다. 아마도 다음 창이 나타날 것입니다.

LPT 포트에 연결되어 있으므로 클릭만 하면 됩니다. 좋아요.

그러면 프로그램 창이 열립니다:

포트가 올바르게 선택되지 않으면 묻는 창이 나타납니다.

확인을 클릭하고 원하는 포트를 선택합니다.

MK가 자동으로 감지되지 않으면 수동 선택 창이 나타납니다.

아쉽게도 목록에는 없습니다 atmega328, 그래서 우리는 선택합니다 메가32 (같은 양의 플래시 메모리를 가지고 있습니다.)를 누르고 좋아요.

이후에는 알 수 없음이라는 단어 대신 연결된 컨트롤러가 나타납니다...

32K는 플래시 메모리의 양이고, 1024 - EEPROM 볼륨.

이제 모든 것이 그림과 같으면 도움말  을 열고 거기에 쓰여진 내용을 주의 깊게 읽으십시오. 작가님의 글이 매우 간결해서 시간이 많이 걸리지는 않을 것 같습니다. 아직 어떤 버튼도 누르지 마세요.

만났나요? 좋습니다. 이제 계속 진행할 수 있습니다. EEPROM 옆의 확인란을 선택 취소하면 변경된 인터페이스가 표시됩니다.

EEPROM 체크박스를 체크 해제한 후에는 해당 메모리 영역을 읽고 쓰는 작업이 수행되지 않습니다.

16진수 파일로 작업할 것이므로 "체크 표시"를 제거하겠습니다. 일반적인그리고 큰 상자을 선택하고 확인란도 선택하세요. 브레이크!, 이렇게 하면 읽기/쓰기 시간이 늘어나지만 안정성도 높아집니다.

진행이 빠르지 않아서 기다려야 합니다. 파란색 사각형이 아래로 크롤링되고 숫자는 오른쪽 하단에서 계산됩니다. 첫 번째 패스에서는 PROGRAM 영역을 읽고 두 번째 패스에서는 EEPROM을 읽습니다.

표준 Blink가 내장된 새로운 Arduino가 있습니다. (프로그래머가 연결되면 다이오드 깜박임이 중지됩니다). 동일한 내용이 있으면 다음 그림이 나타납니다.

오른쪽에는 EEPROM에 아무것도 없고, 왼쪽에는 PROGRAM에 기록된 프로그램이 있습니다. (말씀드린 대로 블링크입니다). 이제 아래쪽 화살표를 사용하여 데이터가 다 떨어질 때까지 슬라이더를 스크롤합니다...

...이제 끝까지 스크롤하세요. 더 많은 데이터를 볼 수 있습니다. 이것은 Arduino 부트로더입니다.

이제 나는 내 기사를 잠시 쉬고 MK의 구조에 대해 읽어볼 것을 제안합니다. 그러면 자료에 대한 이해가 크게 높아질 것입니다. 모든 것이 매우 명확하고 명확하게 작성되었습니다. 글쎄, 다 읽고 나면 다시 돌아와서 계속하자...

선택을 취소 EEPROM. 실제로는 필요하지 않지만 "틱"이 있다는 것은 분명합니다. 브레이크!

이제 컨트롤러의 모든 펌웨어를 저장하여 실험 후에 원래 상태로 되돌릴 수 있습니다.

  버튼을 누르고 펌웨어를 저장하고 다음과 같이 호출합니다. origProMini328.hex. 그게 다입니다. 이제 백업이 생겼습니다.

... 그런 다음 이미 익숙한 읽기 버튼을 클릭합니다. 그러면 PROGRAM의 모든 셀이 비어 있는 것을 볼 수 있습니다. 프로그램뿐만 아니라 Arduino 부트로더도 제거되었습니다.
즉, 이제 기존 방식으로는 스케치를 업로드할 수 없습니다. 그런 다음 원하는 경우 약간의 손을 흔들어 백업에서 모든 것을 복원하십시오.

이제 AVR Studio에서만 작성된 동일한 "Blink"로 컨트롤러를 플래시하겠습니다.

코드는 다음과 같습니다.

#F_CPU 16000000UL 정의 #include #포함하다 #define PIN_PB5 5 // PB5 (Arduino - D13) #define PIN_PB5_PORT PORTB #define PIN_PB5_DDR DDRB int main(void) ( PIN_PB5_DDR = 1<< PIN_PB5; // устанавливаем PIN_PB5 (PB5 (ардуина - D13)) как ВЫХОД while(1) { PIN_PB5_PORT = 1 << PIN_PB5; _delay_ms(300); PIN_PB5_PORT = 0 << PIN_PB5; _delay_ms(300); } return 0; }
8MHz 석영이 포함된 Arduino를 사용하는 경우에는 아무런 문제가 없으며 다이오드가 절반만큼 자주 깜박입니다.

차지하는 공간은 다음과 같습니다.

AVRDude

Uniprof는 다른 유사한 프로그램과 마찬가지로 AVRDude 프로그램에 대한 그래픽 추가 기능일 뿐입니다. (AVR 다운로더-업로더), 그러면 위에서 설명한 모든 작업이 마이크로컨트롤러에서 수행됩니다.
왜냐하면 AVRDude자체 그래픽 인터페이스가 없으므로 명령줄에서 작업해야 합니다. 이는 어떤 사람들에게는 불편해 보일 수도 있지만 정반대이므로 콘솔에서 작업하는 것은 정말 좋습니다. 편리하고 단순하며 어떤 OS에도 얽매이지 않습니다. 왜냐하면 avrdude는 아마도 모든 것에 존재할 것이기 때문입니다. 이제 이것을 보게 될 것입니다.

사용자용

Avrdude AVR 툴체인에 포함되어 있으므로 설치하세요. (AVR Studio 설치 후)기사 시작 부분에 쓰여진대로.

CD\
...디스크의 루트로 이동 와 함께.

다음 명령을 입력하여:

그렇다면, 그렇다면 avrdude계속할 준비가 되었습니다.

이제 구성 파일에 프로그래머를 추가해야 합니다. avrdude (C:\Program Files (x86)\Atmel\AVR Tools\AVR Toolchain\bin\ avrdude.conf) . 프로그램에서 열어보세요 메모장++"PROGRAMMER DEFINITIONS"라는 문구 뒤에 다음 행을 추가하십시오.

프로그래머 ID = "gromov"; desc = "직렬 포트 연결, 재설정=dtr sck=rts mosi=txd miso=cts"; 유형 = 세르비아; 재설정 = 4; scck = 7; 모시 = 3; 된장 = 8; ;
비트 뱅킹.

파일을 저장하고 닫으십시오. 더 이상 필요하지 않습니다.

터미널로 돌아가서 MK와 프로그래머 사이의 통신을 확인하는 명령을 내리십시오.

Avrdude -n -c gromov -P com1 -p m328p
다른 COM 포트가 있을 수 있습니다.

설치하다 avrdude

Sudo apt install avrdude

다음 명령을 입력하여:

도움말 정보를 확인해야 합니다.

그렇다면, 그렇다면 avrdude일할 준비가되었습니다.

포트를 구성합니다.

Sudo stty 9600 ignbrk -brkint -icrnl -imaxbel -opost -isig -icanon -iexten -echo noflsh이 작업은 컴퓨터를 재부팅할 때마다 수행하거나 rc.local에 추가해야 합니다.

/dev/ttyS0은 어디에 있습니까? com1, /dev/ttyS1 - com2등.
앞으로는 팀별로 글을 쓰겠습니다. /dev/ttyS0, 당신은 할 수 있습니다 /dev/ttyS1등.

구성 파일에 프로그래머 추가 /etc/avrdude.conf

Sudo nano /etc/avrdude.conf

"PROGRAMMER DEFINITIONS" 뒤에 다음 줄을 추가합니다.

프로그래머 ID = "gromov"; desc = "직렬 포트 연결, 재설정=dtr sck=rts mosi=txd miso=cts"; 유형 = "serbb"; 재설정 = 4; scck = 7; 모시 = 3; 된장 = 8; ;
프로그래머는 Bit-banging 기술을 사용합니다.

복사할 때 따옴표가 따옴표로만 남아 있는지 확인하십시오. 그렇지 않으면 (인코딩의 차이로 인해) 변경될 수 있으며 avrdude가 맹세합니다.

파일을 저장하고 닫습니다.

MK와 프로그래머 사이의 연결을 확인하는 명령을 제공하십시오.

Sudo avrdude -n -c gromov -P /dev/ttyS0 -p m328p

연결이 있으면 대답은 다음과 같습니다.

운영 체제의 차이점과 명령의 차이점이 중복되는 곳입니다.

명령에 인수 추가 -V또는 -v -v (모든 명령에 추가 가능)완전한 정보를 표시하려면:

Avrdude -n -v -c gromov -P com1 -p m328p ###WIN###
sudo avrdude -n -v -c gromov -P /dev/ttyS0 -p m328p ###Linux###


Avrdude의 결론은 Windows와 Linux 모두 동일하므로 앞으로는 Win에서만 스크린샷을 찍어보겠습니다.

여기에는 더 많은 정보가 있습니다. 예를 들어 어떤 퓨즈가 설치되어 있는지 확인할 수 있습니다. 여기서는 16진수로 출력됩니다. (마녀)숫자. 예를 들어, hfuse 0xDA는 바이너리로 다음과 같습니다 - . 즉, 이는 그래픽 인터페이스에서 확인되는 것과 동일한 비트입니다.

퓨즈를 다룰 때 ATmega 마이크로 컨트롤러에서는 퓨즈가 반전된다는 점을 기억하십시오. 그건 0 - 이것 ~에유체노, 1 - 끄다유체노. 이로 인해 온라인 계산기에 혼란이 발생합니다(아래 참조).

해당 지역의 펌웨어를 읽어보자 플래시 (uniprof의 PROGRAM과 동일)명령:

Avrdude -c gromov -P com1 -p m328p -U 플래시:r:readfl.txt:h ###WIN###
sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U flash:r:readfl.txt:h ###Linux###

uniprof에서는 코드가 프로그램에 표시되었지만 여기서는 파일에 기록됩니다.

펌웨어 읽기 및 파일 쓰기 readfl.txt. 편지 시간 (마녀)끝에는 데이터가 16진수 형식으로 기록되어야 함을 나타냅니다. 편지를 쓰면 (바이너리), 이진 시스템으로 작성되며, 아르 자형 (날것의), 그러면 데이터는 "원시" 형식이 됩니다. (kryakozyabra).

이제부터는 win 사용자가 디스크의 루트에 위치한다고 가정합니다. 와 함께 (씨:\), Linux 사용자는 홈 폴더에서 작업하므로 파일이 해당 홈 폴더에 저장됩니다. (달리 명시하지 않는 한). MK에 업로드될 펌웨어가 여기에 위치해야 합니다.

Win의 경우 파일은 C:\readfl.txt에 있고 Linux의 경우 /home/user/readfl.txt에 있습니다. 이 파일을 열어서 살펴보시면 됩니다.

EEPROM 읽기:

Avrdude -c gromov -P com1 -p m328p -U eeprom:r:reader.txt:h ###WIN###
sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U eeprom:r:reader.txt:h ###Linux###

플래시와 eeprom을 함께 읽기:

Avrdude -c gromov -P com1 -p m328p -U 플래시:r:readfl.txt:h -U eeprom:r:reader.txt:h ###WIN###
sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U flash:r:readfl.txt:h -U eeprom:r:reader.txt:h ###Linux###

컨트롤러 지우기:

Avrdude -e -c gromov -P com1 -p m328p ###WIN###
sudo avrdude -e -c gromov -P /dev/ttyS0 -p m328p ###Linux###

"리셋" 핀을 분리하세요. 다이오드가 깜박이지 않고 프로그램이 삭제됩니다.

이전에 다운로드한 파일로 MK를 플래싱해 보겠습니다. 328test.hex. 디스크의 루트에 위치 Windows에서는 (c:\328test.hex), Linux에서는 홈 폴더(/home/user/328test.hex)에 있습니다.

Avrdude -c gromov -P com1 -p m328p -U flash:w:328test.hex ###WIN###
sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U flash:w:328test.hex ###Linux###

이제 "재설정"을 끄면 컨트롤러가 활성화됩니다.

메모. MK를 통해 깜박일 때 avrdude, 컨트롤러를 지울 필요는 없으며 프로그램 자체가 지울 수 있습니다. 그러나 매개변수를 지정하면 -디, 그러면 MK가 자동으로 청소되지 않습니다.

EEPROM 펌웨어:

Avrdude -c gromov -P com1 -p m328p -U eeprom:w:eeprom.hex ###WIN###
sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U eeprom:w:eeprom.hex ###Linux###

모든 퓨즈 읽기:

Avrdude -c gromov -P com1 -p m328p -U hfuse:r:hfuse.txt:h -U lfuse:r:lfuse.txt:h -U 잠금:r:lock.txt:h -U efuse:r:efuse .txt:h ###WIN###
sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U hfuse:r:hfuse.txt:h -U lfuse:r:lfuse.txt:h -U 잠금:r:lock.txt:h -U efuse :r:efuse.txt:h ###리눅스###

일부 컨트롤러에는 퓨즈가 없을 수 있습니다.

읽기 전용 낮은 퓨즈:

Avrdude -c gromov -P com1 -p m328p -U lfuse:r:lfuse.txt:h ###WIN###
sudo avrdude -c gromov -P com1 -p m328p -U lfuse:r:lfuse.txt:h ###Linux###

로우 퓨즈는 클럭 신호 소스(내부, 외부), 해당 주파수 및 전원이 공급된 후 컨트롤러가 시작되기 전 일시 중지를 선택하는 역할을 합니다. 이제 거기에 값이 기록되었습니다. 0xff, 이는 8MHz 이상의 외부 석영에 해당합니다.

이제 내부 8MHz 발생기에서 작동하도록 ATmeg를 전송하는 또 다른 lfuse를 플래시하겠습니다.

Avrdude -c gromov -P com1 -p m328p -U lfuse:w:0xe2:m ###WIN###
sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U lfuse:w:0xe2:m ###Linux###

16MHz Arduino를 사용하는 경우 다이오드가 두 배 느리게 깜박입니다.
앞으로 AVR Studio에서 코딩할 때 8MHz의 주파수를 지정하고 석영의 납땜을 풀면 자유롭게 사용할 수 있는 무료 디지털 핀 2개를 더 얻을 수 있습니다.

하지만 그건 나중에 이야기하고 이제 이전 퓨즈를 깜박여 모든 것을 원래대로 되돌려 보겠습니다.

Avrdude -c gromov -P com1 -p m328p -U lfuse:w:0xff:m ###WIN###
sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U lfuse:w:0xff:m ###Linux###

다이오드가 올바르게 깜박입니다.

퓨즈는 개별적으로 또는 함께 플래시할 수 있습니다.

Avrdude -c gromov -P com1 -p m328p -U hfuse:w:0xda:m -U lfuse:w:0xff:m -U efuse:w:0x05:m ###WIN###
sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U hfuse:w:0xda:m -U lfuse:w:0xff:m -U efuse:w:0x05:m ###Linux###
이러한 명령은 제공할 필요가 없습니다. 나는 명확성을 위해 그것들을 제시합니다.

나중에 다른 컨트롤러를 사용해야 할 때 온라인 계산기의 확인란을 선택하고 값을 얻으십시오. (링크는 왼쪽 상단에 있습니다) 16진수 형식으로 플래시합니다.

이제 남은 것은 매개 변수를 파악하는 것입니다. avrdude마지막 부분으로 넘어갈 수 있습니다.

-c 그로모프-프로그래머 유형 또는 오히려 구성에 기록된 이름 (avrdude.conf).
-P com1-글쎄, 여기서는 모든 것이 명확합니다.
-p m328p- 지정 유형 MK.
-유- 이 옵션 뒤에는 메모리 영역이 표시됩니다. (플래시, eeprom, xfuse), 모든 작업이 수행됩니다. (r - 읽기, w - 쓰기).
콜론은 구분 기호 역할을 합니다.

여기에는 마이크로 컨트롤러의 이름과 별칭, 프로그래머 및 기타 옵션이 포함되어 있습니다.

별명 MK

uc3a0512- AT32UC3A0512
c128- AT90CAN128
c32- AT90CAN32
c64- AT90CAN64
PWM2- AT90PWM2
pwm2b- AT90PWM2B
PWM3- AT90PWM3
PWM316- AT90PWM316
pwm3b- AT90PWM3B
1200 - AT90S1200 (****)
2313 - AT90S2313
2333 - AT90S2333
2343 - AT90S2343 (*)
4414 - AT90S4414
4433 - AT90S4433
4434 - AT90S4434
8515 - AT90S8515
8535 - AT90S8535
usb1286- AT90USB1286
usb1287- AT90USB1287
USB162- AT90USB162
usb646- AT90USB646
usb647- AT90USB647
USB82- AT90USB82
m103- ATmega103
m128- ATmega128
m1280- ATmega1280
m1281- ATmega1281
m1284p- ATmega1284P
m1284rfr2- ATmega1284RFR2
m128rfa1- ATmega128RFA1
m128rfr2- ATmega128RFR2
m16- ATmega16
m161- ATmega161
m162- ATmega162
m163- ATmega163
m164p- ATmega164P
m168- ATmega168
m168p- ATmega168P
m169- ATmega169
m16u2- ATmega16U2
m2560- ATmega2560 (**)
m2561- ATmega2561 (**)
m2564rfr2- ATmega2564RFR2
m256rfr2- ATmega256RFR2
m32- ATmega32
m324p- ATmega324P
m324pa- ATmega324PA
m325- ATmega325
m3250- ATmega3250
m328- ATmega328
m328p- ATmega328P
m329- ATmega329
m3290- ATmega3290
m3290p- ATmega3290P
m329p- ATmega329P
m32u2- ATmega32U2
m32u4- ATmega32U4
m406- ATMEGA406
m48- ATmega48
m48p- ATmega48P
m64- ATmega64
m640- ATmega640
m644- ATmega644
m644p- ATmega644P
m644rfr2- ATmega644RFR2
m645- ATmega645
m6450- ATmega6450
m649- ATmega649
m6490- ATmega6490
m64rfr2- ATmega64RFR2
m8- ATmega8
m8515- ATmega8515
m8535- ATmega8535
m88- ATmega88
m88p- ATmega88P
m8u2- ATmega8U2
t10-ATtiny10
t11- ATtiny11
t12- ATtiny12
t13- ATtiny13
t15-ATtiny15
t1634- ATtiny1634
t20- ATtiny20
t2313- ATtiny2313
t24- 에이티니24
t25- 에이티니25
t26- 에이티니26
t261- ATtiny261
t4- ATtiny4
t40- ATtiny40
t4313-ATtiny4313
t43u- ATtiny43u
t44- ATtiny44
t45- ATtiny45
t461- ATtiny461
t5- ATtiny5
t84- ATtiny84
t85- ATtiny85
t861- ATtiny861
t88- ATtiny88
t9- ATtiny9
x128a1- ATxmega128A1
x128a1d- ATxmega128A1revD
x128a1u- ATxmega128A1U
x128a3- ATxmega128A3
x128a3u- ATxmega128A3U
x128a4- ATxmega128A4
x128a4u- ATxmega128A4U
x128b1- ATxmega128B1
x128b3- ATxmega128B3
x128c3- ATxmega128C3
x128d3- ATxmega128D3
x128d4- ATxmega128D4
x16a4- ATxmega16A4
x16a4u- ATxmega16A4U
x16c4- ATxmega16C4
x16d4- ATxmega16D4
x16e5- ATxmega16E5
x192a1- ATxmega192A1
x192a3- ATxmega192A3
x192a3u- ATxmega192A3U
x192c3- ATxmega192C3
x192d3- ATxmega192D3
x256a1- ATxmega256A1
x256a3- ATxmega256A3
x256a3b- ATxmega256A3B
x256a3bu- ATxmega256A3BU
x256a3u- ATxmega256A3U
x256c3- ATxmega256C3
x256d3- ATxmega256D3
x32a4- ATxmega32A4
x32a4u- ATxmega32A4U
x32c4- ATxmega32C4
x32d4- ATxmega32D4
x32e5- ATxmega32E5
x384c3- ATxmega384C3
x384d3- ATxmega384D3
x64a1- ATxmega64A1
x64a1u- ATxmega64A1U
x64a3- ATxmega64A3
x64a3u- ATxmega64A3U
x64a4- ATxmega64A4
x64a4u- ATxmega64A4U
x64b1- ATxmega64B1
x64b3- ATxmega64B3
x64c3- ATxmega64C3
x64d3- ATxmega64D3
x64d4- ATxmega64D4
x8e5- ATxmega8E5

Linux 사용자는 와인을 사용할 수 있습니다.

이미 모든 것이 설치되어 있기를 바랍니다. AVR Studio를 실행해 보겠습니다.


여기에서는 새 프로젝트를 만들거나 이전 프로젝트를 열라는 메시지가 표시됩니다. 딸깍 하는 소리 새 프로젝트


선택하다 AVR GCC, 어셈블러가 아닌 SI로 작성하기 때문입니다.
프로젝트 이름을 지정하고 상자를 선택합니다.
선택하다 위치 (저는 C:\ 드라이브에 AVR 폴더를 만들었습니다)프로젝트가 포함된 폴더가 자동으로 생성됩니다.
딸깍 하는 소리 다음


선택하다 AVR 시뮬레이터, 디버깅을 허용하는 특별한 프로그래머가 없고 마이크로컨트롤러가 ATmega328p.
딸깍 하는 소리 마치다.

이러한 조작이 끝나면 스튜디오 작업 준비가 완료됩니다.

왼쪽에는 프로젝트 경로가 있습니다. 중앙에는 코드가 작성되는 텍스트 편집기가 있습니다. 오른쪽에는 컨트롤러 레지스터가 있습니다. 왼쪽 하단에는 디버깅 정보가 있습니다.

현재 우리가 관심을 갖고 있는 버튼은 다음과 같습니다.

프로젝트를 빌드합니다.
프로젝트를 빌드하고 디버깅을 시작합니다.
파일을 컴파일합니다.
청소.
프로젝트 설정. 그러니 클릭해 보세요...

여기에서 MK 유형을 변경하고 클럭 주파수를 설정할 수 있습니다. (코드에 직접 작성하겠습니다), 최적화 수준을 확인하고 어떤 파일이 생성될지 결정합니다.
관심 있는 왼쪽 아이콘을 클릭한 후 다음을 클릭하세요. 취소.
이러한 옵션과 기타 옵션은 설명하지 않겠습니다. 나중에 적절한 설명이 포함된 링크를 제공하겠습니다.

이제 기사 시작 부분에 작성된 코드를 복사하여 편집기에 붙여넣습니다.

라이브러리에서 요구하기 때문에 코드에 클럭 주파수를 지정했습니다. 지연.h.

빌드가 성공했으며 오류나 경고가 없었습니다.

이제 갈 길을 가보자 C:\AVR\my328\default\, 우리가 만든 16진수 파일이 있습니다. my328.hex컨트롤러에 플래시하세요. 플래시할 항목 (avrdude 또는 uniprof)스스로 선택하십시오.

avrdude에서는 다음과 같이 표시됩니다.

Avrdude -c gromov -P com1 -p m328p -U 플래시:w:\AVR\my328\default\my328.hex ###WIN###
avrdude -c gromov -P /dev/ttyS0 -p m328p -U flash:w:my328.hex ###Linux###

"재설정"을 비활성화하고 다이오드가 초당 한 번씩 깜박이는 것을 확인하십시오. 명령줄의 단순성과 편리함에 대해 확신을 가지셨기를 바랍니다.

Arduino를 다시 Arduino로 바꾸려면 백업이 필요합니다.

위에서도 썼듯이 AVR Studio 작업에 대한 설명이나 SI 언어에 대한 강의는 하지 않겠습니다. 우선 이건 내 계획이 아니었어. (저는 Arduino에서 AVR Studio로의 전환을 돕고 싶었습니다.)

IDE는 다양한 템플릿, 라이브러리, 디버거 기능을 포함하는 통합 개발 환경입니다. 2004년부터 강력한 소프트웨어 패키지인 AVR studio가 개발되었습니다.

첫 번째 버전

스튜디오의 첫 번째 버전에는 에 대한 어셈블러가 포함되어 있어 첫 번째 어셈블리에서 추출할 수 있지만 나중에 이 프로젝트가 중단되고 C AVR이 기본 언어로 선택되었습니다. 컴파일러는 유료이며 매우 심각한 제품 IAR이었습니다. 무료 WINAVR을 다운로드할 수 있으며, 이를 위해서는 스튜디오를 설치한 후 설치해야 합니다.

메모! AVR studio 4 및 기타 버전을 설치한 후에만 이 작업을 수행하는 것이 좋습니다.

AVR 스튜디오 4(위 사진)는 오랫동안 선보였습니다. 많은 마이크로 컨트롤러 개발자가 이 문제에 직면했습니다. 이후 IDE가 AVR 스튜디오 5로 업그레이드됐다. 인터페이스 외에 특별한 변화는 없었고, 그 이후에야 개발사에서 제품 브랜드를 바꾸고 이름을 아트멜 스튜디오 6으로 바꿨다.

AVR studio 5 환경은 다음 마이크로컨트롤러를 지원합니다.

  • AVR32;
  • XMEGA.

Atmel studio 6은 AVR studio 5와 크게 달랐습니다. 이 버전에서 가장 눈에 띄는 혁신은 다음과 같습니다.

  1. Microsoft Visual Studio 2010은 AVR 제품군과 함께 작동하기 시작했습니다.
  2. AVR studio 5에 비해 구문 강조가 향상되었습니다.
  3. 힌트와 명령 세트의 자동 완성을 추가하여 개발 프로세스 속도를 높였습니다.
  4. 일반적으로 환경의 전체 운영이 더욱 안정적이 되었습니다.
  5. ARM Cortex-M에 대한 지원이 추가되었습니다.
  6. WinAVR은 더 이상 별도로 설치할 필요가 없으며, 이전 버전과 달리 GCC는 이제 설치 과정에서 설치됩니다.

Atmel studio 6에서는 프로그램 사용자를 위한 더 나은 발전이 이루어졌으며 이는 Atmel 제품군의 인기에 영향을 미쳤습니다. 그러나 파일 경로에서 러시아어 문자를 적절하게 지원하는 것은 불가능했습니다.

현재 버전 - Atmel studio 7

제가 사용한 개발 환경은 Visual Studio Isolated Shell 2015였습니다. 한편으로 이 솔루션은 Windows XP에서 지원되지 않습니다. 반면에 이러한 조치는 프로그램의 모양과 기능을 모두 개선하기 위해 취해진 것입니다.

아마도 가장 중요한 것은 Atmel studio 7에 Arduino 지원이 추가되었다는 점일 것입니다. 이는 간단한 스케치 세트에서 모든 C 기능, 디버깅, MCU 시뮬레이터 및 기타 기능을 사용할 수 있다는 것을 의미합니다. Arduino와 Atmel studio 7의 결합은 이 간단한 학습 플랫폼 개발에 새로운 국면을 열었습니다.

Arduino와 함께 Atmel studio를 공부하는 것은 Arduino의 핵심인 Atmega 마이크로컨트롤러에 대해 완벽하고 생산적인 숙달과 더 깊은 지식으로 나아갈 수 있는 기회를 제공할 것입니다.

또한 Atmel 웹사이트에서 LCD 작동 및 연결을 위한 패키지를 다운로드할 수 있습니다. 마스터링의 예로 LCD 1602를 사용할 수 있으며 인터넷에는 이에 대한 많은 강의가 있으며 개발자는 디스플레이에 16개의 문자와 2줄을 사용할 수 있습니다.

어디서부터 학습을 시작하나요?

물론 프로그래머를 구입하는 것부터 시작해야 합니다. 가장 예산 친화적인 것은 USBASP입니다. USBASP 프로그래머는 Atmel Studio 7에서 지원되지 않습니다.


프로그래머용 드라이버와 AVRdude 프로그램을 다운로드하고 모두 함께 작동하게 하려면 명령줄을 통해 명령을 사용할 수 있습니다.

"avrdude -c usbasp -p atmega32 -U 플래시:w: 펌웨어 파일 이름. 마녀 -U lfuse:w:0x6a:m -U hfuse:w:0xff:m"

atmel studio 7(제목 – 외부 도구)에서 프로필을 생성하여 지원을 활성화하고 인수 항목에 각각 "-c usbasp -p atmega32 -U flash:w:$(TargetName).hex" 등을 입력합니다. 마이크로컨트롤러를 사용하는 유형입니다.

이것이 스튜디오와 USBASP 프로그래머를 연결하는 유일한 방법입니다. 플래시할 때 주의하세요. 마이크로컨트롤러 서명이 손상될 수 있으며 12V(고전압) 프로그래머를 통해서만 복원할 수 있습니다.

훈련을 위해 어떤 문헌을 사용해야 합니까?

먼저, 각 마이크로컨트롤러의 공식 웹사이트에서 매뉴얼을 다운로드하세요. 특정 교재를 추천하기는 어렵지만 “DI Halt - AVR. 교육 과정"을 사용할 수 있습니다. 이 자료의 작성자는 실무자이자 다양한 인터넷 리소스에 대한 많은 기사의 저자이며 단순히 전문가 집단에서 존경받는 사람입니다.

나는 MK를 공부하려면 어셈블러부터 시작해야 한다고 여러 번 말했습니다. 웹사이트의 전체 과정이 이에 전념했습니다(비록 일관성이 별로 없지만 점차 적절한 모양을 만들기 위해 빗질하고 있습니다). 예, 어렵습니다. 결과는 첫날에는 나오지 않지만 컨트롤러에서 무슨 일이 일어나고 있는지 이해하는 방법을 배우게 됩니다. 당신은 그것이 어떻게 작동하는지 알게 될 것이고, 원숭이처럼 다른 사람의 소스를 복사하지 않고 그것이 갑자기 작동을 멈추는 이유를 이해하려고 노력할 것입니다. 게다가 C에서는 가장 부적절한 순간에 갈퀴를 들고 나오는 무뚝뚝한 코드를 만드는 것이 훨씬 쉽습니다.

불행히도 모든 사람은 즉시 결과를 원합니다. 그래서 저는 다른 방향으로 가기로 결정했습니다. C에 대한 튜토리얼을 작성하되 그의 속옷을 보여주기로 했습니다. 훌륭한 임베더 프로그래머는 항상 자신의 하드웨어 부품을 볼트로 단단히 고정하여 하드웨어가 허락 없이 한 걸음도 나아갈 수 없도록 합니다. 먼저 C 코드가 있고, 컴파일러가 생성한 코드와 실제로 작동하는 방식이 있습니다. :)

반면 C의 장점은 코드 이식성이다. 물론 모든 것을 올바르게 작성했다면. 작업 알고리즘과 해당 하드웨어 구현을 프로젝트의 여러 부분으로 분리합니다. 그런 다음 알고리즘을 다른 마이크로 컨트롤러로 전송하려면 하드웨어에 대한 모든 호출이 기록되는 인터페이스 계층만 다시 작성하고 모든 작업 코드는 그대로 두는 것으로 충분합니다. 그리고 물론 가독성도요. C 소스 코드는 언뜻 보기에 이해하기 더 쉽습니다(비록... 예를 들어, C든 ASM이든 무엇을 지적해야 할지 상관하지 않습니다 :)). 하지만 모든 것이 올바르게 작성된 경우에도 마찬가지입니다. 나는 또한 이러한 점에 주목할 것입니다.

내 디버그 보드는 모든 예제의 대부분이 설치될 실험용 하드웨어 역할을 할 것입니다.

AVR을 위한 최초의 C 프로그램

컴파일러 선택 및 환경 설정
AVR에는 다양한 C 컴파일러가 있습니다.
우선 이 IAR AVR C- AVR을 위한 최고의 컴파일러로 거의 확실하게 인정받고 있습니다. 컨트롤러 자체는 Atmel과 IAR 전문가 간의 긴밀한 협력을 통해 만들어졌습니다. 하지만 모든 비용을 지불해야 합니다. 그리고 이 컴파일러는 고가의 상용 소프트웨어일 뿐만 아니라 설정이 너무 많아서 단순히 컴파일하는 데에도 많은 노력이 필요합니다. 정말 그 사람과 친해지지는 않았고, 연결 단계에서 이상한 오류로 인해 프로젝트가 썩어가고 있었습니다(나중에 알고 보니 삐뚤어진 균열이었습니다).

두 번째가 온다 WinAVR GCC- 강력한 최적화 컴파일러. 완전 오픈 소스, 크로스 플랫폼, 일반적으로 삶의 모든 즐거움. 또한 AVR Studio에 완벽하게 통합되어 바로 디버그할 수 있어 매우 편리합니다. 일반적으로 나는 그것을 선택했습니다.

도 있습니다 CodeVision AVR C매우 유명한 컴파일러입니다. 단순함으로 인해 인기를 얻었습니다. 단 몇 분만에 작동하는 프로그램을 얻을 수 있습니다. 시작 코드 마법사는 모든 종류의 초기화에 대한 표준을 작성하여 이를 크게 촉진합니다. 솔직히 말해서 나는 그것이 다소 의심스럽습니다. 이 컴파일러로 작성된 프로그램을 분해해야 했을 때 그것은 코드가 아닌 일종의 엉망인 것으로 판명되었습니다. 엄청난 양의 불필요한 움직임과 작업으로 인해 상당한 양의 코드가 발생하고 성능이 저하되었습니다. 하지만 어쩌면 원본 펌웨어를 작성한 사람의 DNA에 오류가 있었을 수도 있습니다. 게다가 그는 돈을 원합니다. IAR 만큼은 아니지만 눈에 띕니다. 그리고 데모 모드에서는 2kb 이하의 코드를 작성할 수 있습니다.
물론 균열이 있지만, 훔치려고 한다면 IAR 의미에서 백만 달러입니다 :)

도 있습니다 이미지 크래프트 AVR C그리고 마이크로C마이크로일렉트로닉스 출신. 둘 중 하나를 사용할 필요는 없었지만 SWG매우 칭찬 마이크로파스칼, 그들은 매우 편리한 프로그래밍 환경과 라이브러리라고 말합니다. 나는 MicroC가 더 나쁘지 않을 것이라고 생각하지만 유료이기도합니다.

말씀대로 제가 선택했어요 WinAVR세 가지 이유가 있습니다. 무료이고, AVR Studio에 통합되며, 모든 상황에 맞게 작성된 수많은 기성 코드가 있습니다.

따라서 AVR Studio를 사용하여 WinAVR 설치를 다운로드하십시오. 다음으로 스튜디오를 먼저 설치한 후 WinAVR을 그 위에 올려 플러그인 형태로 스튜디오에 연결합니다. C:\WinAVR과 같은 짧은 경로에 WinAVR을 설치하는 것이 좋습니다. 이렇게 하면 경로와 관련된 많은 문제를 피할 수 있습니다.

프로젝트 만들기
이제 스튜디오가 설치되고 C가 조여졌으며 이제 무언가를 프로그래밍해 볼 시간입니다. 가장 간단한 것부터 시작해 보겠습니다. 스튜디오를 실행하고 AVR GCC 컴파일러로 새 프로젝트를 선택한 다음 프로젝트 이름을 입력하세요.

빈 *.c 파일이 포함된 작업 필드가 열립니다.

이제 스튜디오 북마크에서 경로 표시를 구성하는 것이 문제가 되지 않습니다. 이렇게 하려면 다음으로 이동하세요.
메뉴 도구 - 옵션 - 일반 - 파일 탭을 클릭하고 드롭다운 목록에서 "파일 이름만"을 선택하세요. 그렇지 않으면 작업이 불가능합니다. 탭에는 파일의 전체 경로가 포함되고 화면에는 탭이 2~3개 이하로 표시됩니다.

프로젝트 설정
일반적으로 모든 종속성이 설명되는 make 파일을 만드는 것은 고전적인 것으로 간주됩니다. 그리고 그것은 아마도 맞을 것입니다. 하지만 저는 다음과 같은 완전히 통합된 IDE를 갖고 자랐습니다. 유비전또는 AVR 스튜디오이 접근 방식은 매우 이질적입니다. 그러므로 나는 스튜디오 수단을 사용하여 모든 것을 내 방식대로 할 것입니다.

기어로 버튼을 찌르세요.


이것은 프로젝트에 대한 설정이거나 오히려 make 파일의 자동 생성을 위한 설정입니다. 첫 번째 페이지에서는 MK가 작동할 주파수를 입력하기만 하면 됩니다. 이는 퓨즈 비트에 따라 다르므로 주파수가 8000000Hz라고 가정합니다.
또한 최적화 라인에 주의하십시오. 이제 -Os가 있습니다. 이것이 크기 최적화입니다. 지금은 그대로 두고 이 매개변수를 사용해 시도해 볼 수 있습니다. -O0은 전혀 최적화가 아닙니다.

다음 단계는 경로를 구성하는 것입니다. 우선 거기에 프로젝트 디렉터리를 추가하세요. 거기에 타사 라이브러리를 추가하게 됩니다. 목록에 ".\" 경로가 나타납니다.

Make 파일이 생성되었습니다. 프로젝트의 기본 폴더에서 해당 파일을 볼 수 있습니다. 거기에 무엇이 있는지 살펴보세요.


지금은 여기까지입니다. 어디에서나 확인을 클릭하고 소스로 이동합니다.

문제의 공식화
다이오드의 평범한 깜박임이 더 이상 작동하지 않기 때문에 빈 종이에 교활한 아이디어를 구현하려는 유혹이 있습니다. 즉시 황소의 뿔을 잡고 컴퓨터와의 연결을 구현합시다. 이것이 제가하는 첫 번째 일입니다.

다음과 같이 작동합니다.
COM 포트에 1(코드 0x31)이 도착하면 다이오드가 켜지고 0(코드 0x30)이 도착하면 다이오드가 꺼집니다. 또한 모든 작업은 인터럽트 시 수행되며 백그라운드 작업은 다른 다이오드가 깜박이는 것입니다. 간단하고 의미가 있습니다.

회로 조립
USB-USART 변환기 모듈을 마이크로 컨트롤러의 USART 핀에 연결해야 합니다. 이렇게 하려면 두 개의 전선에서 점퍼를 가져와 핀 위에 십자형으로 놓습니다. 즉, 컨트롤러의 Rx를 컨버터의 Tx에 연결하고, 컨버터의 Tx를 컨트롤러의 Rx에 연결합니다.

결국 이것은 다이어그램입니다.


나머지 핀 연결, 전원 연결, 재설정 등은 고려하지 않는 것이 표준입니다.

코드 작성

C 언어 자체에 대한 설명을 구체적으로 다루지는 않을 것이므로 즉시 예약하겠습니다. K&R의 고전적인 "C 프로그래밍 언어"부터 다양한 매뉴얼에 이르기까지 이를 위한 자료가 엄청나게 많습니다.

나는 내 은닉처에서 그러한 방법 중 하나를 발견했는데, 한때 이 언어를 공부하는 데 사용한 적이 있습니다. 모든 것이 짧고 명확하며 요점이 명확합니다. 차차 정리해서 홈페이지에 올려보겠습니다.

아직 모든 챕터가 옮겨지지 않은 것은 사실이지만, 그리 오래 걸리지는 않을 것 같아요.

더 잘 설명할 수 없을 것 같으므로 교육 과정에서 세부 사항에 대한 자세한 설명 대신 이 매뉴얼의 개별 페이지에 대한 직접 링크만 제공하겠습니다.

라이브러리를 추가합니다.
우선, 정의와 함께 필요한 라이브러리와 헤더를 추가합니다. 결국 C는 보편적인 언어이고 우리는 특별히 AVR로 작업하고 있다는 것을 그에게 설명해야 하므로 소스 코드에 다음 줄을 작성합니다.

1 #포함하다

#포함하다

이 파일은 폴더에 있습니다 WinAVR컨트롤러의 모든 레지스터와 포트에 대한 설명이 포함되어 있습니다. 더욱이, 컴파일러에 의해 다음을 통해 전송되는 특정 컨트롤러에 바인딩하는 모든 것이 교묘합니다. 만들다매개변수의 파일 MCU이 변수를 기반으로 이 특정 컨트롤러에 대한 모든 포트 및 레지스터의 주소에 대한 설명과 함께 헤더 파일이 프로젝트에 연결됩니다. 우와! 그것 없이도 가능하지만 SREG 또는 UDR과 같은 기호 레지스터 이름을 사용할 수 없으며 "0xC1"과 같은 각각의 주소를 기억해야하므로 골치 아픈 일이 될 것입니다.

팀 자체 #포함하다<имя файла> 예를 들어 기능 설명이나 기타 코드가 포함된 파일 등 텍스트 파일의 내용을 프로젝트에 추가할 수 있습니다. 그리고 지시문이 이 파일을 찾을 수 있도록 프로젝트 경로를 지정했습니다(WinAVR 디렉터리는 기본적으로 여기에 이미 등록되어 있습니다).

주요 기능.
C 프로그램은 전적으로 함수로 구성됩니다. 순서와 방법에 관계없이 서로 중첩되고 호출될 수 있습니다. 각 함수에는 세 가지 필수 매개변수가 있습니다.

  • 반환 값은 다음과 같습니다. 죄(x) x의 사인 값을 반환합니다. 간단히 말해서 수학에서와 같습니다.
  • 전송되는 매개변수는 동일한 X입니다.
  • 기능 본체.

전송되고 반환되는 모든 값은 데이터에 따라 특정 유형이어야 합니다.

모든 C 프로그램에는 함수가 포함되어야 합니다. 기본메인 프로그램의 진입점으로 사용합니다. 그렇지 않으면 전혀 C가 아닙니다. :) 백만 개의 파일 중 다른 사람의 소스 코드에 main이 있으면 이것이 모든 것이 시작되는 프로그램의 주요 부분이라는 것을 이해할 수 있습니다. 그럼 질문해보자:

1 2 3 4 5 int main(void) ( 0을 반환 ; )

int main(void) ( 0을 반환; )

그게 다입니다. 가장 간단한 프로그램이 작성되었습니다. 아무것도 하지 않는 것은 중요하지 않습니다. 우리는 방금 시작했습니다.

우리가 무엇을 했는지 알아봅시다.
정수이는 기본 함수가 반환하는 데이터 유형입니다.

물론 마이크로 컨트롤러에서는 기본원칙적으로는 아무것도 반환될 수 없으며 이론적으로는 반환되어야 합니다. 무효 메인(void), 그러나 GCC는 원래 PC용으로 설계되었으며 여기서 프로그램은 완료 시 운영 체제에 값을 반환할 수 있습니다. 따라서 GCC는 무효 메인(void)경고로 맹세합니다.

이것은 오류가 아니며 작동하지만 경고가 마음에 들지 않습니다.

무효의이것은 우리가 함수에 전달하는 데이터 유형입니다. 이 경우 기본또한 외부로부터 어떤 것도 받아들일 수 없습니다. 무효의- 더미. 스텁은 아무것도 전송하거나 반환할 필요가 없을 때 사용됩니다.

여기 있습니다 { } 중괄호는 프로그램 블록입니다. 이 경우 함수 본문입니다. 기본, 코드는 거기에 있습니다.

반품- 이것은 완료 시 주 함수가 반환할 반환 값입니다. int, 즉 숫자가 있으므로 숫자를 반환해야 합니다. 여전히 말이 안 되긴 하지만, 왜냐면... 마이크로 컨트롤러에서는 메인에서 아무데도 갈 수 없습니다. 나는 null을 반환합니다. 왜냐하면 그것은 중요하지 않기 때문입니다. 그러나 컴파일러는 일반적으로 똑똑하므로 이 경우에 대한 코드를 생성하지 않습니다.
하지만 변태라면 기본 MK로 이동하여 예를 들어 부트로더 섹션으로 이동하여 실행할 수 있지만 전환 주소를 수정하려면 펌웨어에 대한 낮은 수준의 수정이 필요합니다. 아래에서 직접 확인하고 수행 방법을 이해하게 될 것입니다. 무엇을 위해? 이것은 또 다른 질문입니다. 99.999%의 경우에는 이것이 필요하지 않습니다. :)

우리는 해냈고 계속 나아갔습니다. 변수를 추가해 보겠습니다. 실제로는 필요하지 않으며 변수 없이 변수를 도입하는 것은 의미가 없지만 우리는 배우고 있습니다. 변수가 함수 본문 내부에 추가되면 해당 변수는 로컬이며 이 함수에만 존재합니다. 함수를 종료하면 이러한 변수가 삭제되고 더 중요한 요구 사항을 위해 RAM 메모리가 할당됩니다. .

1 2 3 4 5 6 int main(void ) ( unsigned char i; return 0 ; )

int main(void) ( unsigned char i; return 0; )

서명되지 않은서명되지 않은 것을 의미합니다. 사실 이진 표현에서는 최상위 비트가 부호에 할당됩니다. 즉, 숫자 +127/-128은 1바이트(char)에 맞지만 부호를 버리면 0에서 0까지에 적합합니다. 255. 일반적으로 표시는 필요하지 않습니다. 그래서 서명되지 않은.
단지 변수 이름일 뿐입니다. 더 이상은 없어.

이제 포트를 초기화해야 합니다. UART. 물론, 라이브러리를 가져와 연결하고 일종의 UartInit(9600)을 호출할 수 있습니다. 하지만 그러면 실제로 무슨 일이 일어났는지 알 수 없을 것입니다.

우리는 이렇게 합니다:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 int main(void ) ( unsigned char i; #define XTAL 8000000L #define 전송 속도 9600L #define bauddivider (XTAL/(16*보드 속도)-1)#define HI(x) ((x)>>8) #define LO(x) ((x)& 0xFF) UBRRL = LO(bauddivider) ; UBRRH = HI(보드 분배기) ; UCSRA = 0 ; UCSRB = 1<< RXEN| 1 << TXEN| 1 << RXCIE| 0 << TXCIE; UCSRC = 1 << URSEL| 1 << UCSZ0| 1 << UCSZ1; }

int main(void) ( unsigned char i; #define XTAL 8000000L #define 전송 속도 9600L #define bauddivider (XTAL/(16*baudrate)-1) #define HI(x) ((x)>>8) #define LO( x) ((x)& 0xFF) UBRRL = LO(보드 분배기), UBRRH = HI(보드 분배기), UCSRA = 0, UCSRB = 1<

무서운? 실제로 실제 코드는 마지막 다섯 줄만 있습니다. 모든 것, 그 #정의하다전처리기 매크로 언어입니다. Assembly와 거의 동일하지만 구문이 약간 다릅니다.

이는 필요한 계수를 계산하는 일상적인 작업을 용이하게 합니다. 첫 번째 줄에서는 대신에 다음과 같이 말합니다. XTAL 8000000을 안전하게 대체할 수 있으며, - 유형 표시, 즉 long은 프로세서의 클럭 주파수입니다. 똑같다 전송 속도— UART를 통한 데이터 전송 빈도.

보드 분배기이미 더 복잡하기 때문에 그 대신 이전 두 공식의 공식을 사용하여 계산된 표현식이 대체됩니다.
음 그리고 봐라.그리고 안녕낮은 바이트와 높은 바이트는 이 결과에서 가져옵니다. 왜냐하면 분명히 1바이트에 맞지 않을 수도 있습니다. 안에 안녕 X(매크로 입력 매개변수)가 오른쪽으로 8번 이동되어 최상위 바이트만 남게 됩니다. 그리고 봐라.숫자 00FF를 사용하여 비트 단위 AND를 수행하면 결과적으로 하위 바이트만 남게 됩니다.

그래서 완료된 모든 일은 다음과 같습니다. #정의하다안전하게 버리고 계산기로 필요한 숫자를 계산한 후 즉시 UBBRL = … 행에 입력할 수 있습니다. 그리고 UBBRH = .....

할 수 있다. 하지만! 이 작업을 수행 절대 불가능하다!

이런 식으로든 저런 식으로든 작동하겠지만 소위 말하는 문제가 발생합니다. 매직넘버- 알 수 없는 이유로 갑자기 가져온 가치, 그리고 몇 년 안에 그러한 프로젝트를 열면 이러한 가치가 무엇인지 이해하기 어려울 것입니다. 지금도 속도를 변경하거나 석영 주파수를 변경하려면 모든 것을 다시 계산해야 하지만 코드에서 몇 가지 숫자를 변경하면 그게 전부입니다. 일반적으로 코더라는 브랜드를 받고 싶지 않다면 읽기 쉽고 이해하기 쉽고 수정하기 쉬운 코드를 만드십시오.

그렇다면 모든 것이 간단합니다.
이 모든 "UBRRL 및 Co"는 우리가 전 세계와 통신하는 데 도움이 되는 UART 송신기의 구성 레지스터입니다. 이제 필요한 값을 할당하고 원하는 속도와 모드로 설정했습니다.

녹음 유형 1<다음을 의미합니다. 1개를 가져다가 제자리에 놓으십시오. RXEN바이트로. RXEN이것은 레지스터의 4번째 비트입니다 UCSRB, 그래서 1<이진수 00010000을 형성합니다. TXEN- 이것은 세 번째 비트이고, 1< 00001000을 제공합니다. 단일 "|" 그것은 비트 단위이다 또는, 그래서 00010000 | 00001000 = 00011000. 같은 방식으로 나머지 필수 구성 비트가 설정되어 일반 힙에 추가됩니다. 결과적으로 수집된 번호는 UCSRB에 기록됩니다. 자세한 내용은 USART 섹션의 MK 데이터시트에 설명되어 있습니다. 그러니 기술적 세부 사항 때문에 주의가 산만해지지 않도록 하세요.

이제 무슨 일이 일어났는지 알아볼 시간입니다. 컴파일을 클릭하고 에뮬레이션을 시작합니다(Ctrl+F7).

디버깅
온갖 진행 표시줄이 지나갔고, 스튜디오가 바뀌었고, 메인 기능 입구 근처에 노란색 화살표가 나타났습니다. 이곳은 프로세서가 현재 실행 중이고 시뮬레이션이 일시 중지된 곳입니다.

사실 처음에는 UBRRL = LO(bauddivider); 라인에 있었습니다. 결국 우리가 정의한 것은 코드가 아니라 단순히 예비 계산이므로 시뮬레이터가 약간 지루합니다. 하지만 이제 그는 깨달았습니다. 첫 번째 지시가 완료되었고 나무에 올라가면 I/O 보기, USART 섹션으로 이동하여 UBBRL 바이트를 보면 값이 이미 있음을 알 수 있습니다! 0x33.

한 단계 더 나아가십시오. 다른 레지스터의 내용이 어떻게 변경되는지 확인하세요. 따라서 모두 살펴보고 표시된 모든 비트가 내가 말한 대로 설정되고 전체 바이트에 대해 동시에 설정된다는 사실에 주의하십시오. Return 이상은 진행되지 않습니다. 프로그램이 종료되었습니다.

열리는
이제 시뮬레이션을 0으로 재설정합니다. 거기를 클릭하세요 재설정(Shift+F5). 분해된 목록을 열면 이제 컨트롤러에서 실제로 무슨 일이 일어나고 있는지 확인할 수 있습니다. 보기 -> 디스어셈블러. 그리고 아니야 YYAAAAAAA!!! 어셈블러!!! 공포!!! 그리고 그것은 필요합니다. 그러면 나중에 뭔가 잘못되었을 때 코드를 멍청하게 작성하지 말고 포럼에서 형편없는 질문을 하지 말고 즉시 용기를 내어 어디에서 막혔는지 확인하세요. 거기에는 무서운 것이 없습니다.

먼저 시리즈의 탑이 있습니다:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 +00000000: 940C002A JMP 0x0000002A 점프 +00000002: 940C0034 JMP 0x00000034 점프 +00000004: 940C0034 JMP 0x00000034 점프 +00000006: 940C0034 JMP 0x0 0000034 점프 +00000008: 940C0034 JMP 0x00000034 점프 +0000000A: 940C0034 JMP 0x00000034 점프 +0000000C: 940C0034 JMP 0x00000034 점프 + 0000000E: 940C0034 JMP 0x00000034 점프 +00000010: 940C0034 JMP 0x00000034 점프 +00000012: 940C0034 JMP 0x00000034 점프 +00000014: 940C0034 JMP 0x0 0000034 점프 +00000016: 940C0034 JMP 0x00000034 점프 +00000018: 940C0034 JMP 0x00000034 점프 +0000001A: 940C0034 JMP 0x00000034 점프 +0000001C : 940C0034 JMP 0x00000034 점프 +0000001E: 940C0034 JMP 0x00000034 점프 +00000020: 940C0034 JMP 0x00000034 점프 +00000022: 940C0034 JMP 0x000000 34 점프 +00000024: 940C0034 JMP 0x00000034 점프 +00000026: 940C0034 JMP 0x00000034 점프 +00000028: 940C0034 JMP 0x00000034 점프

00000000: 940C002A JMP 0x0000002A 점프 +00000002: 940C0034 JMP 0x00000034 점프 +00000004: 940C0034 JMP 0x00000034 점프 +00000006: 940C0034 JMP 0x0 0000034 점프 +00000008: 940C0034 JMP 0x00000034 점프 +0000000A: 940C0034 JMP 0x00000034 점프 +0000000C: 940C0034 JMP 0x00000034 점프 +0000000E : 940C0034 JMP 0x00000034 점프 +00000010: 940C0034 JMP 0x00000034 점프 +00000012: 940C0034 JMP 0x00000034 점프 +00000014: 940C0034 JMP 0x000000 34 점프 +00000016: 940C0034 JMP 0x00000034 점프 +00000018: 940C0034 JMP 0x00000034 점프 +0000001A: 940C0034 JMP 0x00000034 점프 +0000001C : 940C0034 JMP 0x00000034 점프 +0000001E: 940C0034 JMP 0x00000034 점프 +00000020: 940C0034 JMP 0x00000034 점프 +00000022: 940C0034 JMP 0x00000034 점프 + 00000024: 940C0034 JMP 0x00000034 점프 +00000026: 940C0034 JMP 0x00000034 점프 +00000028: 940C0034 JMP 0x00000034 점프

이것은 인터럽트 벡터 테이블입니다. 나중에 다시 설명하겠지만 지금은 그것이 존재한다는 것을 보고 기억하기만 하면 됩니다. 첫 번째 열은 명령이 있는 플래시 셀의 주소이고, 두 번째 열은 명령 코드, 세 번째 열은 명령 니모닉, 동일한 조립 명령, 세 번째 열은 명령의 피연산자입니다. 음, 자동 댓글입니다.
따라서 보시면 지속적인 전환이 있습니다. 그리고 JMP 명령 코드는 4바이트이며, 여기에는 거꾸로 쓰여진 점프 주소(낮은 주소의 하위 바이트 및 점프 명령 코드 940C)가 포함되어 있습니다.

0000002B: BE1F OUT 0x3F,R1 I/O 위치로 출력

이 0을 주소 0x3F에 기록합니다. I/O 보기 열을 보면 주소 0x3F가 컨트롤러의 플래그 레지스터인 SREG 레지스터의 주소임을 알 수 있습니다. 저것들. 0 조건에서 프로그램을 실행하기 위해 SREG를 재설정합니다.

1 2 3 4 +0000002C: E5CF LDI R28,0x5F 즉시 로드 +0000002D: E0D4 LDI R29,0x04 즉시 로드 +0000002E: BFDE OUT 0x3E,R29 I/O 위치로 출력 +0000002F: BFCD OUT 0x3D,R28 I/O 위치로 출력

0000002C: E5CF LDI R28,0x5F 즉시 로드 +0000002D: E0D4 LDI R29,0x04 즉시 로드 +0000002E: BFDE OUT 0x3E,R29 I/O 위치로 출력 +0000002F: BFCD OUT 0x3D,R28 I/O 위치로 출력

스택 포인터를 로드하는 중입니다. I/O 레지스터에 직접 로드할 수 없으며 중간 레지스터를 통해서만 로드할 수 있습니다. 따라서 먼저 LDI에서 중급으로, 그 다음 OUT에서 I/O로 이동합니다. 나중에 스택에 대해서도 자세히 설명하겠습니다. 지금은 이것이 RAM 끝에 달려 있고 주소와 중간 변수를 저장하는 동적 메모리 영역이라는 것을 알고 있습니다. 이제 스택이 시작될 위치를 표시했습니다.

00000032: 940C0041 JMP 0x00000041 점프

프로그램의 맨 끝 부분으로 이동하면 인터럽트와 자체 루프가 금지됩니다.

1 2 +00000041: 94F8 CLI 전역 인터럽트 비활성화 +00000042: CFFF RJMP PC-0x0000 상대 점프

00000041: 94F8 CLI 전역 인터럽트 비활성화 +00000042: CFFF RJMP PC-0x0000 상대 점프

이는 메인 기능을 종료하는 등 예상치 못한 상황이 발생한 경우입니다. 컨트롤러는 하드웨어 재설정이나 워치독의 재설정을 통해 이러한 루프에서 벗어날 수 있습니다. 글쎄, 또는 위에서 말했듯이 16진수 편집기에서 이를 수정하고 마음이 원하는 곳으로 질주하십시오. 또한 전환에는 JMP와 RJMP라는 두 가지 유형이 있으며 첫 번째는 주소로 직접 전환하는 것입니다. 4바이트를 차지하며 전체 메모리 영역을 직접 점프할 수 있습니다. 두 번째 전환 유형은 RJMP - 상대 전환입니다. 그의 명령은 2바이트를 사용하지만 현재 위치(주소)에서 1024단계 앞으로 또는 뒤로 이동합니다. 그리고 해당 매개변수는 현재 지점으로부터의 오프셋을 나타냅니다. 더 자주 사용되기 때문에 플러시 시 공간의 절반을 차지하며 긴 전환이 거의 필요하지 않습니다.

1 +00000034: 940C0000 JMP 0x00000000 점프

00000034: 940C0000 JMP 0x00000000 점프

그리고 이것은 코드의 맨 처음으로 이동하는 것입니다. 일종의 재부팅. 여기에서 모든 벡터가 점프하는 것을 확인할 수 있습니다. 결론은 이제 인터럽트를 활성화하고(기본적으로 비활성화되어 있음) 인터럽트가 발생했지만 핸들러가 없으면 소프트웨어가 재설정되고 프로그램이 맨 처음으로 되돌아간다는 것입니다.

기능 메인. 모든 것이 비슷하므로 설명할 필요조차 없습니다. 레지스터에 입력되는 이미 계산된 숫자를 살펴보십시오. 컴파일러 전처리기가 흔들립니다!!! 따라서 "마법의" 숫자는 없습니다!

1 2 3 4 5 6 7 8 9 10 11 12 <

00000036: E383 LDI R24,0x33 즉시 로드 +00000037: B989 OUT 0x09,R24 I/O 위치로 출력 15: UBRRH = HI(bauddivider); +00000038: BC10 OUT 0x20,R1 I/O 위치 16으로 출력: UCSRA = 0; +00000039: B81B OUT 0x0B,R1 I/O 위치 17로 출력: UCSRB = 1<

버그는 다음과 같습니다.

1 2 3 +0000003E: E080 LDI R24.0x00 즉시 로드 +0000003F: E090 LDI R25.0x00 즉시 로드 +00000040: 9508 RET 서브루틴 반환

0000003E: E080 LDI R24.0x00 즉시 로드 +0000003F: E090 LDI R25.0x00 즉시 로드 +00000040: 9508 RET 서브루틴 반환

문제는 컴파일러가 왜 그러한 상단을 추가하는가입니다. 그리고 이것은 Return 0에 지나지 않습니다. 함수를 int main(void)으로 정의했기 때문에 추가로 4바이트를 낭비했습니다. :) 그리고 void main(void)을 만들면 RET만 남지만 경고가 나타납니다. , 우리의 주요 함수는 아무것도 반환하지 않습니다. 일반적으로 원하는대로하십시오 :)

어려운? 분명히 그렇지 않습니다. 디스어셈블러 모드에서 단계별 실행을 클릭하고 프로세서가 개별 명령을 실행하는 방법과 레지스터에 어떤 일이 일어나는지 확인하세요. 명령과 최종 루핑을 통한 이동은 어떻게 발생합니까?

며칠 뒤에 계속됩니다...

오프탑:
알렉세이78내 사이트와 포럼을 더 쉽게 탐색할 수 있게 해주는 Firefox용 플러그인을 만들었습니다.
토론 및 다운로드,

Atmel Studio는 ARM Cortex-M 시리즈 프로세서 아키텍처를 기반으로 하는 Atmel 마이크로컨트롤러용으로 개발된 애플리케이션을 설계하고 디버그하는 기능을 제공하는 통합 개발 플랫폼입니다. Atmel Studio는 C/C++ 또는 어셈블리 언어로 생성된 애플리케이션을 디버그하고 구축할 수 있는 기능을 제공하는 원활하고 사용하기 쉬운 환경입니다. 여기에는 ARM 및 AVR 아키텍처용 1,600개 이상의 프로젝트가 포함된 완전 무료 Atmel Software Framework 소스 코드의 방대한 라이브러리가 내장되어 있습니다. 이러한 라이브러리를 갖는 것은 모든 프로그래머에게 큰 보너스입니다. 이 IDE는 다양한 AVR 기반 마이크로컨트롤러는 물론 Cortex-M3, Cortex-M4 코어를 사용하는 Atmel SAM3 기반 플래시 마이크로컨트롤러를 프로그래밍하는 데 사용할 수 있습니다.

Atmel Studio에는 프로그래머의 삶을 훨씬 쉽게 만들어주는 도구도 포함되어 있습니다. 플랫폼에는 Atmel Spaces 및 Atmel Gallery와 같은 솔루션이 포함되어 있습니다. Atmel Gallery는 개발 도구 및 통합 소프트웨어를 판매하는 온라인 상점입니다. Atmel Spaces는 Atmel 마이크로컨트롤러용 하드웨어 및 소프트웨어 프로젝트 파일의 공동 개발 및 저장을 위한 클라우드 기반 공간입니다.

주요 특징 및 기능

  • 완전 무료 통합 개발 환경입니다.
  • C/C++ 및 어셈블러 언어를 지원합니다.
  • 자세한 문서가 동반됩니다.
  • 다양한 애플리케이션을 위한 소스 코드 예제가 포함된 광범위한 라이브러리가 포함되어 있습니다.
  • Atmel 마이크로 컨트롤러 프로그래밍용으로 설계되었습니다.

특별 요구 사항

  • 1.6GHz 이상의 프로세서 클럭 주파수;
  • 1GB RAM의 32비트 시스템용;
  • 2GB RAM의 64비트 시스템용;
  • 가상 머신에서 실행하는 경우 추가로 512MB의 RAM이 권장됩니다.
  • 6GB의 여유 하드 디스크 공간.

이 버전의 새로운 기능은 무엇입니까?

7.0.790 (25.02.2016)

  • 확장 디버거(EDBG)에 대한 지원이 추가되었습니다.
  • 인터페이스 설정 프로필에 대한 지원이 추가되었습니다. 설정 패널의 키를 사용하여 프로필 간에 전환할 수 있습니다.
  • 이전에 가져온 프로젝트에 라이브러리를 가져오는 기능이 추가되었습니다. Arduino Zero 및 Zero Pro에 대한 지원이 추가되었습니다.
  • 이제 병렬 빌드가 기본적으로 활성화됩니다.
  • Xplained Mini용 펌웨어 업데이트;
  • 솔루션 탐색기의 "모든 파일 표시" 기능이 수정되었습니다.