0

さて、私は3つのLEDを操作するために.asmを作成しましたが、私はずっと前にそれを作成し、コマンド/構造に非常に錆びています。このスクリプトが正確に何をするのかさえ理解できません!

私が知る限り、それは0から7までのバイナリでカウントされます(3つのLED = 0から7?)。

私の質問は、LEDが基本的なビジュアルバイナリクロックとして機能するために、LEDがオンになる間に最大1秒の遅延を追加するにはどうすればよいですか?

どうもありがとうございました。

; WRITTEN BY            JL
; DATE                  28/03/05
; FILE SAVED AS         SAMPLE6.ASM
; DEVICE                PIC16F684
; OSCILLATOR            XT (4MHZ)
; WATCHDOG              DISABLED
; FUNCTION              LEDs are switched ON in a binary sequence 
    list      p=16f684            ; list directive to define processor
    #include <p16f684.inc>        ; processor specific variable definitions
__CONFIG  _CP_OFF & _WDT_OFF &_PWRTE_ON & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF & _CPD_OFF

;*******************************Equates****************************************
PORTA EQU 05h
COUNT1 EQU 20h; Set up two counters to count down a delay
COUNT2 EQU 21h

;*******************************Defines****************************************
; define input/output designation for LEDs (what TRISA will equal)

#define TRIS_D0_D1  B'00001111' ; TRISIO setting for D0 and D1
#define TRIS_D2_D3  B'00101011' ; TRISIO setting for D2 and D3
#define TRIS_D4_D5  B'00011011' ; TRISIO setting for D4 and D5

; define LED state (what PORTA will equal)

#define D0_ON   B'00010000'     ; D0 LED
#define D1_ON   B'00100000'     ; D1 LED
#define D2_ON   B'00010000'     ; D2 LED

;****************************** Start of Program ******************************

           org     0x000               ; processor reset vector

;************* Initialize PortA **********
           movlw    B'00111111'     ; Set all I/O pins of PORTA as inputs
           TRIS    PORTA                
           clrf    PORTA               ; clear all outputs

;************** LED0 ON *********************
START        movlw  TRIS_D0_D1      ; move predefined value to TRISA to switch ON LED0
           TRIS    PORTA
             movlw  D0_ON              ; move predefined value to PORTA TO switch ON LED0
           movwf    PORTA
           decfsz   COUNT1,1       ;Subtract 1 from 00h (this gives 255 or FFh)
          goto     START          ;If COUNT is zero, carry on.
          decfsz   COUNT2,1       ;Subtract 1 from 00h
          goto     START          ;Go back to the start of our loop
;************** LED1 ON *********************
LOOP2       movlw   D1_ON              ; move predefined value to PORTA TO switch ON LED1
           movwf    PORTA
             decfsz   COUNT1,1       ;Subtract 1 from 00h (this gives 255 or FFh)
          goto     LOOP2          ;If COUNT is zero, carry on.
          decfsz   COUNT2,1       ;Subtract 1 from 00h
          goto     LOOP2          ;Go back to the start of our loop
;************** LED0 and LED1 ON **************
LOOP3    movlw  D0_ON              ; move predefined value to PORTA TO switch ON LED0
           movwf    PORTA
             movlw  D1_ON              ; move predefined value to PORTA TO switch ON LED1
           movwf    PORTA
          decfsz  COUNT1,1        ;Subtract 1 from 00h (this gives 255 or FFh)
          goto    LOOP3           ;If COUNT is zero, carry on.
          decfsz  COUNT2,1        ;Subtract 1 from 00h
          goto    LOOP3           ;Go back to the start of our loop
;************** LED2 ON *********************   
LOOP4        movlw  TRIS_D2_D3      ; move predefined value to TRISA to switch ON LED2
           TRIS    PORTA
             movlw  D2_ON              ; move predefined value to PORTA TO switch ON LED2
           movwf    PORTA
          decfsz   COUNT1,1       ;Subtract 1 from 00h (this gives 255 or FFh)
          goto     LOOP4          ;If COUNT is zero, carry on.
          decfsz   COUNT2,1       ;Subtract 1 from 00h
          goto     LOOP4          ;Go back to the start of our loop
;************** LED0 and LED2 ON **************
LOOP5        movlw  TRIS_D0_D1       ; move predefined value to TRISA to switch ON LED0
           TRIS    PORTA
             movlw  D0_ON               ; move predefined value to PORTA TO switch ON LED0
           movwf    PORTA
             movlw  TRIS_D2_D3       ; move predefined value to TRISA to switch ON LED2
           TRIS    PORTA
             movlw  D2_ON               ; move predefined value to PORTA TO switch ON LED2
           movwf    PORTA
            decfsz  COUNT1,1        ;Subtract 1 from 00h (this gives 255 or FFh)
          goto    LOOP5           ;If COUNT is zero, carry on.
          decfsz  COUNT2,1        ;Subtract 1 from 00h
          goto    LOOP5           ;Go back to the start of our loop
;************** LED1 and LED2 ON **************
LOOP6        clrf      PORTA               ; clear all outputs
             movlw  TRIS_D0_D1       ; move predefined value to TRISA to switch ON LED1
           TRIS    PORTA
             movlw  D1_ON               ; move predefined value to PORTA TO switch ON LED1
           movwf    PORTA
             movlw  TRIS_D2_D3       ; move predefined value to TRISA to switch ON LED2
           TRIS    PORTA
             movlw  D2_ON               ; move predefined value to PORTA TO switch ON LED2
           movwf    PORTA
            decfsz  COUNT1,1        ;Subtract 1 from 00h (this gives 255 or FFh)
          goto    LOOP6           ;If COUNT is zero, carry on.
          decfsz  COUNT2,1        ;Subtract 1 from 00h
          goto    LOOP6           ;Go back to the start of our loop
;************** LED0,LED1 and LED2 ON **************
LOOP7        movlw  TRIS_D0_D1       ; move predefined value to TRISA to switch ON LED0 and LED1
           TRIS    PORTA
             movlw  D0_ON               ; move predefined value to PORTA TO switch ON LED0
           movwf    PORTA
             movlw  D1_ON               ; move predefined value to PORTA TO switch ON LED1
           movwf    PORTA
             movlw  TRIS_D2_D3       ; move predefined value to TRISA to switch ON LED2
           TRIS    PORTA
             movlw  D2_ON               ; move predefined value to PORTA TO switch ON LED2
           movwf    PORTA
            decfsz  COUNT1,1        ;Subtract 1 from 00h (this gives 255 or FFh)
          goto    LOOP7           ;If COUNT is zero, carry on.
          decfsz  COUNT2,1        ;Subtract 1 from 00h
          goto    LOOP7           ;Go back to the start of our loop

;**********End of program *****************

          goto    START           ; indefinite loop
           END                        ; End instruction is needed by some compilers and also useful in case we miss goto instruction

;*********************************************************************************
4

1 に答える 1

1

はい、3 つの LED は 0 から 7 までカウントされます。次の 2 つのいずれかを行う必要があります。その種の pic での命令のタイミングは非常に決定論的です (割り込みがないことを前提としています)。そのため、1 秒相当の実行時間を消費するネストされたループがある場合は、それが実行されます。もう 1 つのオプションは、ハードウェア タイマーを使用することです。タイマーは、システム (チップ/マイクロコントローラー) クロックから派生したレートで刻みます。クロックのレートと、有効/設定した除数の数がわかれば、待機する必要があるクロックティックの数を判断できます。たとえば、4MHz クロックは 1 秒あたり 400 万ティックです。1 つの 8 除算がある場合、500,000 クロック ティックをカウントする必要があります。たとえば、16 ビット タイマーしかない場合、65536 カウントでロールオーバーするため、7.629 ロールオーバーを待つ必要があります。または別の除数などを使用します。あなたのオプションが何であるかを知るために、その部分のデータシートを読み直す必要があります。タイマーを 50,000 までカウントしてから、10 回ロールオーバーするのを見たいと思うかもしれません。最も簡単な方法は、タイマーを最大カウントから最小カウント、または最小カウントから最大カウントにロールオーバーさせることです。たとえば、それが 16 ビット カウンターであり、それがカウントアップし、フリー ランおよびオートロードして 0xFFFF まで上昇する場合、次のカウントは 0x0000 です。カウントダウンすると、0x0000 から 0xFFFF になります。方向に応じて、16 ビット カウンターの場合、たとえば、タイマーのサンプルを取得して A と呼び、別のサンプル B を取得して、B - A (アップカウント タイマーの場合) >= 10,000 (いくつかのタイマーの能力よりかなり小さい数. ロールオーバー全体でも BA デルタは機能します. 10,000 ティックに達したら、A = A + 10,000. もう一度やり直してください. 必要なティック数が得られるまでこれを繰り返します。この簡単な例では、4MHz を 8 クロックで割ると、500,000 カウントで 10,000 カウントのダンスが 50 回繰り返され、それが 1 秒になります。

写真にはありませんが、他のマイクロコントローラーには、このhttp://github.com/dwelch67のさまざまな例があります(各レポでウィンカーの例を探してください)。

于 2012-04-24T22:11:04.237 に答える