tag:crieit.net,2005:https://crieit.net/tags/PIC18F14K50/feed
「PIC18F14K50」の記事 - Crieit
Crieitでタグ「PIC18F14K50」に投稿された最近の記事
2018-10-31T21:27:42+09:00
https://crieit.net/tags/PIC18F14K50/feed
tag:crieit.net,2005:PublicArticle/14369
2014-06-17T09:00:00+09:00
2018-10-31T21:27:42+09:00
https://crieit.net/posts/8-PIC
8ピンPIC用のデバッグモニタ作成
<p>キャラクタLCDを購入していたのだがずっと触らずに放置していた。<br />
色々調べてみるときむ茶さんのところに<br />
<a target="_blank" rel="nofollow noopener" href="http://www.geocities.jp/zattouka/GarageHouse/micon/Monitor/Monitor.htm" target="_blank">デバッグモニターの作成</a><br />
という記事があったのだが、面倒くさそうだし<br />
LCDの操作自体はシンプルそうなので必要な時に<br />
ピン数の多いICで直接操作すればいいかな、くらいの感じで考えていた。</p>
<p>別でmTouchというタッチセンサっぽいものが気になったので<br />
PIC12F1822を購入していたのだがずっと手を付けずにいた。<br />
ようやくやってみようという気になって色々調べてみたところ、<br />
どうも離している時と触っている時の充電、放電の回数をカウントする必要があるらしく、<br />
ちゃんと大きな数値をデバッグできないと作成が出来ないっぽいことがわかった。</p>
<p>なるほど、だからデバッグモニタを作成する必要があったのか…と理解。<br />
この方法なら1ピンでモニタを操作できることになる。</p>
<p>さて、やってみようと思いきや記事に書かれている<br />
モニタを直接操作するためのICがない。<br />
手元にある8ビットの安いICはPIC18F14K50くらい。<br />
20ピンもあるのでなんとなくもったいない気がしたが<br />
とりあえずブレッドボードで仮に作成してみることにした。</p>
<p>でよくよく記事を見ると、どうもソフトウェアでシリアル通信をしているらしい。<br />
でもちょっとまてよ、PIC18F14K50は普通にシリアル通信に対応してたはず。<br />
もしかするとこのシリアル通信とソフトウェアシリアルで通信できるんだろうか?<br />
そう思いPIC18F14K50は普通にシリアル通信の機能を使ってやってみることにした。</p>
<p>下記がPIC18F14K50側のプログラム。</p>
<blockquote>
<p>|c|</p>
</blockquote>
<h1 id="include <xc.h>"><a href="#include+%26lt%3Bxc.h%3E">include <xc.h></a></h1>
<h1 id="include <stdlib.h>"><a href="#include+%26lt%3Bstdlib.h%3E">include <stdlib.h></a></h1>
<h1 id="include "skUARTlib.h""><a href="#include+%22skUARTlib.h%22">include "skUARTlib.h"</a></h1>
<h1 id="if defined _18F14K50"><a href="#if+defined+_18F14K50">if defined _18F14K50</a></h1>
<h1 id="pragma config FOSC = IRC, PLLEN = ON, FCMEN = OFF"><a href="#pragma+config+FOSC+++%3D+IRC%2C++PLLEN++%3D+ON%2C++FCMEN++%3D+OFF">pragma config FOSC = IRC, PLLEN = ON, FCMEN = OFF</a></h1>
<h1 id="pragma config IESO = OFF, USBDIV = OFF, CPUDIV = NOCLKDIV"><a href="#pragma+config+IESO+++%3D+OFF%2C+USBDIV+%3D+OFF%2C+CPUDIV+%3D+NOCLKDIV">pragma config IESO = OFF, USBDIV = OFF, CPUDIV = NOCLKDIV</a></h1>
<h1 id="pragma config PWRTEN = ON, BOREN = ON, WDTEN = OFF"><a href="#pragma+config+PWRTEN+%3D+ON%2C+BOREN++%3D+ON%2C+WDTEN++%3D+OFF">pragma config PWRTEN = ON, BOREN = ON, WDTEN = OFF</a></h1>
<h1 id="pragma config HFOFST = OFF, MCLRE = OFF"><a href="#pragma+config+HFOFST+%3D+OFF%2C+MCLRE++%3D+OFF">pragma config HFOFST = OFF, MCLRE = OFF</a></h1>
<h1 id="pragma config STVREN = ON, BBSIZ = OFF, LVP = OFF"><a href="#pragma+config+STVREN+%3D+ON%2C++BBSIZ++%3D+OFF%2C+LVP++++%3D+OFF">pragma config STVREN = ON, BBSIZ = OFF, LVP = OFF</a></h1>
<h1 id="pragma config XINST = OFF"><a href="#pragma+config+XINST++%3D+OFF">pragma config XINST = OFF</a></h1>
<h1 id="pragma config CP0 = OFF, CP1 = OFF, CPB = OFF"><a href="#pragma+config+CP0++++%3D+OFF%2C+CP1++++%3D+OFF%2C+CPB++++%3D+OFF">pragma config CP0 = OFF, CP1 = OFF, CPB = OFF</a></h1>
<h1 id="pragma config WRT0 = OFF, WRT1 = OFF, WRTB = OFF, WRTC = OFF"><a href="#pragma+config+WRT0+++%3D+OFF%2C+WRT1+++%3D+OFF%2C+WRTB+++%3D+OFF%2C+WRTC+++%3D+OFF">pragma config WRT0 = OFF, WRT1 = OFF, WRTB = OFF, WRTC = OFF</a></h1>
<h1 id="pragma config EBTR0 = OFF, EBTR1 = OFF, EBTRB = OFF"><a href="#pragma+config+EBTR0++%3D+OFF%2C+EBTR1++%3D+OFF%2C+EBTRB++%3D+OFF">pragma config EBTR0 = OFF, EBTR1 = OFF, EBTRB = OFF</a></h1>
<h1 id="define _XTAL_FREQ 8000000 // CLK 12MHz (use from __delay_ms)"><a href="#define+_XTAL_FREQ+8000000+++++++++%2F%2F+CLK+12MHz+%28use+from+__delay_ms%29">define _XTAL_FREQ 8000000 // CLK 12MHz (use from __delay_ms)</a></h1>
<h1 id="define LCD_RS PORTCbits.RC0"><a href="#define+LCD_RS++++PORTCbits.RC0">define LCD_RS PORTCbits.RC0</a></h1>
<h1 id="define LCD_EN PORTCbits.RC1"><a href="#define+LCD_EN++++PORTCbits.RC1">define LCD_EN PORTCbits.RC1</a></h1>
<h1 id="define LCD_D4 PORTCbits.RC3"><a href="#define+LCD_D4++++PORTCbits.RC3">define LCD_D4 PORTCbits.RC3</a></h1>
<h1 id="define LCD_D5 PORTCbits.RC4"><a href="#define+LCD_D5++++PORTCbits.RC4">define LCD_D5 PORTCbits.RC4</a></h1>
<h1 id="define LCD_D6 PORTCbits.RC5"><a href="#define+LCD_D6++++PORTCbits.RC5">define LCD_D6 PORTCbits.RC5</a></h1>
<h1 id="define LCD_D7 PORTCbits.RC6"><a href="#define+LCD_D7++++PORTCbits.RC6">define LCD_D7 PORTCbits.RC6</a></h1>
<h1 id="endif"><a href="#endif">endif</a></h1>
<h1 id="define LCD_STROBE() ((LCD_EN=1),(LCD_EN=0))"><a href="#define+LCD_STROBE%28%29++++%28%28LCD_EN%3D1%29%2C%28LCD_EN%3D0%29%29">define LCD_STROBE() ((LCD_EN=1),(LCD_EN=0))</a></h1>
<p>void Wait(unsigned int num)<br />
{<br />
int i ;</p>
<pre><code> // numで指定した回数だけ繰り返す
for (i=0 ; i<num ; i++) {
__delay_ms(10) ; // 10msプログラムの一時停止
}
</code></pre>
<p>}</p>
<p>void lcd_write(unsigned char c)<br />
{<br />
// 送信データのバイト列上位4ビットを処理<br />
LCD_D4 = ( ( c >> 4 ) & 0x01 ) ;<br />
LCD_D5 = ( ( c >> 5 ) & 0x01 ) ;<br />
LCD_D6 = ( ( c >> 6 ) & 0x01 ) ;<br />
LCD_D7 = ( ( c >> 7 ) & 0x01 ) ;<br />
LCD_STROBE() ;<br />
// 送信データのバイト列下位4ビットを処理<br />
LCD_D4 = ( ( c ) & 0x01 ) ;<br />
LCD_D5 = ( ( c >> 1 ) & 0x01 ) ;<br />
LCD_D6 = ( ( c >> 2 ) & 0x01 ) ;<br />
LCD_D7 = ( ( c >> 3 ) & 0x01 ) ;<br />
LCD_STROBE() ;<br />
}</p>
<p>void command(unsigned char c)<br />
{<br />
LCD_RS = 0 ;<br />
LCD_D4 = ( ( c ) & 0x01 ) ;<br />
LCD_D5 = ( ( c >> 1 ) & 0x01 ) ;<br />
LCD_D6 = ( ( c >> 2 ) & 0x01 ) ;<br />
LCD_D7 = ( ( c >> 3 ) & 0x01 ) ;<br />
LCD_STROBE() ;<br />
}</p>
<p>/*******************************************************************************<br />
* lcd_clear - LCDモジュールの画面を消す処理 *<br />
*******************************************************************************/<br />
void lcd_clear(void)<br />
{<br />
LCD_RS = 0 ;<br />
lcd_write(0x01) ; // Clear Display : 画面全体に20Hのスペースで表示、カーソルはcol=0,row=0に移動<br />
__delay_ms(2) ; // LCDが処理(1.53ms)するのを待ちます<br />
}<br />
/*******************************************************************************<br />
* lcd_setCursor - LCDモジュール画面内のカーソル位置を移動する処理 *<br />
* col : 横(列)方向のカーソル位置(0-15) *<br />
* row : 縦(行)方向のカーソル位置(0-1) *<br />
********************************************************************************/<br />
void lcd_setCursor(int col, int row)<br />
{<br />
int row_offsets[] = { 0x00, 0x40 } ;</p>
<pre><code> LCD_RS = 0 ;
lcd_write(0x80 | (col + row_offsets[row])) ; // Set DDRAM Adddress : 00H-0FH,40H-4FH
</code></pre>
<p>}<br />
/*******************************************************************************<br />
* lcd_putc - LCDにデータを1バイト出力する処理 *<br />
* c : 出力する文字データ *<br />
*******************************************************************************/<br />
void lcd_putc(char c)<br />
{<br />
LCD_RS = 1 ; // RSの制御信号線をセットします<br />
lcd_write( c ) ; // LCDにデータの送信<br />
}<br />
/*******************************************************************************<br />
* lcd_puts - LCDに文字列データを出力する処理(文字列をNULL(0x00)まで繰返し出力)*<br />
* s : 出力する文字列のデータ *<br />
*******************************************************************************/<br />
void lcd_puts(const char * s)<br />
{<br />
LCD_RS = 1 ; // RSの制御信号線をセットします<br />
while(<em>s) lcd_write(</em>s++) ;<br />
}<br />
/*******************************************************************************<br />
* lcd_init - LCDの初期化処理 *<br />
*******************************************************************************/<br />
void lcd_init()<br />
{<br />
LCD_RS = 0 ;<br />
LCD_EN = 0 ;</p>
<pre><code> __delay_ms(15) ; // 電源ON後15msまで待ってから初期化
// LCDの立上げ時のチェックデータ(イニシャライズ処理用)を設定
command(0x03) ;
__delay_ms(5) ;
command(0x02) ;
// LCDにコマンドを発行します
lcd_write(0x28) ; // function set : データ線は4本・表示は2行・フォントは5x8ドット
lcd_write(0x0c) ; // display control: 画面表示はON・カーソル表示はOFF・カーソル点滅はOFF
lcd_clear() ; // Clear Display : 画面をクリアし、カーソル位置はcol=0,row=0
lcd_write(0x06) ; // entry mode set : 文字を表示した次にカーソルを移動するを指示
</code></pre>
<p>}</p>
<p>void interrupt inter(void) {<br />
InterUART();<br />
}</p>
<p>void main(void)<br />
{<br />
int i = 0;<br />
char s[17];<br />
// char debug[2] = "a";</p>
<pre><code>OSCCON = 0b01100010;
TRISC = 0b00000000;
ANSEL = 0b00000000;
ANSELH = 0b00000000;
PORTC = 0;
InitUART(12, 10, 51);
lcd_init();
lcd_setCursor(0, 0);
lcd_puts(" Monitor Start ");
while(1) {
if (UART_Available() != 0) {
char c = UART_Read();
if (c == '\n' || c == '\r') {
c = 0;
}
</code></pre>
<p>// debug[0] = c;<br />
// UART_Send(debug, 2);<br />
if (i < 16 || c == 0) {<br />
s[i++] = c;<br />
if (c == 0) {<br />
lcd_setCursor(0, 1);<br />
lcd_puts(" ");<br />
lcd_setCursor(0, 1);<br />
lcd_puts(s);<br />
i = 0;<br />
}<br />
}<br />
}<br />
}</p>
<pre><code>return;
</code></pre>
<p>}<br />
||</p>
<p>skUARTlib.hはこれまたきむ茶さんのところで手に入れたUARTプログラム。<br />
FT232RLとつないでteratermから文字を送ってみたら<br />
とくにつまづくことなくモニタに文字を表示することが出来た。感動。<br />
(ヌル文字の送り方が分からなかったので改行もヌル文字として扱っている)</p>
<p>引き続きPIC12F1822側の送信プログラムを試してみた。<br />
…が、動かない。<br />
どうも厳密なソフトウェアシリアルではなく、<br />
ソフトウェアシリアル同士でのみ通信できるシリアル通信もどきのようだ。</p>
<p>困った…、どう調整すればいいのかも分からない…。</p>
<p>PIC12F1822 シリアル通信<br />
で検索してみたところ、またもやきむ茶さんのサイトに辿り着いた。<br />
ぼーっと眺めていると、なんかUARTが使えるとか書いてある。<br />
え…?</p>
<p>データシートを見てみたら確かにRX, TXのピンがある。<br />
何だそりゃと思いつつskUARTlib.hを使ったプログラムに書き換えてみたら<br />
普通に動いた。<br />
こっちのほうが簡単じゃないか。</p>
<blockquote>
<p>|c|<br />
// 12F1822によるLCDモニターのサンプルプログラム</p>
</blockquote>
<h1 id="include <xc.h>"><a href="#include+%26lt%3Bxc.h%3E">include <xc.h></a></h1>
<h1 id="include <string.h>"><a href="#include+%26lt%3Bstring.h%3E">include <string.h></a></h1>
<h1 id="include <stdlib.h>"><a href="#include+%26lt%3Bstdlib.h%3E">include <stdlib.h></a></h1>
<h1 id="include "skUARTlib.h""><a href="#include+%22skUARTlib.h%22">include "skUARTlib.h"</a></h1>
<h1 id="define _XTAL_FREQ 8000000"><a href="#define+_XTAL_FREQ+8000000">define _XTAL_FREQ 8000000</a></h1>
<p>// コンフィギュレーション1の設定<br />
// CLKOUTピンをRA4ピンで使用する(CLKOUTEN_OFF):内部クロック使用する(FOSC_INTOSC)<br />
// 外部クロック監視しない(FCMEN_OFF):外部・内部クロックの切替えでの起動はなし(IESO_OFF)<br />
// 電源電圧降下常時監視機能ON(BOREN_ON):電源ONから64ms後にプログラムを開始する(PWRTEN_ON)<br />
// ウオッチドッグタイマー無し(WDTE_OFF):<br />
// 外部リセット信号は使用せずにデジタル入力(RA3)ピンとする(MCLRE_OFF)<br />
// プログラムメモリーを保護しない(CP_OFF):データメモリーを保護しない(CPD_OFF)<br />
__CONFIG(CLKOUTEN_OFF & FOSC_INTOSC & FCMEN_OFF & IESO_OFF & BOREN_ON &<br />
PWRTE_ON & WDTE_OFF & MCLRE_OFF & CP_OFF & CPD_OFF) ;<br />
// コンフィギュレーション2の設定<br />
// 動作クロックを32MHzでは動作させない(PLLEN_OFF)<br />
// スタックがオーバフローやアンダーフローしたらリセットをする(STVREN_ON)<br />
// 低電圧プログラミング機能使用しない(LVP_OFF)<br />
// Flashメモリーを保護しない(WRT_OFF):電源電圧降下常時監視電圧(2.5V)設定(BORV_25)<br />
__CONFIG(PLLEN_OFF & STVREN_ON & WRT_OFF & BORV_HI & LVP_OFF);</p>
<p>/*******************************************************************************<br />
* メインの処理 *<br />
*******************************************************************************/<br />
void main()<br />
{<br />
int i ;<br />
char s[17] ;</p>
<pre><code> OSCCON = 0b01110010 ; // 内部クロックは8MHzとする
ANSELA = 0b00000000 ; // アナログは使用しない(すべてデジタルI/Oに割当てる)
TRISA = 0b00000000 ; // ピンはRA1(SCL)/RA2(SDA)のみ入力(RA3は入力専用)
PORTA = 0b00000000 ; // 出力ピンの初期化(全てLOWにする)
// LCDモニターを使用する為の初期化処理
InitUART(2, 3, 51);
i = 0 ;
while(1) {
itoa(s,i,10) ;
UART_Send(s, strlen(s) + 1);
i++ ;
__delay_ms(1000) ; // 1秒後に繰り返す
}
</code></pre>
<p>}<br />
||</p>
<p>画像をつけようと思ったが<br />
輝度調整を省いたのでLCDが明るすぎてLCDしか映らなかったので省略。</p>
<p>さてこれでmTouchが試せそうだ。</p>
だら@Crieit開発者
tag:crieit.net,2005:PublicArticle/14385
2014-05-03T09:00:00+09:00
2018-10-31T11:15:42+09:00
https://crieit.net/posts/arduino-5b0d18bd4ef39
arduinoの自作ブレッドボード版
<p>arduino UNO互換ボードの作成のために<br />
まずブレッドボードに組んでみた。<br />
USBシリアル変換はPIC18F14K50を使用している。</p>
<p>ブートローダの書き込みは、ほかのサイトを参考にしながら<br />
optifixを使用したところ簡単に出来た。<br />
回路を組めば最終的に書き込み用の回路もできているので<br />
そちらをそのまま使った。</p>
<p>ハマったところをメモ。</p>
<p>とりあえず回路を組んでスケッチをアップしてみたのだがうまくいかない。<br />
avrdude: stk500_getsync(): not in sync: resp=0x00<br />
のエラーが出る。<br />
USBシリアルの回路を疑ってFT232RLに置き換えてみたがうまくいかない。<br />
なので回路やブートローダの書き込みなど何かがおかしいんだろうと思った。<br />
この日は諦める。</p>
<p>次の日、何故か知らないがFT232RLでやったら普通に上手く行った。<br />
なんだろう…。<br />
何にしろこの調子で一気に進めてしまおうと思った。</p>
<p>しかしPICに置き換えてみるとうまくいかない。<br />
<a target="_blank" rel="nofollow noopener" href="http://www.pwv.co.jp/~take/TakeWiki/index.php?Arduino%2FPIC18F14K50%E3%82%92USB%E5%A4%89%E6%8F%9B%E3%82%A2%E3%83%80%E3%83%97%E3%82%BF%E3%83%BC%E3%81%AB%E3%81%99%E3%82%8B" target="_blank">PIC18F14K50をUSB変換アダプターにする</a><br />
を参考にしてやっていたのだがどうもうまくいかない。<br />
ところが試しにスケッチアップロードの際にリセットボタンを押してみたところ<br />
あっさりアップ出来た。<br />
どうもDTRが上手く機能していないのでは。</p>
<p>ぐぐってみると同じようにPIC18F14K50を使用している人がいた。<br />
<a target="_blank" rel="nofollow noopener" href="http://hp.vector.co.jp/authors/VA000177/html/Arduino400.html" target="_blank">Arduino400</a><br />
試しにこちらを使用してみたところ、あっさりとスケッチがアップ出来た。<br />
どうも原因はDTRがうまく機能していなかったようだ。</p>
<p>ということでarduino UNO互換回路が出来上がったので<br />
基板に実装してみようと思う。<br />
Cタイプのユニバーサル基板に丁度収まるくらいっぽい。</p>
<p><a target="_blank" rel="nofollow noopener" href="http://program.alphabrend.com/wp-content/uploads/2014/05/DSC_0233.jpg"><img class="alignnone size-medium wp-image-336" title="DSC_0233" src="http://program.alphabrend.com/wp-content/uploads/2014/05/DSC_0233-225x300.jpg" alt="" width="225" height="300" /></a><a target="_blank" rel="nofollow noopener" href="http://program.alphabrend.com/wp-content/uploads/2014/05/DSC_0234.jpg"><img class="alignnone size-medium wp-image-337" title="DSC_0234" src="http://program.alphabrend.com/wp-content/uploads/2014/05/DSC_0234-225x300.jpg" alt="" width="225" height="300" /></a></p>
だら@Crieit開発者
tag:crieit.net,2005:PublicArticle/14395
2014-04-17T09:00:00+09:00
2018-10-31T11:14:34+09:00
https://crieit.net/posts/FT232RL-PIC18F14K50
FT232RLの代わりにPIC18F14K50を使う
<p>FT232RLは高いので、PICで代用できないか、という考え。<br />
<a target="_blank" rel="nofollow noopener" href="http://www.pwv.co.jp/~take/TakeWiki/index.php?Arduino%2FPIC18F14K50%E3%82%92USB%E5%A4%89%E6%8F%9B%E3%82%A2%E3%83%80%E3%83%97%E3%82%BF%E3%83%BC%E3%81%AB%E3%81%99%E3%82%8B" target="_blank">PIC18F14K50をUSB変換アダプターにする</a><br />
のサイトを参考にする。</p>
<p>しかし、バージョンの問題か何か知らないが、<br />
現状のMicrochip librariesにはSerial Emulatorというのが無い…。<br />
これは困った…とおもったら上記サイトにhexがあったので<br />
そのまま書き込んでみたら上手く行った。<br />
昨日作成したもう1個別のpic18f14k50とそのまま連携できた。<br />
しかし他のICの時はどうするんだろ…。どっかにソースが残っていればいいが…。</p>
<p>まあ何にしろ、以前PIC18F14K50単体をUSBコネクタと接続して<br />
なんだかんだするテストは済んでいるので、<br />
これでFT232RLの代わりにPIC18F14K50をUSBシリアル変換器として利用し、<br />
arduinoを作成する準備が整った。<br />
材料を安くで揃えておけばarduinoが千円未満で作成できる。<br />
そろそろ材料を揃えるか…。<br />
たまには実際に秋月の店舗に行ってみたい。</p>
<p>追記<br />
ソース見つけた。<br />
最新のCurrent MLA v2013-12-20ではなく、<br />
Legacy MLA v2013-06-15の方にだいじなもの全部入ってた。</p>
だら@Crieit開発者
tag:crieit.net,2005:PublicArticle/14396
2014-04-16T09:00:00+09:00
2018-10-29T15:31:04+09:00
https://crieit.net/posts/PIC18F14K50-FT232RL
PIC18F14K50とFT232RLでシリアル通信
<p>PIC18F14K50とFT232RLでシリアル通信を試した。<br />
元々やろうと思っていて全然手を出していなかった。</p>
<p>というのも、arduinoの簡単さに感心してしまい、<br />
PICはなぜすぐに色々な機能が実現できるライブラリさえ<br />
提供していてくれないのだろう、という思いがあり、<br />
やるなら使いまわせるライブラリを作りたい、と考えていた。</p>
<p>そんなおり、色々ネットを見ていて、<br />
気が付くとよくきむ茶さんのサイトに辿り着いたりするのだが、<br />
よくよく見るときむ茶さんがダウンロードできるようにしてくれているソースには、<br />
UARTやSPIなど、面倒なところをライブラリにまとめてくれていて、<br />
それを使えばわざわざ自分で書かなくても簡単に色々出来てしまう。<br />
まさに欲しいなと思っていたものだった。もっと早く気付けばよかった。</p>
<p>ということで、きむ茶さんのサイトにある通りに試しただけ。<br />
<a target="_blank" rel="nofollow noopener" href="http://www.geocities.jp/zattouka/GarageHouse/micon/linkPC/FT232R.htm" target="_blank">http://www.geocities.jp/zattouka/GarageHouse/micon/linkPC/FT232R.htm</a><br />
今後も色々使い倒していきたいと思う。</p>
<p>18F14K50用のソースは下記。</p>
<blockquote>
<p>|c|</p>
</blockquote>
<h1 id="include <xc.h>"><a href="#include+%26lt%3Bxc.h%3E">include <xc.h></a></h1>
<h1 id="include "skUARTlib.h""><a href="#include+%22skUARTlib.h%22">include "skUARTlib.h"</a></h1>
<p>// PIC18F14K50</p>
<h1 id="pragma config FCMEN = OFF"><a href="#pragma+config+FCMEN++%3D+OFF">pragma config FCMEN = OFF</a></h1>
<h1 id="pragma config IESO = OFF, USBDIV = OFF, CPUDIV = NOCLKDIV"><a href="#pragma+config+IESO+++%3D+OFF%2C+USBDIV+%3D+OFF%2C+CPUDIV+%3D+NOCLKDIV">pragma config IESO = OFF, USBDIV = OFF, CPUDIV = NOCLKDIV</a></h1>
<h1 id="pragma config WDTEN = OFF"><a href="#pragma+config+WDTEN++%3D+OFF">pragma config WDTEN = OFF</a></h1>
<h1 id="pragma config BOREN=NOSLP,BORV=30,PWRTEN=ON"><a href="#pragma+config+BOREN%3DNOSLP%2CBORV%3D30%2CPWRTEN%3DON">pragma config BOREN=NOSLP,BORV=30,PWRTEN=ON</a></h1>
<h1 id="pragma config HFOFST = OFF, MCLRE = OFF"><a href="#pragma+config+HFOFST+%3D+OFF%2C+MCLRE++%3D+OFF">pragma config HFOFST = OFF, MCLRE = OFF</a></h1>
<h1 id="pragma config STVREN = ON, BBSIZ = OFF, LVP = OFF"><a href="#pragma+config+STVREN+%3D+ON%2C++BBSIZ++%3D+OFF%2C+LVP++++%3D+OFF">pragma config STVREN = ON, BBSIZ = OFF, LVP = OFF</a></h1>
<h1 id="pragma config XINST = OFF"><a href="#pragma+config+XINST++%3D+OFF">pragma config XINST = OFF</a></h1>
<h1 id="pragma config CP0 = OFF, CP1 = OFF, CPB = OFF"><a href="#pragma+config+CP0++++%3D+OFF%2C+CP1++++%3D+OFF%2C+CPB++++%3D+OFF">pragma config CP0 = OFF, CP1 = OFF, CPB = OFF</a></h1>
<h1 id="pragma config WRT0 = OFF, WRT1 = OFF, WRTB = OFF, WRTC = OFF"><a href="#pragma+config+WRT0+++%3D+OFF%2C+WRT1+++%3D+OFF%2C+WRTB+++%3D+OFF%2C+WRTC+++%3D+OFF">pragma config WRT0 = OFF, WRT1 = OFF, WRTB = OFF, WRTC = OFF</a></h1>
<h1 id="pragma config EBTR0 = OFF, EBTR1 = OFF, EBTRB = OFF"><a href="#pragma+config+EBTR0++%3D+OFF%2C+EBTR1++%3D+OFF%2C+EBTRB++%3D+OFF">pragma config EBTR0 = OFF, EBTR1 = OFF, EBTRB = OFF</a></h1>
<p>//内部クロック</p>
<h1 id="pragma config FOSC = IRC, PLLEN = OFF"><a href="#pragma+config+FOSC+++%3D+IRC%2C++PLLEN++%3D+OFF">pragma config FOSC = IRC, PLLEN = OFF</a></h1>
<h1 id="define _XTAL_FREQ 8000000"><a href="#define+_XTAL_FREQ+8000000">define _XTAL_FREQ 8000000</a></h1>
<p>void interrupt inter(void) {<br />
InterUART();<br />
}</p>
<p>void init(void)<br />
{<br />
OSCCON = 0b01100010;<br />
ANSEL = 0;<br />
ANSELH = 0;<br />
TRISA = 0;<br />
TRISB = 0b00100000; //RX in<br />
TRISC = 0;<br />
USBEN = 0;<br />
IOCA0 = 1;<br />
IOCA1 = 1;<br />
PORTA = 0;<br />
PORTB = 0;<br />
PORTC = 0;<br />
}</p>
<p>void main(void)<br />
{<br />
char data[3];</p>
<pre><code>init();
InitUART(12, 10, 51);
data[1] = 0x0d;
data[2] = 0x0a;
while(1) {
if (UART_Available() != 0) {
data[0] = UART_Read();
data[0] += 2;
UART_Send(data, 3);
}
}
return;
</code></pre>
<p>}<br />
||</p>
<p>InitUARTの中身を見てみるとわかるが、ICによって処理が分けられている。<br />
18F14K50にはRX, TXは1個ずつしか無いので特に設定はいらないため<br />
そのまま使える。最初の2つの引数は使ってないので適当な値でもいい。<br />
他のICを使う場合はそこに分岐処理を追加していけばいい。<br />
githubに上がってみんなで更新していけるとよさげなライブラリ…。</p>
<p>ハマったところとしては、<br />
どうしても割り込み関数が呼ばれず、全然動作しなかった。<br />
なんか設定やコンフィグがおかしいのかな〜と思い時間かけて調べたが分からず。<br />
よくよく調べるとFT232とPICのRX同士、TX同士をつないでいたという<br />
初心者にありがちそうなミス…。</p>
だら@Crieit開発者
tag:crieit.net,2005:PublicArticle/14402
2014-04-07T13:04:12+09:00
2018-10-31T21:27:29+09:00
https://crieit.net/posts/PIC18F14K50-USB
PIC18F14K50でUSBシリアル通信
<p>PIC18F14K50でシリアル通信を行った。<br />
<a target="_blank" rel="nofollow noopener" href="http://program.alphabrend.com/wp-content/uploads/2014/04/DSC_0219-1.jpg"><img class="alignnone size-medium wp-image-256" title="DSC_0219 (1)" src="http://program.alphabrend.com/wp-content/uploads/2014/04/DSC_0219-1-225x300.jpg" alt="" width="225" height="300" /></a></p>
<p>なんてことはない、先日購入した秋月の<br />
<a target="_blank" rel="nofollow noopener" href="http://akizukidenshi.com/catalog/g/gK-05499/" target="_blank">PIC18F14K50使用USB対応超小型マイコンボード</a><br />
の回路を自分で組み立てただけ。<br />
プログラムは<a target="_blank" rel="nofollow noopener" href="http://program.alphabrend.com/?p=240" target="_blank">先日の記事</a>と同じ。<br />
秋月のこういうキットは実用的なだけではなく、<br />
回路図が公開されているので自分で作ることも出来てしまう。<br />
やる気があれば勉強にもなるし自分で作れば節約にもなるので<br />
自分のような初心者には本当に助かる。</p>
<p>組み立てキットは800円。<br />
自分で組み立てた回路は複数パック品も全部1個分の値段で考えると</p>
<p>IC 170円<br />
12MHzクリスタル 1個40円<br />
USBコネクタ 1個50円(ただし今回はDIP可されたものを買ったので200円)<br />
ポリスイッチ350mAがなかったので200mA 30円<br />
(正しくないかもしれないので確認して下さい)<br />
積層セラミックコンデンサー 15pF 15円☓2<br />
その他コンデンサ3つくらい 計50円くらい?</p>
<p>…合計400円弱。<br />
DIP可されたコネクタの方でも500円ちょい。<br />
いっぱいシリアル通信したものが作りたい時は<br />
自分で組み立てた方が経済的だ。</p>
<p>あとは、これをUSBシリアルモジュールとするプログラムに変更し、<br />
汎用的に使ったりarduino自作の時に使えたらと考えている。</p>
だら@Crieit開発者
tag:crieit.net,2005:PublicArticle/14406
2014-04-04T09:00:02+09:00
2018-10-31T11:16:52+09:00
https://crieit.net/posts/18c97009d3861183c3a4dfbe2ddf4d0b
PIC18F14K50使用USB対応超小型マイコンボード
<p>PICでもシリアル通信がしたいと思い秋月で<br />
PIC18F14K50使用USB対応超小型マイコンボードを買った。</p>
<p>とりあえずMicrochip Application librariesのUSB CDCをそのまま試してみることに。<br />
なんかIDEで読み込んで、その後プロジェクトをIDEから外すと<br />
ファイルまで消えてることがあるらしいので<br />
ドキュメントフォルダにコピーして試すことにした。</p>
<p>ただし、他のサンプルやMicrochip Application librariesのフォルダを参照しているので<br />
ただコピーするだけではビルド出来ない。<br />
なのでまず参照設定をみて、メモっておく。次に<br />
cdc_basic/firmware/MPLAB.X/nbproject/configurations.xml<br />
をテキストエディタで開き、Microchip Application librariesを参照している箇所を<br />
全部相対パスから絶対パスに置換する。<br />
これでプロジェクトを開けば問題ない感じになっている。</p>
<p>あとはプロジェクト設定で自分の使うICの電源設定など必要なところを変更し、<br />
IDE上部のプルダウンでその設定を変更してビルドして書き込むだけ。</p>
<p>USBをさした後、デバイスマネージャでsampleCDCみたいな<br />
未解決なデバイスが増えているので、<br />
ネット上にあるmchpcdc.infを指定して更新すればOK。</p>
<p>サンプルプログラムだと<br />
teratermで送信すると、自分の送った値+1の値が返ってくる。<br />
例えばAだとBとか。<br />
ソースはapp/app_device_cdc_basci.cの<br />
APP_DeviceCDCBasicDemoTasksというところで行われている。</p>
<p>だいたいこういうのはかなりハマるんだが<br />
あっさりできて拍子抜けだが助かる。</p>
だら@Crieit開発者
tag:crieit.net,2005:PublicArticle/14409
2014-03-31T09:00:00+09:00
2018-10-25T13:55:15+09:00
https://crieit.net/posts/PIC18F14k50-USB-5b0d18bd8474a
PIC18F14k50使用USB対応超小型マイコンボード
<p>秋月のPIC18F14k50使用USB対応超小型マイコンボードを買った。<br />
やっぱPICでもUSBでシリアル通信がしたい。</p>
<p>まだ慣れてないはんだ付けをしないといけないので<br />
最初に全部の出力が上手くハンダ付けできているかを確認。<br />
プログラムは<br />
<a target="_blank" rel="nofollow noopener" href="http://yak-shaver.blogspot.jp/2013/09/pic18f14k50-l.html" target="_blank">秋月の PIC18F14K50 ボードでLチカ</a><br />
を参考にした。<br />
configが多すぎてびびる…。</p>
<p>このボードはPORTAが使えないようになっている<br />
(RA0, RA1はpickit使わなければ使える?)<br />
のでそれ以外を1個づつLED点灯させてみることにした。</p>
<p>プログラム部分は下記みたいな感じで<br />
LEDのdefineをRB4〜7, RC0〜7に変えながら試せばいい。<br />
というか全部HIGHにしてどんどん差しなおせばいいだけだった…。</p>
<blockquote>
<p>|c|</p>
</blockquote>
<h1 id="define LED RB4"><a href="#define+LED+RB4">define LED RB4</a></h1>
<p>void init(void)<br />
{<br />
TRISB = 0b00000000; // direction: all out<br />
TRISC = 0b00000000; // direction: all out<br />
ANSEL = 0b00000000; // analog/digital: all digital<br />
ANSELH = 0b00000000; // analog/digital: all digital<br />
}</p>
<p>void main(void)<br />
{<br />
init();<br />
PORTB = 0;<br />
PORTC = 0; // output to port c</p>
<pre><code>while(1) {
LED = 1;
__delay_ms(65); // < 66 ms at 12MHz
LED = 0;
__delay_ms(65); // < 66 ms at 12MHz
}
return;
</code></pre>
<p>}<br />
||</p>
だら@Crieit開発者