AVR 마이크로 컨트롤러의 출력 핀 용 하드웨어 XOR

May 30, 2022 0 By vhemf

많은 AVR 칩은 출력 핀의 논리 수준에 관한 것일 때 많은 AVR 칩 유형이 하드웨어 배타적 인 또는 (XOR) 옵션이 있음을 알고 계셨습니까? 데이터 시트를 살펴보면 (위의 이미지는 Attiny13 데이터 시트의 스크린 샷이며) 핀을 토글하는 섹션을 찾을 수 있습니다. 포트를 출력으로 설정하면 해당 핀 레지스터에 로직을 기록하면 논리 수준을 토글합니다. C에서 작성하는 경우에는 정말로 방치하기가 쉽지만 조금 어셈블러 언어를 배우고이를 매우 유용하게 만들었습니다. 휴식 후 계속 읽고 나는이 정보에 어떻게 일어 났는지와 그것이 무엇을 위해 좋은지 알려 드리겠습니다.

그래서 먼저 C 코드에 쓰는다면 이것이 중요하지 않은 이유에 대해 이야기 해 봅시다. 일반적으로 일부 출력 핀을 전환하려면 BITMASK가있는 XOR의 XOR을 쓸 수 있습니다.

1
portb ^ = 0xff;

이것은 현재 출력 수준에서 XOR을 수행하고 결과를 포트에 다시 쓰는 C의 약간의 C 단축 (내 튜토리얼 시리즈에서 훨씬 더 많은 것을 알아보십시오)입니다. BITMASK를 PINB 레지스터에 기록하여 하드웨어에서 동일한 일을 하드웨어로 수행 할 수 있습니다.

1
pinb = 0xff;

당신은 단지 한 줄의 코드 일뿐이기 때문에 정말로 신경 쓰지 않습니다. 실제로 그것은 아마도 Portb가 개념적으로 더 많은 의미를 갖기 때문에 아마도 Portb에게 더 간단합니다. 그러나 컴파일러는 핀 레지스터에 기록한 경우보다 훨씬 더 많은 사이클을 사용하여 끝날 수 있습니다.

나는 어셈블러를 배우는 방법으로 약간의 LED를 깜박이기 때문에 나는이 기능을 가로 질러 일어났습니다. 인터럽트 서비스 루틴에서 코드를 뒤죽박죽이었습니다.

1
2

4.
LDI Myreg, 0xff.
Intreg, Portb.
eor Intreg, Myreg.
out portb, intreg.

BITMASK를 하나의 레지스터에로드하고 PORTB에서 다른 레지스터로 현재 로직에로드하고 두 가지의 XOR을 수행하고 결과를 PORTB에 다시 씁니다. 이것은 4 개의주기가 필요하며 두 개의 레지스터가 필요합니다. 비트를 토글 링은 그런 초보적인 일이며, 나는 깜짝 놀랐으므로 XOR 비트에 직접 명령이 없으므로 주위를 찾기 시작했습니다. 나는이 짧은 기사를 비트 토글 (Bitto Toggle) 기능으로 만드는 AVR 괴물에서 끝났습니다. 이제는 다음과 같이 어셈블러 코드를 줄일 수있었습니다.

1
2
ldi intreg2, 0xff; 임시 사용트 intreg2를 비트 마스크로 사용
pinb, intreg2; pinb speetivley에 쓰는 것은 독점적이거나 portb

이로 인해 동일한 토글 링 효과가 발생하지만 두 개의주기가 필요하며 하나의 레지스터 만 사용해야합니다.

내가 많은 흥미로운 점은 AVR 칩을 얼마나 많이 사용 하든지, 데이터 시트에서 발견되기를 기다리는 놀라움의 부족은 결코 결코 부족하다는 것입니다.