PIC12F1822をアセンブラで動かす1

PIC12F1822をアセンブラでいろいろ動作させてみたので、少しづつ公開していきたいと思います。

まず、今頃PICかよっ!と突っ込みたくなる方も沢山いると思います。世の中にはArduinoやmbed等、いわゆるマイコンをより簡単にプログラミングできるボードが沢山あります。その流れにPICは完全に乗り遅れているのは事実です。

では、なぜPICなの?ということに対しての答えになりますが、それは、私が使いこなしているマイコンだからです。

PICは始めての方には癖のある構造であると良く言われます。==> はい、その通りです。

一つの命令を実行するのに4clock cycleかかります(avrは1clock cycleです) ==> はい、その通りです。

このように比較すると劣る部分があります。

しかし、これらは私にとって大きな問題とは思いません。これらを理解して使用できれば問題ではないと思います。

癖のある構造であるのは、慣れましたし、4cycleも慣れました。

今から、新しいマイコンにチャレンジするのに時間をかける必要もなく実現したいことができれば、上記は何も問題ではないのです。

8ピンのPICマイコンのPIC12F1822は、特に私が使いたい機能をこの小さいマイコンで持ち合わせています。

USART

PWM

SPI

ADC

タッチセンス

これがすべて入っています。特にUSARTは昔の8ピンの12Fxxxシリーズでは持っているものがありませんでした。そのためソフトウェアUSARTを実装する必要がありました。

しかし、12F1822はその必要もなく、今までの16FxxxシリーズのようにUSARTを使うことできます。

Web上では、12F1822をアセンブラで動作させている情報があまりなかったので、できるだけアップしていきたいと思います。

以下は、単純にRA0~RA5をHigh、Lowにするプログラム。RA0~RA5に1kΩの抵抗を介してLEDをつなげばLチカになります。

内部の発振器を16MHzに設定しています。Delay関数は20MHzのときをそのまま移植したので、コメントアウトしている時間はあっていませんが、動作はします。

また、ソースコードの表示は以下のプラグインを使ってみました。アセンブラ表示用は特に見つからなかったので、htmlを[ ]でくくる形で表示させてみました。(ググれば沢山例がでてきます)

SyntaxHighlighter Evolved

;**************************************************
;
;       Schematic
;
;**************************************************
;
;   12F1822
;   Internal 16MHz
;   +------+
;   |      |----------Vdd=5V
;   |      |----------RA5
;   |      |----------RA4
;   |      |----------RA3----4.7k---Vdd=5V
;   |      |----------RA2
;   |      |----------RA1
;   |      |----------RA0
;   |      |----------Vss=GND
;   +------+

;**************************************************
	list		p=12F1822      ; list directive to define processor
	#include	 ; processor specific variable definitions

    __CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF
    __CONFIG _CONFIG2, _WRT_OFF & _PLLEN_OFF & _STVREN_OFF & _BORV_19 & _LVP_OFF

    CBLOCK 0x20 ; Define GPR variable register locations
        COUNT
        COUNT1
        COUNT2
        COUNT3
        COUNT4
    ENDC

    ORG     0x0000            ; processor reset vector
    GOTO    START             ; When using debug header, first inst.
                              ; may be passed over by ICD2.

;------------------------------------------------------------------------------
; INTERRUPT SERVICE ROUTINE
;------------------------------------------------------------------------------

    ORG     0x0004

;------------------------------------------------------------------------------
; USER INTERRUPT SERVICE ROUTINE GOES HERE
;------------------------------------------------------------------------------

; Note the 12F1822 family automatically handles context restoration for
; W, STATUS, BSR, FSR, and PCLATH where previous templates for 16F families
; required manual restoration.  Shadow registers store these SFR values, and
; shadow registers may be modified since they are readable and writable for
; modification to the context restoration.

    RETFIE                    ; return from interrupt

;------------------------------------------------------------------------------
; MAIN PROGRAM
;------------------------------------------------------------------------------

START
    MOVLW   B'00100'
    MOVWF   BSR         ;BANK4

    MOVLW   B'00000000'
    MOVWF   WPUA
    ;WEAK PULL-UP PORTA REGISTER(BANK4) Disalbed :0, Enalbled :1
    ;BIT5,4,3,2,1,0
    ;Note 1: Global WPUEN bit of the OPTION register must be cleared for individual pull-ups to be enabled.
    ;Note 2: The weak pull-up device is automatically disabled if the pin is in configured as an output.

    MOVLW   B'00011'
    MOVWF   BSR         ;BANK3

    MOVLW   B'00000000'
    MOVWF   ANSELA
    ;PORTA ANALOG SELECT REGISTER(BANK3) DIGITAL : 0, ANALOG : 1
    ;BIT4 RA4
    ;BIT2 RA2
    ;BIT1 RA1
    ;BIT0 RA0

    MOVLW   B'00010'
    MOVWF   BSR         ;BANK2

    MOVLW   B'00000000'
    MOVWF   APFCON
    ;ALTERNATE PIN FUNCTION CONTROL REGISTER(BANK2)
    ;BIT 7 RX/DT assign to RA1 : 0, RA5 : 1
    ;BIT 6 SDO assign to   RA0 : 0, RA4 : 1
    ;BIT 5 /SS assign to   RA3 : 0, RA0 : 1
    ;BIT 3 T1G assign to   RA4 : 0, RA3 : 1
    ;BIT 2 TX/CK assign to RA0 : 0, RA4 : 1
    ;BIT 1 P1B assign to   RA0 : 0, RA4 : 1
    ;BIT 0 CCP1 assign to  RA2 : 0, RA5 : 1
    MOVLW   B'00000000'
    MOVWF   LATA
    ;PORTA DATA LATCH REGISTER(BANK2)
    ;BIT5,4,2,1,0

    MOVLW   B'00001'
    MOVWF   BSR         ;BANK1

    MOVLW   B'00000000'
    MOVWF   TRISA
    ;(BANK1)

    MOVLW   B'01111000'
    MOVWF   OSCCON
    ;(BANK1)
    ;OSCILLATOR CONTROL REGISTER
    ;BIT7 SPLLEN software pll enabled/disalbed
    ;BIT6~3 IRCF Osc Freq 1111=16MHz
    ;BIT1~0 SCS System Clock Select bits 00=Clock determined by FOSC in CONFIG1

    MOVLW   B'00000'
    MOVWF   BSR         ;BANK0

    MOVLW   B'11111111'
    MOVWF   PORTA
    ;(BANK0)
;------------------------------------------------------------------------------
; MAIN
;------------------------------------------------------------------------------
MAINLOOP
    MOVLW   B'11111110'
    MOVWF   PORTA
    CALL    TIME10M
    MOVLW   B'11111101'
    MOVWF   PORTA
    CALL    TIME10M
    MOVLW   B'11111011'
    MOVWF   PORTA
    CALL    TIME10M
    MOVLW   B'11101111'
    MOVWF   PORTA
    CALL    TIME10M
    MOVLW   B'11011111'
    MOVWF   PORTA
    CALL    TIME10M

    GOTO    MAINLOOP
;***********************************************************
;Delays
;***********************************************************

;100us(20MHz)
;0.2us x 500 = 100us

TIME100
	MOVLW	D'165'	; 1cycle
	MOVWF	COUNT	; 1cycle
	NOP				; 1cycle dummy
	NOP				; 1cycle dummy
LOOP
	DECFSZ	COUNT,F	; 1×(165-1)+2 = 166cycle
	GOTO	LOOP	; 2×(165-1) = 328cycle
	RETURN			; 2cycle
					; 1+1+1+1+166+328+2=500cycle

;49.2us(20MHz)
;0.2us x 246 = 49.2us

TIME50
	MOVLW	D'81'	; 1cycle
	MOVWF	COUNT	; 1cycle
	;NOP			; 1cycle dummy
	;NOP			; 1cycle dummy
	;NOP			; 1cycle dummy
LOOP50
	DECFSZ	COUNT,F	; 1×(81-1)+2 = 82cycle
	GOTO	LOOP50	; 2×(81-1) = 160cycle
	RETURN			; 2cycle
					; 1+1+82+160+2=246cycle

;10ms(20MHz)
;0.2us x 50000 = 10000us(10ms)
TIME10M
	MOVLW	D'99'	; 1cycle
	MOVWF	COUNT1	; 1cycle
	NOP				; 1cycle dummy
	NOP				; 1cycle dummy
LOOPP1
	CALL	TIME100	; (2+500)×99=49698cycle
	DECFSZ	COUNT1,F; 1×(99-1)+2 = 100cycle
	GOTO	LOOPP1	; 2×(99-1) = 196cycle
	RETURN			; 2cycle
					; 1+1+1+1+49698+100+196+2 = 50000

;1s(10MHz)
;0.2us x 5000000 =1000000 us

TIME1S
	MOVLW	63H		; 1cycle 63H=99
	MOVWF	COUNT2	; 1cycle
	MOVLW	62H		; 1cycle 62H=98
	MOVWF	COUNT3	; 1cycle
	MOVLW	03H		; 1cycle 03H=3
	MOVWF	COUNT4	; 1cycle
	NOP				; 1cycle dummy
LOOPP2
	CALL	TIME10M	;(2+50000)×99=4950198cycle
	DECFSZ	COUNT2,F; 1×(99-1)+2 = 100cycle
	GOTO	LOOPP2	; 2×(99-1) = 196cycle
LOOPP3
	CALL	TIME100	;(2+500)×98=49196cycle
	DECFSZ	COUNT3,F; 1×(98-1)+2 = 99cycle
	GOTO	LOOPP3	; 2×(98-1) = 194cycle
LOOPP4
	DECFSZ	COUNT4,F; 1×(3-1)+2 = 4cycle
	GOTO	LOOPP4	; 2×(3-1) = 4cycle
	RETURN			; 2cycle
					; 1x7+4950198+100+196+49196+99+194+4+4+2=5000000cycle

    END

コメントはまだありません »

コメントはまだありません。

この投稿へのコメントの RSS フィード。 TrackBack URL

コメントする