ホーム | 電子工作 | 腕ロボット | 二足歩行ロボット | 無線コントローラ | 工作機械 | 動画 | 自作ソフト | Web作成 | テキスト | その他 |
PIC18F14K50で液晶モニタSD1602(2016年12月〜2017年1月) |
![]() |
左が液晶モニタで、上がSD1602、下がSC1602です。 電子工作をごちゃごちゃやっていると、その折々の状況を見たいことがあります。そういう時このような 超小型液晶モニタは便利です。 以前、H8マイコンを使っていた時、SC1602という液晶モニタ(左下)を使いました。 今回はPICマイコンでの液晶モニタです。 H8マイコンとPICマイコンとは使い方が全然違いますので、液晶モニタに対してもそれなりの相手を しなければなりません。 SD1602とSC1602の違いは、SDの方は12個の端子が左下に1列に並んでいることで、これによって ブレッドボードに直に挿せます。SCのほうは左に12個の端子が6個ずつ2列になっているので、 リードを出さないとブレッドボードに挿すことが出来ません。 はんだ付けの手間を省くためにブレッドボードを使っているので、今回はSD1602(左上)を使います。 |
![]() |
左の一番下の画像が実際にLCDに文字を表示した例です。 PIC18F45k50ボードを使っています。 |
以前にH8マイコンでSC1602を使ったときは核心の部分でRIKIYAさんのプログラムをほぼコピペ
でした。 このLCDは4ビットモードがあるので、この4ビットモードでPICとつなぎます。 PICはピンの数が少ないので、この4ビットモードを使えば必要なピンの数が節約できます。 つまり、文字データのためのピンが4個、制御のためのピンが2個でPICのピンは合計6個で済みます。 今回はSD1602のマニュアルを見て自力でプログラム作成をしようと思いました。 SD1602は、インターフェースICがHD44780コンパチブルです(SC1602もそうですが)。 秋月電子のページにあったマニュアルを印刷しました。しかし求める情報は何も書いておらず、別のサイトから HD44780の詳しいマニュアルを印刷しました。 このマニュアル通りにプログラムを組んだのですが全然表示されません。 このマニュアルには、「条件さえ整えば初期化は内部で自動的に行っています。」と書いてあるのですが、 殆ど手動で行う必要があるようです。 またマニュアルには、「Eから信号を意識的に送る」ということは一言も書いてなかった。 ただ波形のタイミングチャートがありそこにはEからの信号が表示されていました。 実際には、LCDにコマンドとか文字データを送る時には、コマンドとか文字データをセットしてから Eから1を送ると信号がLCDに初めて送られて220ns待ってからEから0を送るとLCDがそれを きちんと認識します。 やむを得ずネットを調べてこのページを参考にしてやっとこさ 表示できました。 そのマニュアルにはEからの これはこのサイトから取ったLCD設定の画像です。 ![]() この設定を参考にして、僕の場合はPORTCの0からの4ビットをデータ用に、5ビット、6ビット目を 制御のために使いました。 次の関数類はそのサイトに載っていたものです。この関数を参考にしてプログラムを作りました。これらの 関数群のあとに僕のプログラムを載せます。
|
// LCDに文字を表示 // Notes: 4MHz内部クロック // PORTC(3) : LCD(DB7)14 PORTC(4) 6 : LCD_EN 6 // PORTC(2) : LCD(DB6)13 GND : LCD_RW 5 // PORTC(1) : LCD(DB5)12 PORTC(5) 5 : LCD_RS 4 // PORTC(0) : LCD(DB4)11 CONTRAST ADJ: LCD_Vo 3 // +5v : LCD(Vdd) 2 // GND : LCD(Vss) 1 // Target: PIC18F14K50 #include |
PIC18F14K50マイコンボード(2016年10月〜11月) |
|
![]() |
左がPIC18F14K50マイコンボードの説明です。 秋月電子で買いました。この説明書は秋月電子のネットにあったものです。 ピンヘッダが3つついていて、はんだでボードにピンヘッダを取り付けます。 ボードの真ん中のものがPIC18F14K50です。 ボードの左端にUSBソケットがついています。 |
![]() ![]() |
USBもついていて、しかもこのボードを基盤に取り付けたままでPICkit3をつないでプログラムを書き込める、
という優れものですが、左を見てください。 上が本ボードのピン配置、下がボードに載る前のPIC18F14K50のピン配置です。 よく見るとRA0〜RA4が上のボードのピン配置にはありません。 つまりPORTAをつぶしてPICkit3の端子を確保しています。 |
![]() |
いつものようにLED4個をつなげてちかちかさせてみます。 RC0,RC1,RC2,RC3にLEDをつなぎます。ボードでは左上の4個の端子に当たります。 RB7、ボードでは右の真ん中の端子です、ここにスイッチをつなぎます。 このRB7にはプルアップ抵抗をつなぎます。 これらは前の8ピンのPIC12F683の場合と、つなぐピンが異なるだけで他は一緒なので回路図は省きます。 このボードの電源は5Vなので、前に使ったものと同じお手製の電源を使います。 |
![]() |
このように本ボードをブレッドボードに挿したままでPICkit3をつけられてプログラムをPCから
転送できます。 以下にLEDちかちかのプログラムを載せます。 XC8コンパイラで作りました。 ただ今まで使っていたMPLABがXC8を認識できなくて、「MPLAB X」というIDEがXC8にジャスト 対応しているということで「MPLAB X」を使いました。 今までのMPLABとは使い方がすごく違っていたのでかなり苦労しました。 出力の時には、アセンブラで書いた時には直接その端子に1を与えましたが、C言語では該当のLATレジスタに1を 与えます。 例えばPORTCの0ビット目を1にするときには 「LATC = 0b00000001;」という風にです。 動作周波数が大きくなってくると、直接レジスタに1を与えるとその速さに動作がついていかないので、それ専用の レジスタとしてLATレジスタがあるようです。 このプログラムは、「はじめてのPIC」というサイトを参考にしました(1部変えただけで殆どコピペ)。 |
// 4つのLEDが順次点灯する。LEDはPORTCの0,1,2,3に取り付けている //スイッチを押すと点灯する順番が逆になる // Notes: 4MHz内部クロック // Language: MPLABX xc8(v1.12) // Target: PIC18F14K50 #include "xc.h" #define _XTAL_FREQ 4000000 // 動作周波数値を4MHに設定する #pragma config FOSC = IRC, PLLEN = ON, FCMEN = OFF #pragma config IESO = OFF, USBDIV = OFF, CPUDIV = NOCLKDIV #pragma config PWRTEN = OFF, BOREN = OFF, WDTEN = OFF #pragma config HFOFST = OFF, MCLRE = OFF #pragma config STVREN = ON, BBSIZ = OFF, LVP = OFF #pragma config XINST = OFF #pragma config CP0 = OFF, CP1 = OFF, CPB = OFF #pragma config WRT0 = OFF, WRT1 = OFF, WRTB = OFF, WRTC = OFF #pragma config EBTR0 = OFF, EBTR1 = OFF, EBTRB = OFF void main(void){ OSCCON = 0b01010010; // 内部クロック4Mhz LATC = 0; // PortCのすべてのビットを「0」 TRISC = 0b11110000; // LEDの接続されているポートを出力に設定 while(1){ // 繰り返しループ if(PORTBbits.RB7){ // SW(RB7)が1なら LATC = 0b00000001; // LED 1つ目点灯 3ヶ消灯 __delay_ms(150); LATC = 0b00000010; // LED 2つ目点灯 3ヶ消灯 __delay_ms(150); LATC = 0b00000100; // LED 3つ目点灯 3ヶ消灯 __delay_ms(150); LATC = 0b00001000; // LED 4つ目点灯 3ヶ消灯 __delay_ms(150); } else{ // SW(RB7)が0なら LATC = 0b00001000; // LED 4つ目点灯 3ヶ消灯 __delay_ms(150); LATC = 0b00000100; // LED 3つ目点灯 3ヶ消灯 __delay_ms(150); LATC = 0b00000010; // LED 2つ目点灯 3ヶ消灯 __delay_ms(150); LATC = 0b00000001; // LED 1つ目点灯 3ヶ消灯 __delay_ms(150); } } // ここまで繰り返し } |
Picマイコンでスイッチを使う(20016年10月) |
![]() |
アセンブラ言語でスイッチはどのように扱えばいいのだろうか? と思って、スイッチがある回路を組みました。 ついでにLEDを4つにして、4つのLEDが順番に点灯してスイッチを押している間はその点灯順が 逆になる、というプログラムを組みました。 左がその回路図です。 |
![]() ![]() |
上の回路図をブレッドボードに組んだ全体のイメージです。 右の基盤は9Vの電池から3端子レギュレータを介して5Vを作っている電源回路です。 スイッチはプッシュスイッチを使っていますので、押している間はGP3の入力がGNDになります。 左の下の画像が、Pic・LED・スイッチの部分を拡大したものです。 画像ではよく見えていませんが、Picの左一番下のピン(GP3)に上の5Vからプルアップ抵抗をつなげて 、それをスイッチで分断してスイッチから下のグラウンドに線をつなげています。 上の回路図では200Ωとしていますが、手近なところにそれがあったのでそうしただけです。 |
以下にこのためのアセンブラプログラムを載せます。 ラベルsw1の行の命令にスイッチを押したときの条件分岐があります。 アセンブラで条件分岐の命令は次の4つしかありません。 BTFSC ; レジスタの指定したビットが0なら次の命令をスキップ BTFSS ; レジスタの指定したビットが1なら次の命令をスキップ DECFSZ ; レジスタ値を1減算し,値が0なら次の命令をスキップ INCFSZ ; レジスタ値を1加算し,値が0なら次の命令をスキップこのうちの最初の命令を使っています。 「BTFSC GPIO,3」 はGPIOレジスタのビット3(つまりGP3)が0になったら、すなわちプッシュスイッチSWを 押したら次の命令をスキップせよということになります。 list p=12f683 #include |
はじめてのPicマイコン(20016年9月) |
![]() PICというマイコンがあります。 左にその写真を載せます。この写真は http://www.eleclabo.com/denshi/micon/pic_basis/ のサイトから転載したものです。 左ようないろいろなものがあります。いろいろと言ってもその違いは足のピンの数です。 足のピンの一つ一つに機能が割り当てられているので足が多ければ多いほど機能が豊富ということになります。 そして、見てのようにピンの数が多いとサイズも大きくなります。 電子工作を始めた頃、最初にマイコンの書物を買ったのはこのPicマイコンの本でした。 その中身を見ると、プログラムを組むのにアセンブラ言語を使っていました。C言語を使っている本は 見当たりませんでした。 アセンブラ言語というのは、記号言語とも呼ばれ最も難解な言語のひとつです。 これに反してC言語は高級言語であり人が見て何をしているか分かるような言語です。 例えば、C言語では、a=100 という命令がアセンブラ言語では3行4行必要です。 そもそもアセンブラ言語は、僕が修士論文を書く時にアセンブラ言語を使ったものであり、その時に 非常に難渋したのを覚えています。 そういうことでアセンブラ言語は避けようと思っていましたのでC言語を使えるほかのマイコンに行きました。 今回思うところがあってPicマイコンをやる必要に迫られ、改めて以前に買った書物を熟読しました。 すると、前は避けようと思っていたアセンブラ言語が案外わかりやすく、「それでは」と思ってPicマイコン を始めようと思いました。 マルツパーツ館のサイトに「はじめてのPicマイコン」 http://www.marutsu.co.jp/pc/static/large_order/begin_pic というページがあり、このページでPicマイコンのいろはが勉強できます。 ここではC言語を使ったPICマイコンの動かしかかたを説明しています。 アセンブラ言語を使った方が「頭の体操」にはいいので僕はアセンブラ言語を使いました。 マルツパーツ館のサイトで解説されていた内容を確認しようと思い、そこに載っていたパーツを購入しました。 以下にそれらを挙げます。 はんだ付けをしないで簡便に取り掛かろうと思ったのでこれら以外に、「ブレッドボード、配線ワイヤー、LED」が 必要です。 僕はこれらは手持ちのものを使いましたが・・・・・。
|
![]() |
Pic12F683のピン構成です。 LEDは7番ピンのGP0に接続することにします。 1番ピンに電源をつなげます。 8番ピンはグラウンドです。 |
![]() |
PCのソフトMPLABからPICKIT3を経由してアダプタキット上のPIC
にプログラムを書き込んでいるところです。 |
![]() ![]() |
ブレッドボード上に回路を組んでLEDを点滅させているところです。 Picは2V〜5.5Vで動作するので単4電池4個を電源としました。 単4電池としたのは4個で 約5Vになる使い古しがあったためです。 非常に簡単な回路なので左を見てもらうとはわかると思いますので回路図は載せません。 LEDを抵抗で減圧する必要がありますが、使っているLEDは抵抗内蔵のもの(秋月で購入) なので抵抗を付けていません。 どのような信号が出ているのかを見るためにオシロスコープをつなぎました。 電圧5V、幅約300msの矩形波が断続的に出ているのがわかります。 |
以下にこのためのアセンブラプログラムを載せます。 参考にしたのはこのページです。 http://www.geocities.jp/ejiri_takahiro/S_5214_A5.html list p=12f683 #include |