jl7gmnのblog

yahooブログから移行してきました。アマチュア無線を中心としたブログです。

2016年06月

PIC18F14K50-EEPROM

PIC18F14K50を使ったDDS-VFOの心臓部であるAD9834小型DDSモジュールが届きました。早速使用開始のための半田付け工作開始です。久々のハードですが、ユニットで信号線類と電源、アナログ、デジタルグランドの配線だけで済みました。超簡単!でしたHi!
イメージ 1
イメージ 2
イメージ 3
イメージ 4





イメージ 5






DDS-VFOのプログラムは、先の参考ブログのCコードを丸ごと打ち込みしました。久々のコードタイピングで、肩が凝りましたが、何とかコンパイルできるまでにはなっています。コンパイラーはXC8ですので、C18コンパイラーとは以下、若干のコードの変更が必要でした。

long eeprom_read_long(unsigned int adr) 中の以下のEEPROMへの読み込みコマンドと書き込みコマンドです。1行だけサンプル記します。
C18コンパイラーの場合
d= (unsigned long)Read_b_eep(EEPROM +adr*4);

XC8コンパイラーの場合
d= (unsigned long)eeprom_read(EEPROM +adr*4);

単純にコマンドがRead_b_eep を eeprom_read に変えるだけでOKでした。
同様にEEPROMの書き込みコマンドも
単純にコマンドがWrite_b_eep を eeprom_writeに変えるだけでOKです。
もう一つ、Busy_eep();はコマンド書き換え時に削除します。
void eeprom_write_long(unsigned int adr ,long data)
{
      unsigned char i; 
  for( i=0 ; i <4 ; i++){
           eeprom_write(EEPROM + adrs*4 + i ,(unsigned char((data >>(i*8)) & 0x000000ff);
    //Busy_eep();     ←はコメントアウト化か削除します
}

もう一つは、割り込み処理です。これはC18コンパイラーより大夫簡単になります。
C18コンパイラーの場合
---------------------------------------------
#pragma interrupt isr
#pragma code isrcode = 0x8
void isr_direct(void)
{
   _asm
   goto isr
   _endasm
}
#pragma code
void isr(void)
{
...
}
---------------------------------------------
XC8コンパイラーの場合 
上記のコードのvoid isr(void)の前の黄色コードを全部削除し 赤のvoid isr(void)を次の白のコードに書き換えるだけでOKとなります。
---------------------------------------------
void interrupt isr(void)
{
...
}
---------------------------------------------
後はLCDライブラリ(lcd.c,lcd.h)のコマンドが異なるため、自分で用意したライブラリのコマンドに合わせて書き換えることが必要になります。
注意したいのは、プログラム上でも lcd_write() というファンクションを使っているため、LCDのライブラリとコマンドがダブル場合があり得ます。この場合は、下記のvoid lcd_write() を書き換えたほうが紛らわしくなくなると思います。
例えば void disp_write() などとすればLCDのライブラリとは全く異なるようになりますので、完全にダブル事はなくなります。Hi!

void lcd_write(){
    INTCONbits.GIE = 0;
    //lcd_gotopos(0,0); ←ここはオリジナルのLCDコマンド
    LCD_posyx(0,0);  ←ここが書き換えた私の用意したライブラリのコマンド
    if(mode){     
        sprintf(tmp,"IF ");
        //lcd_putstr(tmp); ←ここはオリジナルのLCDコマンド
        LCD_str(tmp);  ←ここが書き換えた私の用意したライブラリのコマンド
        long2comma(offset);       
    }else{
        sprintf(tmp,"VFO");
        //cd_putstr(tmp); ←ここはオリジナルのLCDコマンド
        LCD_str(tmp);  ←ここが書き換えた私の用意したライブラリのコマンド
        long2comma(freq);
    }
    sprintf(tmp,"Hz");
    //lcd_putstr(tmp); ←ここはオリジナルのLCDコマンド
    LCD_str(tmp);   ←ここが書き換えた私の用意したライブラリのコマンド
    if(!mode){
        //lcd_gotopos(0,1); ←ここはオリジナルのLCDコマンド
        LCD_posyx(1,0);  ←ここが書き換えた私の用意したライブラリのコマンド
        if(((freq + offset)> 0) && ((freq + offset)< MAX_FREQ))
            sprintf(tmp,"DDS");
        else
            sprintf(tmp,"ERR");
        //lcd_putstr(tmp); ←ここはオリジナルのLCDコマンド
        LCD_str(tmp);  ←ここが書き換えた私の用意したライブラリのコマンド
        long2comma(freq + offset);
        sprintf(tmp,"Hz");
        //lcd_putstr(tmp); ←ここはオリジナルのLCDコマンド
        LCD_str(tmp);  ←ここが書き換えた私の用意したライブラリのコマンド
    }
    INTCONbits.GIE = 1;
}
もう一つ、LCDのライブラリコマンドのxy座標表示が逆です。私のライブラリは(y,x)の座標指定になります。
自分の使うLCDライブラリで確認する必要があります。
実際の書き換え例)
lcd_gotopos(1,0); ←オリジナルは lcd_gotopos(x座標,y座標)
LCD_posyx(0,1);  ←用意したライブラリ LCD_posyx(y座標,x座標)
以上が主な書き換え部分でした。それから、勿論オリジナルのインクルードするLCDライブラリを私の用意したライブラリに書き換えも必要です。Hi!
#include "lcd.h"  →   #include "L_LCD.h"

以上で、コンパイルは問題なく通ります。しかし、コンパイルが通らないエラーが続出することがありました。これでだいぶ私も時間を取られてしまいました。特にインストールしたMPLAB X IDE v3.30の状態でのコンパイルは注意が必要です。コードが問題なくても、必ずエラーが出ます。何かといいますと、XC8のコンパイラの設定が初期状態では、エラーが出るレベルになっていたということです。気づかなければいやになってPICのプログラムはうまく動かないと思い込んでしまう可能性もあり得ます。
かというと、customize でのXC8のコンパイラーOption categoriesの Preprocessing and message のWarning level 初期値では-3 となっているのです。
これを Warning level 0 にする必要があります。
イメージ 7
前置きがながくなってしまいましたが、本題のEEPROMの書き込みです。読み込み書き込みもコードを書き換えてコンパイルもうまく通り実際の動作をEE Data Memoryで確認してみましたが、EEPROM自体への読み書きができてませんでした。ネットで確認しても、EEPROMの書き込みコマンドも問題ないし、XC8のコンパイラーのユーザーズガイドでも特に問題はありません。何で、うまく動作しないのだろうと思っていました。これも、ネットで調べると、同様な例があり、Macでの対応でしたが、方法としてP18系マイコン用のペリフェラルライブラリをインストールするという解決法でした。やってみましたが、XC8がないだの、インストールができない等と、もうお手上げ状態でした。


がそのあとの文面を読み進んでみて、ペリフェラライブラリを使用する設定があるというので一応見てみました。(結果、ライブラリはインストールされていたため、新たにはインストールしなくても良かったようです。)今度はXC8のLinker の設定項目中のPeripheral Library の項目にチェックを入れるということでした。
イメージ 8

結果これだけで、EEPROMの読み書きができるようになりました。本当に全機能が使えるように最初からは、なっていないということです。使いたいものがあれば、その時に設定で使用できるようにするということになります。以上が本当に時間のかかってしまったEEPROM 奮闘記になります。
他、面白いことにライブラリにチェックがなくても、EEPROMへの初期値の設定だけは(下記)プログラム上で、問題なくできるということがありました。
__EEPROM_DATA (0xC0,0xCF,0x6A,0x00,0x20,0xA1,0x07,0x00);
イメージ 6





DDSのプログラム上では、EEPROMからデータを読み込みその周波数とオフセット周波数をAD9834に送るルーチンで出来ているため、書き込みしておいたデータ周波数を読み込む部分で、デバッグをしていました。ペリフェラルライブラリの使用設定がされてない中では、eeprom_readも堂々巡りだったわけです。
あとプログラム上での、周波数の設定カーソルのルーチンなどうまくない感じなので
時間があれば、少し見てみようと思います。
とにかく動くようになるとPICはとても面白いマイコンでもっと何かやりたいと欲が出てくる楽しい趣味だとつくづく思います。貴重な情報を公開してくださっている先人の方々の苦労には感謝する次第です。Hi!
つづく

PIC18F14K50とLCD(SC1602BBWB-XA-LB-G)

ANALOG DEVICES Co.のAD9834のDDS用ICをつかったVFOを作りたくなりました。突然といっても、Windows10でMPLAB X IDEをインストールしたため、何か一つプログラムを組んでつくってみようと思ったのが事のきっかけです。参考となったホームページは、下記になります。

[AD9834を使った実験用DDS-VFOの制作]
このホームページでは、MPLAB Version8.90にCコンパイラはフリーのC18でのサンプルコードでした。いろいろなデバイスで対応できる方なので、無線をやっているものとしては、とても参考になります。特にメインのコードを全部載せてくれているのがありがたいです。(LCDドライバ(lcd.c ,lcd.h )は残念ながら載せていません。)

私のインストールした MPLAB X IDEは、バージョンが最新のv3.30でCコンパイラーはXC8になります。コードの若干の手直しが必要ですが、ほぼ特別なファンクション(EEPROMコード)とLCDのライブラリでのファンクション名が異なるのを除いては、ほぼまるまるコードは使えそうです。??

まずは、最初にPIC18F14K50にLCD(SC1602BBWB-XA-LG-G)を繋ぐことから始めました。久々なので、前のLCD動作したサンプルコードを思い出し参考にしてみました。今回のVFOの参考としたホームページの回路図での配線をそのままPIC18F14K50とLCDに行います。このことが、LCD表示のドライバのプログラムを手直しすることになってしまいました。こだわりではないですが、汎用のLCDドライバでは、動作しなかったためです。前もブログに載せて対応できたドライバも使えません。
ことは、「連続でのポート以外は使えないLCDドライバがほとんど」ということです。私の今回参考とした回路図では、たまたま、不連続なポートでの動作サンプルだったのです。
通常はLCD側のポートD4,D5,D6,D7に対してPIC側も連続のポートRC4,RC5,RC6,RC7などとして使うので、WEBで出回っている一般のLCDドライバは動作します。
PIC側のポートが今回は、RC7,RC6,RC3,RC4の不連続なしかもバラバラな接続ではまったく動作しません。動作しない問題となるLCDドライバでのメイン下記のコード部分です。他は問題ありません。

void LCD_out(char c){
    LCD_DB = (c>>4) | (LCD_DB & 0xF0);
    LCD_EN = 1;   // Enable Hi
    NOP();        // NOP
    LCD_EN = 0;       // Enable Low
}
以前はこの部分を下記のように書き換えて任意のポートで問題ありませんでした。
void LCD_out(char c){
    LCD_DB4 = ((c) & 0x01);
    LCD_DB5 = ((c >> 1 ) & 0x01);
    LCD_DB6 = ((c >> 2 ) & 0x01);
    LCD_DB7 = ((c >> 3 ) & 0x01);
    LCD_STROBE;
}

PIC18F14K50での連続ポート使用の際は下記で動作します。
void LCD_out(char c){
    LCD_DB = (c & 0xF0) | (LCD_DB & 0x0F);
  LCD_EN = 1;   // Enable Hi
    //Delay1TCY();    // NOP
    NOP();                // NOP
    LCD_EN = 0;       // Enable Low
}

任意ポート対応にするには、下記の LCD_DB = (c & 0xF0) | (LCD_DB & 0x0F);を下記のように書き換える必要があります。

void LCD_out(char c){
    //LCD_DB = (c & 0xF0) | (LCD_DB & 0x0F);
    if((c & 0x80) != 0){
        LCD_DB7 = 1 ;
    }else{
        LCD_DB7 = 0 ;
    }
    if((c & 0x40) != 0){
        LCD_DB6 = 1 ;
    }else{
        LCD_DB6 = 0 ;
    }
    if((c & 0x20) != 0){
        LCD_DB5 = 1;
    }else{
        LCD_DB5 =0;
    }
    if((c & 0x10) != 0){
        LCD_DB4 = 1;
    }else{
        LCD_DB4 = 0;
    } 
    LCD_EN = 1;    // Enable Hi
    //Delay1TCY();       // NOP
    NOP();               // NOP
    LCD_EN = 0;    // Enable Low
}
上記にlcd.cを書き換えて、同郡内のどんな接続順番でもLCDが表示可能になりました。案外とこれが便利で使い道(パターン作成都合とか、あまりポート使用とか)があると思います。

※参考書籍
電子工作のためのPIC16F1ファミリ活用ガイドブック
後閑哲也著;技術評論社

つづく

Windows10でPICkit3を使う方法まとめ

久々のPIC関連の記事になります。Windows10で以前購入したPICkit3とサンプル基板を使おうと思い、最新のMPLAB X IDE v3.30とMPLAB IPE v3.30とMPLAB driver switchar および、PICkit3 v3.10を一通りダウンロードした。難なくPICkit3もサンプル基板も以前のプログラムを読み込むだけで動くものだと思っていましたが、あにはからんや、はしるどころかデバイスとしてもPICkit3は認識はするものの通信ができない状態でした。インターネット情報では、Windows10ではMPLAB X IDE v3.30は書き込みができないの情報の多いこと多いこと、その中でもこれぞと思えるやり方を説明してあるものがありましたので、実際にやってみたところ、うまく動くようになりました。その記録を防備録として残すものです。私のWindows10がインストールしてあるPCは以下の通りです。
イメージ 1
参考にしたURLです。
特に情報として、異なっていたことは、PICkit3のボタンを押しながらUSBを繋ぐ等は必要ありませんでした。
以下Windows10でMPLAB X IDE v3.30でPICkit3を使えるようになった手順のまとめです。
[1]インストールしておいた中のPICkit3v3.10のProgrammerを起動します。
これは、なぜだかうまく動作(通信)します。MPLAB X IDE v3.30も動けばいいのにと思ってしまいます。
イメージ 2
起動画面
イメージ 3
[2]PCのUSB(2.0)ポートにPICkit3を繋いでおきます。
Tool->Download Pickit Operating Systemを選択実行します。
イメージ 9
[3]OS読み込み設定(すでにダウンロードされているOSのhexファイルを設定)
イメージ 4
[4]PICkit3のOS読み込み中
イメージ 10
[5]OSインストール後
イメージ 11
[6]ReadでLesson基板のデータを読み込みできるかチェックしました。
イメージ 12
[7]Verifyしてみました。動作は問題ありません。
イメージ 13
[8]MPLABモードにします。
イメージ 14
[9]メッセージがでます。      
 イメージ 5
 イメージ 6
[10]閉じるときには、エラーメッセージがPICkit2の表示ででます?
 イメージ 7
[11]次にMPLAB IPE v3.30を起動して、Connectボタンを押します。
イメージ 15
[12]firmware等が読み込まれます。  
イメージ 16
[13]完了後にPICkit3のデータの通信確認でRead とVerifyをしてみました。
イメージ 17
[14]動作問題ないようなので、プログラムを閉じて、MPLAB X IDE v3.30を起動します。すでにLesson1のLED点滅プログラム(オリジナルは1個点灯から一部ブリンクに改良しました。)が読み込まれています。
イメージ 18
[15]PICkit3の電源を設定します。(必須)
イメージ 8
[16]後はプログラムをコンパイルです。(インクルードファイル等はあらかじめパスを設定しておきます。

以上でWindows10上でMPLAB IDE v3.30がPICkit3でうまくプログラムをコンパイルでき、書き込みも問題なく動作しました。途中の画像が繰り返して実行したりしていますので、必ずしも同じ画像とは限りませんので、見た人が実際に行って、ハードを壊すトラブルを起こしても責任は負いません。問題ない内容ですが、一応断っておきます。
なお、Windows Vistaでは、うまくいきませんでした。
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

QRコード
QRコード
  • ライブドアブログ