JH7UBCブログ

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

今週末は県北430CQ大会

2021-08-30 14:17:30 | アマチュア無線
 今週末の9月3日(金)18時から5日(土)21時まで、県北430CQクラブ主催の第31回430CQ大会が開催されます。要項は、こちら

 このコンテストは、430MHz FMモードだけを使用するユニークなコンテストです。CQを出して交信するか、CQに応答して交信しなければ得点になりませんので、CQ大会という名称がついてようです。(特定局呼び出しでの交信は無効)

 当局JH7UBCは、1999年から参加し、途中何度か参加できませんでしたが、2009年からは毎年参加しています。今年も参加予定です。

 最近は静かな430MHzですが、このコンテスト期間中は、移動局や固定局でとても賑やかになります。福島県内の市町村と都道府県がマルチになりますので、県内の各市町村へ移動する局も多く、普段430MHzの電波が聞こえないところからも電波が発射されます。

 この機会に各局も430MHzでの交信を楽しんでいただきたいと思います。では、お空でお会いしましょう。

今日の落ちこぼれ花壇

2021-08-23 13:31:19 | 家庭菜園と花
 オリンピックが終わったら、夏とは思えない涼しい日が続き、数日前から再び夏の暑さが戻ってきました。
 天気は不安定で、突然雨がザーっと降ってきます。雑草の伸びが早く、「落ちこぼれ花壇」も草だらけになりました。ということで草むしりをしてきれいにしました。
 自分では種を蒔かず、あちこちからこぼれた種で育てる我が家の「落ちこぼれ花壇」。今は、昨年咲いたホウセンカの種が芽を出し成長し、ピンクと白のかわいい花が咲き始めました。

 さて、畑の現在の様子です。
 手前がミニトマト。株間にバジルを植えています。
 奥にオクラとナスが見えます。見えないのですが、他にピーマン、シシトウ、インゲンが今収穫できます。

 そろそろ秋作の準備を始めました。これから空いている所を耕して、月末に種まきをします。

 季節はちゃくちゃくと秋に向かっています。夏もだんだん終わりですね。
 

PIC16F1827 MCC RTC(DS1307)時計の試作

2021-08-10 11:26:58 | MPLAB X MCC
 東京オリンピックが終わり、しばらく放っておいたPIC16F1827 RTC 時計のプログラミングを再開しました。

 一応動きましたので、公開します。(まだバグがあるかも知れません)

 まず、回路図です。SETボタンを長押しすると時計セットモードになります。年、月、日、曜、時、分、秒の数値の変更は、UP/DOWNボタンで行います。SETモードでは、SETボタンを押すごとに年から秒まで変更できます。
 以前に試作したArduino Nano RTC(DS1307) 時計と基本的な操作、プログラムのアルゴリズムは同じです。


 MCCの設定です。まず、System moduleです。
 内部クロック、FOSC=16MHzとしました。
 ICSPを利用しますので、RA5は、RESET/MCLR/VPPとします。



 SETボタン=RB2
 UPボタン=RB3
 DOWNボタン=RB5
 として、inputとし、ウィークプルアップします。


 プログラムです。
-----------------------------------------------------------------------------------------------------
/*
* PIC12F1827 MCC RTC TEST
* 2021.08.10
* 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

char *week[] = {" ","MON","TUE","WED","THU","FRI","SAT","SUN"};
uint8_t REG[8] = {0x00,0x00,0x00,0x01,0x01,0x01,0x20,0x10};//時刻データ初期値2020/01/01 MON 00:00:00
int OLD_REG[7] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};//前の時刻データを保存するレジスタ
int Disp_REG[7];//表示用レジスタ
uint8_t REG_addr = 0x00;

//時計セット関係
#define SET RB2
#define UP RB3
#define DOWN RB5
int Num = 6; //Clock data number 6:year 5:month 4:day 3:week 2:hour 1:mminute 0:second
int count = 0;

//割込み関係
volatile int IntFlag = 0;

//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(){
for(uint8_t i=0;i<8;i++){
I2C1_Write1ByteRegister(RTC_addr,i,REG[i]);
}
}

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

//REG[]のデータ(HEX)をDisp_REG[]のデータ(10進)に変換
void HEX2DEC(){
for(uint8_t i=0;i<=7;i++){
Disp_REG[i] = ((REG[i] & 0xF0)>>4)*10 + (REG[i] & 0x0F);
}
}

//Disp_REG[]のデータ(10進)をREG[]のデータ(HEX)に変換
void DEC2HEX(){
for(uint8_t i=0;i<=7;i++){
REG[i] = ((Disp_REG[i] / 10) << 4) | (Disp_REG[i] % 10);
}
}

void LCD_print(uint8_t n){
printf("%02d",Disp_REG[n]);
OLD_REG[n]=Disp_REG[n];
}

//Timeデータの表示
void Time_disp(){
if(Disp_REG[6] != OLD_REG[6]){
LCD_cursor(2,0);
LCD_print(6);
}
if(Disp_REG[5] != OLD_REG[5]){
LCD_cursor(5,0);
LCD_print(5);
}
if(Disp_REG[4] != OLD_REG[4]){
LCD_cursor(8,0);
LCD_print(4);
}
if(Disp_REG[3] != OLD_REG[3]){
LCD_cursor(12,0);
printf(week[Disp_REG[3]]);
OLD_REG[3] = Disp_REG[3];
}
if(Disp_REG[2] != OLD_REG[2]){
LCD_cursor(4,1);
LCD_print(2);
}
if(Disp_REG[1] != OLD_REG[1]){
LCD_cursor(7,1);
LCD_print(1);
}
if(Disp_REG[0] != OLD_REG[0]){
LCD_cursor(10,1);
LCD_print(0);
}
}

void Time_UP_DOWN(uint8_t n){
if(UP == 0){
Disp_REG[n]++;
while(UP == 0){
__delay_ms(10);
}
}
if(DOWN == 0){
Disp_REG[n]--;
while(DOWN == 0){
__delay_ms(10);
}
}
}

void Year_set(){
LCD_cursor(0,1);
printf("Y");
while(SET == 1){
Time_UP_DOWN(6);
if(Disp_REG[6]>=100){
Disp_REG[6]=99;
}
if(Disp_REG[6]<0){
Disp_REG[6]=0;
}
Time_disp();
__delay_ms(10);
}
while(SET == 0){
}
OLD_REG[6] = Disp_REG[6];
Num--;
}

void Month_set(){
LCD_cursor(0,1);
printf("M");
while(SET == 1){
Time_UP_DOWN(5);
if(Disp_REG[5]>12){
Disp_REG[5]=1;
}
if(Disp_REG[5]<1){
Disp_REG[5]=12;
}
Time_disp();
__delay_ms(10);
}
while(SET == 0){
}
OLD_REG[5] = Disp_REG[5];
Num--;
}

void Day_set(){
LCD_cursor(0,1);
printf("D");
while(SET == 1){
Time_UP_DOWN(4);
if(Disp_REG[4]>31){
Disp_REG[4]=1;
}
if(Disp_REG[4]<1){
Disp_REG[4]=31;
}
Time_disp();
__delay_ms(10);
}
while(SET == 0){
}
OLD_REG[4] = Disp_REG[4];
Num--;
}

void Week_set(){
LCD_cursor(0,1);
printf("W");
while(SET == 1){
Time_UP_DOWN(3);
if(Disp_REG[3]>7){
Disp_REG[3]=1;
}
if(Disp_REG[3]<1){
Disp_REG[3]=7;
}
Time_disp();
__delay_ms(10);
}
while(SET == 0){
}
OLD_REG[3] = Disp_REG[3];
Num--;
}

void Hour_set(){
LCD_cursor(0,1);
printf("h");
while(SET == 1){
Time_UP_DOWN(2);
if(Disp_REG[2]>23){
Disp_REG[2]=0;
}
if(Disp_REG[2]<0){
Disp_REG[2]=23;
}
Time_disp();
__delay_ms(10);
}
while(SET == 0){
}
OLD_REG[2] = Disp_REG[2];
Num--;
}

void Minute_set(){
LCD_cursor(0,1);
printf("m");
while(SET == 1){
Time_UP_DOWN(1);
if(Disp_REG[1]>59){
Disp_REG[1]=0;
}
if(Disp_REG[1]<0){
Disp_REG[1]=59;
}
Time_disp();
__delay_ms(10);
}
while(SET == 0){
}
OLD_REG[1] = Disp_REG[1];
Num--;
}

void Second_set(){
LCD_cursor(0,1);
printf("s");
while(SET == 1){
Time_UP_DOWN(0);
if(Disp_REG[0]>59){
Disp_REG[0]=0;
}
if(Disp_REG[0]<0){
Disp_REG[0]=59;
}
Time_disp();
__delay_ms(10);
}
while(SET == 0){
}
OLD_REG[0] = Disp_REG[0];
Num--;
}

void Time_set(){
while(Num > -1){
switch(Num){
case 6:
Year_set();
break;
case 5:
Month_set();
break;
case 4:
Day_set();
break;
case 3:
Week_set();
break;
case 2:
Hour_set();
break;
case 1:
Minute_set();
break;
case 0:
Second_set();
break;
}
}
LCD_cursor(0,1);
printf(" ");
DEC2HEX();//Disp_REGデータ(10進)をREGデータ(HEX)に変換する
Time_data_write();//変更されたデータをRTCに書き込む
}

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

LCD_init();

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

//固定文字を表示
LCD_home();
printf("20 / / ( )");
LCD_cursor(6,1);
printf(": :");

//時刻表示
HEX2DEC();
Time_disp();

while (1){
if(IntFlag == 1){ //RB0にIOC割込みがあったら
Time_data_read();//RTCから時刻を読み出し
HEX2DEC(); //HEX→10進変換
Time_disp(); //時刻を表示する
IntFlag = 0; //割込みフラッグを降ろす
}

count = 0;
if(SET == 0){
while(SET == 0){
count++;
__delay_ms(5);
}
}
if(count>100){ //SETボタンが長押しされたら
INTCONbits.IOCIE = 0;//IOC割込み停止
INTCONbits.IOCIF = 0;//IOC割込みフラッグクリア
IntFlag = 0;
Time_set(); //時刻セットルーチンへ
Num = 6;
INTCONbits.IOCIE = 1;//IOC割込み再開
}
__delay_ms(10);
}
}

-----------------------------------------------------------------------------------------------------
ブレッドボードです。





全福島マラソンQSO終了

2021-08-01 19:13:45 | アマチュア無線
 7月25日(土)から31日(日)まで行われた第52回全福島マラソンQSOが終了しました。

 当局JH7UBCは、個人シングルバンド部門3.5MHzで参加しました。このマラソンQSOというコンテストは、通常交信ですので、交信モードは問いません。

 現在のバンド状況からすると、得点を伸ばすにはFT8などのデジタルモードを活用する方法がありますが、今回の当局のテーマは、「3.5MHzでCW交信を楽しむ」とし、CWモードののみで参加することにしました。

 3.5MHzですので、夜の交信でした。毎晩20時前後から30分程度のON AIRでしたが、多くの局と交信することができました。交信いただいた各局ありがとうございました。

 今回、連続してCQを送出する場合は、Digital Sound CWというソフトを使いましたが、CW交信自体は、縦振電鍵(HK-808)を使用してラバースタンプQSOに近い形で交信しました。(599BKだけでは、つまらないですものね)

 折しも、東京オリンピック開催中でもあり、果たして各局からコールいただけるか心配でしたが、多くの局からコールいただきました。皆さんワッチされているんですね。うれしくなりました。

 当局が3.5MHz CWで交信会以外でCQを出すのは久しぶりなので、始めて交信する局も多く、改めてCQを出す重要性に気づかされました。

 全福島マラソンQSOは、コンテストなのですが、JARL福島県支部が主催する最大のイベントです。言ってみればお祭りでもありますので、多くの局が参加して、ワイワイと交信を楽しむのが一番ですね。