2013-06-06 1 views
2

80MHz 클록 속도로 실행되는 PIC32를 구성했습니다. 테스트로서, 그것만 범위에있어서 625kHz에서 토글 DIO있어pic32 가장 빠른 전환 방법 DIO

while(1) {   
    LATFbits.LATF4 = !LATFbits.LATF4; 
} 

와 DIO 핀 전환하려고. 해킹 된 목록을보고

9D000118 8C446160 LW A0, 24928(V0) 
9D00011C 30840010 ANDI A0, A0, 16 
9D000120 2C840001 SLTIU A0, A0, 1 
9D000124 8C436160 LW V1, 24928(V0) 
9D000128 7C4 INS V1, A0, 4, 1 
9D00012C AC436160 SW V1, 24928(V0) 
9D000130 0B400046 J 0x9D000118 

많은 지침이 아닙니다. 왜 이렇게 느린가요?

==============

마지막으로 조립

#include<p32xxx.h> 

.text 
.set noreorder 
.set nomacro 

.global toggle 
.ent toggle 

toggle: 

# void toggle(int mask) 

# $a0 - mask 
# performs toggles in an infinite loop (never returns) 

# la $t0, 0xbf886160 # LATF base address 04:clear 08:set 12:inv 

la $t0,LATF 

loop: 
sw $a0, 4($t0)  # write mask to clear 
sw $a0, 8($t0)  # write mask to set 
j loop 
nop 

.end toggle 
+0

가'SYSTEMConfigPerformance을 추가하는 것을 잊지 (예를 들면 인해 MEM 대기 시간에) CPU가 전환 할 수있는 다음 높은 경우, 더 높은 속도에 도달 할 수있을 비교 80000000UL);'처음에는 진술. 이제 3MHz로 토글됩니다. Beryllium의 의견으로 나는 토글 링을'LATFINV = 0x10;'으로 바꾸었다. 이제는 8MHz로 토글한다. 나는 용감한자가'sw '에 직접 어셈블리 코드를 작성할 수 있다고 생각한다. 어떻게 제대로 파이프 라인을해야할지 모르겠다. 시험판과 오류로 11MHz의 어셈블리 코드가 있습니다. –

+0

은 [microchip forum] (http://www.microchip.com/forums/tm.aspx?m=404723&high=)에서 비슷한 토론을 보았습니다. –

답변

1

와 20MHz의 (4 지침)을 얻을 당신이 INV 레지스터를 사용하여 포트를 전환하려고 있나요? 트리스, 포트 및 LAT베이스 레지스터
모듈
원자 비트 조작을 제공하는 SET, CLR과 INV 레지스터와 연관되어 각각의 포트에 더하여

및 허용 속도 I/O 핀의 동작.

0

이러한 아이디어는 비대칭 파형을 나타내지 만 초당 전환 수를 증가시킵니다.

필자는 고속 샘플링이 필요할 때 비슷한 방법을 사용했습니다. 이미 언급 한 다른 아이디어와 함께

: 또한 PIC24으로 루프

while(1) {   
    LATFbits.LATF4 = 0; 
    LATFbits.LATF4 = 1; 
    LATFbits.LATF4 = 0; 
    LATFbits.LATF4 = 1; 
    LATFbits.LATF4 = 0; 
    LATFbits.LATF4 = 1; 
    ... 
    LATFbits.LATF4 = 0; 
    LATFbits.LATF4 = 1; 
} 

의 오버 헤드를 줄일 수

while(1) {   
    LATFbits.LATF4 = 0; 
    LATFbits.LATF4 = 1; 
} 

, 나는 많은 DIO에 타이머 출력을 구성 할 수 있습니다 핀을 사용하고 하드웨어가 신호를 생성하도록합니다. 나는 PIC32로 같은 것을 할 수 있다고 생각한다.

0

(ds) PIC의 C30 컴파일러는 F 장치와 2 개의 -E 장치에서 한 명령에서 비트 토글을 수행하기 위해 _builtin_btg()을 사용합니다. PIC32도 가지고 있는지 확인하십시오. 아마 그것은 E 시리즈처럼 afaik PIC32가 반드시 1 사이클/I/O 명령이 될 필요가 없기 때문에 절반 밖에 가지 못하게 될 것입니다. 출력과 같은

또한 사용하는 모듈은 (당신이 모듈의 주변 시계가