[戻る]
過去ログ [ 0001 ]
過去ログ:     ワード検索: 条件: 表示:

タイトル
記事No
投稿日
投稿者
参照先
T1Gピンを利用した回転計
609
: 16/07/03-18:36
sontonsan
http://www.geocities.jp/sontonsan2004/T1G-RPM7SEG-4.C
投稿者ご一同様お世話になっております。
表題のT1Gピンからの信号で7SEG4桁表示の実験を行っております。
秋月より購入のEE-SX460-P1にて遮光時0V、セラロック10MHz
で行っておりますが、■while(T1GCONbits.T1GVAL==0);//T1Gピンの入力を待つ■
これ以降進みません。
T1Gピン信号利用についてご指導をお願いします。
while(1){//2
TMR1H=0;//上位4ビット時間設定
TMR1L=0;//下位4ビット時間設定
COUNT=0;//割り込みカウント
■while(T1GCONbits.T1GVAL==0);//T1Gピンの入力を待つ■
T1CONbits.TMR1ON=1;//TMER01スタート
if (T1GCONbits.T1GVAL==0)//T1GピンのLOを判定
{
T1CONbits.TMR1ON=0;//TMER01停止
}
DAT=TMR1H<<8;//8ビット左移動
DAT=(COUNT*256)+DAT+TMR1L;//周期時間のカウント数合計
DAT2=(1000/((double)DAT*0.0032*2))*60;//1*4*8/10MHz-msecで1周期の計算&RPM
//DAT2=DAT2*2;//2刃これで1回転
//DAT2=1000/DAT2*60;//RPM変換
while (1)//1
{
seg_display();
//桁に値、変換
D = DAT2 / 1000; //4桁目
C = (DAT2 - D * 1000) / 100; //3桁目
B = (DAT2 - D * 1000 - C * 100) / 10; //2桁目
A = DAT2 - D * 1000 - C * 100 - B * 10; //1桁目
break; //while脱出
}//while-1
}//while-2
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re: T1Gピンを利用した回転計
613
: 16/07/05-09:50
Gokan <gokan@picfun.com>

PICのデバイスが不明ですがF1ファミリでしたら
TMR1ONがセットされる前にT1GVALを見ても無効だと思います。
単純にPORTピンとして入力すればよいかと思います。


> 投稿者ご一同様お世話になっております。
> 表題のT1Gピンからの信号で7SEG4桁表示の実験を行っております。
> 秋月より購入のEE-SX460-P1にて遮光時0V、セラロック10MHz
> で行っておりますが、■while(T1GCONbits.T1GVAL==0);//T1Gピンの入力を待つ■
> これ以降進みません。
> T1Gピン信号利用についてご指導をお願いします。
> while(1){//2
> TMR1H=0;//上位4ビット時間設定
> TMR1L=0;//下位4ビット時間設定
> COUNT=0;//割り込みカウント
> ■while(T1GCONbits.T1GVAL==0);//T1Gピンの入力を待つ■
> T1CONbits.TMR1ON=1;//TMER01スタート
> if (T1GCONbits.T1GVAL==0)//T1GピンのLOを判定
> {
> T1CONbits.TMR1ON=0;//TMER01停止
> }
> DAT=TMR1H<<8;//8ビット左移動
> DAT=(COUNT*256)+DAT+TMR1L;//周期時間のカウント数合計
> DAT2=(1000/((double)DAT*0.0032*2))*60;//1*4*8/10MHz-msecで1周期の計算&RPM
> //DAT2=DAT2*2;//2刃これで1回転
> //DAT2=1000/DAT2*60;//RPM変換
> while (1)//1
> {
> seg_display();
> //桁に値、変換
> D = DAT2 / 1000; //4桁目
> C = (DAT2 - D * 1000) / 100; //3桁目
> B = (DAT2 - D * 1000 - C * 100) / 10; //2桁目
> A = DAT2 - D * 1000 - C * 100 - B * 10; //1桁目
> break; //while脱出
> }//while-1
> }//while-2
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
投稿者削除
614
: 16/07/05-10:24
(削除)

(投稿者により削除されました)
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re^2: T1Gピンを利用した回転計
616
: 16/07/05-10:27
sontonsan

ご指導ありがとうございます。
書籍記載のT1GVALの状態の言葉を理解することが出来ませんでしたが、回答でT1GVALの状態を監視することがわかりました。
トグルモードにてT1Gピンでの回転数又はカウントはお勧めできない機能なのでしょうか。
お時間が有りましたらご指導お願いいたします。
/*
File: キャプチャー回転計7SEG4桁.c
*/
// PIC16F1939 Configuration Bit Settings
#include <xc.h>
// CONFIG1
#pragma config FOSC = HS // Oscillator Selection (HS Oscillator, High-speed crystal/resonator connected between OSC1 and OSC2 pins)
#pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable (PWRT disabled)
#pragma config MCLRE = ON // MCLR Pin Function Select (MCLR/VPP pin function is MCLR)
#pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config CPD = OFF // Data Memory Code Protection (Data memory code protection is disabled)
#pragma config BOREN = ON // Brown-out Reset Enable (Brown-out Reset enabled)
#pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = OFF // Internal/External Switchover (Internal/External Switchover mode is disabled)
#pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled)
// CONFIG2
#pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off)
#pragma config VCAPEN = OFF // Voltage Regulator Capacitor Enable (All VCAP pin functionality is disabled)
#pragma config PLLEN = OFF // PLL Enable (4x PLL disabled)
#pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)
#pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
#pragma config LVP = ON // Low-Voltage Programming Enable (Low-voltage programming enabled)
/*関数プロトタイプ */
#define _XTAL_FREQ 10000000 // 外部10MHzセラロック
void seg_display();
/*グローバル変数*/
unsigned long DAT;//パルス時間
unsigned int DAT2;//7SEG用 整数
unsigned int SEC_COUNT = 250; //0.9秒=3.5ms*250
int STR = 0b1000; //4桁表示
unsigned int A, B, C, D;//桁順
unsigned int i, j, k;
unsigned int COUNT;//割り込み回数
unsigned int seg_pattern[13] = {
//gfedcba // 7セグメントLED用点灯パターン
0b00111111, // 0
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00100111, // 7
0b01111111, // 8
0b01101111, // 9
0b01001001, //横線10
0b00110110, //たて線11
0b00000000};//12非表示
//
void main(void){
ANSELA=0;//デジタル仕様とする
ANSELB=0;//デジタル仕様とする
ANSELD=0;//デジタル仕様とする
ANSELE=0;//デジタル仕様とする

APFCONbits.T1GSEL=0;//代替ピン設定 T1G=RB5
//APFCONbits.T1GSEL=1;//代替ピン設定 T1G=RC4
//IN/OUT設定(0=出力:1=入力))
TRISA = 0; //RA全OUT
TRISB=0b100000;//RB5=T1Gピン入力
//TRISC=0b10000;//RC4=T1G
TRISD = 0; //RB全OUT
//
LATA = 0b0;//PORTA初期化
PORTC=0b0;//PORTC初期化
LATD = 0b0;//PORTB初期化
//■TIME01クロック設定
T1CONbits.TMR1CS=0b01;//★クロック foce/4
//T1CONbits.TMR1CS=0b01;//★クロック foce
T1CONbits.nT1SYNC=1;//システムと同期
//T1CONbits.n_T1SYNC=1;//同期しない
T1CONbits.T1CKPS=0b00;//プリスケラー1:8

//
T1CONbits.TMR1ON=1;//TMER1有効
T1GCONbits.TMR1GE=1;//TIMER01ゲート機能
T1GCONbits.T1GPOL=1;//入力極性HIでカウント
T1GCONbits.T1GTM=1;//TIMER01トグルモード
T1GCONbits.T1GSS=0b00;//T1Gピンゲートソース信号を利用
//

TMR1H=0;//上位4ビット時間設定
TMR1L=0;//下位4ビット時間設定
//■CCP1クロック設定
//CCP1CONbits.P1M=0b11;//入力ポートはP1CポートにCCP1Mで自動設定
//CCP1CONbits.CCP1M=0b0100;//すべて立ち上がり
//CCPR1H=0;//カウンター初期値設定
//CCPR1L=0;//関数内で常にクリアー
//★TIMER01初期設定
PIE1bits.TMR1IE=1;//タイマー1オーバーフロー割り込み
PIR1bits.TMR1IF=0;//タイマー1オーバーしていない
//CCP1初期設定
//PIE1bits.CCP1IE=0;//キャプチャー割り込み禁止(動作不要)
//PIR1bits.CCP1IF=0;//キャプチャー発生していない
//タイマー全般許可
INTCONbits.PEIE=1;//周辺割り込み許可
INTCONbits.GIE=1;//全体割り込み許可

//くるくる7segDEMO
for (k = 1; k <= 2; ++k)
{
LATA = 0b1;
LATD = 0b1;
for (j = 1; j <= 4; ++j)
{
for (i = 1; i <= 5; ++i)
{
LATD = LATD << 1;
__delay_ms(1);
}//next i
LATD = 0b1; //aセグ
__delay_ms(1);
LATA = LATA << 1; //データーをPORTAに送る
}//next j
}//next k
//▲無限ループ▲
while(1){//2
T1CONbits.TMR1ON=1;//TMER1
TMR1H=0b0;//上位4ビット時間設定
TMR1L=0b0;//下位4ビット時間設定
COUNT=0;//割り込みカウント
if (T1GCONbits.T1GVAL==0)//T1GピンのLOを判定
{
while(T1GCONbits.T1GVAL==1);//T1Gピンの入力を待つ
T1CONbits.TMR1ON=1;//TMER01スタート
if (T1GCONbits.T1GVAL==0)//T1GピンのLOを判定
{
T1CONbits.TMR1ON=0;//TMER01停止
}
}
DAT=TMR1H<<8;//8ビット左移動
DAT=(COUNT*256)+DAT+TMR1L;//周期時間のカウント数合計
DAT2=(1000/((double)DAT*0.0032*2))*60;//1*4*8/10MHz-msecで1周期の計算&RPM
//DAT2=DAT2*2;//2刃これで1回転
//DAT2=1000/DAT2*60;//RPM変換
while (1)//1
{
//桁に値、変換
D = DAT2 / 1000; //4桁目
C = (DAT2 - D * 1000) / 100; //3桁目
B = (DAT2 - D * 1000 - C * 100) / 10; //2桁目
A = DAT2 - D * 1000 - C * 100 - B * 10; //1桁目
seg_display();
break; //while脱出
}//while-1
}//while-2
}
//7セグメント関数
void seg_display() {
if ((STR = STR << 1) == 0x10)//STR=STR<<1 5桁目がないので1桁目から実行
{
//1桁目
STR = 0x01; //1桁目実行
LATD = seg_pattern[A]; //文字列呼び出し
LATA = STR; //データーをPORTAに送る
__delay_us(500);
LATA = 0; //1桁目消去
__delay_us(100);
}
//2桁目
if (STR == 0x02) //0は非表示
{
LATD = seg_pattern[B];
LATA = STR; //データーをPORTAに送る
__delay_us(500);
LATA = 0; //2桁目消去
__delay_us(100);
}
//3桁目
if (STR == 0x04) //0は非表示
{
LATD = seg_pattern[C];
LATA = STR; //データーをPORTAに送る
__delay_us(500);
LATA = 0; //3桁目消去
__delay_us(100);
}
//4桁目
if (STR == 0x08)//0は非表示
{
LATD = seg_pattern[D];
LATA = STR; //データーをPORTAに送る
__delay_us(500);
LATA = 0; //4桁目消去
__delay_us(100);
}
}
//割り込み関数
void interrupt TIMER(void) {
COUNT++; //256オーバーフローカウント数
PIR1bits.TMR1IF=0;//タイマー1オーバーしていない
}
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re^3: T1Gピンを利用した回転計
622
: 16/07/05-16:48
Gokan <gokan@picfun.com>

タイマをトグルモードで使うことは問題ありませんが
T1GVALの値をモニタするのは使い方としてはよくないですね。
PORTピンとしてモニタすべきです。

> ご指導ありがとうございます。
> 書籍記載のT1GVALの状態の言葉を理解することが出来ませんでしたが、回答でT1GVALの状態を監視することがわかりました。
> トグルモードにてT1Gピンでの回転数又はカウントはお勧めできない機能なのでしょうか。
> お時間が有りましたらご指導お願いいたします。
> /*
> File: キャプチャー回転計7SEG4桁.c
> */
> // PIC16F1939 Configuration Bit Settings
> #include <xc.h>
> // CONFIG1
> #pragma config FOSC = HS // Oscillator Selection (HS Oscillator, High-speed crystal/resonator connected between OSC1 and OSC2 pins)
> #pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled)
> #pragma config PWRTE = OFF // Power-up Timer Enable (PWRT disabled)
> #pragma config MCLRE = ON // MCLR Pin Function Select (MCLR/VPP pin function is MCLR)
> #pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled)
> #pragma config CPD = OFF // Data Memory Code Protection (Data memory code protection is disabled)
> #pragma config BOREN = ON // Brown-out Reset Enable (Brown-out Reset enabled)
> #pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
> #pragma config IESO = OFF // Internal/External Switchover (Internal/External Switchover mode is disabled)
> #pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled)
> // CONFIG2
> #pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off)
> #pragma config VCAPEN = OFF // Voltage Regulator Capacitor Enable (All VCAP pin functionality is disabled)
> #pragma config PLLEN = OFF // PLL Enable (4x PLL disabled)
> #pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)
> #pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
> #pragma config LVP = ON // Low-Voltage Programming Enable (Low-voltage programming enabled)
> /*関数プロトタイプ */
> #define _XTAL_FREQ 10000000 // 外部10MHzセラロック
> void seg_display();
> /*グローバル変数*/
> unsigned long DAT;//パルス時間
> unsigned int DAT2;//7SEG用 整数
> unsigned int SEC_COUNT = 250; //0.9秒=3.5ms*250
> int STR = 0b1000; //4桁表示
> unsigned int A, B, C, D;//桁順
> unsigned int i, j, k;
> unsigned int COUNT;//割り込み回数
> unsigned int seg_pattern[13] = {
> //gfedcba // 7セグメントLED用点灯パターン
> 0b00111111, // 0
> 0b00000110, // 1
> 0b01011011, // 2
> 0b01001111, // 3
> 0b01100110, // 4
> 0b01101101, // 5
> 0b01111101, // 6
> 0b00100111, // 7
> 0b01111111, // 8
> 0b01101111, // 9
> 0b01001001, //横線10
> 0b00110110, //たて線11
> 0b00000000};//12非表示
> //
> void main(void){
> ANSELA=0;//デジタル仕様とする
> ANSELB=0;//デジタル仕様とする
> ANSELD=0;//デジタル仕様とする
> ANSELE=0;//デジタル仕様とする
>
> APFCONbits.T1GSEL=0;//代替ピン設定 T1G=RB5
> //APFCONbits.T1GSEL=1;//代替ピン設定 T1G=RC4
> //IN/OUT設定(0=出力:1=入力))
> TRISA = 0; //RA全OUT
> TRISB=0b100000;//RB5=T1Gピン入力
> //TRISC=0b10000;//RC4=T1G
> TRISD = 0; //RB全OUT
> //
> LATA = 0b0;//PORTA初期化
> PORTC=0b0;//PORTC初期化
> LATD = 0b0;//PORTB初期化
> //■TIME01クロック設定
> T1CONbits.TMR1CS=0b01;//★クロック foce/4
> //T1CONbits.TMR1CS=0b01;//★クロック foce
> T1CONbits.nT1SYNC=1;//システムと同期
> //T1CONbits.n_T1SYNC=1;//同期しない
> T1CONbits.T1CKPS=0b00;//プリスケラー1:8
>
> //
> T1CONbits.TMR1ON=1;//TMER1有効
> T1GCONbits.TMR1GE=1;//TIMER01ゲート機能
> T1GCONbits.T1GPOL=1;//入力極性HIでカウント
> T1GCONbits.T1GTM=1;//TIMER01トグルモード
> T1GCONbits.T1GSS=0b00;//T1Gピンゲートソース信号を利用
> //
>
> TMR1H=0;//上位4ビット時間設定
> TMR1L=0;//下位4ビット時間設定
> //■CCP1クロック設定
> //CCP1CONbits.P1M=0b11;//入力ポートはP1CポートにCCP1Mで自動設定
> //CCP1CONbits.CCP1M=0b0100;//すべて立ち上がり
> //CCPR1H=0;//カウンター初期値設定
> //CCPR1L=0;//関数内で常にクリアー
> //★TIMER01初期設定
> PIE1bits.TMR1IE=1;//タイマー1オーバーフロー割り込み
> PIR1bits.TMR1IF=0;//タイマー1オーバーしていない
> //CCP1初期設定
> //PIE1bits.CCP1IE=0;//キャプチャー割り込み禁止(動作不要)
> //PIR1bits.CCP1IF=0;//キャプチャー発生していない
> //タイマー全般許可
> INTCONbits.PEIE=1;//周辺割り込み許可
> INTCONbits.GIE=1;//全体割り込み許可
>
> //くるくる7segDEMO
> for (k = 1; k <= 2; ++k)
> {
> LATA = 0b1;
> LATD = 0b1;
> for (j = 1; j <= 4; ++j)
> {
> for (i = 1; i <= 5; ++i)
> {
> LATD = LATD << 1;
> __delay_ms(1);
> }//next i
> LATD = 0b1; //aセグ
> __delay_ms(1);
> LATA = LATA << 1; //データーをPORTAに送る
> }//next j
> }//next k
> //▲無限ループ▲
> while(1){//2
> T1CONbits.TMR1ON=1;//TMER1
> TMR1H=0b0;//上位4ビット時間設定
> TMR1L=0b0;//下位4ビット時間設定
> COUNT=0;//割り込みカウント
> if (T1GCONbits.T1GVAL==0)//T1GピンのLOを判定
> {
> while(T1GCONbits.T1GVAL==1);//T1Gピンの入力を待つ
> T1CONbits.TMR1ON=1;//TMER01スタート
> if (T1GCONbits.T1GVAL==0)//T1GピンのLOを判定
> {
> T1CONbits.TMR1ON=0;//TMER01停止
> }
> }
> DAT=TMR1H<<8;//8ビット左移動
> DAT=(COUNT*256)+DAT+TMR1L;//周期時間のカウント数合計
> DAT2=(1000/((double)DAT*0.0032*2))*60;//1*4*8/10MHz-msecで1周期の計算&RPM
> //DAT2=DAT2*2;//2刃これで1回転
> //DAT2=1000/DAT2*60;//RPM変換
> while (1)//1
> {
> //桁に値、変換
> D = DAT2 / 1000; //4桁目
> C = (DAT2 - D * 1000) / 100; //3桁目
> B = (DAT2 - D * 1000 - C * 100) / 10; //2桁目
> A = DAT2 - D * 1000 - C * 100 - B * 10; //1桁目
> seg_display();
> break; //while脱出
> }//while-1
> }//while-2
> }
> //7セグメント関数
> void seg_display() {
> if ((STR = STR << 1) == 0x10)//STR=STR<<1 5桁目がないので1桁目から実行
> {
> //1桁目
> STR = 0x01; //1桁目実行
> LATD = seg_pattern[A]; //文字列呼び出し
> LATA = STR; //データーをPORTAに送る
> __delay_us(500);
> LATA = 0; //1桁目消去
> __delay_us(100);
> }
> //2桁目
> if (STR == 0x02) //0は非表示
> {
> LATD = seg_pattern[B];
> LATA = STR; //データーをPORTAに送る
> __delay_us(500);
> LATA = 0; //2桁目消去
> __delay_us(100);
> }
> //3桁目
> if (STR == 0x04) //0は非表示
> {
> LATD = seg_pattern[C];
> LATA = STR; //データーをPORTAに送る
> __delay_us(500);
> LATA = 0; //3桁目消去
> __delay_us(100);
> }
> //4桁目
> if (STR == 0x08)//0は非表示
> {
> LATD = seg_pattern[D];
> LATA = STR; //データーをPORTAに送る
> __delay_us(500);
> LATA = 0; //4桁目消去
> __delay_us(100);
> }
> }
> //割り込み関数
> void interrupt TIMER(void) {
> COUNT++; //256オーバーフローカウント数
> PIR1bits.TMR1IF=0;//タイマー1オーバーしていない
> }
>
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re^4: T1Gピンを利用した回転計
625
: 16/07/05-22:24
sontonsan
http://www.geocities.jp/sontonsan2004/T1G-RPM7SEG-4.C
一旦動きました。
現在は7segを肉眼で追えないので時間調整にてこずっております。
回転数が合っているかは不明です。
週末にPORT入力にへんこうしてテストいたします。
/*
File: キャプチャー回転計7SEG4桁.c
*/
// PIC16F1939 Configuration Bit Settings
#include <xc.h>
// CONFIG1
#pragma config FOSC = INTOSC // Oscillator Selection (HS Oscillator, High-speed crystal/resonator connected between OSC1 and OSC2 pins)
#pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable (PWRT disabled)
#pragma config MCLRE = ON // MCLR Pin Function Select (MCLR/VPP pin function is MCLR)
#pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config CPD = OFF // Data Memory Code Protection (Data memory code protection is disabled)
#pragma config BOREN = ON // Brown-out Reset Enable (Brown-out Reset enabled)
#pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = OFF // Internal/External Switchover (Internal/External Switchover mode is disabled)
#pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled)
// CONFIG2
#pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off)
#pragma config VCAPEN = OFF // Voltage Regulator Capacitor Enable (All VCAP pin functionality is disabled)
#pragma config PLLEN = OFF // PLL Enable (4x PLL disabled)
#pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)
#pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
#pragma config LVP = ON // Low-Voltage Programming Enable (Low-voltage programming enabled)
/*関数プロトタイプ */
#define _XTAL_FREQ 32000000 // 外部10MHzセラロック
void seg_display();
/*グローバル変数*/
unsigned long DAT;//パルス時間
unsigned int DAT2;//7SEG用 整数
//unsigned int SEC_COUNT = 250; //0.9秒=3.5ms*250
int STR = 0b1000; //4桁表示
unsigned int A, B, C, D;//桁順
unsigned int ii,i, j, k;
unsigned int COUNT;//割り込み回数
unsigned int seg_pattern[13] = {
//gfedcba // 7セグメントLED用点灯パターン
0b00111111, // 0
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00100111, // 7
0b01111111, // 8
0b01101111, // 9
0b01001001, //横線10
0b00110110, //たて線11
0b00000000};//12非表示
//
void main(void){
OSCCON=0b11110000;//8MHz+PLL
ANSELA=0;//デジタル仕様とする
ANSELB=0;//デジタル仕様とする
ANSELD=0;//デジタル仕様とする
ANSELE=0;//デジタル仕様とする

APFCONbits.T1GSEL=0;//代替ピン設定 T1G=RB5
//APFCONbits.T1GSEL=1;//代替ピン設定 T1G=RC4
//IN/OUT設定(0=出力:1=入力))
TRISA = 0; //RA全OUT
TRISB=0b100000;//RB5=T1Gピン入力
//TRISC=0b10000;//RC4=T1G
TRISD = 0; //RB全OUT
//
LATA = 0b0;//PORTA初期化
PORTC=0b0;//PORTC初期化
LATD = 0b0;//PORTB初期化
//■TIME01クロック設定
T1CONbits.T1OSCEN=0b0;//--1--専用オシレータ無効
T1CONbits.TMR1CS=0b00;//--2--★外部クロック foce/4
//T1CONbits.TMR1CS=0b01;//★クロック foce
T1CONbits.T1CKPS=0b11;//--3--プリスケラー1:8
//T1CONbits.nT1SYNC=0;//システムと同期
//T1CONbits.n_T1SYNC=1;//同期しない
//ブロック図の順番
T1GCONbits.T1GSS=0b00;//--1--T1Gピンゲートソース信号を利用
T1GCONbits.T1GPOL=1;//--2--入力極性HIでカウント
T1CONbits.TMR1ON=1;//--3--TMER1有効
T1GCONbits.T1GTM=1;//--4--TIMER01トグルモード有効
T1GCONbits.TMR1GE=1;//--5--TIMER01ゲート機能
//
TMR1H=0;//上位4ビット時間設定
TMR1L=0;//下位4ビット時間設定
//■CCP1クロック設定
//CCP1CONbits.P1M=0b11;//入力ポートはP1CポートにCCP1Mで自動設定
//CCP1CONbits.CCP1M=0b0100;//すべて立ち上がり
//CCPR1H=0;//カウンター初期値設定
//CCPR1L=0;//関数内で常にクリアー
//★TIMER01初期設定
PIE1bits.TMR1IE=1;//タイマー1オーバーフロー割り込み
PIR1bits.TMR1IF=0;//タイマー1オーバーしていない
//CCP1初期設定
//PIE1bits.CCP1IE=0;//キャプチャー割り込み禁止(動作不要)
//PIR1bits.CCP1IF=0;//キャプチャー発生していない
//タイマー全般許可
INTCONbits.PEIE=1;//周辺割り込み許可
INTCONbits.GIE=1;//全体割り込み許可

//くるくる7segDEMO
for (k = 1; k <= 2; ++k)
{
LATA = 0b1;
LATD = 0b1;
for (j = 1; j <= 4; ++j)
{
for (i = 1; i <= 5; ++i)
{
LATD = LATD << 1;
__delay_ms(10);
}//next i
LATD = 0b1; //aセグ
__delay_ms(10);
LATA = LATA << 1; //データーをPORTAに送る
}//next j
}//next k
//▲無限ループ▲
while(1){//2
DAT2=0;
for(ii=1;ii<=100;ii++)
{
// TMR1H=0b0;//上位4ビット時間設定
// TMR1L=0b0;//下位4ビット時間設定
// COUNT=0;//割り込みカウント
//T1CONbits.TMR1ON=1;//TMER1-ON
if (T1GCONbits.T1GVAL==1)//T1GピンのLOを判定
{
while(T1GCONbits.T1GVAL==0);//T1Gピンの入力を待つ
TMR1H=0b0;//上位4ビット時間設定
TMR1L=0b0;//下位4ビット時間設定
COUNT=0;//割り込みカウント
T1CONbits.TMR1ON=1;//TMER01スタート
if (T1GCONbits.T1GVAL==0)//T1GピンのLOを判定
{
T1CONbits.TMR1ON=0;//TMER01停止
}
}
DAT=TMR1H<<8;//8ビット左移動
DAT=DAT+(COUNT*256)+DAT+TMR1L;//周期時間のカウント数合計
DAT2=(1000/((double)DAT/100*0.0001))*60;//1*4*8/10MHz-msecで1周期の計算&RPM
//DAT2=DAT2*2;//2刃これで1回転
//DAT2=1000/DAT2*60;//RPM変換
}//for i
//DAT2=DAT2/10;

while (1)//1
{
//D=12;C=12;B=12;A=12;
//DAT2=DAT2/1000;
//桁に値、変換
D = DAT2 / 1000; //4桁目
C = (DAT2 - D * 1000) / 100; //3桁目
B = (DAT2 - D * 1000 - C * 100) / 10; //2桁目
A = DAT2 - D * 1000 - C * 100 - B * 10; //1桁目
seg_display();
//DAT2=0;
break; //while脱出
}//while-1
}//while-2
}
//7セグメント関数
void seg_display() {
if ((STR = STR << 1) == 0x10)//STR=STR<<1 5桁目がないので1桁目から実行
{
//1桁目
STR = 0x01; //1桁目実行
LATD = seg_pattern[A]; //文字列呼び出し
LATA = STR; //データーをPORTAに送る
__delay_us(100);
LATA = 0; //1桁目消去
__delay_us(100);
}
//2桁目
if (STR == 0x02) //0は非表示
{
LATD = seg_pattern[B];
LATA = STR; //データーをPORTAに送る
__delay_us(100);
LATA = 0; //2桁目消去
__delay_us(100);
}
//3桁目
if (STR == 0x04) //0は非表示
{
LATD = seg_pattern[C];
LATA = STR; //データーをPORTAに送る
__delay_us(100);
LATA = 0; //3桁目消去
__delay_us(100);
}
//4桁目
if (STR == 0x08)//0は非表示
{
LATD = seg_pattern[D];
LATA = STR; //データーをPORTAに送る
__delay_us(100);
LATA = 0; //4桁目消去
__delay_us(100);
}
}
//割り込み関数
void interrupt TIMER(void) {
COUNT++; //256オーバーフローカウント数
PIR1bits.TMR1IF=0;//タイマー1オーバーしていない
}
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re^5: T1Gピンを利用した回転計
631
: 16/07/10-22:29
sontonsan

DAT3の合計を求めたいのご指導をお願いします。
RB4の入力を判定する様に変更し、タイマー1の10回累積をDAT3に持たせようと考えたのですが、合計が0です。
7SEGの方も0000です。
詳しいかたご指導をお願いします。

/*
File: キャプチャー回転計7SEG4桁.c
 MPLAB:X3.26
XC8:V1.37
*/
// PIC16F1939 Configuration Bit Settings
#include <xc.h>
// CONFIG1
#pragma config FOSC = INTOSC // Oscillator Selection (HS Oscillator, High-speed crystal/resonator connected between OSC1 and OSC2 pins)
#pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable (PWRT disabled)
#pragma config MCLRE = ON // MCLR Pin Function Select (MCLR/VPP pin function is MCLR)
#pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config CPD = OFF // Data Memory Code Protection (Data memory code protection is disabled)
#pragma config BOREN = ON // Brown-out Reset Enable (Brown-out Reset enabled)
#pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = OFF // Internal/External Switchover (Internal/External Switchover mode is disabled)
#pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled)
// CONFIG2
#pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off)
#pragma config VCAPEN = OFF // Voltage Regulator Capacitor Enable (All VCAP pin functionality is disabled)
#pragma config PLLEN = OFF // PLL Enable (4x PLL disabled)
#pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)
#pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
#pragma config LVP = ON // Low-Voltage Programming Enable (Low-voltage programming enabled)
/*関数プロトタイプ */
//#define _XTAL_FREQ 16000000 // 内部16MHz
//#define _XTAL_FREQ 8000000 // 内部8MHz
//#define _XTAL_FREQ 4000000 // 内部4MHz
//#define _XTAL_FREQ 2000000 // 内部2MHz
#define _XTAL_FREQ 1000000 // 内部1MHz
void seg_display();
/*グローバル変数*/
unsigned long DAT;//パルス時間
int DAT3=0;
unsigned int DAT2=0;//7SEG用 整数
unsigned int SEG_COUNT = 250; //7seg内ループ回数
unsigned int COUNT_H = 10; //10回平均
int STR = 0b1000; //4桁表示
int delay=0;//デバッグ用
unsigned int A, B, C, D;//桁順
unsigned int HEIKINN;//FOR平均
unsigned int SEG_FOR;//7Sseg FOR
unsigned int k,i,j;//7seg テストFOR
unsigned int T1_COUNT;//割り込み回数
unsigned int seg_pattern[13] = {
//gfedcba // 7セグメントLED用点灯パターン
0b00111111, // 0
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00100111, // 7
0b01111111, // 8
0b01101111, // 9
0b01001001, //横線10
0b00110110, //たて線11
0b00000000};//12非表示
//
void main(void){
// OSCCON=0b01111000;//16MHz-PLL-OFF
// OSCCON=0b01110000;//8MHz-PLL-OFF
// OSCCON=0b01101000;//4MHz-PLL-OFF
// OSCCON=0b01100000;//2MHz-PLL-OFF
OSCCON=0b01011000;//1MHz-PLL-OFF
ANSELA=0;//デジタル仕様とする
ANSELB=0;//デジタル仕様とする
ANSELD=0;//デジタル仕様とする
ANSELE=0;//デジタル仕様とする

APFCONbits.T1GSEL=0;//代替ピン設定 T1G=RB5
//APFCONbits.T1GSEL=1;//代替ピン設定 T1G=RC4
//IN/OUT設定(0=出力:1=入力))
TRISA = 0b0; //RA全OUT
TRISB=0b10000;//RB4=入力
//TRISC=0b10000;//RC4=T1G
TRISD = 0b0; //RD全OUT
//
// WPUB=0b100000;//RB5
// OPTION_REGbits.nWPUEN=1;//プルアップ有効
//
LATA = 0b0;//PORTA初期化
//PORTB=0b0;//PORTB初期化
PORTC=0b0;//PORTC初期化
LATD = 0b0;//PORTB初期化
//■TIME01クロック設定
T1CONbits.T1OSCEN=0b0;//--1--専用オシレータ無効
T1CONbits.TMR1CS=0b00;//--2--クロック foce/4
//T1CONbits.TMR1CS=0b01;//★クロック foce
//T1CONbits.T1CKPS=0b11;//--3--プリスケラー1:8
//T1CONbits.T1CKPS=0b10;//--3--プリスケラー1:4
//T1CONbits.T1CKPS=0b01;//--3--プリスケラー1:2
T1CONbits.T1CKPS=0b00;//--3--プリスケラー1:1
//T1CONbits.nT1SYNC=0;//システムと同期
//T1CONbits.n_T1SYNC=1;//同期しない
//ブロック図の順番
T1GCONbits.T1GSS=0b00;//--1--T1Gピンゲートソース信号を利用
T1GCONbits.T1GPOL=1;//--2--入力極性HIでカウント
T1CONbits.TMR1ON=0;//--3--TMER1有効
T1GCONbits.T1GTM=0;//--4--TIMER01トグルモード
T1GCONbits.TMR1GE=0;//--5--TIMER01ゲート機能
//
TMR1H=0;//上位4ビット時間設定
TMR1L=0;//下位4ビット時間設定
//状態変化割り込み設定
INTCONbits.IOCIE=0;//状態変化り込み不許可
IOCBPbits.IOCBP4=1;//RB4立ち下がり=0 
IOCBFbits.IOCBF4=0;//変化フラグ
//■CCP1クロック設定
//CCP1CONbits.P1M=0b11;//入力ポートはP1CポートにCCP1Mで自動設定
//CCP1CONbits.CCP1M=0b0100;//すべて立ち上がり
//CCPR1H=0;//カウンター初期値設定
//CCPR1L=0;//関数内で常にクリアー
//★TIMER01初期設定
PIE1bits.TMR1IE=1;//タイマー1オーバーフロー割り込み
PIR1bits.TMR1IF=0;//タイマー1オーバーしていない
//CCP1初期設定
//PIE1bits.CCP1IE=0;//キャプチャー割り込み禁止(動作不要)
//PIR1bits.CCP1IF=0;//キャプチャー発生していない
//タイマー全般許可
INTCONbits.PEIE=1;//周辺割り込み許可
INTCONbits.GIE=1;//全体割り込み許可

//くるくる7segDEMO
for (k = 1; k <= 2; ++k)
{
LATA = 0b1;
LATD = 0b1;
for (j = 1; j <= 4; ++j)
{
for (i = 1; i <= 5; ++i)
{
LATD = LATD << 1;
__delay_ms(50);
}//next i
LATD = 0b1; //aセグ
__delay_ms(5);
LATA = LATA << 1; //データーをPORTAに送る
}//next j
//LATA=0b0;//消灯
}//next k

//▲無限ループ▲
while(1){//2
DAT2=0;//総カウント数初期化
DAT=0;//1周期カウント値初期化
DAT3=0;//累積初期化
T1_COUNT=0;
//A=12;B=12;C=12;D=12;
//while(IOCBFbits.IOCBF4==1);//IF LO
//{
for(HEIKINN=1;HEIKINN<=COUNT_H;HEIKINN++)//平均化ループ
{
// T1CONbits.TMR1ON=1;//TMER01スタート
// if (IOCBFbits.IOCBF5==0)
// {
while(IOCBFbits.IOCBF4=1)
{
//変化フラグ待ち
IOCBFbits.IOCBF4=0;//変化フラグクリアー
TMR1H=0;//上位4ビット時間設定
TMR1L=0;//下位4ビット時間設定
T1_COUNT=0;//割り込み回数カウント
DAT=0;
//DAT3=0;
T1CONbits.TMR1ON=1;//TMER01スタート
delay=0;
break; //while脱出
}// LO待ち
while(IOCBFbits.IOCBF4=1)//変化フラグ発生
{
T1CONbits.TMR1ON=0;//TMER01停止
IOCBFbits.IOCBF4=0;//変化フラグクリアー
DAT=TMR1H<<8;//8ビット左移動
DAT3 =(T1_COUNT*65535)+TMR1L+DAT;//周期時間のカウント数合計
delay=0;
break; //while脱出
}//変化フラグ発生
DAT3++;//=DAT3+DAT3;
delay=0;
}//FOR HEIKINN

while (1)//1
{
DAT3=DAT3/COUNT_H;//平均値
DAT2=(1000/((double)DAT3*0.004))*60;//1*1/1MHz-msecで1周期の計算&RPM
//DAT2=DAT2*2;//2刃これで1回転
//DAT2=1000/DAT2*60;//RPM変換
//D=12;C=12;B=12;A=12;
//DAT2=DAT2/1000;
//桁に値、変換
D = DAT2 / 1000; //4桁目
C = (DAT2 - D * 1000) / 100; //3桁目
B = (DAT2 - D * 1000 - C * 100) / 10; //2桁目
A = DAT2 - D * 1000 - C * 100 - B * 10; //1桁目
seg_display();
//DAT2=0;
break; //while脱出
}//while-1
}//while-2
}
//7セグメント関数
void seg_display() {
for(SEG_FOR=1;SEG_FOR<=SEG_COUNT;SEG_FOR++)
{
if ((STR = STR << 1) == 0b10000)//STR=STR<<1 5桁目がないので1桁目から実行
{
//1桁目
STR = 0b01; //1桁目実行
LATD = seg_pattern[A]; //文字列呼び出し
LATA = STR; //データーをPORTAに送る
__delay_ms(7);
LATA = 0; //1桁目消去
__delay_us(100);
}
//2桁目
if (STR == 0b10) //0は非表示
{
LATD = seg_pattern[B];
LATA = STR; //データーをPORTAに送る
__delay_ms(7);
LATA = 0; //2桁目消去
__delay_us(100);
}
//3桁目
if (STR == 0b100) //0は非表示
{
LATD = seg_pattern[C];
LATA = STR; //データーをPORTAに送る
__delay_ms(7);
LATA = 0; //3桁目消去
__delay_us(100);
}
//4桁目
if (STR == 0b1000)//0は非表示
{
LATD = seg_pattern[D];
LATA = STR; //データーをPORTAに送る
__delay_ms(7);
LATA = 0; //4桁目消去
__delay_us(100);
}
}//for SEG_FOR
}
//割り込み関数
void interrupt TIMER(void) {
T1_COUNT++; //256オーバーフローカウント数
PIR1bits.TMR1IF=0;//タイマー1オーバーしていない
}
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re^6: T1Gピンを利用した回転計
648
: 16/07/25-20:44
sontonsan

ボール盤回転計完成しました。
今後もご指導いただければ幸いです。
>/*
RB-RPM7SEG-4.C
*/
// PIC16F1939 Configuration Bit Settings
#include <xc.h>
// CONFIG1
#pragma config FOSC = INTOSC // Oscillator Selection (HS Oscillator, High-speed crystal/resonator connected between OSC1 and OSC2 pins)
#pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable (PWRT disabled)
#pragma config MCLRE = ON // MCLR Pin Function Select (MCLR/VPP pin function is MCLR)
#pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config CPD = OFF // Data Memory Code Protection (Data memory code protection is disabled)
#pragma config BOREN = ON // Brown-out Reset Enable (Brown-out Reset enabled)
#pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = OFF // Internal/External Switchover (Internal/External Switchover mode is disabled)
#pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled)
// CONFIG2
#pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off)
#pragma config VCAPEN = OFF // Voltage Regulator Capacitor Enable (All VCAP pin functionality is disabled)
#pragma config PLLEN = ON // PLL Enable (4x PLL disabled)
#pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)
#pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
#pragma config LVP = ON // Low-Voltage Programming Enable (Low-voltage programming enabled)
//
#define _XTAL_FREQ 16000000 //16MHz
/*
* 16MHz1:1=T1CONbits.T1CKPS=0b00; TIME=0.00000025
* 16MHz1:2=T1CONbits.T1CKPS=0b01; TIME=0.0000005
* 16MHz1:4=T1CONbits.T1CKPS=0b10; TIME=0.000001
* 16MHz1:8=T1CONbits.T1CKPS=0b11; TIME=0.000002
*/
//#define PRS_TIME01 0.00025
//#define PRS_TIME02 0.0005
//#define PRS_TIME04 0.001
//#define PRS_TIME08 0.002
/*関数プロトタイプ */
void seg_display();//7seg表示ループ
void IO_KEISANN();//状態変化割り込みの計算
void KURUKURU();//くるくる7segDEMO
/*グローバル変数*/
double PRS_TIME01=0.00025;
unsigned long DAT;//パルス時間
unsigned long DAT3;//平均値算出変数
unsigned long DAT2;//7SEG用 整数
unsigned int SEG_COUNT =10; //7seg内ループ回数
unsigned int SEG_FOR=0;//7Sseg表示ループ変数
unsigned int STR = 0b1000; //4桁表示
int A_1, B_2, C_3, D_4;//桁順
unsigned int HEIKINN;//平均
unsigned int COUNT_H =10;//10回平均
unsigned int k,i,j;//7segデモ用ループ変数
unsigned int T1_COUNT=0;//タイマー1割り込み回数カウント
unsigned int IO_COUNT=0;//状態変化割り込み回数カウント
//
int delay=0;//デバッグ停止用-変数
//
unsigned int seg_pattern[13] = {
// 7セグメントLED用点灯パターン
0b00111111, // 0
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00100111, // 7
0b01111111, // 8
0b01101111, // 9
0b01001001, //3本横線-10番
0b00110110, //2本縦線-11番
0b00000000};//非表示-12番
//
void main(void){
OSCCON=0b01111010;//16MHz-PLL-OFF-内蔵OSC
OPTION_REGbits.nWPUEN=0;//プルアップ有効
//アナログ/デジタル選択
ANSELA=0;//デジタル仕様とする
ANSELB=0;//デジタル仕様とする
ANSELD=0;//デジタル仕様とする
ANSELE=0;//デジタル仕様とする
//プルアップピン選択(RBとRE)
WPUB = 0b11111111;//RBポート全プルアップ
WPUE = 0b00001000;//RE3ポートプルアップ
//ポートの入力(1)/出力(0)設定
TRISA = 0b11110000;//RA0&RA3出ポート
TRISB = 0b11010111;//RB5&RB3ポート出力
TRISC = 0b11111111;//RC全ポート入力
TRISD = 0b10000000;//RD0&RD4ポート出力
TRISE = 0b00001111;//RE全ポート入力
//出力ポートの初期化
LATA=0;LATB=0;LATC=0;LATD=0;LATE=0;
//■TIME01クロック設定
T1CONbits.T1OSCEN=0b0;//--1--専用オシレータ無効
T1CONbits.TMR1CS=0b00;//--2--クロック foce/4
T1CONbits.T1CKPS=0b00;//--3--プリスケラー__0b00=1:1
T1CONbits.TMR1ON=1;//TMER01スタート初期値=停止
//T1CON=0b00000001;//短縮記載
PIE1bits.TMR1IE=1;//タイマー1オーバーフロー割り込み許可
PIR1bits.TMR1IF=0;//タイマー1オーバーフローフラグ=リセット
//
//TMR1H=0;//上位4ビット時間設定
//TMR1L=0;//下位4ビット時間設定
TMR1=0;//H&L合計値短縮記載
//状態変化割り込み設定
INTCONbits.IOCIE=1;//状態変化り込み許可
IOCBPbits.IOCBP4=1;//RB4 N=立ち下がり P=立ち上がり
IOCBFbits.IOCBF4=0;//RB4変化フラグをクリアー
KURUKURU();////くるくる7segDEMO
//割り込み全般許可
INTCONbits.PEIE=1;//周辺割り込み許可
INTCONbits.GIE=1;//全体割り込み許可
//ei();//短縮記載=全割り込み許可:di();=全割り込み禁止
//▲無限ループ▲
while(1)//2
{
seg_display();//7seg表示ループ
}//while-2
}//main
//
//割り込み関数
void interrupt TIMER(void)//割り込み全般の関数
{
// if(INTCONbits.IOCIF || PIR1bits.TMR1IF)//状態変化割り込み OR タイマー1割り込み
// {
//RB4状態変化割り込み発生時
if(INTCONbits.IOCIF && IOCBFbits.IOCBF4)
{
INTCONbits.IOCIF=0;//状態割り込みフラグクリアー
IOCBFbits.IOCBF4=0;//状態変化割り込みフラグクリアー
IO_KEISANN();//状態変化割り込みの計算ループ行き
LATB5^=1;//確認用LED反転指令
}//RB4状態変化割り込み発生時
//
//タイマー1割り込み発生時
if(T1CONbits.TMR1ON && PIR1bits.TMR1IF)
{
PIR1bits.TMR1IF=0;//タイマー1オーバーフローフラグをクリアー
++T1_COUNT; //タイマー1割り込み回数加算
LATB3^=1;//確認用LED反転指令
}//タイマー1割り込み発生時
//}//IF_状態変化割り込み OR タイマー1割り込み

}//割り込み関数
//
//状態変化割り込みの計算
void IO_KEISANN()
{
T1CONbits.TMR1ON=0;//タイマー1を停止
// DAT=(T1_COUNT*65535)+DAT+((TMR1H << 8) | TMR1L);//タイマー1合計 OR演算
// TMR1H=0;TMR1L=0;T1_COUNT=0;//カウント値初期化
DAT=(T1_COUNT*65535)+DAT+TMR1;//タイマー1合計 OR演算
TMR1=0;T1_COUNT=0;//カウント値初期化
T1CONbits.TMR1ON=1;//タイマー1を開始
IO_COUNT++;//ループ回数累積
//
if(IO_COUNT>=COUNT_H)//指定ループ回数の判定
{
DAT3=DAT/COUNT_H;//平均値算出
//delay=0;
DAT2=(1000/((double)DAT3*PRS_TIME01))*30;//PRS_TIME01=1:1_1/16MHz-msecで1周期の計算&RPM
//1000で割=uSECからmSECに変更
DAT=0;//累積カウント初期化
IO_COUNT=0;//ループ回数をクリアー
//桁に値、変換
D_4 = DAT2 / 1000; //4桁目
C_3 = (DAT2 - D_4* 1000) / 100; //3桁目
B_2 = (DAT2 - D_4 * 1000 - C_3 * 100) / 10; //2桁目
A_1 = DAT2 - D_4 * 1000 - C_3 * 100 - B_2 * 10; //1桁目
}//指定回数の判定
}//状態変化割り込みの計算
//
//くるくる7segDEMO
void KURUKURU()
{
for (k = 1; k <= 2; ++k)
{
LATA = 0b1;
LATD = 0b1;
for (j = 1; j <= 4; ++j)
{
for (i = 1;i <= 5; ++i)
{
LATD = LATD << 1;
__delay_ms(50);
}//next i
LATD = 0b1; //A_1セグ
__delay_ms(50);
LATA = LATA << 1; //データーをPORTAに送る
}//next j
}//next k
}//くるくる7segDEMO
void seg_display()
{//7セグメント関数
for(SEG_FOR=1;SEG_FOR<=SEG_COUNT;SEG_FOR++)//ループ
{
if ((STR = STR << 1) == 0b10000)//STR=STR<<1 5桁目がないので1桁目から実行
{
//1桁目
STR = 0b01; //1桁目実行
LATD = seg_pattern[A_1]; //文字列呼び出し
LATA = STR; //データーをPORTAに送る
__delay_us(500);
LATA = 0; //1桁目消去
__delay_us(10);
}
//2桁目
if (STR == 0b10) //0は非表示
{
LATD = seg_pattern[B_2];
if(C_3!=0 || B_2!=0)//2桁目表示の可否
{
LATA = STR; //データーをPORTAに送る
}
__delay_us(500);
LATA = 0; //2桁目消去
__delay_us(10);
}
//3桁目
if (STR == 0b100) //0は非表示
{
LATD = seg_pattern[C_3];
if(D_4!=0 || C_3!=0)//3桁目表示の可否
{
LATA = STR; //データーをPORTAに送る
}
__delay_us(500);
LATA = 0; //3桁目消去
__delay_us(10);
}
//4桁目
if (STR == 0b1000)//0は非表示
{
LATD = seg_pattern[D_4];
if(D_4!=0)//4桁目表示の可否
{
LATA = STR; //データーをPORTAに送る
}
__delay_us(500);
LATA = 0; //4桁目消去
__delay_us(10);
}
}//for SEG_FOR
}//7セグメント関数
▲pagetop

- WebForum -