|
テーマ:電子工作(533)
カテゴリ:電子工作
HI-TECH SoftwareのPIC用cコンパイラのフリー版(以下、PICC-Lite)の新しい版v9.60PL1がリリースされていたので、拾ってきた。Vista対応になったそうである。インストールして、マニュアルをナナメ読みしてみて、面白そうなので、ちょっと実験。
もとのソフトは、以前使った、MicroChipのWebページに掲載されているプログラム http://www.microchip.co.jp/seminar/200203/jisshuu.pdf 。これを適当にcで書き直したもの(最後に載せました)。もとのアセンブラのプログラムが130行程度ですが、こちらは80行にも満たない量です。それより、読みやすいですねー、やっぱり。 PIC16F84互換プロセッサでのシミュレーション実行結果はこんな感じ。 54行目で、ループの待ち時間をオリジナルより短くしているので、アセンブラ版 http://plaza.rakuten.co.jp/pressgreenbutton/diary/200709150000/ より、LED(PORTB)の点滅は速くなっています。オリジナルのアセンブラのプログラムに似せて、変数flagは構造体にして、bitを扱っています。 それにしても、cを使うのは実に13年半ぶり。そのころは、MS-CでMS-DOS用のプログラムだったので、volatile修飾子とか使うのは初めてです。変数flagの初期化もオリジナルのアセンブラのプログラムに似せて、むりむりcastしてます(44行目)が、こういうcastの書き方もやり方をほとんど忘れてしまっていて、思い出すのにちょっと苦労してしまいました。トシはとりたくないものです(笑)。 ---- 本日の御託 急に涼しくなって、体調を崩しかけていたので、アルコール消毒を実施(早い話、呑みに行ったのだ)したが、効果なし。かえって調子悪し… 1 // 2 // (c) 2007 Bakaoyaji 3 // The original version is from microchip 4 // http://www.microchip.co.jp/seminar/200203/jisshuu.pdf 5 6 #include "pic.h" 7 8 #define PORTB_INIT (0x01) 9 // #define DEB_INIT (200) 10 #define DEB_INIT (3) 11 12 unsigned char portb_out, deb_cnt, cnt0, cnt1 ; 13 volatile struct { 14 unsigned shift : 1 ; 15 unsigned hit : 1 ; 16 } flag ; 17 18 void ioport(void) ; 19 void delay( unsigned char ) ; 20 21 static void interrupt isr(void) { 22 if(T0IF) { 23 T0IF = 0 ; 24 if( !(PORTA & 0x01 )) { // key press 25 if( !flag.hit ) { 26 if( --deb_cnt == 0 ) { 27 flag.hit = 1 ; 28 flag.shift = flag.shift ^ 1 ; 29 } 30 } 31 } else { // key release 32 flag.hit = 0 ; 33 deb_cnt = DEB_INIT ; 34 } // else 35 } 36 } // isr 37 38 void main(void) { 39 portb_out = 0 ; 40 ioport() ; 41 OPTION = 0xd0 ; // bank1 42 // flag.shift = 0 ; 43 // flag.hit = 0 ; 44 *( (unsigned char * ) &flag ) = 0x00 ; 45 deb_cnt = DEB_INIT ; 46 portb_out = PORTB_INIT ; 47 TMR0 = 0 ; 48 INTCON = 0xa0 ; 49 while (1) { 50 CLRWDT() ; 51 ioport() ; 52 delay( 40) ; // delay( 150) ; 53 if( !flag.shift ) { 54 continue ; 55 } 56 portb_out <<= 1 ; 57 if( portb_out == 0 ) { 58 portb_out = PORTB_INIT ; 59 } 60 } // while 61 } // main() 62 63 void ioport(void) { 64 PORTA = 0 ; 65 PORTB = portb_out ; 66 TRISA = 0x01 ; // bank1 67 TRISB = 0x00 ; // bank1 68 } // ioprt() 69 70 void delay( unsigned char d) { 71 cnt0 = d ; 72 do { 73 cnt1 = 0 ; 74 do { 75 asm("nop") ; 76 } while ( --cnt1!=0 ) ; 77 } while( --cnt0 !=0 ) ; 78 } // delay() お気に入りの記事を「いいね!」で応援しよう
[電子工作] カテゴリの最新記事
|