2009年12月
    1 2 3 4 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 31    

最近のトラックバック

無料ブログはココログ

役に立ったAVRマイコンの本

« 2009年6月 | トップページ | 2009年8月 »

2009年7月

2009年7月30日 (木)

わしのC言語の理解度は幼稚園児レベル・・・(笑)

そもそも何がANSI-C準拠で何がC18特有なのかも理解していない・・・(笑)

だから試行錯誤で液晶表示で確認するしかない(笑)

1.C18の液晶表示ライブラリは40MHz用を20MHz用に改良してビジーチェックを追加した。

2.C18のUSART(RS232C)受信関数は、CCS-CのERRORSのようなオーバーランエラー、フレーミングエラー処理の適当な命令が見つからないので、直接レジスタ操作する関数を作って対応。

(※;直接レジスタ操作の方法はCCS-CよりもC18の方が行いやすい)

前にも書いたが、CCS-Cは出力も拡張で液晶に

  printf(lcd_data,"cos(pi*%lu/180)",data);

なんてこともできるから%書式さえきちんと書けば、浮動小数点実数値でも文字列に変換して液晶表示できるけど・・・

C18はそんな便利な機能は無い!(笑)

数値を文字列に変換できるのは整数だけ(笑)

でも浮動小数点実数を整数部と小数部に分ける関数がある・・・これだ!

実行結果です。

math01.JPG

34.5678 なんだが 34.5677 になってる????確認要・・・

プログラムソースです。

小数点部はZ=0.5678 なので小数第四位まで表示するなら10000倍して整数化した後、文字列変換すれば良いハズ。

// 追加ヘッダーファイル
#include <lcd18m20b.h>  // LCD表示(20MHz,ビジーチェック有り)
#include <math.h>       // 数学関数
#include <stdlib.h>     // 文字列関数

/* 関数プロトタイピング  */
// 無し

/* 変数の定義 */
char STRTMSG[] = "18F4550 math.h test"; // 開始メッセージ
char dodo1[]=".";                       // 小数点
    float x=34.5678;        // テスト用の浮動小数点実数
    float y;                // 整数部格納変数
    float z;                // 小数部格納変数
    char yy[4];             // 文字配列、整数部用
    char zz[6];             // 文字配列、小数部用

/* メイン関数 */
void main (void){
    ////入出力設定
    TRISB = 0;              // PORTB全部出力設定
    lcd_init();             // LCD初期化
    lcd_clear();            // LCD消去
    lcd_str(STRTMSG);       // 開始メッセージ表示
    lcd_cmd(0xC);           // カーソルOFF
    //// メインループ
    while(1)
    {
        z = modf(x,&y);     // 小数点部=z,整数部=y
        ultoa(z*10000,zz);  // 小数点部zをn倍して整数化し文字列に変換→zz
        ultoa(y,yy);        // 整数部yを文字列に変換→yy

        lcd_cmd(0xC0);      // 2行目
        lcd_str(zz);        // 小数部の表示

        lcd_cmd(0x94);      // 3行目
        lcd_str(yy);        // 整数部の表示

        lcd_cmd(0xD4);      // 4行目
        lcd_str(yy);        // 整数部の表示
        lcd_str(dodo1);     // 小数点.の表示
        lcd_str(zz);        // 小数部の表示
    }                       // while(1)end
}

これを関数にしてプロトタイピングすれば計算後の液晶表示も容易になるかな・・・

2009年7月28日 (火)

18F4550+GT720F C18 ビデオその1

詳細は後日に・・・

PIC18F4550+GT720F C18 でやっとここまでできた・・・

夏バテかなぁ~疲れて詳細書く気力無し・・・

CCS-C と C18 かなり違う・・・

とりあえず文字列処理まで出来たが課題は山積み・・・

gt720c18_01.JPG

息子「今週末、こち亀に香里奈が出るから元気出せよ!」

オレってそういう奴?(笑)

2009年7月24日 (金)

18F4550 クロックダイアグラム・・・430ページの英文マニュアルを読め!(笑)

研究社の英和辞典、引っ張り出してきて・・・(笑)

16F877AのPDFは234ページだったけど、18F4550は430ページもある・・・しかも英文で(笑)

パソコン画面で見るのは老体にはつらい(笑)ので印刷しちゃいました・・・

clock_01.JPG

※以下、勝手に解釈して想像も含まれていますので間違っているかもしれません。あしからず・・・

少しづつ解ってきました・・・18F4550のクロックダイアグラムです。

clock_02.JPG

以前の外付け10MHzのセラロックを付けると内部で40MHzになるような18Fシリーズとは異なるみたいです。

恐らくUSB機能搭載に合わせた?PLLはUSBの仕様に合わせてある?

内蔵PLLは4MHz入力で、てい倍の96MHzを発生します。USBフルスピードで、半分の48MHzを使用します。

従って、PLLには4MHzの倍数のクロックをデバイドして入力することになり、外付けのセラロックは4,8,12,16,20,24,40,48MHzから選択することになります。

10MHzは不可ってことになりますよね?

20MHzのセラロックだったら5でデバイドして4MHzにします。コンフィグの指定です。

#pragma config PLLDIV=5,USBDIV=2

一方、マイコン本体(MCU)で使用するクロックは外付けセラロック(20MHz)のものをそのまま使用する場合

#pragma config FOSC=HS

かPLLから出力されたクロック(96MHz)を使用する場合

#pragma config FOSC=HSPLL_HS

をコンフィグで選択できます。さらにCPUDIVで両方の場合でクロックが分割できます。

コンフィグ無指定だとHSの場合は/1(20MHz/1→20MHz)、HSPLL_HSの場合は/2(96MHz/2→48MHz)となります。

以下コンフィグヘルプファイルから抜粋です。

CPU System Clock Postscaler:

CPUDIV = OSC1_PLL2
[OSC1/OSC2 Src: /1][96 MHz PLL Src: /2]
CPUDIV = OSC2_PLL3
[OSC1/OSC2 Src: /2][96 MHz PLL Src: /3]
CPUDIV = OSC3_PLL4
[OSC1/OSC2 Src: /3][96 MHz PLL Src: /4]
CPUDIV = OSC4_PLL6
[OSC1/OSC2 Src: /4][96 MHz PLL Src: /6]
 
 
clock_03.JPG
 
実は先の液晶表示プログラムはHSモードだったのでコンフィグPLLDIVを無指定だったのですが、/1となってPLLに4MHzでは無く20MHzが入力されていた様です。
PLLクロックを使用していないので関係ないようですが、マイコンは誤動作していたようです。
電源投入後はフリーズしてMCLRのリセットスイッチで動くって感じです。
 
コンフィグを訂正した仕様です。
 
config_07.jpg
 
これで正常に動作します。マイコンはクロック20MHzで動作していることになると思います。
 
実は10MHzのセラロックでも適当にデバイドすると動作しちゃったりします。あまり高周波でなければOKって事ですかね?
 
この辺も色々試して見ると面白いかも?
 
ディープだ(笑)
 
 

 

2009年7月23日 (木)

PIC 18F4550 を入手♪(笑)

秋月電子通商から通販で購入・・・

40ピンの18F4550と28ピンの18F2550も手配した。

4550_01.JPG

このデバイスはポートCのRC3ピンが無くてVUSBピンになっている。それ以外は16F877Aとピンコンパチなのでとりあえずテストボードに差し替えて見ることにしました。

将来的にはRC3の差し間違えを無くす為、18F4550の専用テストボードを作る予定・・・

で!なかなか877AがICソケットから外せなかったのですが、小さいマイナスドライバーでこじってなんとか外しました。

4550_02.JPG

4550_03.JPG

4550_04.JPG

そのまま4550を差そうとしましたが、足が広がっていて差さりません。

4550_05.JPG

いつもやっている足曲げ(笑)

4550_06.JPG

無事差さった。換装完了!!!

4550_07.JPG

コンフィグワードとかまだまだ勉強不足でイマイチ動作が不安定なのですが、液晶表示テストプログラムが動いてます。

4550_08.JPG

4550_10.JPG

本体のプログラムと別に液晶ライブラリソースをlcdlib18.cを追加してlcdlib18.hヘッダーファイルのプロトタイピングで受け渡すのですがこのファイルも前回同様パスを追加しないと認識しませんでした。

config_06.jpg

書籍のソースに対して私のテストボードはRSがRB1、E(STB)がRB0なので変更。R/WはRB2に接続されているがライブラリがビジーチェックを行わない仕様なので

 LATBbits.LATB2=0;     // R/W常にLOW,BusyCheck無し

としました。

コンフィグはとりあえず下記で設定・・・

#include <p18f4550.h>
#include <delays.h>
#include <lcdlib18.h>
/* コンフィギュレーションの設定 */
#pragma config FOSC=HS, FCMEN=OFF, IESO=OFF, PWRT=ON
#pragma config BOR=ON, BORV=0, VREGEN=OFF,WDT=OFF, WDTPS=1024
#pragma config MCLRE=ON, LPT1OSC=OFF,PBADEN=OFF, CCP2MX=ON
#pragma config STVREN=OFF, LVP=OFF, ICPRT=OFF,XINST=OFF,DEBUG=OFF
#pragma config CP0=OFF, CP1=OFF, CP2=OFF, CP3=OFF, CPB=OFF
#pragma config CPD=OFF, WRT0=OFF, WRT1=OFF, WRT2=OFF, WRT3=OFF
#pragma config WRTB=OFF, WRTC=OFF, WRTD=OFF, EBTR0=OFF
#pragma config EBTR1=OFF, EBTR2=OFF, EBTR3=OFF, EBTRB=OFF

18F452などとはかなり異なってます。452から始めれば良かったかな?(笑)

コンフィグの設定はMPLAB IDEのヘルプから見れます。PLLの設定が良く解らない?・・・

config_01.jpg

452のコンフィグでビルドすると当然エラー(笑)

config_02.jpg

先の4550用コンフィグでとりあえずビルドできました。

config_03.jpg

設定してないコンフィグはデフォルトでどーなるの?MPLAB IDEで確認出来ます・・・

config_05.jpg

FOSC=HS だから PLLは分割しないになってる?うーん?

レゾネータ(セラロック)20MHzでも10MHzでも動くし・・・

まあ、慌てずにいろいろ試してみよう・・・

ちなみに書込はミニPICプログラマとW509で出来ます。

config_04.jpg

CCS-Cの方がDELAY関数がクロック周波数設定できたり・・・

出力も拡張で液晶に

  printf(lcd_data,"cos(pi*%lu/180)",data);

なんてこともできるから数値でも液晶表示できるけど・・・

C18はなんかアセンブラに近い感じ(笑)

877Aがフリーダムだったら、4550はストライクフリーダムくらいになった気分♪

凄くわかりやすいでしょ(笑)

 

2009年7月20日 (月)

きっ聞いてないぞ!・・・喧嘩売ってるのか?(笑)

今日は、うちの息子、友達と神田、秋葉原に行ってるはずなのに・・・メイドが目当てかと思ったら(笑)

なんでお台場に居るんだよ?メールに画像だけって何?喧嘩売ってるのか?(笑)

わしが熱狂的な隠れガンダムファンだって知ってるくせに・・・コノヤロ(笑)

090720_1608~01.JPG

あ~わしも見たい(笑)

X10Aフリーダムも作ってくれ(笑)

追伸; わし「これ動くんだぜ!」

かみさん「ええ?動くの?!」

って歩くわけじゃないですから~(笑)

 

2009年7月19日 (日)

C18でデバイス18F4550にしてATAN計算もビルドできるじゃん♪(笑)

18F4550・・・まだ持ってないんですが(笑)

C18でATANが計算できるのか?チェックプログラムでビルド出来ました。他は何もしないプログラムなので何の意味も無いですが(笑)

絶対値計算の関数はCCSCではABS()でしたがC18はFABS()なので修正しました。英文のライブラリーPDFを参照・・・

実はC18にはATAN2(x、y)関数もある。すげぇ~

atan_01.jpg

16F877Aと殆どピンコンパチの様なのでやっぱ18F4550が有力候補だな♪

ミニPICプログラマでも書き込みできるようだし・・・

2009年7月18日 (土)

877AでATAN使うとメモリーオーバー(笑)・・・方位角の計算

方位角の計算式は組めるのですが・・・

16F877AでATAN(アークタンジェント)を使うとメモリーオーバーする。

ほんと色々試してみましたが駄目・・・もう時間の無駄って感じ(笑)

下記は距離計算を外して、ATANを5°置きの計算値を参照する小細工プログラムで実行させたもの・・・

経度の変位分に緯度のCOS計算が含まれていますがメモリーオーバーしません。

IMG_3109.JPG

130°です。スーパーマップルで印刷して角度を分度器で測ると50°です。

第2象限なので真北を0°として180°-50°=130°となります。

IMG_3110.JPG

この方位計算に先の距離計算を組み込むとまたメモリーオーバーです。

outofrom01.jpg

COS計算を外して緯度30°のCOS30°計算値を使用した小細工プログラム(笑)です。メモリー85%です。

誤差ありますが関東近辺では使えそう(笑)

ちなみに速度ノットはkm/hに換算しました。

IMG_3113.JPG

とりあえずこれで誤魔化して使って(笑)

同じ計算を2度しないように下記のようにセパレートにしたりしたのだがコンパイラの方が頭良くてふつうに書いても最適化してるようで(笑)

////緯度変位関数
float dp(float p1,float p2)
{
    float di;
    di=abs(p2-p1);
    return(di);
}
////経度変位関数
float dq(float p1,float q1,float p2,float q2)
{
    float di,hp1;
//  float pai=3.141592;
//  hp1=(p1+p2)/2;
//  hp1=hp1 * pai/ 180.0000;
//  di=abs(q2-q1) * cos(hp1);
    di=abs(q2-q1) * 0.8191;
    return(di);
}
////2地点距離算出関数
float dist(float dp,float dq)
{
    float pai=3.141592;
    float di;
    di=sqrt(pow(dq,2)+pow(dp,2));
    di=6370.0000 * di * pai / 180.0000;
    return(di);
}
////2地点方位角算出関数
long azimuth(float p1,float q1,float p2,float q2,float dp,float dq)
{
    long dpq,azi1;
    dpq=dq/dp*10000;
    if(dp==0)
    {azi1=90;}
    else
    {
        if(dpq>=0){azi1=0;}
        break;
        if(dpq>=875){azi1=5;}
        break;
        if(dpq>=1763){azi1=10;}
        break;
        if(dpq>=2679){azi1=15;}
        break;
        if(dpq>=3640){azi1=20;}
        break;
        if(dpq>=4663){azi1=25;}
        break;
        if(dpq>=5774){azi1=30;}
        break;
        if(dpq>=7002){azi1=35;}
        break;
        if(dpq>=8391){azi1=40;}
        break;
        if(dpq>=10000){azi1=45;}
        break;
        if(dpq>=11918){azi1=50;}
        break;
        if(dpq>=14281){azi1=55;}
        break;
        if(dpq>=17321){azi1=60;}
        break;
        if(dpq>=21445){azi1=65;}
        break;
        if(dpq>=27575){azi1=70;}
        break;
        if(dpq>=37321){azi1=75;}
        break;
        if(dpq>=56713){azi1=80;}
        break;
        if(dpq>=114301){azi1=85;}
    }
        if(q2 >= q1 && p2 >= p1)    //第1象限
        {
        }
        break;
        if(q2 >= q1 && p2 < p1)     //第2象限
        {
            azi1=180-azi1;
        }
        break;
        if(q2 < q1 && p2 < p1)      //第3象限
        {
            azi1=azi1 + 180;
        }
        break;
        if(q2 < q1 && p2 >= p1)     //第4象限
        {
            azi1=360-azi1;
        }
    return(azi1);
}

18F4550あたりに浮気するか?16F新シリーズ待つか?計算だけ別のPICにさせるとか(笑)

C18がやっとまともに動いた・・・(笑)

何でこんなに手間かかるの?(笑)

MPLAB IDE V.8.30 は起動しないから始まって・・・

「Windows XP でユーザー プロファイル名を変更する方法」でユーザー名を2バイト文字じゃない名前にして環境をコピー・・・

C18Compiler V3.32ではこんなエラーが出て

error [1027] unable to locate ******

ヘッダーとリンカーのパスを通す。

c18_tst01.jpg

c18_tst02.jpg

c18_tst03.jpg

error - could not find file 'c018i.o'.

ライブラリのパスを通す。

c18_tst04.jpg

でやっとテストソースでビルド出来た・・・

c18_tst05.jpg

CCS-Cの方が勝手にパス通してくれるから便利なんだが・・・

18FシリーズはC18がおすすめのようで・・・

それとも新16Fシリーズが出るの待つかな(笑)

 

2009年7月14日 (火)

方位角の計算・・・忘れないうちにメモ(笑)

後でOpenOfficeで清書するとして、忘れないうちにメモ書き

IMG_3106.JPG

緯度方向距離は緯度変化分ラジアンに地球半径を掛けて円弧を計算する。

経度方向距離は経度変化分ラジアンに地球半径が緯度の余弦に比例させた半径と掛けて円弧を計算する。

この「緯度の余弦」の緯度は基準点か目標点か2点の単純平均値をとるかは考え方が色々ある様ですが、ここでは平均値としました。どれを取っても近距離では変わらないかも?です。

あとは三平方の定理から距離を算出。

一方、方位角は真北を0度として東回りに角度が増えるとすると、ATAN(アークタンジェント)で計算出来ますが求まる値は0~90度なので、2地点の緯度・経度の大小条件で象限ごとに角度が決まることになると思います。

なぶり書きですんません・・・

何か電子工作か?プログラミングか?数学の計算してんだか?どんどん脱線していくジムニー親爺(笑)

 

うーん手強い(笑)2地点の緯度経度から距離算出・・・計算式変更・・・

前回、調べた球面三角法での2地点の距離計算ですが・・・

距離01.png

距離が100kmくらい長いと計算できるのですが・・・数kmの近距離だと0kmと計算されてしまう(笑)

きちんと確認していないので想像ですが、恐らく計算精度の問題でしょう。

上の式で2地点間の距離が近いとCOSθは限りなく1に近い値になる。θを求めるのにACOS(アークコサイン)を使うのだがこの精度が低いとθが0になる為、0に何掛けたって0になってしまう。

CCSCコンパイラの標準算術関数のACOSは-1.0~1.0の値を扱うとある。1.0と0.9は区別出来ても0.99は1.0と計算されて0ラジアンになるのではないか?後日検証してみます。

1行目は目的地の緯度経度。

2行目はGT-720Fから得た現在地の緯度経度。

3行目は距離計算値です。

メモ(gps004.c)

////2地点距離算出関数
float dist(float x1,float y1,float x2,float y2)
{
    float pai=3.14159265;
    float xr1,xr2,yr1,yr2,hx1,hxr1,di;
    float dco,dco2;
    hx1=(x1+x2) / 2;
    hxr1=hx1 * pai / 180.00000000;
    xr1=x1 * pai / 180.00000000;
    yr1=y1 * pai / 180.00000000;
    xr2=x2 * pai / 180.00000000;
    yr2=y2 * pai / 180.00000000;
   di=6370.000000 * acos(sin(xr1)*sin(xr2)+cos(xr1)*cos(xr2)*cos(yr1-yr2));
    return(di);
}

IMG_3103.JPG

140kmくらい離れたところだと計算出来ます。

IMG_3105.JPG

式の出所が明確でないので調べてから後日載せますが、ACOSを使わない計算式を用いた結果です。

上記の緯度経度同様に計算して4.22kmと算出されています。

メモ(gps005.c)

////2地点距離算出関数
float dist(float x1,float y1,float x2,float y2)
{
    float pai=3.14159265;
    float xr1,xr2,yr1,yr2,hx1,hxr1,di;
    float dco,dco2;
    hx1=(x1+x2) / 2;
    hxr1=hx1 * pai / 180.00000000;
    xr1=x1 * pai / 180.00000000;
    yr1=y1 * pai / 180.00000000;
    xr2=x2 * pai / 180.00000000;
    yr2=y2 * pai / 180.00000000;
    dco2=sqrt(pow(abs(yr1-yr2)*cos(hxr1),2)+pow(abs(xr1-xr2),2));
    di=6370.00000000 * dco2;
    return(di);
}

IMG_3102.JPG

自宅付近からワングーまでの距離です(笑)スーマーマップルの計算値とも合っていると思われます。

2地点間距離01.jpg

同様に140kmくらいはほぼ同じ計算結果となります。

IMG_3104.JPG

とりあえずこれでいいや(笑)

パソコンのEXCELだったらACOS計算も精度高いのだが・・・

うーん手強い・・・(笑)

方位角の計算もATAN2(x,y)を使ったりして(笑)どーすんの!

自転車・徒歩での近距離使用がメインと考えるから近似式で良いでしょう。別に測量するわけでもないし・・・

 

2009年7月13日 (月)

C言語でGPGGAに加えGPRMCから文字を抽出・・・

LCD表示のレイアウトはイマイチですが・・・

gprmc_01.JPG

2行目は前回と同様GPGGAから緯度の文字列をそのまま表示したもの

3行目は前回の緯度に加え経度の文字列を数値に変換して度数計算したもの

4行目はGPRMCから速度(ノット)と方位角を表示したものです。とりあえず文字列そのままです。

gprmc_02.JPG

面倒だからマスキングはやめました(笑)

GT-720Fを少し動かすと速度出ます!方位角は固定測位だと数値が安定しません。当然ですが・・・

これに電子コンパス組み合わせたら凄いよな・・・

gprmc_03.JPG

gprmc_04.JPG

次は球面三角法から目標点に対する直線距離と方位角を算出させて見たいと思います・・・

11日土曜日に逗子から三浦までサイクリング・・・コース選定ミス(笑)

結果はまあまあでしたが期末試験も終わり、

息子が「運動不足だからサイクリングがしたい」

おお!ありがたい(笑)

私、「で!コースはどこにする?」

懲りずにまたこの本を見る(笑)

IMG_3096.JPG

「ここに行きたい!」・・・GT-720Fの自転車運用は間に合わないので紙地図をコピー(笑)

逗子から三浦へ往復のルート・・・サイクリングロードでは無く一般道(車道)なんだよなぁ~いやな予感が・・・

IMG_3097.JPG

出足が遅くて行きはアクアラインを使う。

IMG_3076.JPG

IMG_3078.JPG

ベイブリッジも久しぶり・・・

IMG_3081.JPG

横横道路から逗葉新道で逗子海岸に出て、調べてあった披露山公園の駐車場へ向かう・・・

しかし海岸線国道134号から入る道が解らず、鎌倉まで出てナビ見ながら狭い裏道で戻ってなんとか到着・・・

IMG_3082.JPG

ここの駐車場も夕方4時30分にゲートが閉まる・・・

高台にあって帰りの登りがキツそう・・・

IMG_3083.JPG

混雑している逗子駅前を抜け・・・

IMG_3084.JPG

海岸に出て、国道を逸れて海沿いの道へ

IMG_3085.JPG

車道は恐いよ(笑)

IMG_3086.JPG

IMG_3087.JPG

車が気になって変な写真ばかり(笑)

IMG_3088.JPG

葉山を抜け、三浦で大楠山へ乗ろうとしたのですが、ダートなので断念・・・

IMG_3089.JPG

海に出て笠島マリーナだったかな?そこで昼食・・・はまゆう丼です。高いよトホホ・・・

IMG_3091.JPG

のら猫が魚を狙ってやってきます(笑)

IMG_3090.JPG

IMG_3094.JPG

写真はこれしか無いです(笑)帰りの駐車場への登りはキツかった・・・

コンビニで水分補給するも海水浴ギャルにジロジロ見られて・・・(笑)

IMG_3095.JPG

帰りはアクアラインを使わずに湾岸線で・・・

出掛けるとPAでいつも貰ってくるハイウエーウオーカー・・・あっ戸田恵梨香だ!

そういえば前回も戸田恵梨香だった・・・カワイイよな(笑)

IMG_2817.JPG

海水浴客で混雑してて、一般道で自転車だと車が恐い・・・

次回はサイクリングロードにしよう

ここんとこ外走ってなかったからかなり体鈍ってます(泣)

 

未完成ですがジムニーで移動運用・・・

10日の金曜日に用事があったので少々・・・

GT-720Fはビニールテープでダッシュボードに固定・・・

gps_ja12_01.JPG

歯医者の駐車場(笑)・・・虫歯が有るのではなく月一度の検査です。

gps_ja12_02.JPG

gps_ja12_03.JPG

帰りにスーパーの駐車場で(笑)

今日は息子とカレーを作るのだ!

gps_ja12_04.JPG

計算は合ってるって当たり前(笑)

 

2009年7月11日 (土)

はまゆう丼

はまゆう丼

三浦市に居る

三浦市に居る サイクリング

2009年7月 9日 (木)

C言語でなんとかGT-720Fの文字列を処理出来た♪ビデオ

詳細は「C言語でなんとかGT-720Fの文字列を処理出来た♪」を見て(笑)

C言語でなんとかGT-720Fの文字列を処理出来た♪

C言語・・・勉強の日が浅いのでかなり手こずった(笑)

ここまで出来れば後は同様の処理なのでなんとか形になると思う。

アセンブラの時はGT-720Fの文字列をキャラクタ液晶にそのまま表示しただけでしたが・・・

※;液晶に数値を表示する時もテーブルを参照して数字文字に置き換えなければならない

画像はアセンブラの時のもの

gps13m.jpg

C言語では文字列を配列に格納する。クセがあって手こずりましたが、アセンブラと似たプロセスで1文字づつ処理して何とか出来ました。

メモ;配列はテーブルと同様にエンドポイントを0で識別している。設定配列数をオーバーすると変なアドレスにジャンプして動作がおかしくなるのはアセンブラと同じ。

もしかしたら、もっとスマートな手法があるかもしれませんが(笑)

また、C言語なら文字列を数値、それも浮動小数点実数に変換できる関数がありますから下記のようなことも出来ます♪

gps_c02.JPG

NMEA-0183では緯度(経度も同様)が3537.4560と出力される。

これは35度37.4560分の意味である。

度に換算すると35+37.4560/60=35.6242となる。変数は浮動小数点実数に変換されていますので球面三角法の公式を使って2地点の最短距離を算出したりも出来ちゃうと思う(笑)

メモリが許せばですが(笑)

文字列の数値変換

      idol = atof(idodo) + atof(idohn)/60; //数値変換
      lcd_cmd(0x94); //3行目
      printf(lcd_data,"=%2.4fdeg",idol);

getc()関数で1文字受信したら直ちにパソコンに送信する簡単な関数を作ったので同時にこんなことが出来ます。

unsigned char getc_p()
{
//  char data1;
    data1=getc();
    printf("%C",data1);
    return data1;
}

gps_c01.JPG

これを見る限りでは測位状態だと3回に1回、GPGSVセンテンスが出力されている?

それともプログラムの影響かな(笑)

I2C EEPROM の書込、読み出しテストもできた♪

手持ちのI2C EEPROM AT24C256B があったのでブレッドボードで仮接続して書込、読み出しテストまで終了した。

i2c_01.JPG

1個しかないのでアドレスA0,A1,A2は000で・・・

i2c_02.JPG

16F877AテストボードにもI2C通信用にピンを立ててあったのでそこへ接続・・・

i2c_03.JPG

本当はSRAMを使った方が書込速度や容量、コンパクト性の面で有利なんですが、接続が多いし、表面実装部品のハンダ付けもしたことないし・・・これだけハンダ付けしてても、いまだに下手だし(笑)

今回、EEPROMは256kbitですが、1MbitのものもあるしI2Cならパラレルに接続できるし、これでログ取ってみるつもり・・・

緯度・経度のテキストのみで記録インターバルが5秒置きくらいならなんとかなるかなぁ?(笑)

追記;こんな本読んで勉強してます。

IMG_3055.JPG

 

2009年7月 7日 (火)

RS232通信用プリプロセッサのERRORSパラメータ追加で受信OKでした(ビデオ)

詳細は「RS232通信用プリプロセッサのERRORSパラメータ追加で受信OKでした」を見て(笑)

RS232通信用プリプロセッサのERRORSパラメータ追加で受信OKでした

前回の記事「CCS社Cコンパイラの標準入出力関数は難有り?・・・」でCCS社Cコンパイラの入出力関数gets()がGT-720Fからの受信でフリーズする件、入力関数を使用せずに直接レジスタ操作でUSARTにしていましたが、gets()関数でもRS232通信用プリプロセッサのERRORSパラメータ追加でフリーズせずに受信OKでした。

直接レジスタ操作ではなく関数使えて良かった♪

#use rs232(BAUD = 9600,XMIT = PIN_C6, RCV = PIN_C7,ERRORS)

バイブルとしてこれ読んでたんですが・・・(改訂版出てます)

ERRORS エラー発生を保存する。”RS232_ERRORS”に保存。・・・しか書いてない(笑)

IMG_3056.JPG

日曜日に用事で成田に行ったのですが、待ち時間の間にCCS社Cコンパイラの代理店データダイナミックスの日本語マニュアルをパラパラ読んでまして

ERRORS 受信の際のエラーを”RS232_ERRORS”に返します。エラーが発生するとポートをリセットします。

あ!これだ(笑)

右が日本語マニュアル・・・直訳でおかしな日本語もありますが・・・

IMG_3054.JPG

MPLABでビルド時、RS232_ERRORSを使用してない主旨の警告が出ますがプログラムの実行上問題ないようです。

c_232_06.jpg

GT-720Fから受信ピンでNMEA文字列をキャラクタLCDに表示し、そのまま送信ピンからパソコンに送ってみました。※デュアルポートではありません。

c232_06.jpg

c232_05.JPG

c_232_05.JPG

これを見る限りでは「GPGGA」「GPGSA」「GPRMC」のみ出力してるようです。「GPVTG」は無い・・・

2009年7月 2日 (木)

CCS社Cコンパイラの標準入出力関数は難有り?・・・

ブログライトから投稿できないぞー(怒)

アセンブラでつまずいたのと同じ現象が起こる(笑)

パソコンからの受信では問題ない。しかしGPSセンサーモジュールGT-720Fからの受信では2文字受信してフリーズする。PIC内蔵のダブルバッファのお陰で2文字は受信するがゴミデータなどによってオーバランエラーやフレーミングエラーが発生してフリーズするものだと思われる。

アセンブラプログラムの時も同じ現象だったのでエラー回避プロセスを追加して対策した。

CCS社Cコンパイラの標準入出力関数 getc() はどーする?この組み込み関数内のプロセスでフリーズしてるんだよなぁ~

いろいろ手法はあるようですが・・・C言語は日も浅く勉強不足で(笑)

面倒なのでCCS社Cコンパイラの標準入出力関数を使わずにC言語で直接レジスタを操作してアセンブラと同じプロセスでエラー処理付きUSART(RS232C)にしてみた。

また、PICでは有名な後閑哲也氏のキャラクタ液晶ライブラリは、液晶がつながっていない場合のフリーズ回避のため、ビジーチェック無しで適当なウエイトを設けてある。

こちらも高速で動作させる為、ビジーチェック有りに改造してしまった(笑)

結果!とりあえずC言語でもGT-720Fから受信した文字データを連続表示するところまでは出来た!♪

c_232_01.JPG

c_232_02.JPG 

追記;ブログライトからXML-RPCによる投稿が出来なくなった原因は下記でした。アカウント設定変更で投稿出来ました。

2009年6月30日よりXML-RPC投稿時に利用するアカウントとパスワードが変更になりました。
XML-RPCによる投稿は、ココログ管理画面へのログイン時に利用している@nifty IDとパスワードにて投稿をお願いします。
なお、ココログフリーをご利用の方は従来通りのアカウントとパスワードでXML-RPCによる投稿をしていただくことが可能です。
また、同様にXML-RPCのエンドポイントも変更になっておりますので、同様に設定を変更してください。

エンドポイント;ベーシック・プラス・プロをお使いの場合

旧 http://app.cocolog-nifty.com/t/api

新 https://app.cocolog-nifty.com/t/api


09.07.07追記 文中、putc()とありましたがgetc()の誤りで訂正しました。

« 2009年6月 | トップページ | 2009年8月 »

フォト

役に立ったPIC書籍リスト