2011-02-12 2 views
1

나는 그것을 전혀 이해하지 못한다. 논평에서 어떻게 든 온라인으로 보는 모든 코드는 왜 그렇게 많은 사이클을하고 있는지에 대한 무작위 수를 가지고 있습니다. 그러나 왜 사람이 무엇을 어떻게하는지, 왜 무엇을하는지에 관해서는 사실상 아무런 설명이 없습니다. 나는 정말로 모른다. 예를 들어지연은 PIC ASM에서 어떻게 작동합니까? 나는 진정으로 당혹 스럽다

:

cblock 
Delay1 
Delay2 
Delay3 
endc 

Start: 

. 
. 
. 

Delay 
movlw .2 
movwf Delay1 ;&&&& 
movlw .3 
movwf Delay2 
movlw .4  <------ Important note here. For some reason it loops back to the 
movwf Delay3 <------ "&&&&" mark when it reads this piece of code. NO IDEA why 

DelayLoop 
decfsz Delay1,f <----- Explain what this does. Where does it get the time from? 
goto DelayLoop <----- Thanks 
decfsz Delay2,f <----- 
goto DelayLoop 

end 

어떤 도움을 환상적 일 것입니다.

+2

정확히 어떤 CPU가이 어셈블리 코드입니까? – zwol

+0

16F690 내 질문에 대한 답변을 생각합니다 –

+1

예제가 불완전합니다 (결코'Delay3'을 사용하지 않습니다). 왜 당신이 '&&&&'로 되돌아 간다고 생각하는지 모르겠습니다. 어떻게 그걸 생각해 냈어? – Gabe

답변

3

지연 루프 뒤에있는 아이디어는 일정 시간의 상관 관계가있는 특정 수의 사이클을 구우는 것입니다. 주기 당 시간은 PIC CPU의 클럭 속도에 따라 달라집니다. 는 http://www.piclist.com/techref/piclist/codegen/delay.htm

지침의 첫 번째 블록은 카운터와 3 개 개의 메모리 위치를로드 : 당신은 무엇을 게시

여기에서 생성 된 것과 유사한 3 단계 지연 루프입니다. 위의 프로그램을 사용하여 원하는 지연을 생성하는 최적의 값을 찾으십시오.

두 번째 명령 집합은 실제 지연입니다. "decfsz VAR, f"는 VAR을 1 씩 감소시킵니다. VAR이 0이면 다음 명령어를 건너 뜁니다. 따라서 위의 경우 decfsz는 Delay1이 0이 될 때까지 실행 된 다음 "goto DelayLoop"를 건너 뛰고 "decfsz Delay2, f"를 시작합니다. 고토의 작동 방식을 decfsz과에 더 도움을 http://www.piclist.com/techref/microchip/PIC16DelayTutorial.htm

: http://www.mstracey.btinternet.co.uk/pictutorial/progtut4.htm

또한이 페이지 :

나는이 페이지를 읽는 것이 좋습니다.

+0

나는 그것을 이해하지만, 나는 어디에서 정확한 타이밍을 얻을지 모르겠다. 어떻게 계산합니까? 이 번호는 어디서 오는 것입니까? VAR1을 15로 설정하면 어떻게 되나요? 3 개의 지연 변수를 4, 16, 12로 설정하면 타이밍은 어디서 오는 것입니까? 루프가 특정 시간이되도록하기 위해 그 숫자는 어떻게됩니까? 감사합니다. –

+1

http://www.piclist.com/techref/microchip/PIC16DelayTutorial.htm의 맨 아래 부분을 읽으십시오. 사이클 카운트가 몇 초까지 어떻게 이어지는 지 자세히 설명되어 있습니다. 단일 지연 루프의 경우 각 라운드에서 사용할 사이클 수를 계산하고 사이클 * 카운터를 곱한 다음 사이클 당 초 단위로 곱하여 초를 구합니다. – patrickmdnet

+0

괜찮아요, 조금 더 이해할 것 같아요 –

4

"나는 정말로 그것을 전혀 이해하지 못합니다. 내가 코멘트에서 어떻게 든 온라인으로 보는 모든 코드는 왜 많은 사이클을하고 있는지에 대한 무작위적인 숫자를 가지고 있습니다. 그러나 무엇이 무엇을 어디에서하는지에 관해서는 사실상 아무런 설명이 없습니다 누가 뭘하는지. 나는 정말로 모른다. "

"정확한 타이밍을 어디에서 얻을 수 있는지 잘 모르겠지만 어떻게 계산합니까?이 숫자는 어디서 발생 했습니까? 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 사이클을 가지고 있습니다.

+0

고맙습니다. –

1

내장 된 RC 발진기의 주파수가 클럭주기를 결정하며, 이는 차례로 속도를 결정합니다.