チョコミント・ダブル(アイスクリームコーン)

チョコミント・ダブル(アイスクリームコーン)
Canon EOS 6D EF40mm F2.8 STM 1/40秒 F8 ISO125 40mm

正しくは「チョコレートミント」。
シングル ¥340
ダブル ¥440

思わずダブルにしたけれど、ダブルとはシングルX2か?思い込みか?

撮影場所
スポンサーサイト

テーマ : ディズニー・ギャラリー
ジャンル : 写真

屋上エスカレータ(東京ディズニーシー・パーキング)

屋上エスカレータ(東京ディズニーシー・パーキング)
Canon EOS 6D サムヤン(Samyang)8mm F3.5 Fisheye CS 2 1/500秒 ISO100 (画像クリックで1920x1080サイズ)



撮影場所

テーマ : ディズニー・ギャラリー
ジャンル : 写真

バック・トゥ・ザ・フューチャー 8キロで?(東京ディズニーシー・パーキング)

バック・トゥ・ザ・フューチャー 8キロで?(東京ディズニーシー・パーキング)
Canon EOS 6D サムヤン(Samyang)8mm F3.5 Fisheye CS 2 1/1250秒 ISO100 (画像クリックで1920x1080サイズ)



撮影場所

テーマ : ディズニー・ギャラリー
ジャンル : 写真

僕たちだって(ミラコスタ通路)

僕たちだって(ミラコスタ通路)
Canon EOS 6D サムヤン(Samyang)8mm F3.5 Fisheye CS 2 1/40秒 ISO800 (画像クリックで1920x1080サイズ)



撮影場所

テーマ : ディズニー・ギャラリー
ジャンル : 写真

to ME!な方(メインエントランス)

to ME!な方(メインエントランス)
Canon EOS 6D サムヤンEF40mm F2.8 STM 1/30秒 F8 ISO2000 40mm (画像クリックで1920x1080サイズ)





撮影場所

テーマ : ディズニー・ギャラリー
ジャンル : 写真

アクアダクト・ブリッジよりお帰りの時(七夕グリーティング)

アクアダクト・ブリッジよりお帰りの時(七夕グリーティング)
Canon EOS 6D サムヤン(Samyang)8mm F3.5 Fisheye CS 2 1/1000秒 ISO100 (画像クリックで1516x2274サイズ)



撮影場所

テーマ : ディズニー・ギャラリー
ジャンル : 写真

GPS-PPSを基準信号にしたPIC周波数計(8桁)

TTL7476の遅延と揺らぎ(備忘録)」の記事でGPSの1秒パルスを基準信号にした周波数計を作ってみよう思い立ってから、4ヶ月後にやっと完成しました。

主な用途は汎用の周波数計ではなくて、以前に買った「秋月の超高精度・水晶発振器(12.8MHz)」を基準周波数として使用する時に実際に発信している正しい周波数を確認する為に使用する目的です。


GPS-PPSを基準信号にしたPIC周波数計(8桁)
上側がPICとTTLで作成した周波数計、下側はGPS受信機

■主な部品
GPSモジュール : VK2828U7G5LF TTL Ublox GPSモジュール(アンテナ付)(\1049)
PIC : PIC16F18313
PPSプリスケーラ : SN74LS163
ゲート等 : SN7400
7Seg表示器 : MAX7219 8-ビット デジタル LED ディスプレイ チューブ(\325)



回路


GPS受信機とカウンター部は分離して作成しました。
理由はGPS衛生の補足場所とPPS出力までの所要時間が分単位であるので、常時電源ONとする為に分離しました。

カウンターの部分は主な部位毎にUNIT化し回路変更を簡単にする為、マザーボードに各ユニットを差し込む方式にしました。

■BUS
GPS-PPSを基準信号にしたPIC周波数計(8桁)
JP4 : 7seg表示器、PPS入力端子、+5V電源を接続する
JP1 : PICで作成したパルスカウンター(周波数計のメイン部分)
JP2 : GPSのPPS信号をn倍化する部分、計測パルスを基準期間通過させる為のGATE部、PICに表示するタイミング信号を送る部分
JP3 : 計測パルスの増幅器(今回は作成せず、そのまま通過させている)
JP5 : 計測パルスの入力を接続、テスト用の信号引き出し用



■PIC
GPS-PPSを基準信号にしたPIC周波数計(8桁)



■PPSxn GATE
GPS-PPSを基準信号にしたPIC周波数計(8桁)



■GPS受信機
GPS-PPSを基準信号にしたPIC周波数計(8桁)



写真




■カウンター部分
GPS-PPSを基準信号にしたPIC周波数計(8桁)



■GPS受信機
GPS-PPSを基準信号にしたPIC周波数計(8桁)



PICソース


/* 
 * File:   main.c
 * Author: 
 *
 * Created on 2018/02/01, 18:07
 */

/* 
 * OSC 内部32MHz ソフトでの設定 CSWEN:OFF
 * 計測パルス入力端子:RA2 TMR0 clock(input)
 * 表示タイミング入力端子:RA3 : 1秒パルス(input)立ち上がりエッジで7seg表示指示
 * * テスト信号:
 *      RA5:(output)
 * * 7セグ8桁LED:
 *      RA4:7segLOAD(output) 橙
 *      RA1:7segCLK(output)  黄
 *      RA0:7segDIN(output)  緑
 */

/*
 * * *概要
 * *カウンター
 * カウンターはunsigned long
 * パルスのカウントはTMR0を16bitカウンターとして使用(RA2をTMR0のclockとする)
 * TMR0のオーバーフロー割り込みで、unsigned long counterHを+1
 * TMR0は常にカウントしている。停止する事はないが、
 * 前段のTTL回路でRA2へ計測パルスを1秒間送り出し、次の一秒間は遮断する。
 * 遮断期間中に7segに計数結果を表示する。
 * *7seg表示
 * MAX7219(7segLED8桁用)を使用
 * メモリ節約と簡易化の為、カウンタ値は最大999,999,999以下と仮定する
 * 99,999,999以下の時、上位ゼロサプレスをする
 * ゼロの時は下一桁に0を表示
 */


/*
 * Config 設定上の注意
 * ICD3によるデバッグを行う場合、WDTは無効にする必要がある。
 * ICD3によるデバッグを行う場合、LVPは無効にする必要がある。
 */


// PIC16F18313 Configuration Bit Settings
// 'C' source line config statements
// CONFIG1
#pragma config FEXTOSC = OFF    // FEXTOSC External Oscillator mode Selection bits (Oscillator not enabled)
#pragma config RSTOSC = HFINT32 // Power-up default value for COSC bits (HFINTOSC with 2x PLL (32MHz))
#pragma config CLKOUTEN = OFF   // Clock Out Enable bit (CLKOUT function is disabled; I/O or oscillator function on OSC2)
#pragma config CSWEN = ON       // Clock Switch Enable bit (Writing to NOSC and NDIV is allowed)
#pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled)

// CONFIG2
#pragma config MCLRE = OFF      // Master Clear Enable bit (MCLR/VPP pin function is digital input; MCLR internally disabled; Weak pull-up under control of port pin's WPU control bit.)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config WDTE = OFF       // Watchdog Timer Enable bits (WDT disabled; SWDTEN is ignored)
#pragma config LPBOREN = OFF    // Low-power BOR enable bit (ULPBOR disabled)
#pragma config BOREN = ON       // Brown-out Reset Enable bits (Brown-out Reset enabled, SBOREN bit ignored)
#pragma config BORV = LOW       // Brown-out Reset Voltage selection bit (Brown-out voltage (Vbor) set to 2.45V)
#pragma config PPS1WAY = ON     // PPSLOCK bit One-Way Set Enable bit (The PPSLOCK bit can be cleared and set only once; PPS registers remain locked after one clear/set cycle)
#pragma config STVREN = ON      // Stack Overflow/Underflow Reset Enable bit (Stack Overflow or Underflow will cause a Reset)
#pragma config DEBUG = OFF      // Debugger enable bit (Background debugger disabled)

// CONFIG3
#pragma config WRT = OFF        // User NVM self-write protection bits (Write protection off)
#pragma config LVP = OFF        // Low Voltage Programming Enable bit (HV on MCLR/VPP must be used for programming.)

// CONFIG4
#pragma config CP = OFF         // User NVM Program Memory Code Protection bit (User NVM code protection disabled)
#pragma config CPD = OFF        // Data NVM Memory Code Protection bit (Data NVM code protection disabled)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#include <xc.h>


#include <stdio.h>
#include <stdlib.h>

#define _XTAL_FREQ 32000000

#define testp PORTAbits.RA5 = 1;PORTAbits.RA5 = 0;

#define M7219LOAD PORTAbits.RA4
#define M7219CLK PORTAbits.RA1
#define M7219DIN PORTAbits.RA0

unsigned long counterH;
char go_disp;

void max7219businit() {
    M7219LOAD = 1;
    NOP(); //32MHz対策
    M7219CLK = 0;
    M7219DIN = 0;
}

void max7219sendloaddata(unsigned char address, unsigned char data) {
    //LOAD OFF
    M7219CLK = 0;
    M7219LOAD = 0;

    //address 送出
    unsigned char m = 0x80;
    do {
        M7219DIN = ((address & m) != 0);
        NOP(); //32MHz対策
        M7219CLK = 1;
        M7219CLK = 0;
    } while (m >>= 1);

    //data送出
    unsigned char m = 0x80;
    do {
        M7219DIN = ((data & m) != 0);
        NOP(); //32MHz対策
        M7219CLK = 1;
        M7219CLK = 0;
    } while (m >>= 1);

    M7219LOAD = 1; //LOAD ON (送信データラッチ指示)
    NOP(); //32MHz対策
    M7219DIN = 0;
}

void max7219bcddisp(unsigned long x, int punctuation_capability, int zero_suppress) {
    char buff[10];
    char n;

    ultoa(buff, 1000000000 + x, 10);

    if (punctuation_capability) {
        buff[6] = buff[6] | 0x80;
        buff[3] = buff[3] | 0x80;
    }

    if (zero_suppress) {
        for (n = 1; n < 9; n++) {
            if (buff[n] & 0x0F) {
                break;
            }
            buff[n] = 0x0F;
        }
    }

    max7219sendloaddata(0x09, 0xFF);
    for (n = 0; n < 8; n++) {
        max7219sendloaddata(0x08 - n, buff[n + 2]);
    }
}


char hosei_sw;
void counter_disp(){
    unsigned long count; 
    unsigned long hosei;
    
    //TMR0H,TMR0Lの順次変更禁止。TMR0Hを読み出せない   
    count = (((unsigned long) counterH * 0x10000) + ((unsigned long) TMR0H * 0x100) + TMR0L);
    count = count;
    
    //ゲート時間が狂っている場合の補正(今回は補正の必要なしのため、0)
    if (hosei_sw) {
        hosei = ((count / 1000) * 0)/100000;
    } else {
        hosei = 0;
    }
    
    max7219bcddisp(count-hosei, 1, 1);
}

void interrupt intservice() {
    INTCONbits.GIE = 0;
    asm("MOVF PORTA,W");

    if (PIR0bits.TMR0IF) {
        PIR0bits.TMR0IF = 0;
        counterH++;
    } else if (PIR0bits.IOCIF) {
        PIR0bits.IOCIF = 0;
        IOCAFbits.IOCAF3 = 0;
        go_disp = 1;
    } else {
        PIR0 = 0;
    }

    INTCONbits.GIE = 1;
}

/*
 * 
 */
int main(int argc, char** argv) {

    //INT Disable 
    INTCON = 0x00; //GIE,PEIE:0;

    //I/O PORT
    PORTA = 0x00; //Clear PORTA
    LATA = 0x00; //Clear PORTA DATA LATCH REGISTER
    ANSELA = 0x00; //digital I/O
    TRISA = 0x0C; //RA2:input; (RA3はinput only) 
    WPUA = 0x0C; //RA3,RA2:Pull-up enabled
    
    
    OSCCON1 = 0x60; //OSCILLATOR CONTROL REGISTER  NOSC:110 HFINTOSC(1 MHz)
    OSCFRQ = 0x7; //OSCFRQ: HFINTOSC FREQUENCY SELECTION  HFFRQ<3:0>  32MHz

    //OSCTUNE = 0x3B; //HFINTOSC TUNING REGISTER

    //INT reg clear
    PIE0 = 0x00;
    PIE1 = 0x00;
    PIE2 = 0x00;
    PIE3 = 0x00;
    PIE4 = 0x00;
    IOCAP = 0x00;   //INTERRUPT-ON-CHANGE PORTA POSITIVE PORTA30:1
    IOCAN = 0x08;   //INTERRUPT-ON-CHANGE PORTA NEGATIVE

    //PPS
    //T0CKIPPS =  0x02; //T0CKI input is RA2 明示的に指定すると機能せず

    //TMR0 init
    //TMR0 is an 8-bit timer 1:1 Postscaler
    T0CON0 = 0x90; //The module is enabled and operating;TMR0 is a 16-bit timer;T0OUTPS:1:1; 
    T0CON1 = 0x10; //T0CKIPPS (True);not synchronized;1:0
    TMR0H = 0;
    TMR0L = 0;


    //MAX7219
    //初期化
    __delay_us(1000); //7seg起動待ち
    max7219businit();
    max7219sendloaddata(0x0c, 0x01); //シャットダウンレジスタ,Normal Operation
    max7219sendloaddata(0x0b, 0x07); //スキャン制限レジスタ,Display digits 0 1 2 3 4 5 6 7

    counterH = 0;
    TMR0H = 0;
    TMR0L = 0;
    counter_disp();

    max7219bcddisp(0,1,1);
    go_disp = 0;
    hosei_sw = 0;


    PIR0 = 0;   //PERIPHERAL INTERRUPT REQUEST REGISTER 0
    PIE0 = 0x30; //TMR0IE=1;IOCIE:1;
    INTCONbits.GIE = 1;
    while (1) {
        if (go_disp) {
            counter_disp();
            go_disp = 0;
            counterH = 0;
            TMR0H = 0;
            TMR0L = 0;
        }
    }

    return (EXIT_SUCCESS);
}





結果


満足のいく結果でした。GPS、秋月の12.8MHz発振器、いずれも短時間のゆらぎも全くないといっていい位でした。
秋月の12.8MHzの超高精度・水晶発振器の温度特性も8秒間のゲート時間で-0.018ppm/℃でした。

感想


GPSのPPS、どのような仕掛けは知りませんが、非常に安定していて驚くばかりです。
感度も良いし、値段も1049円送料無料。ZenFone Go ZB551KLに付けたい。



PPSのプリスケラーをTTLの74163で作成しましたが、最近は簡単に入手できるTTLの種類が減ってきました。
少し寂しい気がしました。



回路を変更しやすくする為に、マザーボード式にしましたが、半分は失敗でした。
ユニット内のGND処理もいい加減なので、信号間の漏れが比較的大でした。誤動作までは至っていませんが。
それに、部品のコストも高くなります。



回路図を清書するのにEAGLEを使いましたが、やっぱり面倒くさい。ライブラリーに無い部品は作らないといけないし、
回路図作成のUIもイマフタツだし。



4ヶ月も掛かった理由は、GPSの通販が中国からなので遅いのと、自身のやる気が起きずに部品を前に何もしないという日々が続いた事ですね。怖い人に進捗報告しない自由意志の個人作業は進みません。精神鍛錬が必要ですね。

マクダックス・デパートメントストアとパラッツォ・カナル

マクダックス・デパートメントストアとパラッツォ・カナル
Canon EOS 6D LENSBABY DOUBLE GLASS OPTIC 1/500秒 ISO100 (画像クリックで1920x1372サイズ)


撮影場所

テーマ : ディズニー・ギャラリー
ジャンル : 写真

リフレッシュメント・ステーション方面(ミステリアスアイランド)

リフレッシュメント・ステーション方面(ミステリアスアイランド)
Canon EOS 6D サムヤン(Samyang)8mm F3.5 Fisheye CS 2 1/400秒 ISO100 (画像クリックで1920x1080サイズ)


撮影場所

テーマ : ディズニー・ギャラリー
ジャンル : 写真

メインエントランス南側のベンチ(コインロッカー)

メインエントランス南側のベンチ(コインロッカー)
Canon EOS 6D サムヤン(Samyang)8mm F3.5 Fisheye CS 2 1/125秒 ISO100 (画像クリックで1920x1080サイズ)

荷物の詰替場所に。
雨の日は辛いですが。


撮影場所

テーマ : ディズニー・ギャラリー
ジャンル : 写真

お知らせ
■注意:Google Chrome以外のブラウザでは動作しない事もあります。
お好みに応じて
画像だけの表示でいいよ
やっぱり全部表示して
背景は黒がいいな
背景を元に戻して
サブジャンル
メモリアルマップ
My Favorite Photo
検索フォーム
プロフィール

otsu.usiwakamaru

Author:otsu.usiwakamaru
五条の橋でひらりひらりと欄干を飛び渡る牛若丸のように、興の向くまま電子回路にプログラミングに写真にと飛び回っています。

プロフィール詳細

カレンダー
05 | 2018/06 | 07
- - - - - 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
キーワード
クリックしたキーワードの記事のみ表示します。

ダンサー ミニー ミッキー デイジー ドナルド グーフィー キャラクター  3D 試み MFP 電池 ティンカーベル デザイン クラリス 全天球 チップデール プルート パークテーマ キャスト IXY スクルージ マレフィセント スモールプラネット ダッフィー SPOT 改造 

最新記事
月別アーカイブ
全記事表示リンク

全ての記事を表示する

おすすめプログ(新着記事)
リンク


にほんブログ村
カテゴリ
橋 (1)
PIC (3)
カウンタ
訪問者数(UU)

アクセス数

現在の閲覧者数

tael no013用