PICkit 2を購入
2009年6月21日
先日、サンフランシスコの紀伊国屋に行ったとき、何気なく手にしたトランジスタ技術・2009年4月号。そこでの特集が、『これなら分かる!!PICマイコン』。以前から、PICでもAVRでもなんでもいいから、マイクロコントローラを使えるようにならにゃイカンなと思っていて、その機会がなかったのだが、これを機に勉強することにした。
トラ技をよむと、Cでプログラムが組めるではないか!しかも、HITEC-C liteというのを用いれば、すべてフリーソフトでできる。これはいい。アセンブラも楽しいが、Cで組めるとなると、やりたいことがすぐにコードになるという利点がある。
Microchip社が、これもフリーで出しているMPLAB IDEと、HITEC-Cを用いてトラ技を見ながら始めて書いたコードは以下のとおり。
main()関数の中に色々と書けば、色々とできる。簡単・簡単。
早速、手作りコンピューターでのとりあえずの目標である、円周率の計算を行うマイコンを製作した。アルゴリズムは、Jeans & Developmentに書いたとおり。
PICのほうの技術としては、タイマー割り込みとLEDのダイナミック点灯を利用している。これらの詳しい解説は、トラ技に載っている。回路も、3つの7セグメントLEDを点灯させるだけの簡単なものなので、割愛。下の写真は、できた回路を、PICkit 2につないでいるところ。
![pi_calc](/jeans/skins/media/1/20090622-pi_calc.jpg)
プログラムは以下のようになった。
PICkitからはずして、6V電源だけを供給して実行させると、以下のとおり。
トラ技をよむと、Cでプログラムが組めるではないか!しかも、HITEC-C liteというのを用いれば、すべてフリーソフトでできる。これはいい。アセンブラも楽しいが、Cで組めるとなると、やりたいことがすぐにコードになるという利点がある。
Microchip社が、これもフリーで出しているMPLAB IDEと、HITEC-Cを用いてトラ技を見ながら始めて書いたコードは以下のとおり。
#include <pic.h> __CONFIG(INTIO & WDTDIS & PWRTDIS & MCLRDIS & UNPROTECT & BORDIS & IESODIS & FCMDIS); void main(){ }
main()関数の中に色々と書けば、色々とできる。簡単・簡単。
早速、手作りコンピューターでのとりあえずの目標である、円周率の計算を行うマイコンを製作した。アルゴリズムは、Jeans & Developmentに書いたとおり。
PICのほうの技術としては、タイマー割り込みとLEDのダイナミック点灯を利用している。これらの詳しい解説は、トラ技に載っている。回路も、3つの7セグメントLEDを点灯させるだけの簡単なものなので、割愛。下の写真は、できた回路を、PICkit 2につないでいるところ。
![pi_calc](/jeans/skins/media/1/20090622-pi_calc.jpg)
プログラムは以下のようになった。
#include <pic.h> __CONFIG(INTIO & WDTDIS & PWRTDIS & MCLRDIS & UNPROTECT & BORDIS & IESODIS & FCMDIS); unsigned char led7(char num){ unsigned char ret=0xFF; if (num & 0x10) ret=0xF7; switch (num & 0x0F) { case 0: return ret & 0x28; case 1: return ret & 0x7B; case 2: return ret & 0x1C; case 3: return ret & 0x19; case 4: return ret & 0x4B; case 5: return ret & 0x89; case 6: return ret & 0x88; case 7: return ret & 0x2B; case 8: return ret & 0x08; case 9: return ret & 0x09; default: return 0xff; } } // 10000 cycles @ 8 MHz / 4 == 5 ms #define WAIT_CYCLE (10000-23) #define TMR1H_INIT ((unsigned char)(((unsigned short)(65536-WAIT_CYCLE))>>8)) #define TMR1L_INIT ((unsigned char)(((unsigned short)(65536-WAIT_CYCLE))&0x00ff)) unsigned char g_ledp=0; unsigned short g_num=0; void interrupt int_function (void) { if (!TMR1IF) return; TMR1H=TMR1H_INIT; TMR1L=TMR1L_INIT; TMR1IF=0; if (++g_ledp==3) g_ledp=0; PORTA=0x00; switch (g_ledp) { case 0: PORTC=led7(0x10 | g_num / 100); PORTA=0x04; break; case 1: PORTC=led7(( g_num / 10 ) % 10); PORTA=0x10; break; case 2: default: PORTC=led7(g_num % 10); PORTA=0x20; break; } } void delay(){ unsigned char c1,c2; for (c1=0;c1<255;c1++) for (c2=0;c2<255;c2++); } float calc_pi(unsigned long max){ unsigned long total=0; unsigned long max2=max*max; unsigned long prev_y=max-1; unsigned long x,y,max2_x2; for (x=0;x<max;x++) { max2_x2=max2-x*x; for (y=prev_y;0<=y;y--) { if (y*y<max2_x2) break; } total+=y+1; prev_y=y; } return ((float)total/(float)max2)*4; } void main(){ // CLK=8 MHz OSCCON=0x70; // All output TRISA=0; TRISB=0; TRISC=0; // Non-analog mode ANSEL=0x00; ANSELH=0x00; // Scaler 1:1 T1CON=0x00; // Reset timer TMR1H=0x00; TMR1L=0x00; // Clear flag TMR1IF=0; // Enable interrupt TMR1IE=1; PEIE=1; GIE=1; // Start timer TMR1ON=1; unsigned long max; float pi; for(max=1;max<8192;max*=2){ pi=calc_pi(max); g_num=(unsigned short)(pi*100); delay(); } while(1); }
PICkitからはずして、6V電源だけを供給して実行させると、以下のとおり。