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

タイトル
記事No
投稿日
投稿者
参照先
pic24f ad変換
679
: 16/09/19-00:08
sagawa

最近PICを勉強し始めている初心者です。
現在PIC24FJ64GA002でAD変換のプログラムを製作していますが、
while(!AD1CON1bits.DONE);から先へ進まない状態です。
AD変換のプログラム上でどこか間違えている場所等在りましたらご教授お願いします。


// CONFIG2
#pragma config POSCMOD = NONE // Primary Oscillator Select (Primary oscillator disabled)
#pragma config I2C1SEL = PRI // I2C1 Pin Location Select (Use default SCL1/SDA1 pins)
#pragma config IOL1WAY = OFF // IOLOCK Protection (IOLOCK may be changed via unlocking seq)
#pragma config OSCIOFNC = ON // Primary Oscillator Output Function (OSC2/CLKO/RC15 functions as port I/O (RC15))
#pragma config FCKSM = CSDCMD // Clock Switching and Monitor (Clock switching and Fail-Safe Clock Monitor are disabled)
#pragma config FNOSC = FRC // Oscillator Select (Fast RC Oscillator (FRC))
#pragma config SOSCSEL = SOSC // Sec Oscillator Select (Default Secondary Oscillator (SOSC))
#pragma config WUTSEL = LEG // Wake-up timer Select (Legacy Wake-up Timer)
#pragma config IESO = OFF // Internal External Switch Over Mode (IESO mode (Two-Speed Start-up) disabled)

// CONFIG1
#pragma config WDTPS = PS32768 // Watchdog Timer Postscaler (1:32,768)
#pragma config FWPSA = PR128 // WDT Prescaler (Prescaler ratio of 1:128)
#pragma config WINDIS = OFF // Watchdog Timer Window (Windowed Watchdog Timer enabled; FWDTEN must be 1)
#pragma config FWDTEN = OFF // Watchdog Timer Enable (Watchdog Timer is disabled)
#pragma config ICS = PGx1 // Comm Channel Select (Emulator EMUC1/EMUD1 pins are shared with PGC1/PGD1)
#pragma config GWRP = OFF // General Code Segment Write Protect (Writes to program memory are allowed)
#pragma config GCP = OFF // General Code Segment Code Protect (Code protection is disabled)
#pragma config JTAGEN = OFF // JTAG Port Enable (JTAG port is disabled)

#include <xc.h>
void pic_init();
void main();
unsigned char a1;
unsigned char a2;

void main(){
pic_init();
while(1) {
AD1CON1bits.SAMP= 1; //サンプリング開始
while(!AD1CON1bits.DONE); //変換終了?
a1=ADC1BUF0; //変換結果格納
a2=ADC1BUF1; //
}
}

//=====PIC初期設定=====
void pic_init() {
CLKDIV = 0;
/// 入出力ポート設定
TRISB = 0b0000000000000000;
/// ADコンバータ初期設定
IEC0bits.AD1IE= 1; //AD割込み許可
IFS0bits.AD1IF= 0; //AD割込みフラグクリア
IPC3 = 0b0000000000010000; //ADコンバーター割込み優先?
AD1PCFG = 0b1111111111111100; //AN0,1をアナログモードに
AD1CSSL = 0b0000000000000011; //AN0,1をスキャン対象
AD1CHS = 0b0000000000000000;
AD1CON1 = 0b0000000011100000; //整数、自動変換
AD1CON2 = 0b0000010000000100; //VDD,VSS,自動スキャン,2番目ごとに割込み
AD1CON3 = 0b0001111100000100; //サンプル時間15Tad,10tcy
AD1CON1bits.ADON= 1; //AD変換有効
}
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re: pic24f ad変換
680
: 16/09/19-08:55
Gokan <gokan@picfun.com>

ADCの割り込みを許可しているのに割り込みを使っていないですね。
割り込み処理関数を追加するか割り込みを禁止するかです。

> 最近PICを勉強し始めている初心者です。
> 現在PIC24FJ64GA002でAD変換のプログラムを製作していますが、
> while(!AD1CON1bits.DONE);から先へ進まない状態です。
> AD変換のプログラム上でどこか間違えている場所等在りましたらご教授お願いします。
>
>
> // CONFIG2
> #pragma config POSCMOD = NONE // Primary Oscillator Select (Primary oscillator disabled)
> #pragma config I2C1SEL = PRI // I2C1 Pin Location Select (Use default SCL1/SDA1 pins)
> #pragma config IOL1WAY = OFF // IOLOCK Protection (IOLOCK may be changed via unlocking seq)
> #pragma config OSCIOFNC = ON // Primary Oscillator Output Function (OSC2/CLKO/RC15 functions as port I/O (RC15))
> #pragma config FCKSM = CSDCMD // Clock Switching and Monitor (Clock switching and Fail-Safe Clock Monitor are disabled)
> #pragma config FNOSC = FRC // Oscillator Select (Fast RC Oscillator (FRC))
> #pragma config SOSCSEL = SOSC // Sec Oscillator Select (Default Secondary Oscillator (SOSC))
> #pragma config WUTSEL = LEG // Wake-up timer Select (Legacy Wake-up Timer)
> #pragma config IESO = OFF // Internal External Switch Over Mode (IESO mode (Two-Speed Start-up) disabled)
>
> // CONFIG1
> #pragma config WDTPS = PS32768 // Watchdog Timer Postscaler (1:32,768)
> #pragma config FWPSA = PR128 // WDT Prescaler (Prescaler ratio of 1:128)
> #pragma config WINDIS = OFF // Watchdog Timer Window (Windowed Watchdog Timer enabled; FWDTEN must be 1)
> #pragma config FWDTEN = OFF // Watchdog Timer Enable (Watchdog Timer is disabled)
> #pragma config ICS = PGx1 // Comm Channel Select (Emulator EMUC1/EMUD1 pins are shared with PGC1/PGD1)
> #pragma config GWRP = OFF // General Code Segment Write Protect (Writes to program memory are allowed)
> #pragma config GCP = OFF // General Code Segment Code Protect (Code protection is disabled)
> #pragma config JTAGEN = OFF // JTAG Port Enable (JTAG port is disabled)
>
> #include <xc.h>
> void pic_init();
> void main();
> unsigned char a1;
> unsigned char a2;
>
> void main(){
> pic_init();
> while(1) {
> AD1CON1bits.SAMP= 1; //サンプリング開始
> while(!AD1CON1bits.DONE); //変換終了?
> a1=ADC1BUF0; //変換結果格納
> a2=ADC1BUF1; //
> }
> }
>
> //=====PIC初期設定=====
> void pic_init() {
> CLKDIV = 0;
> /// 入出力ポート設定
> TRISB = 0b0000000000000000;
> /// ADコンバータ初期設定
> IEC0bits.AD1IE= 1; //AD割込み許可
> IFS0bits.AD1IF= 0; //AD割込みフラグクリア
> IPC3 = 0b0000000000010000; //ADコンバーター割込み優先?
> AD1PCFG = 0b1111111111111100; //AN0,1をアナログモードに
> AD1CSSL = 0b0000000000000011; //AN0,1をスキャン対象
> AD1CHS = 0b0000000000000000;
> AD1CON1 = 0b0000000011100000; //整数、自動変換
> AD1CON2 = 0b0000010000000100; //VDD,VSS,自動スキャン,2番目ごとに割込み
> AD1CON3 = 0b0001111100000100; //サンプル時間15Tad,10tcy
> AD1CON1bits.ADON= 1; //AD変換有効
> }
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re^2: pic24f ad変換
681
: 16/09/19-10:32
sagawa

ご返答ありがとうございます。

早速下のプログラムを削除し

IEC0bits.AD1IE= 1; //AD割込み許可
IFS0bits.AD1IF= 0; //AD割込みフラグクリア
IPC3 = 0b0000000000010000; //ADコンバーター割込み優先?

下の割込み禁止を追加したのですが、

IEC0bits.AD1IE= 0; //AD割込み禁止

結果変わらずでした。
又、

while(!AD1CON1bits.DONE); //変換終了?

の行を1ms待つプログラムに変えてみると、
変換結果が格納されている様です。



> ADCの割り込みを許可しているのに割り込みを使っていないですね。
> 割り込み処理関数を追加するか割り込みを禁止するかです。
>
> > 最近PICを勉強し始めている初心者です。
> > 現在PIC24FJ64GA002でAD変換のプログラムを製作していますが、
> > while(!AD1CON1bits.DONE);から先へ進まない状態です。
> > AD変換のプログラム上でどこか間違えている場所等在りましたらご教授お願いします。
> >
> >
> > // CONFIG2
> > #pragma config POSCMOD = NONE // Primary Oscillator Select (Primary oscillator disabled)
> > #pragma config I2C1SEL = PRI // I2C1 Pin Location Select (Use default SCL1/SDA1 pins)
> > #pragma config IOL1WAY = OFF // IOLOCK Protection (IOLOCK may be changed via unlocking seq)
> > #pragma config OSCIOFNC = ON // Primary Oscillator Output Function (OSC2/CLKO/RC15 functions as port I/O (RC15))
> > #pragma config FCKSM = CSDCMD // Clock Switching and Monitor (Clock switching and Fail-Safe Clock Monitor are disabled)
> > #pragma config FNOSC = FRC // Oscillator Select (Fast RC Oscillator (FRC))
> > #pragma config SOSCSEL = SOSC // Sec Oscillator Select (Default Secondary Oscillator (SOSC))
> > #pragma config WUTSEL = LEG // Wake-up timer Select (Legacy Wake-up Timer)
> > #pragma config IESO = OFF // Internal External Switch Over Mode (IESO mode (Two-Speed Start-up) disabled)
> >
> > // CONFIG1
> > #pragma config WDTPS = PS32768 // Watchdog Timer Postscaler (1:32,768)
> > #pragma config FWPSA = PR128 // WDT Prescaler (Prescaler ratio of 1:128)
> > #pragma config WINDIS = OFF // Watchdog Timer Window (Windowed Watchdog Timer enabled; FWDTEN must be 1)
> > #pragma config FWDTEN = OFF // Watchdog Timer Enable (Watchdog Timer is disabled)
> > #pragma config ICS = PGx1 // Comm Channel Select (Emulator EMUC1/EMUD1 pins are shared with PGC1/PGD1)
> > #pragma config GWRP = OFF // General Code Segment Write Protect (Writes to program memory are allowed)
> > #pragma config GCP = OFF // General Code Segment Code Protect (Code protection is disabled)
> > #pragma config JTAGEN = OFF // JTAG Port Enable (JTAG port is disabled)
> >
> > #include <xc.h>
> > void pic_init();
> > void main();
> > unsigned char a1;
> > unsigned char a2;
> >
> > void main(){
> > pic_init();
> > while(1) {
> > AD1CON1bits.SAMP= 1; //サンプリング開始
> > while(!AD1CON1bits.DONE); //変換終了?
> > a1=ADC1BUF0; //変換結果格納
> > a2=ADC1BUF1; //
> > }
> > }
> >
> > //=====PIC初期設定=====
> > void pic_init() {
> > CLKDIV = 0;
> > /// 入出力ポート設定
> > TRISB = 0b0000000000000000;
> > /// ADコンバータ初期設定
> > IEC0bits.AD1IE= 1; //AD割込み許可
> > IFS0bits.AD1IF= 0; //AD割込みフラグクリア
> > IPC3 = 0b0000000000010000; //ADコンバーター割込み優先?
> > AD1PCFG = 0b1111111111111100; //AN0,1をアナログモードに
> > AD1CSSL = 0b0000000000000011; //AN0,1をスキャン対象
> > AD1CHS = 0b0000000000000000;
> > AD1CON1 = 0b0000000011100000; //整数、自動変換
> > AD1CON2 = 0b0000010000000100; //VDD,VSS,自動スキャン,2番目ごとに割込み
> > AD1CON3 = 0b0001111100000100; //サンプル時間15Tad,10tcy
> > AD1CON1bits.ADON= 1; //AD変換有効
> > }
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re^3: pic24f ad変換
682
: 16/09/19-20:35
Gokan <gokan@picfun.com>

自動スキャンの場合はAD1CON1のASAMビットを1にする必要があります。
それとA/D変換結果は10ビットですからa1、a2はint型にする必要があります。

> ご返答ありがとうございます。
>
> 早速下のプログラムを削除し
>
> IEC0bits.AD1IE= 1; //AD割込み許可
> IFS0bits.AD1IF= 0; //AD割込みフラグクリア
> IPC3 = 0b0000000000010000; //ADコンバーター割込み優先?
>
> 下の割込み禁止を追加したのですが、
>
> IEC0bits.AD1IE= 0; //AD割込み禁止
>
> 結果変わらずでした。
> 又、
>
> while(!AD1CON1bits.DONE); //変換終了?
>
> の行を1ms待つプログラムに変えてみると、
> 変換結果が格納されている様です。
>
>
>
> > ADCの割り込みを許可しているのに割り込みを使っていないですね。
> > 割り込み処理関数を追加するか割り込みを禁止するかです。
> >
> > > 最近PICを勉強し始めている初心者です。
> > > 現在PIC24FJ64GA002でAD変換のプログラムを製作していますが、
> > > while(!AD1CON1bits.DONE);から先へ進まない状態です。
> > > AD変換のプログラム上でどこか間違えている場所等在りましたらご教授お願いします。
> > >
> > >
> > > // CONFIG2
> > > #pragma config POSCMOD = NONE // Primary Oscillator Select (Primary oscillator disabled)
> > > #pragma config I2C1SEL = PRI // I2C1 Pin Location Select (Use default SCL1/SDA1 pins)
> > > #pragma config IOL1WAY = OFF // IOLOCK Protection (IOLOCK may be changed via unlocking seq)
> > > #pragma config OSCIOFNC = ON // Primary Oscillator Output Function (OSC2/CLKO/RC15 functions as port I/O (RC15))
> > > #pragma config FCKSM = CSDCMD // Clock Switching and Monitor (Clock switching and Fail-Safe Clock Monitor are disabled)
> > > #pragma config FNOSC = FRC // Oscillator Select (Fast RC Oscillator (FRC))
> > > #pragma config SOSCSEL = SOSC // Sec Oscillator Select (Default Secondary Oscillator (SOSC))
> > > #pragma config WUTSEL = LEG // Wake-up timer Select (Legacy Wake-up Timer)
> > > #pragma config IESO = OFF // Internal External Switch Over Mode (IESO mode (Two-Speed Start-up) disabled)
> > >
> > > // CONFIG1
> > > #pragma config WDTPS = PS32768 // Watchdog Timer Postscaler (1:32,768)
> > > #pragma config FWPSA = PR128 // WDT Prescaler (Prescaler ratio of 1:128)
> > > #pragma config WINDIS = OFF // Watchdog Timer Window (Windowed Watchdog Timer enabled; FWDTEN must be 1)
> > > #pragma config FWDTEN = OFF // Watchdog Timer Enable (Watchdog Timer is disabled)
> > > #pragma config ICS = PGx1 // Comm Channel Select (Emulator EMUC1/EMUD1 pins are shared with PGC1/PGD1)
> > > #pragma config GWRP = OFF // General Code Segment Write Protect (Writes to program memory are allowed)
> > > #pragma config GCP = OFF // General Code Segment Code Protect (Code protection is disabled)
> > > #pragma config JTAGEN = OFF // JTAG Port Enable (JTAG port is disabled)
> > >
> > > #include <xc.h>
> > > void pic_init();
> > > void main();
> > > unsigned char a1;
> > > unsigned char a2;
> > >
> > > void main(){
> > > pic_init();
> > > while(1) {
> > > AD1CON1bits.SAMP= 1; //サンプリング開始
> > > while(!AD1CON1bits.DONE); //変換終了?
> > > a1=ADC1BUF0; //変換結果格納
> > > a2=ADC1BUF1; //
> > > }
> > > }
> > >
> > > //=====PIC初期設定=====
> > > void pic_init() {
> > > CLKDIV = 0;
> > > /// 入出力ポート設定
> > > TRISB = 0b0000000000000000;
> > > /// ADコンバータ初期設定
> > > IEC0bits.AD1IE= 1; //AD割込み許可
> > > IFS0bits.AD1IF= 0; //AD割込みフラグクリア
> > > IPC3 = 0b0000000000010000; //ADコンバーター割込み優先?
> > > AD1PCFG = 0b1111111111111100; //AN0,1をアナログモードに
> > > AD1CSSL = 0b0000000000000011; //AN0,1をスキャン対象
> > > AD1CHS = 0b0000000000000000;
> > > AD1CON1 = 0b0000000011100000; //整数、自動変換
> > > AD1CON2 = 0b0000010000000100; //VDD,VSS,自動スキャン,2番目ごとに割込み
> > > AD1CON3 = 0b0001111100000100; //サンプル時間15Tad,10tcy
> > > AD1CON1bits.ADON= 1; //AD変換有効
> > > }
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re^4: pic24f ad変換
695
: 16/09/25-09:36
sagawa

無事にプログラムがうまくいきました。
ご返答ありがとうございます!

> 自動スキャンの場合はAD1CON1のASAMビットを1にする必要があります。
> それとA/D変換結果は10ビットですからa1、a2はint型にする必要があります。
>
> > ご返答ありがとうございます。
> >
> > 早速下のプログラムを削除し
> >
> > IEC0bits.AD1IE= 1; //AD割込み許可
> > IFS0bits.AD1IF= 0; //AD割込みフラグクリア
> > IPC3 = 0b0000000000010000; //ADコンバーター割込み優先?
> >
> > 下の割込み禁止を追加したのですが、
> >
> > IEC0bits.AD1IE= 0; //AD割込み禁止
> >
> > 結果変わらずでした。
> > 又、
> >
> > while(!AD1CON1bits.DONE); //変換終了?
> >
> > の行を1ms待つプログラムに変えてみると、
> > 変換結果が格納されている様です。
> >
> >
> >
> > > ADCの割り込みを許可しているのに割り込みを使っていないですね。
> > > 割り込み処理関数を追加するか割り込みを禁止するかです。
> > >
> > > > 最近PICを勉強し始めている初心者です。
> > > > 現在PIC24FJ64GA002でAD変換のプログラムを製作していますが、
> > > > while(!AD1CON1bits.DONE);から先へ進まない状態です。
> > > > AD変換のプログラム上でどこか間違えている場所等在りましたらご教授お願いします。
> > > >
> > > >
> > > > // CONFIG2
> > > > #pragma config POSCMOD = NONE // Primary Oscillator Select (Primary oscillator disabled)
> > > > #pragma config I2C1SEL = PRI // I2C1 Pin Location Select (Use default SCL1/SDA1 pins)
> > > > #pragma config IOL1WAY = OFF // IOLOCK Protection (IOLOCK may be changed via unlocking seq)
> > > > #pragma config OSCIOFNC = ON // Primary Oscillator Output Function (OSC2/CLKO/RC15 functions as port I/O (RC15))
> > > > #pragma config FCKSM = CSDCMD // Clock Switching and Monitor (Clock switching and Fail-Safe Clock Monitor are disabled)
> > > > #pragma config FNOSC = FRC // Oscillator Select (Fast RC Oscillator (FRC))
> > > > #pragma config SOSCSEL = SOSC // Sec Oscillator Select (Default Secondary Oscillator (SOSC))
> > > > #pragma config WUTSEL = LEG // Wake-up timer Select (Legacy Wake-up Timer)
> > > > #pragma config IESO = OFF // Internal External Switch Over Mode (IESO mode (Two-Speed Start-up) disabled)
> > > >
> > > > // CONFIG1
> > > > #pragma config WDTPS = PS32768 // Watchdog Timer Postscaler (1:32,768)
> > > > #pragma config FWPSA = PR128 // WDT Prescaler (Prescaler ratio of 1:128)
> > > > #pragma config WINDIS = OFF // Watchdog Timer Window (Windowed Watchdog Timer enabled; FWDTEN must be 1)
> > > > #pragma config FWDTEN = OFF // Watchdog Timer Enable (Watchdog Timer is disabled)
> > > > #pragma config ICS = PGx1 // Comm Channel Select (Emulator EMUC1/EMUD1 pins are shared with PGC1/PGD1)
> > > > #pragma config GWRP = OFF // General Code Segment Write Protect (Writes to program memory are allowed)
> > > > #pragma config GCP = OFF // General Code Segment Code Protect (Code protection is disabled)
> > > > #pragma config JTAGEN = OFF // JTAG Port Enable (JTAG port is disabled)
> > > >
> > > > #include <xc.h>
> > > > void pic_init();
> > > > void main();
> > > > unsigned char a1;
> > > > unsigned char a2;
> > > >
> > > > void main(){
> > > > pic_init();
> > > > while(1) {
> > > > AD1CON1bits.SAMP= 1; //サンプリング開始
> > > > while(!AD1CON1bits.DONE); //変換終了?
> > > > a1=ADC1BUF0; //変換結果格納
> > > > a2=ADC1BUF1; //
> > > > }
> > > > }
> > > >
> > > > //=====PIC初期設定=====
> > > > void pic_init() {
> > > > CLKDIV = 0;
> > > > /// 入出力ポート設定
> > > > TRISB = 0b0000000000000000;
> > > > /// ADコンバータ初期設定
> > > > IEC0bits.AD1IE= 1; //AD割込み許可
> > > > IFS0bits.AD1IF= 0; //AD割込みフラグクリア
> > > > IPC3 = 0b0000000000010000; //ADコンバーター割込み優先?
> > > > AD1PCFG = 0b1111111111111100; //AN0,1をアナログモードに
> > > > AD1CSSL = 0b0000000000000011; //AN0,1をスキャン対象
> > > > AD1CHS = 0b0000000000000000;
> > > > AD1CON1 = 0b0000000011100000; //整数、自動変換
> > > > AD1CON2 = 0b0000010000000100; //VDD,VSS,自動スキャン,2番目ごとに割込み
> > > > AD1CON3 = 0b0001111100000100; //サンプル時間15Tad,10tcy
> > > > AD1CON1bits.ADON= 1; //AD変換有効
> > > > }
▲pagetop

- WebForum -