PICプログラムの基礎 プログラミング言語 • 高水準言語 人間にわかりやすい 機械的に効率が悪い BASIC、FORTRAN、JAVA等 ・低水準言語 CPUにわかりやすい 機械的に効率がよい C、アセンブリ言語 アセンブリ言語の用途(1) • CPUの性能をフルに引き出すプログラム • 周辺機器の直接制御 • 高水準言語の構築 • CPU内臓ICへのプログラム アセンブリ言語の用途(2) • 定められた動きをすればよい • 周辺機器を直接制御したい • 大量生産が必要である 一度アセンブリ言語でプログラムし、ICそのも のに書き込んでしまう PIC • • • • • Microchip社のマイクロコンピュータ 電化製品などの制御に利用 CPU、プログラム、メモリ、周辺I/Oをすべて一体化 プログラムが簡単 安価 用途に応じさまざまな種類があるが、この基板 ではPIC16F84Aを使用する。 PICの動作(電源等) • 電源 +5VをVdd、 アースをGND • MCLRには+5V (電源ON時の動作 安定のためのおまじない) PICの動作(クロック) • 20MHzの クロックを OSC1、OSC2に 与える PICの動作(入出力) • 任意のポートを 入力・出力に 設定可能 • ポートA • ポートB 5BIT 8BIT 教材基板の回路 • ポートA: RA2~RA4 トグルスイッチ1~3によるプログラム 選択 RA0、RA1 74HC139を介してTR9をプルアップ、 発光ダイオード列を「選択」する • ポートB: 出力8bitが発光ダイオード8つに対応する ポートAで発光ダイオード列を選択、ポートBで個々の 発光ダイオードを制御 教材PICボードの回路 • ポートAの2bit(RA0、RA1)で点灯するLED 群を切り替える • • • • RA0=0、RA1=0 RA0=0、RA1=1 RA0=1、RA1=0 RA0=1、RA1=1 → → → → 7セグメントLED1 7セグメントLED2 さいころ 8列LED 教材PICボードの回路 発光ダイオード 発光ダイオードが点灯するには ・アノード側がHIGH ・カソード側がLOW 教材PICボードの回路 教材PICボードの回路 LED点灯部分にのみ着目する LED群は4セット 7セグメントx2、さいころ、8列LED ・PICのポートB(8bit)の出力がそれぞれのLE D群に接続されている ・ポートの出力がLOW(0)のときLEDが点灯 する ポート出力例 ・数値 03HをポートAに出力 → 8列LED を選択 ・数値 0CBHをポートBに出力 0CBH→11001011→●●○○●○●● プログラム(ポートA) 発光ダイオード列の「選択」 ポートAに ・2進数表記では ・16進数表記では03H LLLHH 00011 プログラム(ポートB) 発光パターン ●○●●○○●○ ポートBに LHLLHHLH ・2進数表記では 01001100 ・16進数表記では04CH 実際のプログラム • プログラムにはアセンブラを使う ポートAに00011(03H)を出力せよ ポートBに10110010(0B2H)を出力せよ アセンブリプログラム 相当するアセンブリプログラムのコア部分 MOVLW MOVWF MOVLW MOVWF 03H PORTA 0B2H PORTB (実際には各種設定が必要なのでもっと長い) PICプログラムの流れ • アセンブリソースの作成(ASMファイル) • MPASMによるアセンブル → 機械語(HEXファイル)の作成 • PICライターによるPICへの書き込み PICプログラミング例 ・全体的構造 初期設定 MAINLP メインルーチン GOTO MAINLP TIMERルーチン 初期設定 ;宣言 LIST P=FIC16F84A ; INCLUDE "P16F84a.INC" ;標準ヘッダ定義ファイルのインクルード ; 変数レジスタの定義 CNT1 CNT2 CNT3 EQU EQU EQU 0CH 0DH 0EH ;タイマ用変数 ;タイマ用変数 ;タイマ用変数 ; 入出力ポートの定義など ORG 0 MAIN BSF STATUS,RP0 ;バンク1へ切り替え CLRF TRISA ;TRISAをクリア CLRF TRISB ;TRISBをクリア BCF STATUS,RP0 ;バンク0に戻す メインループ MOVLW 03H MOVWF PORTA ;8列LEDを出力先に選択 MAINLP MOVLW 0FH MOVWF PORTB CALL TIMER ;ポートBに出力 ;少し待つ ・・・・・・・・・・・・・・・・・・・・・ MOVLW 0DH MOVWF PORTB CALL TIMER GOTO MAINLP ;ポートBに出力 ;少し待つ タイマールーチン ; 0.4msec タイマ TIM10 MOVLW 0F9H MOVWF CNT1 TIMLP1 NOP DECFSZ CNT1,F GOTO TIMLP1 RETURN ; 100msec タイマ TIM100 MOVLW 0F9H MOVWF CNT2 TIMLP2 CALL TIM10 DECFSZ CNT2,F GOTO TIMLP2 RETURN ; 0.5sec タイマ TIMER MOVLW 5 MOVWF CNT3 TIMLP3 CALL TIM100 DECFSZ CNT3,F GOTO TIMLP3 RETURN END ;1 ;1+1=2 ;1+1+2=4 ;2+4*249-1=997 ;997+2=999*0.4μsec=0.4msec ;0.4msec *249(about) ;2+(999+2+3)*249-1=249997 ;100msec * 5(about) PICプログラミング例 ・ポートへの出力の基本的パターン MOVLW 0FH MOVWF PORTB CALL TIMER ;ポートBに出力 ;少し待つ ・数値0FH→00001111 がポートBに出力され る アセンブリプログラム作成上の注意 ・ラベルは行の先頭から書く ・命令はタブ、もしくは半角空白の後に書く ・コメントは“;”に続けて書く ・全角空白は使わない MAINLP ←ラベル MOVLW 0FH ←命令 ;これはコメント ←コメント
© Copyright 2025 ExpyDoc