C.K PRIVATE PICマイコン,

WEB・PIC

C.K PRIVATE PICマイコン

C.K PRIVATE / 2009年・PICマイコンのページです
PICマイコンの基礎やプログラムの紹介です

2009.12.26   テーブルとポインタ?

僕はまだちょっと理解できていない部分があるのですがテーブルとポインタの違い・・
ちなみに下がテーブルの一番簡単な使い方です☆
二行目のテーブルの中に6個のデータが入っていて、その部分を変数nを使って
最終的にPORTDに入れます、勿論LEDなど使えばそのように光ります

#include<p18f4520.h>
const rom unsigned char table[6] = {0x46,0x45,0x44,0x43,0x42,0x41 };
void main(void)
{
  char n;
  TRISD =0;

  for(n=0; n<6; n++)
  {
    PORTD = table[n];
  }
}


2009.12.19   電圧値と精度&最速クロックの設定


項目     内部の場合      外部の入力の場合     備考
vref+    電源電圧Vdd      Vss+3.0V以上       vref+ - vref->3.0Vリファレンス
vref-    グランドVss       Vdd-3.0V以下       電圧差が3.0V以上でないと10ビット

アナログ入力源の   2.5KΩ以下                 高くなると精度が悪化する
出力インピーダンス

 

リファレンス電圧源の 250Ω以下                  高くなると精度が悪化する

 

出力インピーダンス

アクイジションタイム 12.86μsec以上                25度での標準値

 

クロック周波数  ADCS2:0    Tad値     μsec     ACQT2:0設定     合計変換時間
1.25Mhz       Fosc/2     (000)      1.6        100 8Tad=12.8μsec (8+11)Tadから、
2.50Mhz       Fosc/4     (100)      1.6         これ以下では使えない 30.4μsec
5.00Mhz       Fosc/8     (001)      1.6
10.0Mhz       Fosc/16    (101)      1.6
20.0Mhz       Fosc/32    (010)      1.6
40.0Mhz       Fosc/64    (110)      1.6
-----------------------------------------------------------------------------------------
1.00Mhz(RC) Frc (111) 4.0 010 4Tad 44+16=60μsec


2009.12.12   アナログチャンネル数の設定


PCFG3:
PCFG0:AN12 AN11 AN10 AN9 AN8 AN7 AN6 AN5 AN4 AN3 AN2 AN1 AN0
0000   A    A   A    A   A   A  A   A   A   A  A   A   A
0001   A    A   A    A   A   A   A   A   A   A  A   A   A 
0010   A    A   A    A   A   A  A   A   A   A  A   A   A
0011   D    D   A    A   A   A  A   A   A   A  A   A   A  
0100   D    D   D    A   A   A  A   A   A   A  A   A   A  
0101   D    D   D    D   A   A  A   A   A   A  A   A   A
0110   D    D   D    D   D   A  A   A   A   A  A   A   A
0111   D    D   D    D   D   D  A   A   A   A  A   A   A
1000   D    D   D    D   D   D   D   A   A    A A    A   A
1001    D    D    D    D    D   D   D   D   A    A  A   A    A
1010    D    D    D    D    D   D   D   D   D    A  A   A    A
1011    D    D    D    D    D   D   D   D   D    D  A   A    A
1101    D    D    D    D    D   D   D   D   D    D  D   A    A
1110    D    D    D    D    D   D   D   D   D    D  D   D    A
1111    D    D    D    D    D   D   D   D   D    D  D   D    D
(PORTB ) (OSC )(PORTA )
A=アナログ入力 D=デジタル入出力

2009.12.5   A/Dライブラリ関数

関数            書式と使い方
BusyADC         A/Dコンバータのビジーチェック
               「書式」char BusyADC(void);
                  変換中の戻り値=1 変換中でないとき=0
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
               A/Dコンバータを無効化し割り込みも無効化する
CloseADC        「書式」char CloseADC(void);
--------------------------------------------------------------------------
              A/D変換の開始制御、変換終了はBusyADC()でチェックする
              「書式」Void ConvertADC(void);
              「例」 SetChanADC(ADC_CH1);
Convert ADC      ConvertADC();
              While(BusyADC)());
               result=ReadADC();
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
              A/Dコンバータの初期設定を行う
              「必要ファイル」<adc.h>
              「書式」OpenADC(Unsigned char config, unsigned char config2,
              unsigned char portconfig);

              config用パラメータは下記を&で接続して指定
              「クロックソース」
              ADC_FOSC_2 Fosc/2 ADC_FOSC_4 Fosc/4
              ADC_FOSC_8 Fosc/8 ADC_FOSC_16 Fosc/16
             ADC_FOSC_32 Fosc/32 ADC_FOSC_64 Fosc/64

             「結果の配置」
             ADC_0_TAD 0Tad ADC_2_TAD 2Tad
              ADC_4_TAD 4Tad ADC_6_TAD 6Tad
             ADC_8_TAD 8Tad ADC_12_TAD 12Tad
             ADC_16_TAD 16Tad ADC_20_TAD 20Tad
OpenADC        Config2用パラメータ

            「チャンネル選択」
            ADC_CH0 ADC_CH1 ADC_CH2 ADC_CH3
            :
            :
            ADC_CH12 ADC_CH13 ADC_CH14 ADC_CH15

            「割り込み」
            ADC_INT_ON ADC_INT_OFF

            「リファレンス設定」
            ADC_REF_VDD_VREFMINUS ADC_REF_VREFPLUS_VREFMINUS
            ADC_REF_VREFPLUS_VS ADC_REF_VDD_VSS

            Portconfigの設定値
             ADCON1に設定するピンのアナログ(0)デジタル(1)の設定
            (同フォルダ内のアナログチャンネル表のPCFG3:PCFG0の欄を参照)
            または、下記のいずれかを指定
            ADC_0ANA ADC_1ANA ADC_2ANA ADC_3ANA ADC_4ANA
            :
            :
            ADC_11ANA ADC_12ANA ADC_13ANA ADC_14ANA ADC_15ANA
             「例」 OpenADC( ADC_FOSC_32 & ADC_RIGHT_JUST & ADC_12_TAD
            ADC_CH0,ADC_VREF_PLUS_VDD & ADC_VREF_MINUS_VSS,0x0D);
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
            A/D変換の結果を読み出す、戻り値は符号付16ビット
ReadADC      「書式」 int ReadADC(void);
             [例] result=ReadADC();
--------------------------------------------------------------------------------------------
              A/D変換するチャンネルの選択
             「書式」void SetChanADC(unsigned char channel);
SetChanADC     channelには下記のいずれかを指定
              ADC_CH0 ADC_CH1 ADC_CH2 ADC_CH3
              :
              :
              ADC_CH12 ADC_CH13 ADC_CH14 ADC_CH15


2009.11.28   A/D

/**************************************
*PIC18F2320テストPG(ad.c)
* A/D変換モジュールの使用例
* 機能
* タイマ0の3msec周期によりダイナミック点灯制御
* 0.2秒周期で温度データを計測してセグメントLEDに表示
* フルスケール0-50℃とする
************************************/

/*ライブラリ関数の読み込み*/
#include<p18f2320.h>
#include<delays.h>
#include<adc.h>
#include<timers.h>

/*コンフィギュレーションの設定/*
#pragma config OSC=HSPLL,FSCM=OFF,IESO=OFF,PWRT=ON
#pragma config BOR=ON,BORV=45,WDT=OFF,WDTPS=1024
#pragma config MCLRE=ON,PBAD=DIG,CCP2MX=C1
#pragma config STVR=OFF,LVP=OFF,DEBUG=OFF
#pragma config CP0=OFF,CP1=OFF,CP2=OFF,CP3=OFF,CPB=OFF
#pragma config CPD=OFF,WRT0=OFF,WRT1=OFF,WRT2=OFF,WRT3=OFF
#pragma config WRTB=OFF,WRTC=OFF,WRTD=OFF,EBTR0=OFF
#pragma config EBTR1=OFF,EBTR2=OFF,EBTR3=OFF,EBTRB=OFF

///グローバル変数定義
static int Result,Ondo,flag; //グローバル共有変数

///数値からセグメントデータ変換テーブル
int const LED_SEG[11]= //セグメント変換用配列定義
{0x7E,0x0C,0xB6,0x9E,0xCC,0xDA,0xFA,0x0E,0xFE,0xCE,0x80};

///メイン関数
void main()
{
//ポート初期設定
LATB=0; //LED全消灯
TRISB=0; //ポートA全ピン出力
LATC=0; //全桁オフ
TRISC=0x18; //SW1.SW2.以外出力

//A/Dコンバータ初期設定
///A/Dコンバータ初期設定クロック、リファレンス、ポートの設定
OpenADC(ADC_FOSC_32 & ADC_RIGHT_JUST & ADC_12_TAD,ADC_CH0
& ADC_INT_OFF & ADC_REF_VDD_VSS,ADC3ANA);

//タイマ0初期設定
///タイマ0の初期設定、3msecインターバルで割り込み
OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_1);
WriteTimer0(0x8ACF); //3msec設定
INTCONbits.TMR0IE=1; //タイマ0割り込み許可
INTCONbits.GIE=1; //グローバル割り込み許可

////アナログ入力繰り返しループ
//チャンネル0のA/D変換データを読み込み温度データにスケール変換
while(1)
{
SetChanADC(ADC_CH0); //チャンネル0選択
ConvertADC(); //変換開始
while(BusyADC()); //変換終了待ち
Result=ReadADC(); //データ読み出し
Ondo=(Result*50)/1024; //スケール変換
Delay10KTCYx(200); //200msec待ち

/*割り込み定義(優先レベルなし)*/
#pragma interrupt isr0

/*割り込みベクタセット*/
//タイマ0の割り込みへ
#pragma code isrcode=0x08

void isr direct(void) //割り込み関数へ
{_asm goto isr0 _endesm} //ジャンプ

////タイマ0割り込み処理
#pragma code
void isr0(void)
{
///次に3msecの再設定
INTCONbits.TMR0IF=0;       //割り込みフラグクリア
WriteTimer0(0x8ACF);        /タイマ0再設定
LATCbits.LATC0=0;         //下位桁オフ
LATCbits.LATC5=0;         //上位桁オフ

//上位桁セグメントの表示
if(flag)                  //桁フラグチェック
{
flag=0; //桁フラグ切り替え
LATB=LED_SEG[Ondo/10]; //上位桁数値表示
LATCbits.LATC5=1; //上位桁表示

else
{

////下位桁のセグメントの表示
flag=1; //桁フラグ切り替え
LATB=LED_SEG[Ondo%10]; //下位桁数値表示
LATCbits.LATC0=1; //下位桁表示


2009.11.21   リセット回路

PICのリセットの回路をたまに忘れるので、デジカメで写真を撮ってファイルに入れてありますです(汗
MCLRのリセット回路です

2009.11.14   ASCIIコード

   0   1   2  3  4  5  6  7  A  B  C  D

0 NUL  DLE  SP 0  @  P    '   p  -  タ ミ

1 SOH  DC1  !  1  A  Q  a  q  。 ア チ ム

2 STX DC2   "  2  B  R  b  r  「 イ ツ メ 

3  ETX DC3  #  3  C  S  c  s  」  ウ テ モ

4  EOT DC4  $  4  D  T  d  t  、 エ ト ヤ

5  ENQ NAC %  5  E  U  e  u  ・ オ ナ ユ

6  ACK SYN &  6  F  V  f   v ヲ カ 二 ヨ

7  BEL ETB '   7   G  W  g  w ァ キ ヌ ラ

8  BS CAN  (  8  H  X  h   x ィ ク ネ リ

9  HT EM  )  9  I   Y  i  y  ゥ ケ ノ ル

A  LF SUB *:  J  Z  j  z  ェ コ ハ レ

B  VT ESC + ; K  [  k  { ォ サ ヒ ロ

C  FF  FS   ,  < L  ¥ l |  ャ シ フ ワ

D  CR GS   _  = M   ] m } ュ ス ヘ ン

E  SO RS   .   > N  ^  n ~ ョ セ ホ "

F  SI  US   /   ? O _  o DEL ッ ソ マ ゜

 

$00 NULL ヌル 何もしない
$02 STX スタートオブテキスト 電文の開始点
$03 ETX エンドオブテキスト 電文の終了
$08 BS バックススペース 1文字戻る
$0A LF ラインフィード 改行
$0D CR キャリッジリターン 行頭へ移動
$10 DEL デリート 1文字削除
$1B ESC エスケープ 中断する

2009.11.07   ICD2

ICD2やPICKitってISCPが使えるから便利ですよね、便利なだけにその分、回路など面倒な部分もあります
下記に記載したので読んで見て下さいICD2注意事項回路設計で注意すること
1 PGC、PGDラインにはプルアップ抵抗をつけない
これはICD2側で4.7KΩの抵抗でプルダウンしているため、分圧されて電圧が下がり、正常な動作を
しなくなってしまいます
2 PGC、PGDラインにはコンデンサをつけない
高速なパルス信号でデータ転送が行われるので、コンデンサにより遅れると正常なデータ伝送が
出来なくなるためです
3 MCLRラインにもコンデンサはつけない
これも同じように高速パルスが遅れてしまうからです
4 PGC,PGDラインにはダイオードを挿入しない
このラインは双方向通信をしているので、それができなくなってしまうからです

2009.10.31   ICE

今日はちょっと違ったお話、ゲームなんかでエミュレータとかって聞いた事がある人は多いいと思うのですが、

そのエミュレータ(ICE)のお話です、PICで使うICEとは(インサーキット・エミュレータ)基盤からマイコンを引き抜き
代替のマイコンもしくは「マイコンモドキの回路」を代わりに挿入し、その動きを専用の装置で観測します、

また基板上のマイコンはそのままで、NMI(ノン・マスカラブル・インタラプト)をかけるハードウェアを付加して、

デバッグのための動作環境を実現する方法もあります (ハードウェア的制約は増える)、

 

ICE(In Circuit Emulator)を使うと、動作環境は限りなく
実機に近いながら、プログラムや変数もダウンロード/アップロードはもとより、ステップ実行 、動作履歴など

CPUの動きを自在に操ることができ、問題の箇所で何が起きているかを視覚的に見ることが出来ます

しかしこれが究極のツールとまではいえません、その理由は限りなく、 実機に近くても実機とは異なることです

ICEの仕様によっては、特定の割り込みが使えなくなったり実行速度が落ちたりします、ICEを接続することにより

信号線の電気的性質が変わりますから、極端な場合には「本物のCPU」なら動くけどICEの「CPUもどき」では

動かないということもありえます、やっかいなのは、電源投入時です、ICEは本来のCPUのようにパワーオンリセット
信号で起動しません、プッシュボタンスイッチを押したり、操作画面にあるメニューから実行コマンドを

選択したりしなければなりません、ターゲットの動作開始の遅れがターゲットの接続された回路の待ち時間を与え

初期動作の異常やエラー状態に陥ったりします、 またICE自体がケーブルなどから色々な電磁雑音を放射しますから

アナログ系は影響を受けざるをえません、微弱なアナログ信号を扱う基盤では、ICEなどの接続を前提としなくても
動作状態が分かるようなハードウェアの工夫を組み込んでおくと便利です、最近のマイコンは デバッグ時にICEを

用いなくても、デバッグのためにつけられた、通信ポート(JTAG)などを介して同等の機能を実現できるようにする

傾向にあります

2009.10.24   LED


一番使うLED? 電子工作のための知識
現在LEDの発光色は赤、黄、青、白などが揃っています、発光色によって
材質が異なり、そのため定格も下表のようになります、制限抵抗値の算出に お役立てください、
*下表は入手し易い代表的な製品データを基に作成しています
  使用時は個別データも参照ください
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
    波長     順方向    順方向    最大定格                      備考
            電圧VF    電圧If    電流IMAX
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
赤   635-695   1.8V      通常       20-                  赤色は1MAでも光る
                                                  nm 製品があります
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
黄    585nm   2.0V      5-10mA     25mA
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
緑    555nm   2-2.2V
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー順方向電圧VFは製品に
純緑   555nm   3.5V      通常20mA   30mA                よって違う事があります
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーので購入時に確認
青     430nm   3.6V                                 通常 しましょう
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
白     3色混合  3.4-3.6V    15-20mA


  R(KΩ)=
   VCCーVF(V)
   -------
    IF(ma)

(LED活用のポイント)
LEDを点灯させるもっとも多い誤解がこれは何ボルトで光るの?です
何故これが誤解かというと、LED自体は’負荷’ではないため単独で電圧だけを加え
(定格を超える電流を流し)続けると壊れてしまうからです、LED点灯時は’何アンペア流す?’
を下図の計算式で’電流制限抵抗の値はいくらにする?’に置き換えて考えてみてください

例 乾電池2本で赤色LEDを点灯させる場合 (1.5×2-1.8)÷0.01=120Ωとなります
0.01Aは平均的な値なので半分にしたり1/10まで絞って比べてみましょう
          VCC-1.8(VOLT)
R120(Ω)=--------------
              0.01(A)

2009.10.17   時間遅延


C18で時間遅延の計算でかなり苦しんだ管理人リキです(汗
勿論アセンブラの時間遅延よりは楽なのですがHITECH-CやCCSCは
1msとか直にかけるのに・・・・
ちなみに下はアセンブラとC18の時間遅延です

アセンブラの遅延タイマの作り方(クロック10Mhzで0.5秒タイマを作る)
PICはクロック4回で1つの命令が実行されます、これを1サイクルといいます

クロックは発振子の発する信号で、10Mhzのクロックで1サイクルにかかる
時間はどのくらいでしょう?
1/10.000.000×4=0.0000004s  1サイクル:0.4μs(マイクロセカンド)

例えば0.5sの時間遅延をさせたい場合はどうしたらいいか?
0.5=500ms=500.000μSのタイマを作るには何サイクル必要か?
500.000÷0.4=1.250.000サイクル 0.5sタイマ:125万サイクル

C18時間遅延
ヘッダファイル #include<delays.h>が必要です
Delay1TCY 1命令の遅延
Delay10TCYx 10命令の遅延
Delay100TCYx 100命令の遅延
Delay1KTCYx 1000命令の遅延
Delay10KTCYx 10000命令の遅延
255max

クロック10Mhzでは10クロック4μS 10Mhz = n10 = 4μS
「1」↓(2)↓(4)↓  
式=10/10.000.000×4=0.000004s=4μS

クロック4Mhzでは10クロックが10μS 4Mhz = n10 = 10μS
式=10/4.000.000×4=0.00001=10μS

↑「1」は命令数=クロック (2)は発振子の値
(3)PICはクロック4回で1つの命令がなされるから4=1サイクル

10Mhz=n1=0.4μS     4Mhz=n1=1μS
1クロックとは1命令のこと=(n)
4Mhz 10Mhz
Delay10KTCYx(n); n=1 : 10mS n=255: 2.55S n=1 : 4mS n=255: 1.02S
Delay1KTCYx(n); n=1 : 1mS n=255: 255mS n=1 : 400μS n=255 :102mS
Delay100TCYxx(n); n=1 : 100μS n=255 : 25.5mS n=1 : 40μS n=255 :10.2mS
Delay10TCYx(n); n=1 : 10μS n=255 : 2.55mS n=1 : 4μS n=255 :1.02mS
*4MhzのDelay10KTCYx(255)の場合の計算式
10000×255=2550000がn n=2550000÷
4000000* 400000は4Mhz
4= これがサイクル4命令で1サイクルだから
=で答えが出る

2009.10.10   変数


変数は宣言をする場所で変数が有効となる範囲が確定します、mainの外側で宣言した
変数はmainの中でも共通に利用できます、mainやその他の各関数内部で宣言した変数は
、その関数内でのみで使用できます、変数の宣言位置と変数の値の動きの例を↓に書きます

変数aaa bbb ccc sss aaa(2)
int bbb; xxx 0 xxx xxx xxx

main()
{
int aaa; 0 0 xxx xxx xxx
aaa = 0x10; 10 0 xxx xxx xxx
bbb = 0x20; 10 20 xxx xxx xxx bbbの変数は有効
taro(aaa); 10 20 xxx xxx xxx
}

taro(int sss) 10 20 xxx 10 xxx
{
int aaa = 6; 10 10 xxx 10 6
int ccc; 10 10 0 10 6
ccc = aaa; 10 20 6 10 6 aaaは別の変数として扱われる
sss = sss+3; 10 20 6 13 6
aaa = bbb; 10 20 6 13 20 ここでもbbbの変数が有効
bbb = 0x50; 10 50 6 13 20

2009.10.03  割り込み

PICでわりととよく使うのが、割り込みではないでしょうか? 僕もまだ完璧に使えるわけではないのですが(汗
一応ここに書きますです「例pic18F452」PIC18f452には2つの優先順位を持った割り込みがあります
外部からの割り込みはポートBの0.1.2に割りつけられています、 その他タイマ、通信などの機能から割り込みを発生することが出来ます
割り込み処理はアイドル処理に割り込んで優先的に行われる処理ですが、 優先順位の高い割り込みは、割り込み処理中でも

さらに割り込みを発生することが 出来ます、割り込み機能は複雑なためPT3,PIC18マイクロコントローラ解説書を参照願います

割り込みを使用するには以下のような手順が必要です
1.割り込みモードを指定する IPEN(RCONレジスタ)
2.割り込みを発生させたい周辺機能を初期化する
3.割り込みを発生させたい周辺機能の割り込み発生フラグを有効にする(PIP-PIEレジスタ)
4.割り込みを発生させたい周辺機能の割り込み優先順位をしていする(IPRレジスタ)
5.全体の割り込みフラグを有効にする GIEH=1orGIEL =1(INTCONレジスタ)

割り込み処理内では、次のような処理を行います

1.割り込みフラグを確認する
2.割り込みフラグをリセットする
3.割り込み処理を行う

割り込み処理の記述方法はコンパイラへの受け渡しが複雑なようでアセンブラを使用して
飛び先番地などを指定しているようです、次頁の例のようにそのまま呪文のように
記述してご利用ください、割り込みを1種類しか使用しない場合はどちらでも
構いません、割り込みのためのレジスタの初期化はINTCON1.2.3.、IPR1.2、
RCONレジスタを初期化します、プログラム内からの初期化の例を記述します

INTCON =0b00100000; //TMR0 interruptを初期化
INTCON2=0b00000000; //TMR0 Low priority
INTCON3=0b00000000; //
IPR1bits.IPEN=1; //優先割り込み設定
RCONbits.IPEN=1; //割り込みパターンをC18スタイルにする
INTCONbits.GIEH=1; //優先割り込み有効
INTCONbits.GIEL=1; //通常割り込み有効
各機能についてはPIEレジスタで割り込みの有効設定を行い、PIRレジスタで
各割り込み要因の発生をしています、この指定は組み込み関数のOpen関数で
設定される場合もあります

void InterruptHandlerLOW(void); //interrupt 割り込み
void InterruptHandleHIGH(void); //

#pragma code InterruptVectorLow=0x18 //通常割り込み処理
void InterruptVecterLow(void)
{
_asm
goto InterruptHandlerLow //jump to interrupt routine
_endasm
}

#pragma code
#pragma interrupt interruptHandlerLow

void
interrHandlerLow()
{
割り込み処理を書く
}

#pragma code InterruptVectorHigh=0x08 //高レベル割り込み処理
void
InterruptVectorHigh(void)
{
_asm
goto InterruptHandlerHigh //jump to interrupt routine
_endasm
}

#pragma code
#pragma interrupt interruptHandlerHigh

void
interruptHandlerHigh()
{
割り込み処理を書く

2009.9.26  I/Oポート

今回はI/Oポートの事についてです、 I/Oって何の事か知っている人は僕と同じように、PICなどをやっている人だと思うのですが
知らない人のために、I/OのIはインプットのI(入力)です、 I/OのOはアウトのO(出力)です、
PICのC言語などでTRISB = 0b00001111
と書かれている場合は0と1で表しますが、似てるからなのか1=I入力です、0=O出力です
これでなんとなく分かると思うのですが上のプログラムが表すのは0ビット目から3ビット目は
入力です、4ビット目から7ビット目は出力となります、こう考えると結構簡単に思えません??
*ちなみに0bは二進数表記の意味です、16進数の場合は0x0Fの表記になります

2009.9.19  lstファイル???

そういえば、C18コンパイラで前に困ったことがありました、C18関連の参考書でコンパイル後 lstファイル(アセンブラファイル)が

出来ると書いてあったのですが、どこを探しても、 どの設定をいじっても出てこなくて、参考書のメーカーに連絡してみると、

同じバージョンのC18を お使いくださいと。。。。そんな馬鹿な。。。。んでマイクロチップに直接メールで問い合わせしてみると
約1週間後返答があり、MPLABのViewメニューのDisassemblyListingでビルド後アセンブラが見れるとの 事でした、

凄く簡単にかたずいてしましました、でももしかしたら、僕と同じ思いをしている人が 居るかもしれないので、ここに掲載しました☆、

デバック時Cでデバッグだとわかりずらい所がある 時はアセンブラレベルでデバッグした方が早いですもんね!

2009.9.11  アセンブラのWレジスタ

前回までツールの紹介をしてきましたが、今回はC言語とアセンブラを一番簡単なビット指定で説明します、PICのアセンブラの場合は

通常の入出力命令のときや演算処理の時にデータを一時的に保存するレジスタ(ワーキングレジスタ)を頭に入れておく必要があります
対して、C言語の場合はそれに対して、ワーキングレジスタの動きを考える必要はありません、そういうのが一個一個が影響して

Cだと20行で終わるPGが、アセンブラだと40行ということに なることも多々あります、好き好きかもしれませんが僕はCの方が好きかもです
下の文は全く同じことをしています

アセンブラ言語
MOVLW B'00001111' ;リテラル→ワーキングレジスタ
MOVWF PORTB ;ワーキングレジスタ→ファイルレジスタ PORTBに出力

C言語
PORTB = 0b00001111; //PORTBに2進数の00001111を代入

2009.9.04  PICであると便利なもの

前回と同じような感じですが、今回は必要かときかれると、必ず必要ではないですが、あると便利なものを紹介します

 

まずオシロスコープです、テスター同様、電気的な信号を見るものです、僕も6割ぐらいしか使いこなせていませんが、信号チェックなどの

基礎的なことやカーソル機能で周波数を見たりしています、PICが4Mhzから48Mhz(10F-18F)の周波数で使うことが多いので

60Mhzのオシロスコープでいいと思います、値段は40000ー800000円と色々ありますが、高いものでなくても安い物でもいいと思います

 

次に評価ボードです、ブレッドボード&電気知識があれば、ブレッドボードのみで良いのですが、電気的知識がない人や電気的知識を

後回しにして、プログラムに専念したい時は、評価ボード+教科書的な使い方が、一番早道かなとも思います

勿論プログラムを覚えた後にプログラムの開発などの時にも評価ボードは有効だと思います

3000円から40000円ぐらいで売られていると思います、写真はMA183です

 

そしてCコンパイラです、これは人それぞれだと思うのですが、アセンブラよりもC言語のほうが全く同じPGを作る場合でも、かなり早く

出来上がったりします、ただコンパイラの性能次第で出来上がった後のPGがちょっと余計なものが多い場合もあります

20000-160000円ぐらいで売っていると思います、写真はC32(32ビット)コンパイラです

最初は16-18系のPICからやったほうがいいと思います、その場合はHITECH-C、C18コンパイラがフリーで使えます(最適化などされない)

2009.8.29  PICで最低限揃えるもの

PICを始める上で必要になるものを紹介します、まずは書き込み機が必要ですので写真はPICkit3ですが、これでなくても書き込みが出来ればいいと思います3000-30000円ぐらいであると思います、もし予算に余裕があればICD3などのデバッグ機能が付いているものがいいと思います

 

次にブレッドボードです、PICのプログラム後これでテストが出来ます500-3000円ぐらいであります

 

そしてテスターです、これがないと、動かないなどのときトラブルの場所が特定できません、、テスターは電圧と抵抗が測れれば、いいと思うので

1000円ぐらいの物でも良いと思います