忍者ブログ
RoboCup Junior Japan Rescue Kanto OB

             2005~2013
[44]  [45]  [46]  [47]  [48]  [49]  [50]  [51]  [52]  [53]  [54
という訳で、全く脈略もないままに16F19XXHITECコンパイラでのPWMの作動方法について書くことになりました。


PWMについての説明やらなんやらはもう以前の記事で再々やっているような気がいたしますので、

ここでは省略させて頂きます。

という訳で今回はプログラムのお話を。
因みに今回の記事はデータシートが手元にあることを前提としていますので、レジスタの中の詳しい紹介等は行いません。

まず、PWMを行なうにはタイマーの設定が必要です。

これは要するに波の周期を決定するために使われるもので、一般には慣例としてタイマー2が使われるようですね。

別に1でなければどのタイマーでも大丈夫なはずです。

タイマーの設定をするレジスタはT2CONレジスタ。

今回は特に何か指定することもなかったのでEnable、つまりタイマーを有効にする設定のみを行なっています。


あと重要なのが、PR2レジスタで、この値でPWMの周期を決めます。

この値はある計算値を基にして求められるのですが、わざわざ求めなくても、

データシートにPRレジスタの値と主なPWM周期の表が載っていたりします。

ということで今回はこの表に基づいて0xFFとしました。これだと周波数は31.25kHzになりますね。

因みに計算式もその表の付近に載っています。


こんな感じであっけなくタイマーの設定は終了。タイマーのレジスタについてはまた別途の記事で詳しく説明します。


そして今度はPWMの設定。PICではPWMはCCPとかECCPというモジュール内に含まれている機能ですので、

このCCPのレジスタを利用してPWMの設定を行います。

まずは、CCP2CON、今回はCCP2を使うのでこのレジスタを使います。

このレジスタは

ビット7-6:拡張PWMの設定

ビット5-4:デューティ比の最下位2ビット

ビット3-0:モードの選択

となっています。

今回は拡張に興味が無いので7-6は00、

デューティ比はこのPICの場合、最高10ビットで設定出来るようなので、下位ビット分がこんなところで設定できます。

でも、下位ビットっていうと1か2の違いですから、正直どうでもいい。どっちも00でいいでしょう。

3-0は当然PWMの設定になりますね。ECCPの場合はアクティブハイがどうたらと書いてありますが、

どちらもアクティブハイでないと後々面倒なので全部アクティブハイになる1100でいいでしょう。



こんな感じでPWMの初期設定は終了です。

あとはCCPR2Lレジスタで上位8ビット分のデューティ比をプログラム内で設定してやれば

後は勝手にモジュールの方が波形を出力してくれます。

因みにデューティ比は実際には、 設定した値/4(PR+1) になります。

なのでそのあたりはちょっと注意が必要です。


でもこの値ってよく考えるとPRがFFだと分母は10進数で1024になりますよね。

だから単純に1024段階と思って頂ければ何も考えることは無いかと思います。


とまぁPWMのプログラムはこんな感じ。

細かいレジスタ等の紹介はまた別途で行いたいと思います。

という訳で今日は最後に適当なプログラムを乗っけて終了です。このプログラム動いたっけかなぁ・・・?

もしかしたらPICのヘッダをhtcかそこら辺にしないと動かないかもしれません。
 
#include "pic16f1939.h"
#define _XTAL_FREQ 32000000
 
__CONFIG(
FOSC_INTOSC & WDTE_OFF & PWRTE_ON & MCLRE_OFF & CP_OFF
& CPD_OFF & BOREN_OFF & CLKOUTEN_OFF & IESO_OFF & FCMEN_OFF
);
__CONFIG(
WRT_OFF & PLLEN_ON & STVREN_ON & LVP_OFF
);
 
 
int main(void)
{
PORTA = 0b00000000;
PORTB = 0b00000000;
PORTC = 0b00000000;
PORTD = 0b00000000;
ANSELA=0;
ANSELB=0;
ANSELD=0;
TRISA = 0b00000000;
TRISB = 0b00000000;
TRISC = 0b00011000;
TRISD = 0b00000000;
 
OSCCON=0b01110000;
 
CCP2CON = 0b00001100; //PWMモードにする
PR2 = 0xFF;
T2CON = 0b00000100; //Timer2 Enable
 
while(1)
{
CCPR2L = 0x80;
}
 
}

(^・ω・)ノ RadiumProduction in RoboCup Junior
ロボカップジュニアレスキューにおいて、一番最初に現れるであろう課題がライントレースというものです。
ライントレース中のロボットの写真。これがあの有名なSAINⅩⅢです(笑)
ライントレースとは、床に描かれたラインをロボットが辿る(トレースする)動作のことで、工場のライン等に使われています。

基本的にはロボットの下部にラインセンサーと呼ばれるセンサーを搭載して、

そのセンサーからの情報を元にロボットの動作を決定するような仕組みです。

ラインセンサーにはよく、赤外線の反射型の光センサーが使われます。

これは、センサーから光を放出し、床に反射した反射光の量を測定するセンサーです。

反射光の量から床の色の明暗がわかりますので、だいたの色を把握することができます。

しかし、モノクロにした際に色の違いがわからないような色同士だと、やっぱり区別がつきません。

という訳なので、ライントレースを行わせる際にはラインの色と床の色の明暗をはっきりとさせる必要があります。

ロボカップの場合はラインの色が黒、床の色が白となっています。

これをロボットにトレースさせて、競技を進行していく訳です。

ロボットによってセンサーの数は様々で、

1個でライントレースするロボットもいれば、10個以上使用するロボットも存在します。前に作ったロボットだと12個あったっけかなぁ。

また、LEGOだと赤外線ではなく、普通の赤色LEDを使用していますね。

以上がライントレースの簡単な紹介です。

簡単なので、特に課題とするまでもなさそうですが、これにギャップやら串やらが加わると難しくなってきます。


そもそも、これが出来れば一階はほぼ完璧ということになりますので、

ノード大会くらいならこれだけで突破できるのではないでしょうか(笑)

まぁ今ロボカップ自体のレベルはどんどん下降傾向にありますから、

この辺りができていればまぁなんとかなるのではないでしょうか。


という訳で今回の記事はこの辺で。

(^・ω・)ノ RadiumProduction in RoboCup Junior
ロボカップをやっていると、やっぱりどうにも、機械も回路も両方なんとかなる人が出来上がりますよね。

僕もそれは例外ではなく、色々意味不明なものを作ったりもしています。

今日は家の倉庫と呼ばれる部分からコイツを掘り出してきました。
電動ノコギリ、略して電ノコです。

電動ノコギリ、略して電ノコですね。小、中学校の図工や技術の授業で一度は見たことがあるのではないでしょうか。

経緯は知りませんが、何故かうちにはコレがあるんですよね。

ウチは工学系の高専なんだからわざわざ掘り出さなくても学校でやればいいじゃないと思うかもしれませんが、

うちの学校の機械科って金属加工が専門なので金属加工しかできないんです。

実は電ノコが一台も無いと噂されています。使えない旋盤はあんなに沢山あるのに・・・。

勿論刃も金属用しかありませんので、金属加工以外の加工はこの学校ではできないんです。

という訳でそれ以外の加工をしようと思ったら・・・採掘作業が始まるわけです。


まぁ実際金属以外実用はあまりしないような気がするのでこれが普通なのでしょうけど、ちょっと意外な気もしますよね。
うちとしては、金属は重いから余り使いたくないので,金属以外のモノも加工できるような子を導入して欲しいですけどね・・・

そんな感じで今日は採掘とレポートの一日でした。それではまた。


(^・ω・)ノ RadiumProduction in RoboCup Junior
今日は秋葉→池袋→練馬と慌ただしい一日でした。お台場にも行こうかと考えていたのですが、体力的に断念しました。


まずは秋葉、秋月千石スパラジのいつもの短時間巡回コースでした。

秋月では、PIC16F1823という小型のPICを購入しました。

12ピンのPICですが、アナログピン6個搭載の上、MSSPが搭載されているので、

サブPICとして非常に優秀な機能を持っています。

そして、千石では・・・何も買わなかったなぁ。

欲しいものが売ってなかったので・・・


という訳でそのままスパラジへ。

スパラジでは、とりあえずこの辺を買い漁りました。
この前買ったYOKOMOのバッテリーやら端子やらです。
なんかしばらく見ないうちにT字コネクタ安くなってるし・・・

回路制作において、一番金がかかるのがコネクタなので、これは非常に嬉しいです。


それで今度は池袋。東急ハンズに行ってきました。

ハンズでは、とりあえずポリ板買いました。

別にハンズである必要はなかったのですけど、練馬に行くついでだったもので・・・。


という訳で最後に練馬に行ってきました。いつものようにTruthですね。

ついたらいきなり模様替えが行われていたのでかなり焦りましたね。なんか棚運んでる・・・


それでお仕事終了、家に帰ってきて今に至る感じです。


それにしても秋葉から直で池袋ってだいぶ事故っているような・・・。残念な街ツアーをしてしまいましたね。

まぁでもこれで大体買いたいものは買ってしまったので暫くはどこにも買い出しに行かなくて済む・・・よね?


(^・ω・)ノ RadiumProduction in RoboCup Junior
今日はイオンの5%OFFの日ですね。


今回の記事はポインタについてです。

今回は一回目なので、また例の如く、ポインタってなんなんだ!?という概念的な説明を行います。


ポインタはC言語の基本のなかでは最上級に難しい部類に入りますので、

ここが理解できるかどうかで、C言語が出来るようになるかどうかが決まると言っても言い過ぎではないと思います。

というわけで内容に入る訳ですが、まずポインタの前に、アドレスというものについて紹介します。


アドレスとは、端的にいうと、変数の格納場所を示す数列です。住所みたいなものですね。

コンピューターの場合、変数は一次元で配列されていますので、

上から何番目の変数かが分かればそこが指し示す変数は一つに特定されます。

実際にはアドレスは、メモリ内における変数の値の保存場所だと思って頂ければ大丈夫です。


それでポインタというのは、そのアドレスを保存する変数という位置づけけになります。だから変数の仲間のようなものです。

このアドレスをポインタに格納することによってプログラムをもって効率的に走らせることが出来るのですが・・・

ちょっと複雑なので、今まで以上に記事を分けて紹介することになるかと思われます。

という訳で、今日の記事はこのくらいで。

最近NXTやってないなぁ。


(^・ω・)ノ RadiumProduction in RoboCup Junior
またI2Cが動かなくなりました。

なんていうか、アドレスをずっと送り続けているのか、SSPBUFが空になっていないのか。

原因は不明です。

とにかくまともに動作をしなくなってしまいました。

プログラム変わってないのに・・・おかしいなぁ。


とりあえず、訳がわからないのでプログラムを書き直すことにしました。

回路にも異常はないし、一体なんなのでしょうね。

とにかくこれは解決しないと・・・

今回作成した基盤はi2cがないと話にならない仕様なので困りましたね。

参考資料も乏しいので嫌な予感がしますがもうちょっと頑張ってみようと思います。


(^・ω・)ノ RadiumProduction in RoboCup Junior
とりあえず本日の活動報告を。

今日は珍しく最初から最後まで真面目に活動が行われました。

全員が真面目に部活やったのっていつ以来だろう・・・

みんな真面目は本当に稀な気がします。
普段は必ず誰かしら事故ってるからなぁ・・・


主な活動内容は一年生の講習会用の基盤作り。

本来なら、一年生にやらせたいところなのですが、時間配分的に無理があったようなので、

今回の基盤に関しましては、二年生が代理で作成しています。

まぁ二年生の練習にも(色んな意味で)なっているようですから、一石二鳥ってことにしておいて下さい。


それで僕はといいますと、二年生で16Fの4桁台をやってみたいという人がいたので、とりあえず先行でやってます。

その続きで今日はLCDをやってみることに。

当初計画の順番とかなり違うのですが、仕様的にUARTができないことが発覚してしまった以上、

プログラムのデバッグが全くできないので早急にやる必要があったのです。3なんかデバッグ機能ついてないし・・・。


とりあえず、一年生の時にライブラリの存在を知らず、使わずに制御して大変な目にあったので、

今回はネットにあがっているライブラリを使ってみることにしたのですが・・・

結局仕様の違いなどの問題があったので、

最終的に半分以上の関数がほとんど書き換えられ、新しい関数がいくつか増えてしまって、

実質ライブラリがあってもなくても変わらないという惨事になってしまいました。
まぁ結果的には一日で終わらせられましたけど・・・


また謎の鬼畜制御が行われる運びとなってしまいました。非常に残念です。
なんかもう、とんでもないことになっているような・・・



まぁ一番最初にI2Cの相互通信を始めている時点で、なーんか嫌な予感はあったのですけど・・・


という感じでひとまず新16Fで試してみたい機能は一通りやったように思います。
一週間で終わったなオイ・・・

次は、この試した機能を結合させてPIC16F1939のメインモジュールを完成させようと思います。

明日一日で終わるかなぁ。それでは今日はこの辺で。


(^・ω・)ノ RadiumProduction in RoboCup Junior
今回の記事はbitとbyteについてです。


まずはbitについて。

bitとは引数プログラムのデータに構造における最小単位のことです。

この単位は2進数でいう一桁に相当するもので、中には0か1かの数字が入っています。

なので1桁の2進数なら1bit、2桁の2進数なら2bitに相当する訳です。

だからよくプログラムでは、2進数の何桁目かを何bit目と呼ぶことが多いです。

そして、8bit、つまり2進数8個で1byteになります。

つまり2byteで16bitになる訳ですね。

これがbitとbyteの概念です。


因みにbyteの上位にwordというものもありますが、

定義が場合によって2byteだったり4byteだったりして、わかりにくいのであまり使われません。



基本的にレジスタのサイズだとか、変数のサイズだとか、

コンピューターにおけるデータのサイズはだいたいこのbitとbyteで表現されます。
HDDも○○G byteですからね。

特にレジスタにおいては、どこでもかしこでもbit単位で表記がされていますので、非常に重要になってきます。


という訳で、今回はbitとbyteについて紹介しました。

このbitとbyteにはデジタル回路だと、信号線の数にも相当させることもできます。

このことに関しましては、また今度紹介しようと思いますのでよろしくお願いします。


それではまた次回の記事でー。

(^・ω・)ノ RadiumProduction in RoboCup Junior
最近更新速度が右肩あがりなので久しぶりに思えますが、実はまだ二週間も立っていない配列の記事の続きです。

前回は、基本的な配列の使い方についての紹介を行いました。

今回は、タイトルにもあるように、配列についての実践的な使い方について紹介します。


まずはカウンタ変数を使った配列の実践例

例えば、配列の要素全てを連続で読み出したい、または書き込みたい場合に使われます。

配列の要素は数字で番号が振られていて、[ ]内に書かれますよね。

実はその数字、そのプログラム内で数字と判断できるものは何を書いてもいいんです。

従って当然、変数の名前を書いてもそれは有効なんです。

たがらこういうこともできます。

#include"stdio.h"
#define NUM 5

int main(void)
{
  int i;
  int data[NUM]


  for(i=0;i<NUM;i++)
    {
    data[i]=i;
    }

  for(i=0;i<NUM;i++)
    {
    prinft("%d",data[i]);
    }

}



このようにfor文を利用することで、いちいち全ての要素のプログラムを記述しなくとも

要素の書き込みや読み込みを連続して行うことが出来るのです。


次は関数の引数に配列を使う実践例です。

前に関数の引数の話はしましたが、普通の変数の場合は引数となった変数のデータは関数にコピーされます。

従ってどんなに関数にコピーされた引数が変更されようと、元の変数に影響はありません。


しかし、配列の場合はそうではありません。

配列の場合、要素単体を引数とする場合は変数と同じように関数側の値を変えても要素に影響はありませんが、

配列そのものを引数とする場合は、引き渡した関数側の配列の中身を変えると、元の配列の中身も変化してしまうのです。

これにはアドレスというものが深く関わっていますが、ここでは一先ず触れないことにしておきましょう。

つまりプログラムにすると、

#include"stdio.h"
#define NUM 5

void input(int a;int x[])
{
  x[1]=5;
  a=5;
}

int main(void)
{
  int i;
  int data[NUM]


  for(i=0;i<NUM;i++)
    {
    data[i]=i;
    }

  input(data[0],data);

  for(i=0;i<NUM;i++)
    {
    prinft("%d",data[i]);
    }

}

この時、関数inputの前ではdata[0]=0、data[1]=1になっていますね。

しかし、関数inputの後ではdata[0]は0のままですが、data[1]は5に変わってしまっているのです。

配列の名前が違うのでややこしいですが、配列の場合は、引数として引き渡すと、

元の配列と引渡し先の関数の配列名前は違っても要素の中身は同じになるのです。


これが配列の大きなな特徴です。これは非常に意味があって、アドレスを習ったり、配列をもっと複雑に使うようになると

この重要さが理解できるようになると思います。

因みに配列を引数として呼ぶ場合は、メイン文の方の引数の部分(実引数)は配列名だけにしてください。

それで関数の方(仮引数)は普通に配列の定義と同じように記述して下さい。一次元配列の場合は要素の所は空でも大丈夫です。



最後に紹介するのは多次元配列です。

C言語では、多次元配列と言って、配列の中に配列配列IN配列を作成することができます。

多次元配列の定義はこんな感じ。

int x [4][5];

こんな風に[]の数を後ろから増やしていく形式を取ります。これでx[4]を一つの要素とした要素5個の配列を作った訳です。

要素の総数は4×5で20個ですね。


forの2重ループで2次元平面での座標取りなんかをする場合に非常に便利です。

この他の使用方法は他の配列をまぁ大差ありません。同じように使うことができますね。

また、2次元だけでなく、3次元、4次元と、同じようにすればもっと大きな多次元配列も作成できます。



配列の実践的な用法はこんな感じでしょうか。実践と言いつつ、実用的なプログラムが一切出て来なかったのは仕様です。

「実用なんたら・・・って名前の授業ほど実用性がない」という例の高専の法則に肖ってみたつもりです。内輪ネタですね。


という訳で名ばかりの実践編は以上です。配列についてはひと通り書いたつもりですが、まだ、色々残ってはいるので、

この先もっと他の構文についての説明が終わった辺りでまた紹介したいと思います。

それでは今回はこのへんで


(^・ω・)ノ RadiumProduction in RoboCup Junior

今日はコンピューターで使われる数字や数列についてのお話です。


一般に、今使われている数字は10進法という方式ですね。

これは、0123456789

この10個の数字単位で桁があがっていく仕組みです。9の次は10ですからね。

時計だったら60秒、60分で桁というか、単位が変わりますよね。だから時計は60進法です。

このように、数というのは、場合、用途によって、桁上がりのタイミング、即ち進法が変わることがあります。

実はコンピューターでも使われている進法がまた違うのです。


コンピューターでは、2進法という進法が使われています。

2進法では、数字は0と1しか使いません。

つまり、0の次が1、その次がもう桁があがって10になる訳です。

これは、人間からしたら非常にわかりにくい進法ですが、コンピューターからしたら、とてもありがたい進法なのです。

何故コンピューターでは2進法がいいのでしょう。


コンピューターはデジタル回路で動作していますから、制御信号は電圧のONとOFFの2つです。

また、2進法も、0と1の2つで構成されています。

もうお分かりですね。2進法は、デジタル回路の信号とデータの構成が同じなので、

2進法で書かれた数字(2進数)は、コンピューターの信号と等価とみることができます。

だから、信号を数字に置換してやるだけで簡単にコンピューターに命令を送ってやることができるのです。

その置換を実際にやっているのが、プログラムの書込機、

つまりPickitなどのライターや、マイコンそのものの機能になる訳です。


要するにこっちからやるべきことは、その命令となる数字を送ってやること、

これがレジスタの書き換えであり、プログラムそのものなのです。


そういう2進数、0と1だけで書かれたプログラムが機械語というものです。

でもこれは只の0と1の集まりなので、まず人間には理解できません。

そこでコンパイラができ、人間に理解ができるプログラミング言語というものでプログラムができるようになりました。


2進法の話のはずが、随分逸れましたね。

これが2進法の説明です。

因みに、レジスタに書き込む時は言語でも2進数で書かれることがありますが、やっぱり長ったらしくなります。

なので今のプログラムでは、この命令を2進数ではなく、16進数で記述する場合が多いです。

16進数では、数字の順番が

0123456789ABCDEF

となっていて、Fの次が10になります。


何故わざわざまた別の進数を使って記述するかと言いますと、

プログラムではこの2進数で記述される命令の一桁一桁をbitと呼ぶのですが、

そのbitによる命令を行う際にある特性の影響で命令自体を16進数で記述した方がいいんです。

そういう訳で、実用的には16進数で記述される方が多いです。


bitに関しては、また他の記事で紹介することにして、以上が2進数と16進数の紹介でした。

今日はA/D変換の動作が確認できました。

明日はLCDをつけてみようと思います。


(^・ω・)ノ RadiumProduction in RoboCup Junior
今回は前々から告知していた「レジスタ」というものについてお話しします。

レジスタとは、パソコンのプロセッサ、つまり中のCPUだとかDSPだとか、

そういった処理装置が持つ所謂小さなメモリのようなものです。


通常コンピューターは実際に処理を行なっている部分とデータを保存している部分はそれぞれ独立していて、

片方をCPUだとか言って、もう片方をメモリだとか言ったりしますよね。

コンピューターは通常、このようにデータの保存場所とデータで処理を行う場所が分かれているので、

いちいち何かする度にメモリとCPU間でデータの通信を行う必要があります。

でもそれだと、通信の時間分、処理速度が遅くなってしまいますので性能としては残念なコンピューターが出来上がる訳です。

だからといって、CPUとメモリを一緒にしてしまうと、それはそれで勝手が悪くなるし、何より汎用性が低下してしまいます。

だったら、データの中でも常に使われてデータ総量も少ないもの、

例えば一番簡素な「命令」のデータなどはCPUと一緒でいいんじゃないか?ということになりまして、


そこで考えだされたのがレジスタです。

レジスタというのは、CPUに内蔵されている高速メモリだと考えて頂ければわかりやすいと思います。

よく使われる命令などのデータに関してはCPUに直接保存することで、通信の量を抑え、処理を高速化しているのです。


まぁレジスタってのはそんなものです。逆に言うと、レジスタのデータ自体が一つの命令として意味を持っているので

レジスタ自体を直接書き換えてしまえば、一番早く、的確にCPUに命令を送ることが出来るという訳です。

この仕組みはマイコンであるPICも変わりませんから、今まで何度も「レジスタを書き換える」という話が出てきたのです。


レジスタのデータは基本的にbit単位で構成されていて、

8bitCPUなら8bit、16bitCPUなら16bitでひとつのレジスタは構成されています。

このレジスタのbitの中身、つまり0、1を変えてやることでレジスタの中身は書き換えられます。

基本的に一つのレジスタの中にはいくつかの命令が組み込まれていて、

レジスタ内の0,1を変えることでレジスタ内の命令の全てを同時に変更することもできたりします。


また、レジスタは書き込むだけではなくて、読み込むこともでき、

指定しているレジスタのbitが書き込みオンリー(W)なのか、読み込みオンリー(R)なのか

読み書きどっちも行えるのか(R/W)というのも重要な点です。

特に(R/W)のレジスタは、思いもよらない様な使い道を見つける場合も多々ありますので要チェックですね。



と、まぁこれでレジスタの説明は以上です。

と言っても文章だけなのでちょっとわかりにくいですよね。

PIC Cだとレジスタ一つ一つに名前がついていて、変数と同じような感覚で(R/W)が行えます。

先程の記事で記載したプログラムでも大量にレジスタの書き込みは行なっているので

こっちのプログラムからレジスタを探してみると、大体の感じはわかって頂けるのではないでしょうか。

このプログラムだと、直接レジスタを操作する命令はint mainの中にしかありませんが、

その中だと、見た感じ9割近くそれに該当するような・・・。


HITECでプログラムを書くと本当にレジスタだらけになってきてしまいますので、

PIC、特にHITECでプログラムを書く場合はこのレジスタの理解が大事であるということが解って頂ければと思います。


という訳で今回の記事はこのへんで。


(^・ω・)ノ RadiumProduction in RoboCup Junior

カレンダー
08 2026/09 10
S M T W T F S
1 2 3 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
最新CM
[05/09 ONE RoboCuper]
[05/07 HDD ほしいよー]
[04/21 ブラック3辛]
[12/26 bols-blue]
[06/08 ONE RoboCuper]
かうんた
カウンター カウンター
らじぷろ目次
らじぷろ検索機
プロフィール
HN:
Luz
性別:
男性

PR

忍者ブログ 2007-2021,Powered by Radium-Luz-Lα+-Rescatar in RadiumProduction [PR]


Related Posts Plugin for WordPress, Blogger...