Dies Aliquanti

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

PICC-Lite使って見ました (3)

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互換プロセッサでのシミュレーション実行結果はこんな感じ。
WaveInC.JPG
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()


コメント

遊びに来てくれてありがとう!

こんばんは~遊びに来てくれてありがとうございます!!
おお~~私にはちんぷんかんぷんな文字データばかりです~~~

これからもたまに遊びに来て下さいね~
ちなみにラプターは自作で
発泡スチロールからの削り出しで作りました。

  • 2007/10/05(金) 00:57:16 |
  • URL |
  • ヴァニラスカイ #79D/WHSg
  • [ 編集 ]

ANSI C流儀のキャストとか定数代入

INTCON = 0xa0; 見たいに定数を代入するとき
INTCONがunsigned intならば・・・
INTCON= (unsigned int)0xa0
そんでINTCONがunsigned charならば・・・
INTCON= (unsigned int)0xa0

って定数が想定している型を括弧で括って記述してあげるのがANSI流儀ね。

ANSI流儀ならばキャストも hogehoge = (hogehogeの型)fugefugeって記述するのね。

ただキチキチに文法準拠させると、コーディングでキャスト回りの思い違いがあったときに、ワーニングがでないから探すのが難しくなるのが欠点ね。

  • 2007/10/05(金) 16:37:17 |
  • URL |
  • maimi09 #79D/WHSg
  • [ 編集 ]

Re:ANSI C流儀のキャストとか定数代入(10/03)

maimi09さん、お久しぶりです。
>INTCON = 0xa0; 見たいに定数を代入するとき
ご指摘、ごもっとも。私は、K&Rの時代のcプログラマなので、右辺式をきっちりcastする習慣がないのです(笑)。
44行目のcastもこれでちゃんと動作することは、アセンブラコードで確認しています。
castを使うより、変数の定義で、unionにするほうが、c本来の使い方ぽいですかね?
いずれにしても、処理系に思いっきり依存することになりますが…
では、では。

  • 2007/10/07(日) 09:35:59 |
  • URL |
  • 莫迦オヤジ #79D/WHSg
  • [ 編集 ]

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://diesaliquanti.blog.fc2.com/tb.php/393-2aa6d7a2
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad

まとめ

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。