JH7UBCブログ

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

今年のミニトマト

2021-07-31 10:06:10 | 家庭菜園と花
 我が家の家庭菜園では今、インゲン、ケール、トマト、ナス、オクラ、ピーマン、シシトウという夏野菜が毎日収穫できています。

 ただ、今年はナスの出来が良くありません。原因はよく分かりません。
 好調なのは、ミニトマトです。今日採れたミニトマトです。
 粒が大きく、甘みとうまみがあります。


 今年は、トマト苗の植え付け方法を変えました。「木村さんの奇跡のリンゴ」知られる木村さんの本に出ていた方法を試したのです。

 トマト苗を横向きに植え付け、茎を20cmくらい土をかぶせて、そこからも根を出させる方法です。

 この方法ですと、根がたくさん出て、水分と栄養の吸収が良くなります。トマトの成長が非常に良いです。

 また、トマトの間にバジルを植えました。

 そんな訳で、大きくておいしいトマトが出来ました。

 しばらく夏野菜の季節を楽しみます。トウモロコシもそろそろ出来ますよ。

7月25(日)~31日(土)は全福島マラソンQSO

2021-07-23 13:48:43 | アマチュア無線
 7月25日(日)から31日(土)まで、JARL福島県支部主催の第52回全福島マラソンQSOが開催されます。規約はこちら

 かつてはマラソンコンテストと呼ばれ(2006年からはマラソンQSOになりました)、夏と冬の年2回、10日間にわたって開催されていましたが、2013年から7月の最終週の年1回開催となりました。

 迎えて今年は第52回大会となる伝統のあるコンテストです。当局JH7UBCは2000年からほぼ毎回参加してきました。様々なバンドやオールバンドで参加し、近年は50MHz(6m)での参加が続きました。

 しかし、昨年秋にメインアンテナのSteppIRが故障し、今年は6mでの参加ができません。そこで、今年は3.5MHzのCWを中心に参加しようと思っています。折しも東京オリンピック開催期間と重複しますが、マラソンQSOの期間は、毎晩CQを出してみようと思います。聞こえましたら交信をよろしくお願いします。

 コンテストナンバーはなく、通常の交信ですので、気軽にコールお願いします。今年の参加コンセプトは、「80mバンドでCW交信を楽しむ」です。ではお空でお会いしましょう。

PIC16F1827 MCC RTC(DS1307)テストその2

2021-07-17 22:15:24 | MPLAB X MCC
 前回のテストで、リアルタイムクロックRTC(DS1307)をPIC16F1827でコントロールすることができました。

 今回は、DS1307から1Hzの方形波を出力して、波形の立ち上がりで、RB0にIOC(状態変化割込み)をかけ、1secごとに時刻を表示するテストをします。

 回路図です。

 MCCのセッティングをします。
 System ModuleとMSSP1の設定は、テストその1と同じです。
 Pin Managerで、RB0を入力に設定します。(RB2,RB3,RB5は、次回のテストでスイッチを付ける予定なので、入力に設定しています。)


IOC割込みをInterrupt Moduleで設定します。(IOCIにチェックを入れます)
 Pin ModuleでRB0のIOCを立ち上がり(positive)に設定します。

プログラムです。
その1のプログラムの次の部分を変更します。

まず、DS1307のSQW出力に1Hzの信号を出力するようにします。
これは、DS1307のレジスタ0x07番地に0x10を書き込めばよいので、レジスタへの書き込みデータ初期値REG[8]の最後のデータにセットします。
REG[8] = {0x00,0x00,0x00,0x01,0x01,0x01,0x20,0x10};

IOC割込みの設定は、pin_manager.cのIOCBF0_ISR(void) に下のように設定します。
RB0の入力がLOWからHIGHに変化した(立ち上がり)時に割込みがかかります。
割込みがあったら、IntFlag=1;として割込みフラッグを立てます。


main.cの中のmain()関数の中身です。
-------------------------------------------------------------------------
void main(){
// initialize the device
SYSTEM_Initialize();
// Enable the Global Interrupts
INTERRUPT_GlobalInterruptEnable();
// Enable the Peripheral Interrupts
INTERRUPT_PeripheralInterruptEnable();


LCD_init();

Time_data_write();//時刻をセット

while (1){
if(IntFlag == 1){ //RB0にIOC割込みがあったら
Time_data_read();//RTCから時刻を読み出し
Time_disp(); //時刻を表示する
IntFlag = 0; //割込みフラッグを降ろす
}
__delay_ms(10);
}
}
------------------------------------------------------------------
IntFlagという変数を使うmain.cとpin_manager.cの最初の方で、
volatile int IntFlag = 0;
を書いておきます。

ブレッドボードです。時刻の初期値
2020/01/1 (MON)
00:00:00
から1sec1ごとに時刻が動き始めます。

 次回は、スイッチを付けて、時刻設定ができるようにして、時計に仕上げます。


PIC16F1827 MCC RTC(DS1307)テストその1

2021-07-15 22:14:04 | MPLAB X MCC
 先日、ArduinoでRTC(リアルタイムクロック)DS1307をコントロールするテストを行いました。

 これで、DS1307のコントロールの勘所がつかめましたので、PIC16F1827を使って、テストを行います。

 今回は、表示には前の記事で使ったI2Cインターフェース付きLCD1602を使います。
 DS1307とは、I2Cで通信しますので、MCCの設定は、LCD1602のテストの時と同じですが、PICを回路にセットしたまま、プログラムのテストができるように、ICSPを使います。テスト回路図です。


 従って、MCCのpin managerでRA5は、MCLR/VPPのままにしておきます。

プログラムです。
--------------------------------------------------------------
/*
* PIC12F1827 MCC RTC TEST
* 2021.07.15
* JH7UBC Keiji Hata
*/

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

//LCD関係定義
#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

//RTC関係定義
#define RTC_addr 0x68
#define SECOND 0x00
#define MINUTE 0x01
#define HOUR 0x02
#define DAY 0x03//WEEK
#define DATE 0x04
#define MONTH 0x05
#define YEAR 0x06
#define CTRL 0x07

char *week[] = {" ","MON","TUE","WED","THU","FRI","SAT","SUN"};
//時刻データ初期値
uint8_t REG[8] = {0x50,0x59,0x23,0x03,0x14,0x07,0x21,0x00};
uint8_t REG_addr = 0x00;


//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,cursol 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_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);
}
}

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

//時刻データをRTCに書き込む
void Time_data_write(){
//I2C1_Write1ByteRegister(RTC_addr,0x00,0x00);//先頭アドレス
I2C1_Write1ByteRegister(RTC_addr,SECOND,REG[0]);
I2C1_Write1ByteRegister(RTC_addr,MINUTE,REG[1]);
I2C1_Write1ByteRegister(RTC_addr,HOUR,REG[2]);
I2C1_Write1ByteRegister(RTC_addr,DAY,REG[3]);
I2C1_Write1ByteRegister(RTC_addr,DATE,REG[4]);
I2C1_Write1ByteRegister(RTC_addr,MONTH,REG[5]);
I2C1_Write1ByteRegister(RTC_addr,YEAR,REG[6]);
I2C1_Write1ByteRegister(RTC_addr,CTRL,REG[7]);
}

//RTCから時刻データを読みだし、REG[]に格納
void Time_data_read(){
I2C1_WriteNBytes(RTC_addr,&REG_addr,1);

I2C1_ReadNBytes(RTC_addr,&REG,7);
}

//Timeデータの表示
void Time_disp(){
LCD_home();
printf("20");
printf("%02x/",REG[6]);
printf("%02x/",REG[5]);
printf("%02x (",REG[4]);
printf(week[REG[3]]);
printf(")");
LCD_cursor(4,1);
printf("%02x:",REG[2]);
printf("%02x:",REG[1]);
printf("%02x",REG[0]);
}

void main(){
// initialize the device
SYSTEM_Initialize();
// Enable the Global Interrupts
INTERRUPT_GlobalInterruptEnable();
// Enable the Peripheral Interrupts
INTERRUPT_PeripheralInterruptEnable();

LCD_init();

Time_data_write();//時刻をセット

while (1){
Time_data_read();//RTCから時刻データを読み込む
Time_disp(); //時刻を表示する
__delay_ms(1000);
}
}

-------------------------------------------------------------------------------------
ブレッドボードです。
プログタマは、PICKit3を使い、VDD=5Vは、外部から供給する設定にしています。


 ともかく、動作することができましたので、今後、Arduinoの時と同様に、時計として使えるようにしてしてみたいと思います。

PIC16F1827 MCC I2Cインターフェース付きLCD1602表示テスト

2021-07-10 22:26:20 | MPLAB X MCC
 PIC16F1827を使って、MCCを利用して、I2Cインターフェース付きLCD1602の表示テストをします。

 MPLAB Xでprojectを作成して、MCCを立ち上げます。
 まず、System moduleの設定を行います。クロックは、16MHzにしました。
 Low-voltage programing Enableのチェックは外しておきます。

 I2Cを使うためにMSSP1モジュールを導入し、I2C Masterに設定します。
 I2Cのクロックは標準の100KHzとします。


MCC設定のI2Cは割込みを使いますので、Interrupt moduleで割込み設定をします。


 Pin moduleを見るとRB1がSDA1に、RB4がSCL1に設定されています。
 WPU(ウィーク・プルアップ)に一応チェックを入れておきます。(この時、レジスタのタブを開いて、下の方にあるnWUPENをenableにします)

 MCCの設定が終わったら、Generateして、MCCを終了すると関係するヘッダファイルとソースファイルが自動的に生成されます。

 回路図です。

テストプログラムです。LCD1602を4bitモードで動作させます。
MPLABX のプロジェクトのプロパティを開いて、XC8 Global OptionsのC standardは、C90にしてコンパイルしてください。 
----------------------------------------------------------------
/*
* PIC12F1827 MCC I2C LCD1602 TEST
* 2021.07.10
* 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,cursol 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();

char msg[] = "Hello World!";
LCD_str(msg);

int count = 0;
while (1){
LCD_cursor(2,1);
printf("%3d",count);
count++;
__delay_ms(1000);
}
}
----------------------------------------------------------------
 ブレッドボードです。
 LCD1602の表示ドット不良のため、WorldのWの右側が欠けていますが、プログラムは正常に動きました。