JH7UBCブログ

アマチュア無線 電子工作 家庭菜園など趣味のブログです

MPLAB X v6.20 MCC PIC16F1827 GPIOテスト

2024-06-21 20:26:20 | MPLAB X MCC
 MPLAB X v6.20+MCCv5.50をもう少し使い込んでみようと思います。

 PIC16F1827で、GPIOの設定をテストします。テストする回路図です。
 RB4を入力に設定し、ウィークプルアップします。
 RB3は出力に設定して、LEDを接続します。
 ICSPでテストすます。


 MCCの設定です。
 クロックは、デフォルトのままで、16MHzです。
 Pin Grid Viewで、RB3をoutputに、RB4をinputに設定します。


 次に、Pinsウインドウを開き、RB4のWeek Pillupにチェックを入れます。


 MCCの設定は、これだけです。Generateします。

 まず単純にSWを押すとLEDが点灯するといいうプログラムです。
-----------------------------------------------------
#include "mcc_generated_files/system/system.h"

#define SW RB4
#define LED LATB3

int main(void)
{
     SYSTEM_Initialize();

     while(1){
         if(SW == 0){
             LED = 1;
         }else{
             LED = 0;
         }
    }
}
-----------------------------------------------------

ブレッドボードです。タクトスイッチを押すとLEDが点灯します。


 ついでに、スイッチを押すたびに点灯と消灯を繰り返すプログラムを試しました。動作しますが、若干不安定な時もあります。
-----------------------------------------------------
#include "mcc_generated_files/system/system.h"

#define SW RB4
#define LED LATB3

int main(void)
{
     SYSTEM_Initialize();

     LED = 0;
     int val = SW;
     int state = 0;

     while(1)
    {
         if((SW == 0) && (val == 1)){
             state = 1 - state;
             __delay_ms(10);//チャタリング待ち
         }
         val = RB4;
         if(state == 1){
             LED = 1;
         }else{
             LED = 0;
         }
    }
-----------------------------------------------------

MPLAB X v6.20を使ってみる

2024-06-11 14:54:27 | MPLAB X MCC
 しばらくぶりにPICの勉強を再開します。

 これまでは、MPLAB X v5.15を使っていましたが、最新バージョンはv6.20です。さっそくMicrochip社のMPLAB X IDEのサイトからv6.20をダウンロードして、インストールしました。同時にコンパイラXC8 の最新版v2.46もインストールしました。

 今回はPIC16F1827を使って、いろいろテストしてみます。まずはLチカから。ICSPでテストすることにします。回路図です。RB0に接続したLEDを点滅させます。



 プロジェクトを作成すると、自動的にMCCが立ち上がります。(少し時間がかかります)v6.20になってMCC(Melody)を使うことがデフォルトになったみたいです。
 MCCが立ち上がるとこんな画面になります。MMCはv5.50になっています。


 右上に見慣れない「Builder」というウインドウが出てきました。使い方が良くわからないので無視して、クロックとピンの設定だけをしました。
 この画面はMCC Melodyの画面です。私は今までMCC Classicを使っていたので、この画面は初めてでした。

 クロックは、デフォルトで、FOSC、16MHz_HFでしたので、そのままにしました。


 GPIOは、RB0だけoutputに設定しました。


 これだけ設定して、generateしました。

 プログラムです。
--------------------------------------------------------
/*
 * PIC16F1827 MCC ICSP LED Blink
  * 2024.06.10
  * JH7UBC Keiji Hata
*/

#include "mcc_generated_files/system/system.h"

int main(void)
{
     SYSTEM_Initialize();

    while(1)
    {
         LATB0 = 1;
     __delay_ms(500);
         LATB0 = 0;
     __delay_ms(500);
     }    
}
--------------------------------------------------------
Project PropertiesでPICKit3から電源を供給するように設定して、コンパイル・書き込みます。

 ブレッドボードです。
 無事、0.5secごとにLEDが点滅しました。



 まずは、Lチカができました。
 この後、いろいろやってみます。

PIC16F18326 MCC FVRテスト

2024-02-08 13:35:50 | MPLAB X MCC
 PIC16F18326が内蔵しているFVR(Fixed Voltage Reference 低電圧リファレンス)のテストをします。

 FVRの構成です。(説明書より)

 bufferが2つあり、buffer1がADC用、buffer2がComperators and DAC用です。それぞれGainを1x,2x,4xに設定できます。

 今回はADC用のプラス電源としてFVRを利用してみます。
 テストする回路です。



 VDDをボリュームで調整して、その電圧をRC3からADCに入力し、変換値をI2C LCD1602に1secごとに表示します。

 プロジェクトを作成し、MCCを立ち上げ、各種設定を行います。
 systemモジュールです。デフォルトのままで、クロックは1MHzです。


 FVAR,ADC,MSSP1モジュールを導入して、それぞれ設定します。
 表示用にI2C LCD1602を使いますので、MSSP1モジュールをI2C Masterモードに設定します。



 ADCモジュールです。Result Alignmentをrightに、Positive ReferenceをFVRに設定します。



 FVRモジュールです。
 FVR_buffer1 Gainを4x 4.096Vに設定します。



 Interruputモジュールです。I2Cで割り込みを使います。



 pinモジュールです。
 ADCのinputはRC3に設定します。
 I2CのSCL1はRC0に、SDA1はRC1に設定します。


 以上の設定をして、Generateして、main.cのプログラムを次のように書きました。
------------------------------------------------
/*
 * PIC16F18326 MCC FVR test
 * 2024.02.08
 * JH7UBC Keiji Hata
*/

#include "mcc_generated_files/mcc.h"
#include "mcc_generated_files/examples/i2c1_master_example.h"

#define I2C_LCD_addr 0x27
#define LCD_EN 0b00000100//Enable
#define LCD_BL 0b00001000//Back Light
#define LCD_CMD 0x00
#define LCD_CHR 0x01
#define LCD_LINE1 0x80
#define LCD_LINE2 0xC0

//I2C LCDに1byteのdataを書き込む
void I2C_write_data(uint8_t data){
     I2C1_Write1ByteRegister(I2C_LCD_addr, (data | LCD_EN | LCD_BL),(data | LCD_BL));
     __delay_us(100);
}

//I2C LCDにコマンドまたは文字を送る
void LCD_write(uint8_t data, uint8_t mode){
     //上位4bitを送る
     I2C_write_data((data & 0xF0) | mode);
     //下位4bitを送る
     I2C_write_data(((data << 4) & 0xF0) | mode);
}

//I2C LCD 初期化
void LCD_init(){
     __delay_ms(40);
     LCD_write(0x33,LCD_CMD);//8bit mode set 2回
     LCD_write(0x32,LCD_CMD);//8bit mode set 1回,4bit mode set
     LCD_write(0x06,LCD_CMD);//Entry mode set
     LCD_write(0x0C,LCD_CMD);//display ON,cursor OFF,blink OFF
     LCD_write(0x28,LCD_CMD);//Function set 4bit mode,2line
     LCD_write(0x01,LCD_CMD);//Clear display
     __delay_ms(1);
}

void LCD_clear(){
     LCD_write(0x01,LCD_CMD);
     __delay_ms(1);
}

void LCD_home(){
     LCD_write(0x02,LCD_CMD);
     __delay_ms(1);
}

void LCD_cursor(uint8_t x,uint8_t y){
     if(y == 0){
     LCD_write(LCD_LINE1 + x,LCD_CMD);
    }
     if(y == 1){
         LCD_write(LCD_LINE2 + x,LCD_CMD);
    }
}

//文字列の表示
void LCD_str(char *str){
     while(*str)
     LCD_write(*str++,LCD_CHR); //pointer increment
}

//1文字表示
void putch(char ch){
     LCD_write(ch,LCD_CHR);
}


void main(void)
{
     // initialize the device
     SYSTEM_Initialize();

     // Enable the Global Interrupts
     INTERRUPT_GlobalInterruptEnable();

     // Enable the Peripheral Interrupts
     INTERRUPT_PeripheralInterruptEnable();
     LCD_init();
     printf("FVR & ADC TEST");
     LCD_cursor(12,1);

     int data = 0;

     while (1)
    {
      data = ADC_GetConversion(19);
      LCD_cursor(5,1);
      printf("%5d",data);
      __delay_ms(1000);
    }
}
------------------------------------------------
 putch()関数を定義して、printf()関数を使いますので、Project Propertiesの C standardは、C90に設定しました。

 ブレッドボードです。
 10kΩのボリュームを回すとその電圧に対してADCの値がLCDに表示されます。
 FVRのGainをx4に設定しましたので、電圧0~4.096Vの値がADCで変換されて0~1023の値で表示されます。
 写真では、4.10Vの時1023と表示しています。4.10V以上では1023のままです。


 FVRとADCを利用すれば、デジタル電圧計を作ることができます。
 ただし、ADCの変換値がけっこうふらつきますので、ノイズ対策と平均化などの対策が必要です。



PIC16F18326 MCC CLCテスト

2024-02-06 23:18:40 | MPLAB X MCC
 PIC16F18326のCLCのテストをします。

 CLC(Configuable Logic Cell)は、内蔵している下の図(いずれもmicrochipの説明書より)のロジックを設定により、プログラムとは関係なく使用できる機能です。これにより、高速の処理を行うことができます。


実際には、下のCLC BLOCK DIAGRAMで必要な設定をすることで使用可能になります。Logic Functionに上記のロジックのいずれかを設定します。



 CLCの入力は、次の中から選択します。


 microchipの説明書によれば、次のようなCLCの応用例が紹介されています。
• 応用例1: 位相検出器
• 応用例2: SCCP を入力とするデッドバンド制御を備
えた相補波形ジェネレータ
• 応用例3: 非同期のデータ信号モジュレータ(DSM)
• 応用例4: 複数パラメータの監視
• 応用例5: NRZ からRZ へのエンコード
• 応用例6: 2x1 マルチプレクサ

うーん、よく分かりません。とりあえず、どんな風に設定して使うのかWebで調べてみると、「はじめてのPIC & Arduino」というサイトにCLCを利用して、スイッチを押すとLEDが点灯するという記事を見つけたので、これをやってみることにしました。記事は、こちら。(ただし、PICはPIC16F1619が使用されています。 )

 さっそくプロジェクトを作成し、MCCを起動して、設定を始めます。

 systemモジュールです。デフォルトのままです。クロックは1MHzです。


 CLC1モジュールを導入しました。(CLC1からCLC4まで4つのCLCが使えます。)Mode、つまり使うLogic Functionは、AND-ORを選びます。
 下の論理回路をクリックして、入力はCLCIN0を1のOR回路に接続し、2のORの出力を反転させます。最後に出力を反転させます。



 次に、pinモジュールで、CLCの入力ピンと出力ピンを選択します。
 今回は、CLCIN0をRC4にCLC1OUTをRA4に設定しました。


 回路図です。RC4のPUSHスイッチを押すとRA4のLEDが点灯します。



 Generateして、build書き込みをしました。(ICSPでテストしています。電源は、PICKit3から供給しています。)

 プログラムには、次のように何も書かれていませんが、CLCは動作します。
------------------------------------------------------------
#include "mcc_generated_files/mcc.h"

void main(void)
{
     // initialize the device
     SYSTEM_Initialize();

     while (1)
    {
    }
}
---------------------------------------------------------------

 ブレッドボードです。スイッチを押すとLEDが点灯しました。



 最も簡単な回路で、CLCの動作を確認することができました。

 しかし、ここまで来るのに1週間ほどかかってしまいました。というのは、先述のサイトでは、CLCの出力をRA5としているので、私も最初はその設定でやってみました。
 ところが、ボタンを押してもLEDはつきません。何故?。
 CLCの設定やピンの設定、回路を見ても問題ありません。原因が分かりません。もんもんとして1週間が過ぎました。
 ひょっとして、RA5の出力設定がダメなのかな、と思いRA5を使ったLチカをやってみると、案の定LEDが光りません。PICを替えてやっても光りません。他のピンでは、Lチカができました。
 どうも、RA5を出力に設定できていないようです。Webで探ってみるとRA5は外部ロックのINに設定されているらしい。

 CLCの出力先をRA4に変更してみると、問題なく動作しました。ちょっとしたことで沼にはまってしまったわけです。

 このCLC機能をアマチュア無線で何かに利用できないか、今後考えていきたいと思います。


PIC16F18326 MCC DSMテスト

2024-01-31 12:31:06 | MPLAB X MCC
 PIC16F18326のDSMのテストをします。

 DSMとは、Data Signal Modulatorのことで、データ信号と搬送波(キャリア)を混合(AND)して変調出力を作成する機能のことです。説明書では次の図で説明されています。キャリアはCARHとCARLの2種類で、MOD信号がHの時、CARHが出力され、MOD信号がLの時、CARLが出力されます。


 DSMモジュールを簡単に表現すると下の図のようになります。(本当は論理回路で示すべきですが、スイッチで簡略化しました)
 MOD信号がHighの時CARHがDSMoutに出力され、MOD信号がLowの時、CARLがDSMoutに出力されます。
 CARH,CARL,MODについては、下の図の項目から選択することができます。



 さて、DSMのテストで最初に思い浮かんだのが、アマチュア無線家としては、CW通信(モールス通信)でした。搬送波に信号波で変調をかける、まさにCW信号です。

 そこで、モールス練習機を作ってみることにしました。電鍵(キー)を押したときにピーという音が聞こえるようにします。周波数は800Hzとします。この信号はNCOで発生させてCARLとし、MODがLの時に出力します。CARHはVSSとして,MODがHの時は何も出力しません。

 モールス練習機の回路図です。

 DSMの出力は、RC3としてスピーカーを接続します。電鍵はRA4に接続し、RA4はウィークプルアップし、プルアップ抵抗はつけません。

 MPLAB X でprojectを作成し、MCCを立ち上げます。systemモジュールです。デフォルトの状態で、クロックは1MHzです。


 NCOモジュールとDSMモジュールを導入し設定します。
 NCOモジュールは、周波数を800Hzとしました。

 DSMモジュールです。High CarrierはVSS,Low CarrierはNCO1_outに設定します。また、Modulation SourceはMDMIN_pinに設定します。


 Pinモジュールです。
 DSM outuputはRC4に設定します。MDMIN inputはRA4に設定し、ウィークプルアップWPUにチェックを入れます。


 電鍵(KEY)をON/OFFして、モールス符号Vを送出してみました。
 その時のDSM outの波形です。

 800HzのキャリアがKEYの信号で変調され、モールス符号として送出されました。
 プログラムです。MCCの設定以外はプログラム上には何も書いていません。
----------------------------------------------
#include "mcc_generated_files/mcc.h"

void main(void)
{
     // initialize the device
     SYSTEM_Initialize();

     while (1)
    {
    }
}
----------------------------------------------

 ブレッドボードにスピーカーと電鍵をつけてテストをしています。

 音が大きいので、出力に直列に100Ωの抵抗を入れています。

 下の写真は、10年前に製作したモールス練習機です。製作記事は、こちら
 ランド方式電で製作し、ツインT回路とNJM386アンプの2つの基板で構成されています。これらが、1個のPICでできるわけですからすごいですね。