"나는 정말로 그것을 전혀 이해하지 못합니다. 내가 코멘트에서 어떻게 든 온라인으로 보는 모든 코드는 왜 많은 사이클을하고 있는지에 대한 무작위적인 숫자를 가지고 있습니다. 그러나 무엇이 무엇을 어디에서하는지에 관해서는 사실상 아무런 설명이 없습니다 누가 뭘하는지. 나는 정말로 모른다. "
"정확한 타이밍을 어디에서 얻을 수 있는지 잘 모르겠지만 어떻게 계산합니까?이 숫자는 어디서 발생 했습니까? VAR1을 15로 설정하면 어떤 변화가 생깁니 까? 3 개의 지연 변수를 4, 16, 12로 설정하면 타이밍은 어떻게됩니까? 특정 시간에 루프를 발생시키는 숫자는 어떻게됩니까? 감사합니다 - Jimmy Page "
다음 질문 :
이
16F690 데이터 시트는 말한다 :
하나 개의 명령어 사이클이 오실레이터 frequenc 네 개의 오실레이터 기간 구성 y가 4 MHz 인 경우 1 μs의 정상적인 명령 실행 시간을 제공합니다. 조건부 테스트가 참이거나 명령어의 결과로 프로그램 카운터가 변경되지 않는 한 모든 명령어가 단일 명령어 사이클 내에서 실행됩니다. 이 경우 실행은 두 번째 사이클이 NOP로 실행되는 두 개의 명령 사이클을 필요로합니다.
이
Top
decfsz Delay1,f
goto Top
우리 decfsz 실행할 때마다 주식 한 사이클을 얻을 :
그래서 딜레이가 값 3을 가지고 있으며, 우리가이 루프가 있다고 할 수 있습니다. IF f가 0이고 건너 뛸 때 2 사이클 명령이됩니다. 우리가 goto를 실행할 때마다 pc가 변경되어 2 사이클 명령이됩니다.그래서 우리는 루프를 걸어 나는이 형식
딜레이 명령은 명령이, 사이클, 총 사이클
3,decfsz,1,1
2,goto,2,3
2,decfsz,1,4
1,goto,2,6
1,decfsz,2,8
을 실행하는 데 사용하기 전에 값 그래서 3에서 시작 딜레이와 그 자체로 그 루프했다 (8)을 사용하여 표시하는 경우 사이클 또는 우리가 4mhz에서 달리면 8us. 사이클을 먼저 계산 한 다음 부품의 클록 속도를 조정해야합니다. 동일한 코드는 2mhz에서 실행될 때 16us 또는 1mhz에서 실행될 때 32us가 될 수 있습니다.
그래서 우리는 f 값이 1이 아닌 f 값의 경우 decfsz + goto 쌍이 2 + 1 = 3 사이클임을 알 수 있습니다. 우리가 decfsz에 1을 치면 한 번 2 사이클이됩니다. 따라서 Delay1이 3 인 경우 엔 2가 아닌 항목 값 (3,2)이됩니다. 마지막으로 decfsz를 누르고 건너 뛰기 총 사이클 ((3-1) * 3) + 2 = 8에 대해 2 사이클을 추가하십시오.
Delay1을 11로 설정하면이 루프에 들어가면 ((11-1) * 3) + 2 = 32 사이클이되며 7은 20 사이클이됩니다.
또 하나의 decfsz 루프를 감싸고 다른 루프를 감싸면 실행 된 사이클의 수를 계속해서 늘릴 수 있습니다. 딜레이는 3가는이며, 지연 2는 딜레이의 decfsz를 통해 처음으로 그 다음 2
Top
decfsz Delay1,f
goto Top
decfsz Delay2,f
goto Top
경우, 우리가 알고있는 고토 루프는 8주기이다. 첫 번째 decfsz Delay2, f는 Delay2가 1이 아니므로 1 사이클이며 우리는 총 9 개입니다. 고토는 2 더, 11 합계입니다. f 메모리가 8 비트라고 가정하면 두 번째로 Delay1 루프를 두 번째로 입력하면 0을 입력하고 0x100 또는 256으로 수학을 계산합니다 ((256-1) 3) + 2 = 767 more 사이클, 지금까지 총 778. Delay2는 이제 1이므로, 이것은 최종 decfsz Delay2, f이므로 우리는 2, 총 780 사이클을 소비합니다. (Delay2-1) (((256-1) * 3) +2)) + (((Delay1) -1) * 3)에 가까운 사이클을 계산하기위한 알고리즘을 생각해 낼 수 있습니다. +2) + ((지연 2-1) * 3) +2 사이클.
그리고 내 루프가 당신보다 한 decfsz 루프에 의해 작은 있지만, 당신이 할 경우 광산은 다른 지시로 시작하는 것이 당신을에서 유사 : 우리는 두 movlw의의 4주기 이상을 추가 할 필요가
Entry
movlw .3
movwf Delay1
movl2 .2
movwf Delay2
Top
decfsz Delay1,f
goto Top
decfsz Delay2,f
goto Top
실행하는 사이클 수에 대한 전체 방정식에 두 개의 movwf가 있습니다.
말 그대로, 왜 그렇게 많은 사이클을 실행하는지에 대한 설명이 있습니다. 그리고 그 설명은 장치의 데이터 시트에 있습니다.
하자. patrickmdnet이 링크 된 코드 생성기를 사용하여 780 사이클을 생성하십시오.
; Delay = 780 instruction cycles
; Clock frequency = 4 MHz
; Actual delay = 0.00078 seconds = 780 cycles
; Error = 0 %
cblock
d1
d2
endc
;778 cycles
movlw 0x9B
movwf d1
movlw 0x01
movwf d2
Delay_0
decfsz d1, f
goto $+2
decfsz d2, f
goto Delay_0
;2 cycles
goto $+1
이 루프는 약간 다른 구조로되어 있습니다.
우리가 Delay_0에 도착하기 전에 우리가 F 레지스터를로드의 4 개주기 시작
내부 decfsz이 하나 이상 건너 뛰고 고토 직접 귀하의 질문에 코드와 내 위의 설명으로 Delay_0 최대 분기하지 않는 루프 decfsz d2, f. 따라서 아무도 그 루프를 통과하지 못하면 decfsz에 대해 1 사이클, goto Delay_0에 대해 $ 2 + 2 사이클과 2 사이클, 각 비 -d1에 대해 총 5 사이클이 있습니다. 그리고 d1이 1 인 시간에 두 개 더 더하십시오. 이것은 우리에게 ((0x9B-1) * 5) +2 = 772 싸이클을 추가하기 전에 4 사이클을 추가하기 전에 우리는 776 싸이클까지입니다.
마지막으로 decfsz d1, f는 decfsz d2, f에 d2가 0x01로 설정되어 있음을 의미합니다. 이는 건너 뛸 수 있음을 의미합니다.그것은 2 사이클입니다, Goto $ + 2는 movlw/movwf 대신에 다른 goto $ + 1을 사용하여 d2를로드하면 같은 결과를 얻었을 것입니다. 어쨌든이 2 사이클의 명령은 우리에게 총 778 사이클을 가져옵니다.
780에 도달하려면 2 사이클이 더 필요합니다. 그리고 여기에 goto $ + 1로 끝납니다. 사이클. 우리는 프로그램 생성을 요청한 780 사이클을 가지고 있습니다.
정확히 어떤 CPU가이 어셈블리 코드입니까? – zwol
16F690 내 질문에 대한 답변을 생각합니다 –
예제가 불완전합니다 (결코'Delay3'을 사용하지 않습니다). 왜 당신이 '&&&&'로 되돌아 간다고 생각하는지 모르겠습니다. 어떻게 그걸 생각해 냈어? – Gabe