So-net無料ブログ作成

PICのソースの書き方 [PIC]

PICソースの書き方について考えてみました。

ファイル名 日付

PIC素子のピン配列 (普通は書きませんが有ったら便利です)

初期 定義ファイル

fuse領域の記述 (特殊定義ファイル)

テーブル領域 定義

関数ファイル群

ループやシーケンス定義

終わり

 

これらのうち 「PIC素子のピン配列」はて持ちの分で必要になるので、少しずつ書いてみます。

 

それとコメントアウトに ブロック型 /*・・*/ と 各個型 //

が有りますが、 ブロック型は 途中で /等が挟まると内容がめちゃくちゃになるので、

// に統一して行きます。

ピン配列 は 新シリーズ 16f1827 16f933 16f1939

旧シリーズ 16f628a 16f648a 16f883 16f886 16f887

小ピンシリーズ まだ手持ちを調べたい無いのですが 4種類ほど

外部ICなどは無しの自己完結型 で行く分です。

 

それと、技術的質問や討論は歓迎ですが、 自分で勉強しろとか、他の書籍を読め、買え、(大概はアフリエイトが絡んでいます)、

この様な場合はそこの言葉や文章、を拝借して反論 するというスタンスでいます。

自分で判ることは返事をし、わから無いことは判らないと書きますので 、それでご勘弁下さい。


コメント(0) 

お習字 [PIC]

PICでお習字のように、お勉強を・・

etcさんの 

フルカラーLED(色設定ユニット)

元は16f88 ですが mikroC にて作られています。

現在では 古いタイプのPICは入手しにくく、mikroC-PRO の方に換わっています。

そこで入手しやすい16f1827に置き換えてみました、18pinタイプですと配置も同じです。

16f88           
1    AN2/CVREF/        VR_10k    in
2    RA3/AN3/VREF+/    VR_10k    in
3    RA4/AN4/T0CKI/    VR_10k    in
4    RA5/MCLR/VPP    SW1_10k    in
5    VSS    GND   
6    RB0/INT/CCP1(1)       
7    RB1/SDI/SDA        E    out
8    RB2/SDO/RX/DT    R/W    out
9    RB3/PGM/CCP1(1)    RS    out
           
18    RA1/AN1            LED_B_75    out
17    RA0/AN0            LED_R_300    out
16    RA7/OSC1/CLKI    LED_G_133    out
15    RA6/OSC2/CLKO        sp
14    VDD    5v   
13    RB7/AN6/PGD/    D7_LCD    out
12    RB6/AN5/PGC/    D6_LCD    out
11    RB5/SS/TX/CK    D5_LCD    out
10    RB4/SCK/SCL        D4_LCD    out

16f1827                               
1    RA2    AN2            VR_10k    in
2    RA3    AN3            VR_10k    in
3    RA4    AN4            VR_10k    in
4    RA5/MCLR/VPP    SW1_10k    in       
5    VSS/GND   
6    RB0   
7    RB1                E    out   
8    RB2                R/W    out           
9    RB3                RS    out           
                                   
18    RA1                LED_B_75    out   
17    RA0                LED_R_300    out           
16    RA7                LED_G_133    out   
15    RA6                    sp           
14    VDD/5
13    RB7/PGD            D7_LCD    out       
12    RB6/PGC            D6_LCD    out       
11    RB5                D5_LCD    out       
10    RB4                D4_LCD    out       
 

//*********************************************************************
//
//           『LEDフルカラー』 (Shift_Jis)
//    16f88 to 16f1827
//     1    RA2    AN2            VR_10k    in   18    RA1                LED_B_75    out   
//     2    RA3    AN3            VR_10k    in   17    RA0                LED_R_300    out   
//     3    RA4    AN4            VR_10k    in   16    RA7                LED_G_133    out   
//     4    RA5/MCLR/VPP    SW1_10k    in     15    RA6                    sp           
//     5    VSS/GND                         14    VDD/5
//     6    RB0                             13    RB7/PGD            D7_LCD    out       
//     7    RB1                E    out         12    RB6/PGC            D6_LCD    out       
//     8    RB2                R/W    out         11    RB5                D5_LCD    out       
//     9    RB3                RS    out         10    RB4                D4_LCD    out       
//
//
//
//
//
//********************************************************************

// LCD module connections //この部分が 新しい LCD ポート設定です
        sbit LCD_RS at RB3_bit;
        sbit LCD_EN at RB1_bit;
        sbit LCD_D4 at RB4_bit;
        sbit LCD_D5 at RB5_bit;
        sbit LCD_D6 at RB6_bit;
        sbit LCD_D7 at RB7_bit;

        sbit LCD_RS_Direction at TRISB3_bit;
        sbit LCD_EN_Direction at TRISB1_bit;
        sbit LCD_D4_Direction at TRISB4_bit;
        sbit LCD_D5_Direction at TRISB5_bit;
        sbit LCD_D6_Direction at TRISB6_bit;
        sbit LCD_D7_Direction at TRISB7_bit;
// End LCD module connections


#define                LED_R        RA0_bit //100*3
#define                LED_G        RA7_bit //100*4
#define                LED_B        RA1_bit //100*7

#define                SW1                  RA5_bit
#define                SW2                  RB0_bit

#define                ON                 0
#define                OFF                  1



//**********************************************************************

static          unsigned          short        pwm_cnt, led_R, led_G, led_B;

void        interrupt()        // 約0.128msec周期
{
        static          short        onFlg, offFlg;
        //
        INTCON.T0IF = 0;
        //
        onFlg  = (SW1 == 1) ? 0 : 1;
        offFlg = (SW1 == 1) ? 1 : 0;
        //
        LED_R = (pwm_cnt <= led_R) ? onFlg : offFlg;
        LED_G = (pwm_cnt <= led_G) ? onFlg : offFlg;
        LED_B = (pwm_cnt <= led_B) ? onFlg : offFlg;
        //約12.8msec(78Hz)
        if (pwm_cnt < 100)
                pwm_cnt++;
        else
                pwm_cnt = 1;
}

//**********************************************************************

void        main()
{
        static          char          buf[10];
        //
        OSCCON = 01110010;              // クロックは8Mhz
//          CMCON  = 0b00000111;          // レジスタ名変更、コンパレータは使用しない。
        CM1CON0.C1ON = 0;
        CM2CON0.C2ON = 0;
        ANSELA          = 0x1C;         // A/D変換を使用する。 00011100
        ANSELB          = 0x00;         // A/D変換を使用する。 00000000
        TRISA  = 0x7C;          //
        TRISB  = 0x01;          //
       
        Lcd_Init();                  // Initialize LCD
        Lcd_Cmd(_LCD_CLEAR);         // Clear display
        Lcd_Cmd(_LCD_CURSOR_OFF);     // Cursor off

//          Lcd_Cmd(LCD_CURSOR_OFF);
//          Lcd_Cmd(LCD_CLEAR);
        Lcd_Chr(1, 2, 'R');
        Lcd_Chr(1, 6, 'G');
        Lcd_Chr(1, 10, 'B');
       
        // TIMER0の設定
        INTCON.T0IE = 1;
        INTCON.T0IF = 0;
        OPTION_REG.T0CS = 0;
        OPTION_REG.PSA = 1;
        OPTION_REG.PS0 = 0;
        OPTION_REG.PS1 = 0;
        OPTION_REG.PS2 = 0;
        TMR0 = 0;
        //
        pwm_cnt = 1;
        led_R = 50;
        led_G = 50;
        led_B = 50;
        // 割り込みを許可する。
        INTCON.PEIE = 1;
        INTCON.GIE = 1;
        //
        while (1) {
                led_R = (double)Adc_Read(2) / 10.13;
                led_G = (double)Adc_Read(3) / 10.13;
                led_B = (double)Adc_Read(4) / 10.13;
                //
                ByteToStr(led_R, buf);
                Lcd_Out(2, 1, buf);
                ByteToStr(led_G, buf);
                Lcd_Out(2, 5, buf);
                ByteToStr(led_B, buf);
                Lcd_Out(2, 9, buf);
                //
                Delay_ms(10);
        }
}//~!

//**********************************************************************


WS001479.JPG

lcdライブラリーが換わった分や内部レジスタ名などを変更すると、無事コンパイルできました。

(実際には動作させていませんので、プログラムが合っているかは判りません)

 


 


コメント(0) 

mikroPROC ビット素子の記述実験 [PIC]

こんにちは

etcさんの

 PIC UpDownカウンタ サンプル (mikroPROCでコンパイルできました)

#define		CLEAR		(tmp.F5 == 0) を

#define            CLEAR        (RA5_bit == 0) の様に書き換える実験をしました。

リストのほとんどは拝借したものですが、ビット記述の部分と64進カウンタを変化させています。

//**********************************************************************
//7UpDownカウンタ.c
#define            LED                 RA2_bit
#define            UP                (RA3_bit == 0)
#define            DOWN         (RA4_bit == 0)
#define            CLEAR        (RA5_bit == 0)

//#define                                                                 //AN9        RB3 A
//#define                                                                 //c1-        RA0 A ansela
//#define                                                                 //c2-        RA1 A
//#define                                                                 //c1+        RA2 A
//#define                                                                 //c2+        RA3 A
//#define                                                                 //C1OUT        RA4
//#define                                                                 //C2OUT        RA5
//#define                                                                 //CCP2        RC1
//#define                                                                 //CCP1        RC2

//#define                                                                //LATA
//#define                                                                //LATB
//#define                                                                //LATC
//#define                                                                //LATD(1)
//#define                                                                //LATE(1)

//**********************************************************************
void ADC_Init();
//ADC_Init();  // Initialize ADC module with default settings
unsigned ADC_Get_Sample(unsigned short channel);
unsigned adc_value;
//...
//adc_value = ADC_Get_Sample(2);          // read analog value from ADC module channel 2
unsigned ADC_Read(unsigned short channel);
unsigned tmp;
//...
//tmp = ADC_Read(2);        // Read analog value from channel 2

unsigned int temp_res;

void intmain() {
        ANSELA = 0x0F;
        ANSELB = 0x00;
       
        CM1CON0.C1ON = 1 ; //
        CM2CON0.C2ON = 1 ; // にしてコンパレータを許可し、
        CM1CON0.C1OE = 1 ; //
        CM2CON0.C2OE = 1 ; // にしてコンパレータ出力を許可し、
        CM1CON0.C1SP = 0 ; //
        CM2CON0.C2SP = 0 ; //にして
        CM1CON0.C1HYS =0 ; //
        CM2CON0.C1HYS =0 ; //
        APFCON.C2OUTSEL =0 ; // にして RA5にきり換えます       
       
        TRISA = 0x9F ;
        TRISB = 0x03 ;
        TRISC = 0xF8 ;


//**********************************************************************

static                unsigned          char                segIndex, seg0, seg1, seg2, seg3, flg10000;

void        interrupt()
{
        if (INTCON.T0IF == 1) {
                INTCON.T0IF = 0;
                //
        switch (segIndex) {
        case 3:
                PORTB = seg3;
                RA0_bit = 1;
                RA1_bit = 1;
                RA6_bit = 0;
                RA7_bit = 1;
                segIndex = 0;
                break;
        case 2:
                PORTB = seg2;
                RA0_bit = 1;
                RA1_bit = 1;
                RA6_bit = 1;
                RA7_bit = 0;
                segIndex++;
                break;
        case 1:
                PORTB = seg1;
                RA0_bit = 0;
                RA1_bit = 1;
                RA6_bit = 1;
                RA7_bit = 1;
                segIndex++;
                break;
        case 0:
                PORTB = seg0;
                RA0_bit = 1;
                RA1_bit = 0;
                RA6_bit = 1;
                RA7_bit = 1;
                segIndex++;
                break;
                }
        }
if (PIR1.TMR1IF == 1) {
        PIR1.TMR1IF = 0;
        if (flg10000 == 0)
                LED = ~LED;
        else
                LED = 1;
        }
}

//**********************************************************************

static                        unsigned                  char                        segmentTbl[13] = {
                0b00100001,            // 0
                0b11100111,            // 1
                0b00110100,            // 2
                0b10100100,            // 3
                0b11100010,            // 4
                0b10101000,            // 5
                0b00101000,            // 6
                0b11100001,            // 7
                0b00100000,            // 8
                0b10100000,            // 9
                0b11111110,            // -
                0b00000000,            // all-on
                0b11111111,            // all-off
};


unsigned        char        ChangeSegData(unsigned                char          c)
{
        switch (c) {
        case '0':
                return (segmentTbl[0]);
                break;
        case '1':
                return (segmentTbl[1]);
                break;
        case '2':
                return (segmentTbl[2]);
                break;
        case '3':
                return (segmentTbl[3]);
                break;
        case '4':
                return (segmentTbl[4]);
                break;
        case '5':
                return (segmentTbl[5]);
                break;
        case '6':
                return (segmentTbl[6]);
                break;
        case '7':
                return (segmentTbl[7]);
                break;
        case '8':
                return (segmentTbl[8]);
                break;
        case '9':
                return (segmentTbl[9]);
                break;
        case '-':
                return(segmentTbl[10]);
                break;
        case '*':
                return(segmentTbl[11]);
                break;
        case ' ':
                return(segmentTbl[12]);
                        break;
        }
}

void        main()
{
                static                unsigned          int           cnt;
                static                unsigned          char                buf[10], tmp, tmp1, tmp2;
                //
//                        CMCON = 0b00000111;         // コンパレータは使用しない。
//                TRISA = 0b00111000;            // PORTAのモードを背呈する。
//                TRISB = 0b00000000;            // PORTBのモードを背呈する。
                //
                INTCON.GIE = 0;            // 割り込みを無効にする。
                INTCON.PEIE = 1;        // Peripheral Interrupt Enable
                // タイマー0を設定する。
                INTCON.T0IE = 1;        // TMR0 Overflow Interrupt Enable
                INTCON.T0IF = 0;        // TMR0 Overflow Interrupt Flag
                OPTION_REG.T0CS = 0;
                OPTION_REG.PSA = 0;
                OPTION_REG.PS0 = 0;
                OPTION_REG.PS1 = 1;
                OPTION_REG.PS2 = 0;
                TMR0 = 0;
                // タイマー1を設定する。
                PIE1.TMR1IE = 1;        // TMR1 Overflow Interrupt Enable
                PIR1.TMR1IF = 0;        // TMR1 Overflow Interrupt Flag          
                T1CON.T1CKPS0 = 1;
                T1CON.T1CKPS1 = 1;
                T1CON.TMR1ON = 1;
                //
                segIndex = 0;
                // 保存されたデータを読み込む
                tmp1 = Eeprom_Read(0);
                Delay_ms(20);
                tmp2 = Eeprom_Read(1);
                Delay_ms(20);
                cnt = (tmp2 << 8) | tmp1;
                cnt = (cnt > 19999) ? 0 : cnt;
                // 表示データをセットする。
                IntToStr(cnt, buf);
                flg10000 = (buf[1] == '1') ? 1 : 0;
                seg3 = ChangeSegData(buf[2]);
                seg2 = ChangeSegData(buf[3]);
                seg1 = ChangeSegData(buf[4]);
                seg0 = ChangeSegData(buf[5]);
                //
                INTCON.GIE = 1;            // これ以降の処理で割り込みを許可する。
                //
        while(1) {
                tmp = PORTA;
//                        if (UP | DOWN | CLEAR) {                  // スイッチの押下をチェックする。
                        if (UP) {
                                if (cnt < 64) {
                                        cnt++;
                                }         else         {
                                        cnt = 0;
                                }
                        }
                        if (DOWN) {
                                if (cnt > 0)
                                        cnt--;
                                }         else         {
                                        cnt = 63;
                        }                       
                        if (CLEAR) {
                                        cnt = 0;
                        }
        // データを保存する。
                        Eeprom_Write(0, cnt & 0xFF);
                        Delay_ms(20);
                        Eeprom_Write(1, (cnt >> 8) & 0xFF);
                        Delay_ms(20);
                        //
//                                while (UP | DOWN | CLEAR) {
                                        tmp = PORTA;
                                        Delay_ms(1);
                //}
                        // 表示データをセットする。
                        IntToStr(cnt, buf);
                        flg10000 = (buf[1] == '1') ? 1 : 0;
                        seg3 = ChangeSegData(buf[2]);
                        seg2 = ChangeSegData(buf[3]);
                        seg1 = ChangeSegData(buf[4]);
                        seg0 = ChangeSegData(buf[5]);
                //}
        }
}

//**********************************************************************

WS001477.JPG

稲崎さま勝手に使わせて頂いて済みません。 

mikrocPRO(名前が違っていました)
PWMとADCのライブラリーはありますが、
comparatorは有りません。
特に16f1933は C2OUT を RA0とRA5に切り替えが出来、APFCON:C2OUTSEL =0 にして RA5にきり換えます。
CM1CON0:C1ON = 1 CM2CON0:C2ON = 1 にしてコンパレータを許可し、
CM1CON0:C1OE = 1 CM2CON0:C2OE = 1 にしてコンパレータ出力を許可し、
CM1CON0:C1SP = 0 CM2CON0:C2SP = 0 にして
CM1CON0:C1HYS = ? CM2CON0:C1HYS = ?
コンパレータヒステリシスを最小にします、<<1mV
?にはレベルの説明がありません。
またクロックと同期しないように、
CM1CON0:C1SYNC = 0 CM2CON0:C2SYNC = 0
trisa = XXXX1111 にして入力にし、
コンパレータの割り込みは考えていませんが、
これによって、出来ればA、/A、B、/B の遮断も考えています。
ADC モジュールへ供給するリファレンス電圧 は
FVRCON:ADFVR<1:0> = 01 1.024v または 10 2.048v にします。
AD06 の1.024v問題 は
D003 VADFVR Fixed Voltage Reference Voltage
-6 446644 % 1.024V, VDD ? 1.8V, 85°C
Vdd    が1.8v以上でないとという項目と関係するのではないかと思っています。

今後のエラッタ に注目です。

他にも

//**********************************************************************

#define            CLEAR1           (RA.5 == 0)
#define            CLEAR             (RA4_bit == 0)
void main() {
     PORTA.F5 = 1;
     RA4_BIT = 1;
}

//**********************************************************************

なんてのも有りです。

宣言と実行の形式が違う所には戸惑います。


コメント(0) 

mikroPROC で 16f1933の プログラムを作りました。 [PIC]

 mikroPROC で 16f1933の プログラムを作れまして、エラーは出ませんでしたが、

ちゃんと動作するか自信がありません。

最初の部分はjalv2で書き、後にC言語の部分を繋いで、ダブったりエラーになる所を、

コメントアウトで切り捨てると、何とかここまで漕ぎ着けました。

内容は2bitの信号から64進の可逆カウンタを動作させるもので表示などはまだ付けていません。

日本語コメントはUTF8にしましたが表示は出来ていません 。

//*******************************************************************
//16f11933
//
// (unspecified configuration bits may cause a different frequency!)
//? pragma target clock 38_000_000            // oscillator frequency
// configuration memory settings (fuses)
//? pragma target OSC    INTOSC_NOCLKOUT        // intosc
//? pragma target PLLEN     P4            // PLL on
//? pragma target WDT        disabled    // no watchdog
//? pragma target DEBUG     disabled    // no debugging
//? pragma target LVP        disabled    // no Low Voltage Programming
//? pragma target MCLR        reset externally    // reset externally

//
// Switch analog ports to digital mode (if analog module present).

//? procedure set_digital_io() is
//?        pragma inline
//?        analog_set()
//?        adc_set()
//?        comparator_on()
//? end procedure
//
//? FVRCON = 0b1000_0001 //ADC-9 で1.024vとして使う

//? pin_C12IN0_NEG_direction     =  input
//? pin_C12IN1_NEG_direction     =  input
//? pin_C2IN_POS_direction         =  input
//? pin_C1IN_POS_direction         =  input
//? pin_C1OUT_direction          =  output
//? pin_C2OUT_RA5_direction         =  output
//? pin_B0_direction             =  output
//? pin_B1_direction             =  output
//? pin_B2_direction             =  output
//? pin_AN9_direction             =  input
//? pin_B4_direction             =  output
//? pin_B5_direction             =  output
//? pin_B6_direction             =  output
//? pin_B7_direction             =  output
//? pin_P2A_RC1_direction         =  output
//? pin_CCP1_direction             =  output

// These configuration bit settings are only a selection, sufficient for
// this program, but other programs may need more or different settings.
//
//? set_digital_io()  //not         // make all pins digital I/O
//
// Specify the pin to which the LED is connected.
// A low current (2 mA) led with 2.2K series resistor is recommended
// since not all pins may be able to drive an ordinary 20mA led.
//? alias            led     is pin_C3
//? pin_C3_direction =      output
//

//  PORTB
#define     LED     PORTC.F3
#define     UP        (PORTB.F3 == 0)
#define     DOWN    (PORTB.F4 == 0)
#define     CLEAR    (PORTB.F5 == 0)

//**********************************************************************

static     unsigned     char    segIndex, seg0, seg1, seg2, seg3, flg10000;

//**********************************************************************

void     main()
{
     static    unsigned     int     cnt;
     static    unsigned     char     buf[10], PORTB, PORTB1, PORTB2;
     //
//?     ADCON0 = 0b0100_1011     // CHS9 = 01001 enable ADC
//?     ADCON1 = 0b0000_0000
     CM1CON0 = 0b00000111;     // コンパレータは使用しない。
     CM1CON1 = 0b00000111;
//?     CM1CON0 = 0b1110_0110  // enable comparator
//?     CM1CON1 = 0b0000_0000
//?     CM2CON0 = 0b1110_0110     // enable 2nd comparator
//?     CM2CON1 = 0b0000_0001
     // コンパレータは使用しない。
     TRISA = 0b00111000;      // PORTAのモードを背呈する。
     TRISB = 0b00000000;      // PORTBのモードを背呈する。
//?         ANSELA = 0b0001_1111     // all analog
//?         ANSELB = 0b0000_0111     // all digital
     //
     INTCON.GIE = 0;         // 割り込みを無効にする。
     INTCON.PEIE = 1;     // Peripheral Interrupt Enable
     // タイマー0を設定する。
     INTCON.T0IE = 1;     // TMR0 Overflow Interrupt Enable
     INTCON.T0IF = 0;     // TMR0 Overflow Interrupt Flag
     OPTION_REG.T0CS = 0;
     OPTION_REG.PSA = 0;
     OPTION_REG.PS0 = 0;
     OPTION_REG.PS1 = 1;
     OPTION_REG.PS2 = 0;
     TMR0 = 0;              
     // タイマー1を設定する。
     PIE1.TMR1IE = 1;     // TMR1 Overflow Interrupt Enable
     PIR1.TMR1IF = 0;     // TMR1 Overflow Interrupt Flag
     T1CON.T1CKPS0 = 1;
     T1CON.T1CKPS1 = 1;
     T1CON.TMR1ON = 1;
     //
     segIndex = 0;
     // 保存されたデータを読み込む
//?     PORTB1 = Eeprom_Read(0);
     Delay_ms(20);
//?     PORTB2 = Eeprom_Read(1);
     Delay_ms(20);
//?     cnt = (PORTB2 << 8) | PORTB1;
     cnt = (cnt > 64) ? 0 : cnt;
     // 表示データをセットする。
     IntToStr(cnt, buf);
     flg10000 = (buf[1] == '1') ? 1 : 0;
//?     seg3 = ChangeSegData(buf[2]);
//?     seg2 = ChangeSegData(buf[3]);
//?     seg1 = ChangeSegData(buf[4]);
//?     seg0 = ChangeSegData(buf[5]);
     //
     INTCON.GIE = 1; // これ以降の処理で割り込みを許可する。
     //
     while(1) {
//?     tmp = PORTB;
     if (UP | DOWN) {     // スイッチの押下をチェックする。
     if (UP) {
     if (cnt < 64)
     cnt++;
     cnt = 0;
     }
     if (DOWN) {
     if (cnt > 0)
     cnt--;
     cnt = 63;
     }
     }
     }
}

//***********************************************************

随分デタラメなソースですがエラーは出ていません。

WS001465.JPG

 


コメント(3) 

pickit2 のバージョンアップが出来ました。 [PIC]

MPLABが最新版になるにつれpickit2が使えなくなり、pickit3がお勧めのようです。

しかしうちではpickit2が2個有るので新たに買い換えるのももったいないので、

調べてみますと、pickit3のダウンロードの近辺に決め手のファイルがありました。

Dvicefile1.62.14(zip) と PK2DFUpdate-1-62-14.zip をダウンロードして

解凍すると PK2DeviceFile.dat と setup.exe (PICkit2Setup.msi)に成ります。

古い分は適当にリネームして 同じホルダに入れておいて setup.exe を実行しますと

デバイスファイルとファームウエアが同時にバージョンアップされ、

helpのaboutでバージョンの確認が出来ます。

WS001462.JPG

WS001463.JPG

これで、pickit2単独プログラムから、ミッドレンジ、1.8vまでを選択しますと

サポートされるデバイスも増えて、16f1933の書き込みが出来るようになりました。

WS001464.JPG

PCに入れるpickit2のスタンドアローン、アプリケーションは PK2V023200.zip をインストールします。

 

 

 


コメント(0) 

C言語のコンパイル [PIC]

C言語のコンパイル 成功したり失敗したりします。

コンパイルモデルを読み込んで、コンパイルしますと成功。

このホルダーのコピーを作り、 mcw,mcp,c を残して削除、

プロジェクトウイザードから必要な項目ををセットUP。

WS001425.JPG

こうするとドライバーの最後にxc8.exeが付きます。

(\Program Files\Microchip\xc8\v1.01\bin\xc8.exe を指します)

(Program Files\Microchip\xc8\v1.01\include\ には htc.h や xc.h が含まれています)

_LEGACY_HEADERS を付けておくと 以前のヘッダーからも参照するようです

WS001422.JPG

MOVEUPを押すと上に上がります。(上がって意味があるかは判りません)

これをコンパイルしますと、成功。(しかし.HEXは出来ていません、なにかのSWをチェックしていないようです)

もう一度最初のモデルに戻り、 mcp から起動すると コンパイルは失敗。

((924) missing argument to "-D" option
(908) exit status = 1) の表示が出ます。

この時ドライバーにはXC8がありませんでした。

WS001430.JPG

この後コピーの分をコンパイルすると失敗です。

マジックワードの「_LEGACY_HEADERS」は両方で使っています。

WS001423.JPG

WS001427.JPG

WS001431.JPG

この違いは何なんでしょう?

追加 成功に変える方法を見つけました、次の画像の操作を経ると、

sacs.JPG

別の部分からXC8 が追加されて認識されるようです。

WS001432.JPG

最近見つけたんですが、8bit版だからと、間違ったヘッダー名を指定していました。

WS001447.JPG

こうすると、成功率がぐっと上がりました。

 

この後 「MPLABX」を試してみました、

WS001409.JPG

WS001410.JPG

WS001411.JPG

WS001412.JPG

やっぱりもっと説明書を読まないと・・


コメント(0) 

16f1933に変更するための jalv2とC [PIC]

//chgjal1933counta.c

//**********************************************************************
//16f11933
//
// (unspecified configuration bits may cause a different frequency!)
//? pragma target clock 38_000_000                    // oscillator frequency
// configuration memory settings (fuses)
//? pragma target OSC                    INTOSC_NOCLKOUT                                        // intosc
//? pragma target PLLEN         P4                              // PLL on
//? pragma target WDT                    disabled                   // no watchdog
//? pragma target DEBUG         disabled                     // no debugging
//? pragma target LVP                    disabled                   // no Low Voltage Programming
//? pragma target MCLR                    reset externally               // reset externally

//
// Switch analog ports to digital mode (if analog module present).

//? procedure set_digital_io() is
//?              pragma inline
//?              analog_set()
//?              adc_set()
//?              comparator_on()
//? end procedure
//
//? FVRCON = 0b1000_0001 //ADC-9 で1.024vとして使う

//? pin_C12IN0_NEG_direction              =  input
//? pin_C12IN1_NEG_direction              =  input
//? pin_C2IN_POS_direction              =  input
//? pin_C1IN_POS_direction              =  input
//? pin_C1OUT_direction               =  output
//? pin_C2OUT_RA5_direction              =  output
//? pin_B0_direction                  =  output
//? pin_B1_direction                  =  output
//? pin_B2_direction                  =  output
//? pin_AN9_direction                  =  input
//? pin_B4_direction                  =  output
//? pin_B5_direction                  =  output
//? pin_B6_direction                  =  output
//? pin_B7_direction                  =  output
//? pin_P2A_RC1_direction              =  output
//? pin_CCP1_direction                  =  output

// These configuration bit settings are only a selection, sufficient for
// this program, but other programs may need more or different settings.
//
//? set_digital_io()  //not                                             // make all pins digital I/O
//
// Specify the pin to which the LED is connected.
// A low current (2 mA) led with 2.2K series resistor is recommended
// since not all pins may be able to drive an ordinary 20mA led.
//? alias            led                is pin_C3
//? pin_C3_direction =                    output
//

//  PORTB
#define                          LED                                         PORTC.F3
#define                          UP                                          (PORTB.F3 == 0)
#define                          DOWN                                  (PORTB.F4 == 0)
#define                          CLEAR                                    (PORTB.F5 == 0)

//**********************************************************************

static            unsigned                    char                        segIndex, seg0, seg1, seg2, seg3, flg10000;

//**********************************************************************

void                              main()
{
            static                    unsigned                int                         cnt;
            static                    unsigned                char                  buf[10], PORTB, PORTB1, PORTB2;
            //
//?              ADCON0 = 0b0100_1011                     // CHS9 = 01001 enable ADC
//?              ADCON1 = 0b0000_0000
            CM1CON0 = 0b00000111;                                                       // コンパレータは使用しない。
            CM1CON1 = 0b00000111;
//?              CM1CON0 = 0b1110_0110                  // enable comparator
//?              CM1CON1 = 0b0000_0000
//?              CM2CON0 = 0b1110_0110                  // enable 2nd comparator
//?              CM2CON1 = 0b0000_0001
                                                                 // コンパレータは使用しない。
            TRISA = 0b00111000;                                                      // PORTAのモードを背呈する。
            TRISB = 0b00000000;                                                      // PORTBのモードを背呈する。
//?              ANSELA = 0b0001_1111                     // all analog
//?              ANSELB = 0b0000_0111                     // all digital
            //
            INTCON.GIE = 0;                                                                             // 割り込みを無効にする。
            INTCON.PEIE = 1;                                                                    // Peripheral Interrupt Enable
            // タイマー0を設定する。
            INTCON.T0IE = 1;                                                                    // TMR0 Overflow Interrupt Enable
            INTCON.T0IF = 0;                                                                    // TMR0 Overflow Interrupt Flag
            OPTION_REG.T0CS = 0;
            OPTION_REG.PSA = 0;
            OPTION_REG.PS0 = 0;
            OPTION_REG.PS1 = 1;
            OPTION_REG.PS2 = 0;
            TMR0 = 0;              
            // タイマー1を設定する。
            PIE1.TMR1IE = 1;                                                                    // TMR1 Overflow Interrupt Enable
            PIR1.TMR1IF = 0;                                                                    // TMR1 Overflow Interrupt Flag           
            T1CON.T1CKPS0 = 1;
            T1CON.T1CKPS1 = 1;
            T1CON.TMR1ON = 1;
            //
            segIndex = 0;
            // 保存されたデータを読み込む
//?              PORTB1 = Eeprom_Read(0);
            Delay_ms(20);
//?              PORTB2 = Eeprom_Read(1);
            Delay_ms(20);
//?              cnt = (PORTB2 << 8) | PORTB1;
            cnt = (cnt > 64) ? 0 : cnt;
            // 表示データをセットする。
            IntToStr(cnt, buf);
            flg10000 = (buf[1] == '1') ? 1 : 0;
//?                 seg3 = ChangeSegData(buf[2]);
//?                 seg2 = ChangeSegData(buf[3]);
//?                 seg1 = ChangeSegData(buf[4]);
//?                 seg0 = ChangeSegData(buf[5]);
            //
            INTCON.GIE = 1;               // これ以降の処理で割り込みを許可する。
            //
            while(1) {
//?                            tmp = PORTB;
                        if (UP | DOWN) {                    // スイッチの押下をチェックする。
                                      if (UP) {
                                                  if (cnt < 64)
                                                            cnt++;
                                                            cnt = 0;
                                      }
                                      if (DOWN) {
                                                  if (cnt > 0)
                                                            cnt--;
                                                            cnt = 63;
                                      }
                        }
            }
}

//**********************************************************************

まだjalv2とCが共存していて、jalv2はコメントアウトしています。
コメント(0) 

MPLAB リベンジ [PIC]

こんにちは

先日MPLABをバージョンアップをしてから、上手くコンパイルしなくなりました。

その直前に、バビロン が勝手に出てきて 困っていたので完全に削除、

そのほか名前を忘れたんですがもう一つのも完全削除、

そのほかHDDが空きが少なくなって、チェックが出るようになり、

それらが原因かと思って、HDDの不要なバックUPを削除、これによりHDDのチェックは出なく成るも

やはり、MPLAB はコンパイルエラーを出します。

これらの解決に役立ったURLを先に挙げておきます。

TG6月号は拡張ミッドレンジシリーズpicの内部構成を知るのだけに役立ちました。

マイコミのPマイコンのKは内容が理解できませんでした。

PICで遊ぶ電子工作
http://homepage3.nifty.com/mitt/pic/index.html
作りながら学ぶPICマイコン入門
http://mycomputer.cqpub.co.jp/pic006/2005/04/post_f468.html
PICマイコンをHI- TECH Cで動かす
http://www.eleki-jack.com/mycom2/2011/08/pichi_tech_c1.html
から6まで
エアーバリアブル
http://airvariable.asablo.jp/blog/2012/05/15/6446451
パレットソフト
http://www.palettesoft.co.jp/technology/pic/etc/pic16f1823/pic_16f1823.htm

MPLAB IDE V8.63 と HI-TECH C V9.81
MPLAB IDE v8.86 ?
http://www.microchip.com/Microchip.WWW.SecureSoftwareList/secsoftwaredownload.aspx?device=en019469&lang=en&ReturnURL=http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en019469&part=SW007002#
MPLAB XC8 C Compiler ?
http://www.microchip.com/mplabxc8windows
MPLAB[レジスタードトレードマーク] X IDE v1.30
http://www.microchip.com/mplabx-ide-windows-installer
HI-TECH C Archive
ftp://ftp.microchip.com/
HI-TECH C for PIC10-12-16 (Standard v7.76-9.60)
ftp://ftp.microchip.com/HI-TECH%20C%20for%20PIC10-12-16%20%28Standard%20v7.76-9.60%29/
HI-TECH C for PIC10-12-16 (PRO and Standard)
ftp://ftp.microchip.com/HI-TECH%20C%20for%20PIC10-12-16%20%28PRO%20and%20Standard%29/

WS001408.JPG

ソース
ステッピングモータの制御
http://homepage3.nifty.com/mitt/pic/xc8/xc8_887_02.html

プロジェクトウイザードで「pic16f887」を選び
コンパイラを「MPLAB XC8 C Compiler」として
「C:\Program Files\Microchip\xc8\v1.01\bin\xc8.exe」を確認して、

決めたホルダ「motoru」に
プロジェクト「stepper.mcp」を作り、
ソースファイルに「motor_RL.c」を指定
コンフィギュアーセッティングでエディターにhidemaruを選び、
文字コードをシフトJISを選びます(hidemaru、ファイルで設定)

WS001424.JPG

バージョンの違いを避ける工夫
http://www.eleki-jack.com/mycom2/2011/08/pichi_tech_c1.html
プロジェクト、ビルドオプション、プロジェクト、ADD
_LEGACY_HEADERSのマクロ定義をして「適用」「OK」として、
以前のヘッダ・ファイルも参照され、エラーが避けられます。

これをしてからコンパイルしますと、
無事コンパイルエラーが無くなりました。

WS001422.JPG

WS001423.JPG

不思議なものも存在する。

WS001413.JPG

WS001414.JPG

次は16f1XXXで試してみます。 

 


コメント(0) 

MPLABによるソース [PIC]

下記のプロジェクトはビルドできましたが

FIG1        EQU        20H    ;1桁目 LSB
FIG2        EQU        21H    ;2桁目 
FIG3        EQU        22H    ;3桁目
FIG4        EQU        23H    ;4桁目
FIG5        EQU        24H    ;5桁目
FIG6        EQU        25H    ;6桁目
FIG7        EQU        26H    ;7桁目
FIG8        EQU        27H    ;8桁目 MSB

を mXLCDSendMsg    macro   MsgPtr に連結できていません。

WS001368.JPG

;***********************************************************
; new4.asm

;      プログラムNO    CQFC-03
;      8桁周波数カウンタ  CQ誌投稿用
;      プリスケーラ残存数読出し
;      プリスケーラ  1/256
;      ゲートタイム  1.0Sec(1.000013seC)
;    ゲートを閉じた後、TMR0IF=1 ならば    桁上げ処理をして、
;    かつ、TMR0=FFH ならば  TMR0=00H    とする。
;    TMR0がFFHでないなら、そのまま  BYTE1にコピーする。
;    また、TMR0IF=0ならば、そのまま    BYTE1にコピーする。
;
;      測定周波数    100MHz(BCD 4Byte)
;      測定時間中に8LEDをスキャン
;      クロック周波数12.8MHz
;      周波数計測命令サイクル=13サイクル
;                    プログラム者  清水愛典 JA3DEW
;***********************************************************
;-- LCD pin
;-- 1    Vss     2 Vdd
;-- 3    VO      4 RS
;-- 5    R/W(G) 6 E
;-- 7    D0      8 D1
;-- 9    D2      10 D3
;-- 11 D4      12 D5
;-- 13 D6      14 D7
;-- 15 BLA     16 BLK

;-- 16F648A pin
;-- 1 RA2 Gate1_out            18 RA1 Zbl sel
;-- 2 RA3 OvPule_cunt            17 RA0 time sel
;-- 3 RA4 Freq_in            16 RA7 OSC1 XTal IN
;-- 4 RA5 Vpp          15 RA6 OSC2 XTal OUT
;-- 5 Vss ICSP       14 Vdd ICSP Vdd
;-- 6 RB0 A桁        13 RB7 4_seg
;-- 7 RB1 B桁        12 RB6 3_seg
;-- 8 RB2 C桁        11 RB5 2_seg
;-- 9 RB3 Dp          10 RB4 1_seg
;***********************************************************

    LIST        P=PIC16F648a
    INCLUDE        "P16F648a.INC"
    __CONFIG _CP_OFF & _LVP_OFF & _BOREN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC
    include        XLCD.inc

;Shared Functions
;        XLCDInit ;It is used to initialize the LCD module according to the Application Maestro options.
;        XLCDCommand ;It sends clocking signal and instructions to the LCD.
;        XLCDPut ;It sends the clocking signal and data to be displayed to the LCD.
;        XLCDIsBusy ;Reads the Busy Flag status from the LCD module.
;        XLCDReadData ;It reads the data from the present address in the LCD.
;        XLCDL1home ;Points to the first address location of line one of the LCD.
;        XLCDL2home ;Points to the first address location of line two of the LCD
;        XLCDClear ;Clears the DDRAM content of the LCD and points to the 00 address location.
;        XLCDReturnHome ;Points to the 00 address location, the DDRAM content remains unchanged.
;Shared Macros
;        mXLCDSendMsg ;This is to write a string, the user needs to pass the starting address location of the string.

;*******************************************
;変数定義とレジスタ割付
;*******************************************
;         PIC16F627A/628A PIC16F648A
;Bank0 20-7Fh 20-7Fh
;Bank1 A0h-FF A0h-FF
;Bank2 120h-14Fh, 170h-17Fh 120h-17Fh
;Bank3 1F0h-1FFh 1F0h-1FFh

;reg 20-6f a0-ef 120-16f
;creg 70-7f fo-ff 170-17f 1fo-1ff

;9Ah EEDATA 256 x 8
;9Bh EEADR
;9Ch EECON1
;9Dh EECON2(1)
;6c EEIE
;0c EEIF
;EEADRH
;EEADR

;mXLCDSendMsg
;MsgPtr
;XLCDSendMsg
;TBLPTRU
;TBLPTRH
;TBLPTRL

;FSR
;INDF,W

;lcd data
;    20h
;0 30h
;1 31h
;2 32h
;3 33h
;4 34h
;5 35h
;6 36h
;7 37h
;8 38h
;9 39h

;FIG to LIG
;RRF f, d
;RRF f, d
;RRF f, d
;RRF f, d
;ANDLW 0fh
;IORLW 30h
;MOVWF data

;zerog

;G 47h
;M 4dh
;K 4bh
;H 48h
;m 6dh
;u 75h
;n 6eh
;, 2ch

;"G  K  H "
;"  K  H  "
;" K  H  m"
;"K  H  m "
;"  H  m  "
;" H  m  u"
;"H  m  u "
;"  m  u  "
;" m  u  n"

;gmsg equ "G  K  H "
;hkmsg equ "  K  H  "
;tkmsg equ " K  H  m"
;kmsg equ  "K  H  m "
;hmsg equ  "  H  m  "
;tmsg equ  " H  m  u"
;msg equ     "H  m  u "
;hmmsg equ "  m  u  "
;tmmsg equ " m  u  n"

FIG1        EQU        20H    ;1桁目 NUM 4,2,1,Dp, DIG 4,2,1 LSB
FIG2        EQU        21H    ;2桁目    Dp 負論理L data 正論理H
FIG3        EQU        22H    ;3桁目
FIG4        EQU        23H    ;4桁目
FIG5        EQU        24H    ;5桁目
FIG6        EQU        25H    ;6桁目
FIG7        EQU        26H    ;7桁目
FIG8        EQU        27H    ;8桁目 MSB
BYTE0        EQU        28H    ;16進カウンタ0
BYTE1        EQU        29H    ;16進カウンタ1
BYTE2        EQU        2AH    ;16進カウンタ2
BYTE3        EQU        2BH    ;16進カウンタ3
DCML12        EQU        2CH    ;10進1桁目と2桁目
DCML34        EQU        2DH    ;10進3桁目と4桁目
DCML56        EQU        2EH    ;10進5桁目と6桁目
DCML78        EQU        2FH    ;10進7桁目と8桁目
DCML9A        EQU        30H    ;10進9桁目と10桁目DAIMY
DCMLBC        EQU        31H    ;10進11桁目と12桁目DAMIY
SHIFT        EQU        32H    ;SHIFTカウンタHD変換に
WORK1        EQU        33H    ;HEX TO BCD で一時使用
WORK2        EQU        34H    ;HEX TO BCD で一時使用
WCNT1        EQU        35H    ;待ち時間DECカウンタ1
WCNT2        EQU        36H    ;待ち時間DECカウンタ2
WCNT3        EQU        37H    ;待ち時間DECカウンタ3
WCNT4        EQU        38H    ;微調整時間DCカウンタ
FIGCNT        EQU        39H    ;LED桁アドレスカウンタ
PCNT        EQU        3AH    ;プリスケーラ残存数
;

        ORG         0H
        GOTO    MAIN
;
        ORG        0030H
;*******************************************
;メインプログラム
;*******************************************
;***** 初期化 ******
MAIN
;STATUS REG
;BIT    7        6        5        4        3        2        1        0
;      IRP   RP1   RP0   TO/   PD/     Z      DC        C
;        0         0      1      1      1      0      0      0=038H
;IRP 間接アドレスであるがPIC16F84A では使用しない。しかし、0 にしておくこと。
;RP1 RP01の上位のバンク指定であるがPIC16F84A では 0 にしておくこと。
;RP0 PIC16F84A ではプログラムで切り替える。 1 はBANK 1 に切り替える。
;PD/ ウワッチ・ドック・タイマは使用しない=1  使用する=0
        BCF        STATUS,5    ;BANK0
        MOVLW        038H
        MOVWF        STATUS
;--OPTION_REG_NRBPU

;
;OPTION REG
; BIT   7      6      5      4      3      2      1      0
;      RBPU/ INTEDG TOCS    TOSE     PSA     PS2     PS1     PS0
;          0      0      1      1      0      1      1      1= 037H
;RBPU=プルアップ抵抗  繋がない=1    繋ぐ=0
;INTEDG=割込みエッジ  立上り=1     立下り=0      
;TOCS=クロック選択 RA4/T0CKI=1  内部命令サイクル CLKOUT=0
;TOSE=TMR0エッジ      H=>L は 1 ,L=>H は 0 立ち下がりエッジドトリガとする。
;PS2,PS1,PS0 プリスケーラの分周比  1/256を採用
        BSF        STATUS,5    ;BANK1
        MOVLW        037H
        MOVWF        OPTION_REG

        MOVLW 0x07 ;Init comparator mode
        MOVWF CMCON ;CM<2:0> = 0111
;CMCON EQU 0b111
;CMCON,CM EQU 0b111
;CM EQU 0b111

;    
;PORTA
;         BIT     7     6      5     4     3      2     1     0
;IN/OUT         X     X      X    IN   OUT  OUT     IN  IN
;BIT DATA     0     0      0     1     0      0     1     1 =13H
;BIT0:測定周期切り替え入力
;BIT1:ゼロブランキングの切り替え入力
;BIT2:第1ゲートの制御出力
;BIT3:PIC内臓プリスケーラ残存数読み出しパルス出力
;BIT4:周波数測定入力
        BSF        STATUS,5    ;BANK1
        MOVLW        013H
        MOVWF        TRISA        ;PORTA MODEreg
;
;PORTB    
;         BIT     7     6      5     4     3      2     1     0
;IN/OUT        OUT  OUT  OUT    OUT  OUT  OUT     OUT    OUT
;BIT DATA     0     0      0     0     0      0     0     0 = 000H=クリア
        BSF        STATUS,5    ;BANK1
        MOVLW        00H
        MOVWF        TRISB        ;PORTB MODEreg ALL OUT

;INTCON REG
;BIT    7        6        5        4        3        2        1        0
;      GIE  EEIE  TOIE   INTE  RBIE  TMR0IF  INTF  RBIF
;--GIE PEIE T0IE INTE RBIE TMR0IF INTF RBIF
;        0        0        0        0        0        0        0        0 =00H
        BCF        STATUS,5    ;BANK0
        MOVLW        00H
        MOVWF        INTCON
;***** lcdinit *****
;        XLCDInit ;It is used to initialize the LCD module according to the Application Maestro options.

;***** メインループ *****
MAINR
        CLRF        FIGCNT        ;LED桁アドレスカウンタ
        BTFSC        PORTA,0        ;NOR/PRE SW CHEACK
        GOTO        MAINR1
        GOTO        MAINR2
MAINR1
        CALL        FCNTRA        ;周波数測定A(1.00秒)
        CALL        HDCONV        ;16進10進変換
        CALL        ADEVFIG        ;桁分離(1.00秒)
        CALL        ZEROBR        ;ゼロブランキング
        GOTO        MAINR    ;TO MAIN1
MAINR2
        CALL        FCNTRB        ;周波数測定B(1.28秒)
        CALL        HDCONV        ;16進10進変換
        CALL        BDEVFIG        ;桁分離(1.28秒)
        CALL        ZEROBR        ;ゼロブランキング
        GOTO        MAINR    ;TO MAIN1

;********** サブルーチン群 **********
;** 周波数測定サブルーチン 1.00Sec **
;周波数測定の結果はTMR0,BYTE1,BYTE2 に16進数でカウントされている
;測定のためにゲート開放時間は1.000028秒に調整
;FCNTLP3のループとWCNT1,WCNT2,WCNT3で決める。
;FCNTLP2のルーチンLEDのダイナミックスキャンを行う


FCNTRA
        CALL        LEDSCAN            ;LEDSCAN
                                        ;;        XLCDClear
                                        ;;        XLCDL1home        
                                        ;        MOVF        FIGCNT,W
                                        ;        ANDLW        07H
                                        ;        IORLW        020H
                                        ;        MOVWF        FSR
                                        ;        MOVF        INDF,W
                                        ;;        mXLCDSendMsg
                                        ;        MOVWF        PORTB
                                        ;        INCF        FIGCNT,F
                                        ;        RETURN

        BSF            PORTA,4        ;第2ゲートは開いたままにする。
        BSF            PORTA,3        ;RA3=[H]
        BCF            PORTA,2        ;第1ゲートを閉じる

        CLRF        BYTE0        ;Fカウンタ    クリア
        CLRF        BYTE1        ;Fカウンタ    クリア
        CLRF        BYTE2        ;Fカウンタ    クリア
        CLRF        BYTE3        ;Fカウンタ    クリア ##
        CLRF        TMR0        ;Fカウンタ    クリア
        BCF            INTCON,TMR0IF    ;TMR0 のキャリーをクリア
        BSF            PORTA,2        ;第1ゲートを開ける
        NOP                        ;WAIT微々時間調整
        NOP
        MOVLW        0CAH        ;WAIT DATA=0CAH
        MOVWF        WCNT1        ;WAIT DATA IN
FCNTRA1
        CALL        AWAITB                            ;************** 微時間調整A ******************
                                                        ;AWAITB    MOVLW        10H
                                                        ;        MOVWF        WCNT4
                                                        ;        NOP                ;微々調整
                                                        ;        NOP
                                                        ;        NOP
                                                        ;        NOP
                                                        ;        NOP
                                                        ;AWAITB1    NOP
                                                        ;        NOP
                                                        ;        DECF        WCNT4,F
                                                        ;        BTFSS        STATUS,Z
                                                        ;        GOTO        AWAITB1
                                                        ;        RETURN

        MOVLW        026H        ;WAIT DATA=26H
        MOVWF        WCNT2        ;WAIT DATA IN
FCNTRA2
        MOVLW        01CH        ;WAIT DATA=1CH
        MOVWF        WCNT3        ;WAIT DATA IN
        CALL        AWAITA        ;粗時間調整A    ;*************** 粗時間調整A *****************
                                                        ;AWAITA    MOVLW        05H
                                                        ;        MOVWF        WCNT4
                                                        ;AWAITA1    NOP
                                                        ;        NOP
                                                        ;        DECF        WCNT4,F
                                                        ;        BTFSS        STATUS,Z
                                                        ;        GOTO        AWAITA1
                                                        ;        RETURN

        CALL        LEDSCAN        ;LED表示のスキャン

FCNTRA3        
        BTFSS        INTCON,TMR0IF    ;TMR0IFのフラグをチェック    
        GOTO        TAJDA1        ;ルーチン時間調整へ
        BCF            INTCON,TMR0IF    ;TMR0IFのフラグをクリア            
        MOVLW        1            ;カウントアップの準備
        GOTO        NEXTA1

TAJDA1
        NOP
        NOP
        MOVLW        0            ;ノーカウントの準備
NEXTA1
        ADDWF        BYTE2,F        ;TMR0IFが立てば1を加算
        RLF            BYTE2,W
        ANDLW        1
        ADDWF        BYTE3,F        ; ##
        DECFSZ        WCNT3,F        ;ウエイトのWCNT3=0か判定
        GOTO        FCNTRA3
        DECFSZ        WCNT2,F
        GOTO        FCNTRA2
        DECFSZ        WCNT1,F
        GOTO        FCNTRA1
        BCF            PORTA,2        ;第1ゲートを閉じる
        NOP                        ;プリスケーラの出力に2サイクル遅延があるため
        NOP                        ;;同        ; ##
        MOVF        TMR0,W
        MOVWF        BYTE1
        BTFSS        INTCON,TMR0IF
        GOTO        NEXTA2
        MOVLW        1
        ADDWF        BYTE2,F
        RLF            BYTE2,W
        ANDLW        01H
        ADDWF        BYTE3,F        ; ##

        MOVLW        0FFH
        SUBWF        BYTE1,W
        BTFSS        STATUS,Z
        GOTO        NEXTA2
        MOVLW        00H
        MOVWF        BYTE1
NEXTA2
        CALL        READPRE        ;プリセレクタ残存数読出し;READPRE
                                    ;        CLRF        PCNT        ;プリスケーラ残存数カウンタ
                                    ;READPRE1
                                    ;        call        LEDSCAN        ;LEDSCANを挿入
                                    ;        BCF            PORTA,3
                                    ;        BSF            PORTA,3
                                    ;        DECF        PCNT,F
                                    ;        BTFSC        STATUS,Z    ;PCNT THEN 00H DEC.OVER
                                    ;        GOTO        READPRE2
                                    ;        MOVF        BYTE1,W
                                    ;        SUBWF        TMR0,W        ;W=BYTE1-TMR0
                                    ;        BTFSC        STATUS,Z    ;FLAG CK
                                    ;        GOTO        READPRE1
                                    ;        MOVF        PCNT,W
                                    ;        MOVWF        BYTE0

                                    ;READPRE2
                                    ;        RETURN

        RETURN

;*************** 粗時間調整A *****************
AWAITA    MOVLW        05H
        MOVWF        WCNT4
AWAITA1    NOP
        NOP
        DECF        WCNT4,F
        BTFSS        STATUS,Z
        GOTO        AWAITA1
        RETURN

;************** 微時間調整A ******************
AWAITB    MOVLW        10H
        MOVWF        WCNT4
        NOP                ;微々調整
        NOP
        NOP
        NOP
        NOP
AWAITB1    NOP
        NOP
        DECF        WCNT4,F
        BTFSS        STATUS,Z
        GOTO        AWAITB1
        RETURN

;** 周波数測定サブルーチン 1.28Sec **
;周波数測定の結果はTMR0,BYTE1,BYTE2 に16進数でカウントされている
;測定のためにゲート開放時間は1.280002秒に調整
;FCNTLP3のループとWCNT1,WCNT2,WCNT3で決める。
;FCNTLP2のルーチンLEDのダイナミックスキャンを行う

FCNTRB
        CALL        LEDSCAN
        BSF            PORTA,4        ;第2ゲートは開いたままにする。
        BSF            PORTA,3        ;RA3=[H]
        BCF            PORTA,2        ;第1ゲートを閉じる
        CLRF        BYTE0        ;Fカウンタ    クリア
        CLRF        BYTE1        ;Fカウンタ    クリア
        CLRF        BYTE2        ;Fカウンタ    クリア
        CLRF        BYTE3        ;Fカウンタ    クリア        ; ##
        CLRF        TMR0        ;Fカウンタ    クリア
        BCF            INTCON,TMR0IF    ;TMR0 のキャリーをクリア
        BSF            PORTA,2        ;第1ゲートを開ける
        CALL        BWAITC        ;WAIT微々時間調整
        MOVLW        085H        ;WAIT DATA=0CAH
        MOVWF        WCNT1        ;WAIT DATA IN
FCNTRB1
        CALL        BWAITB        ;微時間調整B
        MOVLW        025H        ;WAIT DATA=26H
        MOVWF        WCNT2        ;WAIT DATA IN
FCNTRB2
        MOVLW        03CH        ;WAIT DATA=1CH
        MOVWF        WCNT3        ;WAIT DATA IN
        CALL        BWAITA        ;粗時間調整B
        CALL        LEDSCAN        ;LED表示のスキャン

FCNTRB3        
        BTFSS        INTCON,TMR0IF    ;TMR0IFのフラグをチェック    
        GOTO        TAJDB1        ;ルーチン時間調整へ
        BCF            INTCON,TMR0IF    ;TMR0IFのフラグをクリア            
        MOVLW        1            ;カウントアップの準備
        GOTO        NEXTB1

TAJDB1
        NOP
        NOP
        MOVLW        0            ;ノーカウントの準備
NEXTB1
        ADDWF        BYTE2,F        ;TMR0IFが立てば1を加算
        RLF            BYTE2,W
        ANDLW        1
        ADDWF        BYTE3,F        ; ##
        DECFSZ        WCNT3,F        ;ウエイトのWCNT3=0か判定
        GOTO        FCNTRB3
        DECFSZ        WCNT2,F
        GOTO        FCNTRB2
        DECFSZ        WCNT1,F
        GOTO        FCNTRB1
        BCF            PORTA,2        ;第1ゲートを閉じる
        NOP                        ;プリスケーラの出力に2サイクル遅延があるため
        NOP                        ;;同        ; ##
        MOVF        TMR0,W
        MOVWF        BYTE1
        BTFSS        INTCON,TMR0IF
        GOTO        NEXTB2
        MOVLW        1
        ADDWF        BYTE2,F
        RLF            BYTE2,W
        ANDLW        01H
        ADDWF        BYTE3,F        ; ##

        MOVLW        0FFH
        SUBWF        BYTE1,W
        BTFSS        STATUS,Z
        GOTO        NEXTB2
        MOVLW        00H
        MOVWF        BYTE1
NEXTB2
        CALL        READPRE        ;プリセレクタ残存数読出し
        RETURN

;*************** 粗時間調整B *****************
BWAITA    MOVLW        05H
        MOVWF        WCNT4
BWAITA1    NOP
        NOP
        DECF        WCNT4,F
        BTFSS        STATUS,Z
        GOTO        AWAITA1
        RETURN

;************** 微時間調整B ******************
BWAITB    MOVLW        0CH
        MOVWF        WCNT4
BWAITB1    NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        DECF        WCNT4,F
        BTFSS        STATUS,Z
        GOTO        AWAITB1
        RETURN

;************** 微々時間調整B ******************
BWAITC    MOVLW        1AH
        MOVWF        WCNT4
BWAITC1    
        DECF        WCNT4,F
        BTFSS        STATUS,Z
        GOTO        BWAITC1
        RETURN

;******************************************
;    プリスケーラ残存数の読出し
;******************************************

READPRE
        CLRF        PCNT        ;プリスケーラ残存数カウンタ
READPRE1
        call        LEDSCAN        ;LEDSCANを挿入
        BCF            PORTA,3
        BSF            PORTA,3
        DECF        PCNT,F
        BTFSC        STATUS,Z    ;PCNT THEN 00H DEC.OVER
        GOTO        READPRE2
        MOVF        BYTE1,W
        SUBWF        TMR0,W        ;W=BYTE1-TMR0
        BTFSC        STATUS,Z    ;FLAG CK
        GOTO        READPRE1
        MOVF        PCNT,W
        MOVWF        BYTE0

READPRE2
        RETURN

;********** 16進10進変換サブルーチン **********
;BYTE0,BYTE1,BYTE2,BYTE3から16進数を取り出し
;10進に変換DCML12~DCML78に格納する。
;このサブルーチンはマイクロチップ社のアプリケーションノートを使う。

HDCONV
        BCF        STATUS,C    ;キャリアフラグをクリア
        MOVLW        020H        ;4BYTE BDC=32回シフト
        MOVWF        SHIFT        ;SHIFTカウンタ
        CLRF        DCML12        ; ##
        CLRF        DCML34        ; ##
        CLRF        DCML56        ; ##
        CLRF        DCML78
        CLRF        DCML9A
        CLRF        DCMLBC
HDCONV1
        RLF        BYTE0,F
        RLF        BYTE1,F
        RLF        BYTE2,F
        RLF        BYTE3,F            ; ##
        RLF        DCML12,F        ; ##
        RLF        DCML34,F        ; ##
        RLF        DCML56,F        ; ##
        RLF        DCML78,F
        RLF        DCML9A,F
        RLF        DCMLBC,F
        DECFSZ        SHIFT,F
        GOTO        ADJST
        RETURN

ADJST
        MOVF        DCML12,W    ; ##          ;;10進1桁目と2桁目を
        CALL        ADJBCD                  ;ADJBCD
                                              ;        MOVWF        WORK1
                                              ;        CALL        LEDSCAN        ;LED    SCANを挿入
                                              ;        MOVLW        3
                                              ;        ADDWF        WORK1,W
                                              ;        MOVWF        WORK2
                                              ;        BTFSC        WORK2,3
                                              ;        MOVWF        WORK1
                                              ;        MOVLW        030H
                                              ;        ADDWF        WORK1,W
                                              ;        MOVWF        WORK2
                                              ;        BTFSC        WORK2,7
                                              ;        MOVWF        WORK1
                                              ;        MOVF        WORK1,W
                                              ;        RETURN

        MOVWF        DCML12        ; ##

        MOVF        DCML34,W    ; ##
        CALL        ADJBCD
        MOVWF        DCML34        ; ##

        MOVF        DCML56,W    ; ##
        CALL        ADJBCD
        MOVWF        DCML56        ; ##

        MOVF        DCML78,W
        CALL        ADJBCD
        MOVWF        DCML78

        MOVF        DCML9A,W
        CALL        ADJBCD
        MOVWF        DCML9A

        MOVF        DCMLBC,W
        CALL        ADJBCD
        MOVWF        DCMLBC        
        GOTO        HDCONV1

ADJBCD
        MOVWF        WORK1
        CALL        LEDSCAN        ;LED    SCANを挿入
        MOVLW        3
        ADDWF        WORK1,W
        MOVWF        WORK2
        BTFSC        WORK2,3
        MOVWF        WORK1
        MOVLW        030H
        ADDWF        WORK1,W
        MOVWF        WORK2
        BTFSC        WORK2,7
        MOVWF        WORK1
        MOVF        WORK1,W
        RETURN

;**********  桁分離サブルーチン    1.00秒    ************
; FIGレジスタの上位に数値、下位にLEDのアドレスを作る。
; DPの位置が違うため1.28秒と別のルーチンにする。
;    RB3ポートをDP(小数点)に割り当てる。
;*********************************************

ADEVFIG
        CALL        LEDSCAN        ;LED    SCANを挿入
        MOVF        DCML12,W
        ANDLW        0FH
        IORLW        30H
        MOVWF        FIG1

        SWAPF        DCML12,W
        ANDLW        0FH
        IORLW        30H
        MOVWF        FIG2

        MOVF        DCML34,W
        ANDLW        0FH
        IORLW        30H
        MOVWF        FIG3
        
        SWAPF        DCML34,W
        ANDLW        0FH
        IORLW        30H
        MOVWF        FIG4
        
        MOVF        DCML56,W
        ANDLW        0FH
        IORLW        30H
        MOVWF        FIG5
        
        SWAPF        DCML56,W
        ANDLW        0FH
        IORLW        30H
        MOVWF        FIG7

        MOVF        DCML78,W
        ANDLW        0FH
        IORLW        30H
        MOVWF        FIG5
        
        SWAPF        DCML78,W
        ANDLW        0FH
        IORLW        30H
        MOVWF        FIG8
        
        RETURN

;**********  桁分離サブルーチン    1.28秒    ************
; FIGレジスタの上位に数値、下位にLEDのアドレスを作る。
; DPの位置が違うため1.00秒と別のルーチンにする。
;    RB3ポートをDP(小数点)に割り当てる。
;*********************************************

BDEVFIG
        CALL        LEDSCAN        ;LED    SCANを挿入
        MOVF        DCML12,W
        ANDLW        0FH
        IORLW        30H
        MOVWF        FIG1
        
        SWAPF        DCML12,W
        ANDLW        0FH
        IORLW        30H
        MOVWF        FIG2

        MOVF        DCML34,W
        ANDLW        0FH
        IORLW        30H
        MOVWF        FIG3
        
        SWAPF        DCML34,W
        ANDLW        0FH
        IORLW        30H
        MOVWF        FIG4

        MOVF        DCML56,W
        ANDLW        0FH
        IORLW        30H
        MOVWF        FIG5
        
        SWAPF        DCML56,W
        ANDLW        0FH
        IORLW        30H
        MOVWF        FIG6

        MOVF        DCML78,W
        ANDLW        0FH
        IORLW        30H
        MOVWF        FIG7
        
        SWAPF        DCML78,W
        ANDLW        0FH
        IORLW        30H
        MOVWF        FIG8

        RETURN

;        XLCDCommand ;It sends clocking signal and instructions to the LCD.
;        XLCDPut ;It sends the clocking signal and data to be displayed to the LCD.
;        XLCDIsBusy ;Reads the Busy Flag status from the LCD module.
;        XLCDReadData ;It reads the data from the present address in the LCD.
;        XLCDL1home ;Points to the first address location of line one of the LCD.
;        XLCDL2home ;Points to the first address location of line two of the LCD
;        XLCDClear ;Clears the DDRAM content of the LCD and points to the 00 address location.
;        XLCDReturnHome ;Points to the 00 address location, the DDRAM content remains unchanged.
;        mXLCDSendMsg ;This is to write a string, the user needs to pass the starting address location of the string.

;***************    表示サブルーチン    ****************
;    間接アドレス手法を使う。
; FIG1~FIG8のLEDに表示する数値とLEDの桁アドレスを含む。
; データをPORTBに転送する。
;*********************************************

;FIG1        EQU        20H    ;1桁目
;FIG2        EQU        21H    ;2桁目
;FIG3        EQU        22H    ;3桁目
;FIG4        EQU        23H    ;4桁目
;FIG5        EQU        24H    ;5桁目
;FIG6        EQU        25H    ;6桁目
;FIG7        EQU        26H    ;7桁目
;FIG8        EQU        27H    ;8桁目

LEDSCAN
;        XLCDClear
;        XLCDL1home        
        MOVF        FIGCNT,W
        ANDLW        07H
        IORLW        020H
        MOVWF        FSR
        MOVF        INDF,W

;       MsgPtr equ 20H
;       mXLCDSendMsg    macro   MsgPtr
        MOVWF        PORTB ;この部分が置き換わるはずです。
        INCF        FIGCNT,F
        RETURN

;*********** ゼロブランキング  サブルーチン ************
;    表示数値の1~9に表示が現れるまでの上の桁の0を表示しない。
;*********************************************
ZEROBR
        MOVF    FIG8,W
        ANDLW    0FH
        BTFSS    STATUS,Z
        GOTO    ZEROBR1
        MOVF    FIG8,W
        MOVLW    020H        ;ゼロブランキング
        MOVWF    FIG8        ;FIG8 OFF

        MOVF    FIG7,W
        ANDLW    0FH
        BTFSS    STATUS,Z
        GOTO    ZEROBR1
        MOVF    FIG7,W
        MOVLW    020H        ;ゼロブランキング
        MOVWF    FIG7        ;FIG7 OFF

        MOVF    FIG6,W
        ANDLW    0FH
        BTFSS    STATUS,Z
        GOTO    ZEROBR1
        MOVF    FIG6,W
        MOVLW    020H        ;ゼロブランキング
        MOVWF    FIG6        ;FIG6 OFF

        MOVF    FIG5,W        ; ##
        ANDLW    0FH
        BTFSS    STATUS,Z
        GOTO    ZEROBR1
        MOVF    FIG5,W        ; ##
        MOVLW    020H        ;ゼロブランキング
        MOVWF    FIG5        ;FIG5 OFF        ; ##

        MOVF    FIG4,W        ; ##
        ANDLW    0FH
        BTFSS    STATUS,Z
        GOTO    ZEROBR1
        MOVF    FIG4,W        ; ##
        MOVLW    020H        ;ゼロブランキング
        MOVWF    FIG4        ;FIG4 OFF        ; ##

        MOVF    FIG3,W
        ANDLW    0FH
        BTFSS    STATUS,Z
        GOTO    ZEROBR1
        MOVF    FIG3,W
        MOVLW    020H        ;ゼロブランキング
        MOVWF    FIG3        ;FIG3 OFF

        MOVF    FIG2,W
        ANDLW    0FH
        BTFSS    STATUS,Z
        GOTO    ZEROBR1
        MOVF    FIG2,W
        MOVLW    020H        ;ゼロブランキング
        MOVWF    FIG2        ;FOG2 OFF

ZEROBR1
        RETURN

        END

;*********************

;16XLCD.asm

;        bsf     EECON1,EEPGD
         bsf     EECON1,EEDATA


;        incf    EEADRH
        incf    EEADR


;***********

;16f648a_g.lkr

プリンタが突然かすれたのでインキを交換しました。

sIMG_0623.jpg

ついでに内部を見てみると残量検出プリズムのある空間は元から空っぽで、その横のICチップで代理検出をしているようです。

この空間と実際にインキの入っている部分とは通じていません、実際のインキは横の部屋の薄いシートを重ねた、ウイックに染み込ませてあるのが全量のようです、いわば上げ底ですね。

 

 


コメント(0) 

ディップメーター用に特化した PIC周波数カウンタを企画しまた。 [PIC]

オリジナル作成者の許可を貰っていませんので、ハッキリした内容は掛けませんが、

PIC16F628a の T1 とT2 を使い、元16桁2行であったのを、

8桁2行に切りつめました。

コンパイラは「mikroC PRO for PIC」を使っています。

周波数レンジ選択を4bit16セレクトswで選択しやすい様にしています。

桁数の取扱が良く判らないので、不要なプログラムを二重に含んだりしているので

もう少し切りつめられそうです。(1/64のプリスケーラはプログラムには組み込んでいますが、実装はしません)

//    **********************************************************************
//
//                <FRIQ COUNTER>
//    *FUNCTION

//         11 12 13 14 15 16 17 18                NNNNNNNN
//         21 22 23 24 25 26 27 28                XXXXXXXX
//         sw1=0,sw2=0,sw3=0,sw4=0        msg =  "________";
//         sw1=1,sw2=0,sw3=0,sw4=0        msg =  "01M___K_";
//         sw1=0,sw2=1,sw3=0,sw4=0        msg =  "08_M___K";
//         sw1=1,sw2=1,sw3=0,sw4=0        msg =  "1M___K__";
//         sw1=0,sw2=0,sw3=1,sw4=0        msg =  "8_M___K_";
//         sw1=1,sw2=0,sw3=1,sw4=0        msg =  "01M455K_";
//         sw1=0,sw2=1,sw3=1,sw4=0        msg =  "08_M455K";
//         sw1=1,sw2=1,sw3=1,sw4=0        msg =  "1M455K__";
//         sw1=0,sw2=0,sw3=0,sw4=1        msg =  "8_M455K_";
//         sw1=1,sw2=0,sw3=0,sw4=1        msg =  "064M___K";
//         sw1=0,sw2=1,sw3=0,sw4=1        msg =  "64__M___";
//         sw1=1,sw2=1,sw3=0,sw4=1        msg =  "064M455K";
//         sw1=0,sw2=0,sw3=1,sw4=1        msg =  "64__M455";
//         sw1=1,sw2=0,sw3=1,sw4=1        msg =  "________";
//         sw1=0,sw2=1,sw3=1,sw4=1        msg =  "________";
//         sw1=1,sw2=1,sw3=1,sw4=1        msg =  "________";

//    *コンフィグ設定
//    LVP_OFF
//    MCLR_OFF
//    WDT_OFF
//    HS_CLK

//    *PIN ASIGN
//    Pin-01    LCD:D5
//    Pin-02    LCD:D4
//    Pin-03    LED
//    Pin-04    MCLR
//    Pin-05    Vss(GND)
//    Pin-06   
//    Pin-07   
//    Pin-08   
//    Pin-09   
//    Pin-10    LCD:RS
//    Pin-11    LCD:WR 1/64 SEL
//    Pin-12    SIG INPUT
//    Pin-13    LCD:EN
//    Pin-14    Vdd +5V
//    Pin-15    XTal OUT
//    Pin-16    XTal IN 20MHz
//    Pin-17    LCD:D7
//    Pin-18    LCD:D5

//   
//    LCD
//    1 Vss    2 Vdd
//    3 VO    4 RS
//    5 R/W    6 E
//    7 D0    8 D1
//    9 D2    10 D3
//    11 D4    12 D5
//    13 D6    14 D7
//    15 BLA    16 BLK
//
//    LCD POSTION
//    11 12 13 14 15 16 17 18
//    21 22 23 24 25 26 27 28
//
//    bit 1?bit 0 or 1
//    sbit 1?bit 0 or 1
//    (unsigned) char 1 0 .. 255
//    signed char 1 - 128 .. 127
//    (signed) short (int) 1 - 128 .. 127
//    unsigned short (int) 1 0 .. 255
//    (signed) int 2 -32768 .. 32767
//    unsigned (int) 2 0 .. 65535
//    (signed) long (int) 4 -2147483648 .. 2147483647
//    unsigned long (int) 4 0 .. 4294967295
//
// **********************************************************************
//        16F628A
//    1 RA2 LCD_5    18 RA1 LCD_6
//    2 RA3 LCD_4    17 RA0 LCD_7
//    3 RA4 LED    16 RA7 OSC1 XTal IN
//    4 RA5 MCLR    15 RA6 OSC2 XTal OUT
//    5 Vss        14 Vdd
//    6 RB0 SW1    13 RB7 LCD_EN
//    7 RB1 SW2    12 RB6 T1CK_IN
//    8 RB2 SW3    11 RB5 LCD_RW (1/64 uPB1507GV SEL)
//    9 RB3 SW4    10 RB4 LCD_RS
// **********************************************************************

#define             sw1                    PORTB.F0
#define             sw2                    PORTB.F1
#define             sw3                    PORTB.F2
#define             sw4                    PORTB.F3

#define             LED                    PORTA.F4

#define             GATETIME_100MSEC     10
#define             GATETIME_1SEC        1

//**********************************************************************

static                unsigned            int                MeasurementCnt;
static                char                phase;
static                char                phase1;


//                    Lcd_INT;
//                    Lcd_Custom_Config(&PORTA,0,1,2,3,&PORTB,4,5,7);
// LCD module connections
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB7_bit;
sbit LCD_D7 at RA0_bit;
sbit LCD_D6 at RA1_bit;
sbit LCD_D5 at RA2_bit;
sbit LCD_D4 at RA3_bit;
// Pin direction
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB7_bit;
sbit LCD_D7_Direction at TRISA0_bit;
sbit LCD_D6_Direction at TRISA1_bit;
sbit LCD_D5_Direction at TRISA2_bit;
sbit LCD_D4_Direction at TRISA3_bit;
// End LCD module connections


void                interrupt()
{
                PIR1.TMR2IF = 0;
                //
                MeasurementCnt--;
                if (MeasurementCnt == 0) {
                                T1CON.TMR1ON = 0;    //    GATE OFF
                                T2CON.TMR2ON = 0;    //    TIMER N
                }
}

//**********************************************************************

unsigned        long            FreqMeasurement(unsigned char gateTime)

{
                static            unsigned        long        freq;    //(int) 4
                // TIMER1 is SET
                PIR1.TMR1IF = 0;
                TMR1L = 0;
                TMR1H = 0;
                // TIMER2 is SET
                PIR1.TMR2IF = 0;
                freq = 0;
                // ENABLE INT
                INTCON.PEIE = 1;
                INTCON.GIE = 1;
                // 開始
                T2CON.TMR2ON = 1;        //    TIMER START
                //            Delay
                asm         nop;
                asm         nop;
                asm         nop;
                asm         nop;
                asm         nop;
                asm         nop;
                asm         nop;
                asm         nop;
                asm         nop;
                asm         nop;
                asm         nop;
                asm         nop;
                asm         nop;
                asm         nop;
                asm         nop;
                asm         nop;
                asm         nop;
                asm         nop;
                asm         nop;
                asm         nop;
                asm         nop;
                asm         nop;
                asm         nop;
                asm         nop;
                asm         nop;
                //
                T1CON.TMR1ON = 1;    //GATE ON
                //    MES
                while (T2CON.TMR2ON != 0) {
                                if (PIR1.TMR1IF == 1) {
                                                PIR1.TMR1IF = 0;
                                                freq++;
                                }
                }
                if (PIR1.TMR1IF == 1) {
                                PIR1.TMR1IF = 0;
                                freq++;
                }
                //    CONV
                freq = freq * 65536;   //?
                freq = freq + ((unsigned)TMR1H * 256) + (unsigned)TMR1L;
                //
                return (freq);// friq?
}

//**********************************************************************

void main()
{
                static        char*                        msg;
                static        unsigned        long        freq, temp;        //(int) 4     // 0...4294967295
                static        unsigned        char        buf[20], prescaler, gateTime;
                //char 1    //ch = str[20];    // 20th element
                // ANALOG is SET
                //ANSEL  = 0b00000000;        // NOT USE
                CMCON  = 0b00000111;
                // PORT is SET
                TRISA  = 0b11100000;
                TRISB  = 0b01001111;
                OPTION_REG.F7 = 0;        // PORTBPULL UP
                // TIMER2 is SET
                PIE1.TMR2IE = 1;
                PIR1.TMR2IF = 0;
                T2CON.TOUTPS0 = 0;
                T2CON.TOUTPS1 = 0;
                T2CON.TOUTPS2 = 0;
                T2CON.TOUTPS3 = 0;
                T2CON.TMR2ON = 0;
                T2CON.T2CKPS0 = 1;
                T2CON.T2CKPS1 = 1;
                TMR2 = 0;
                // TIMER1 is SET
                PIE1.TMR1IE = 0;
                PIR1.TMR1IF = 0;
//                T1CON.T1RUN = 0;
                T1CON.T1CKPS0 = 0;
                T1CON.T1CKPS1 = 0;
                T1CON.T1OSCEN = 0;
                T1CON.NOT_T1SYNC = 1;
                T1CON.TMR1CS = 1;
                T1CON.TMR1ON = 0;
                TMR1L = 0;
                TMR1H = 0;
                // VAL INIT
                prescaler = 1;
                gateTime = GATETIME_1SEC;
                // LCD(DISP)INIT
//                Lcd_Custom_Config(&PORTA,0,1,2,3,&PORTB,4,5,7);
                LCD_Init();
                Lcd_Cmd(_LCD_CURSOR_OFF);
                Lcd_Out(2, 1, "FC V8");
                Delay_ms(1000);
                Lcd_Cmd(_LCD_CLEAR);

                while (1) {
                                //    FRIQ MES
                                LED = 1;
                                freq = FreqMeasurement(gateTime);
                                LED = 0;
                                //    CONV
                                freq = freq * prescaler * gateTime;

                                // EXT PRISCALER

                phase1 = phase;
                phase = (sw1 + sw2 * 2 + sw3 * 4 + sw4 * 8);

                if (phase1 != phase)
                switch (phase) {
                case 1:            MeasurementCnt = 123;
                                    TMR2 = 0xEE;        // 31250=0.1/((1/20000000) * 4 * 16)
                                    T1CON.T1CKPS0 = 0;
                                    T1CON.T1CKPS1 = 0;
                                    prescaler = 1;
                                    msg = "01M___K_";
                                    break;
                case 2:            MeasurementCnt = 123;
                                    TMR2 = 0xEE;        // 31250=0.1/((1/20000000) * 4 * 16)
                                    T1CON.T1CKPS0 = 1;
                                    T1CON.T1CKPS1 = 1;
                                    prescaler = 8;
                                    msg = "08_M___K";
                                    break;
                case 3:            MeasurementCnt = 1221;
                                    TMR2 = 0x4C;        // 312500=1/((1/20000000) * 4 * 16)
                                    T1CON.T1CKPS0 = 0;
                                    T1CON.T1CKPS1 = 0;
                                    prescaler = 1;
                                    msg = "1M___K__";
                                    break;
                case 4:            MeasurementCnt = 1221;
                                    TMR2 = 0x4C;        // 312500=1/((1/20000000) * 4 * 16)
                                    T1CON.T1CKPS0 = 1;
                                    T1CON.T1CKPS1 = 1;
                                    prescaler = 8;
                                    msg = "8_M___K_";
                                    break;
                case 5:            MeasurementCnt = 123;
                                    TMR2 = 0xEE;        // 31250=0.1/((1/20000000) * 4 * 16)
                                    T1CON.T1CKPS0 = 0;
                                    T1CON.T1CKPS1 = 0;
                                    prescaler = 1;
                                    freq -= 455000;
                                    msg = "01M455K_";
                                    break;
                case 6:            MeasurementCnt = 123;
                                    TMR2 = 0xEE;        // 31250=0.1/((1/20000000) * 4 * 16)
                                    T1CON.T1CKPS0 = 1;
                                    T1CON.T1CKPS1 = 1;
                                    prescaler = 8;
                                    freq -= 455000;
                                    msg = "08_M455K";
                                    break;
                case 7:            MeasurementCnt = 1221;
                                    TMR2 = 0x4C;        // 312500=1/((1/20000000) * 4 * 16)
                                    T1CON.T1CKPS0 = 0;
                                    T1CON.T1CKPS1 = 0;
                                    prescaler = 1;
                                    freq -= 455000;
                                    msg = "1M455K__";
                                    break;
                case 8:            MeasurementCnt = 1221;
                                    TMR2 = 0x4C;        // 312500=1/((1/20000000) * 4 * 16)
                                    T1CON.T1CKPS0 = 1;
                                    T1CON.T1CKPS1 = 1;
                                    prescaler = 8;
                                    freq -= 455000;
                                    msg = "8_M455K_";
                                    break;
                case 9:            MeasurementCnt = 123;
                                    TMR2 = 0xEE;        // 31250=0.1/((1/20000000) * 4 * 16)
                                    T1CON.T1CKPS0 = 0;
                                    T1CON.T1CKPS1 = 0;
                                    prescaler = 1;
                                    msg = "064M___K";
                                    break;
                case 10:            MeasurementCnt = 123;
                                    TMR2 = 0xEE;        // 31250=0.1/((1/20000000) * 4 * 16)
                                    T1CON.T1CKPS0 = 0;
                                    T1CON.T1CKPS1 = 0;
                                    prescaler = 1;
                                    msg = "64__M___";
                                    break;
                case 11:            MeasurementCnt = 1221;
                                    TMR2 = 0x4C;        // 312500=1/((1/20000000) * 4 * 16)
                                    T1CON.T1CKPS0 = 0;
                                    T1CON.T1CKPS1 = 0;
                                    prescaler = 1;
                                    freq -= 455000;
                                    msg = "064M455K";
                                    break;
                case 12:            MeasurementCnt = 1221;
                                    TMR2 = 0x4C;        // 312500=1/((1/20000000) * 4 * 16)
                                    T1CON.T1CKPS0 = 0;
                                    T1CON.T1CKPS1 = 0;
                                    prescaler = 1;
                                    freq -= 455000;
                                    msg = "64__M455";
                                    break;
}
                                Lcd_Out(2, 1, msg);

                                // 周波数の表示
//      11 12 13 14 15 16 17 18    NNNNNNNN
//      21 22 23 24 25 26 27 28    XXXXXXXX
                                Lcd_Out(1, 1, &buf[3]); // friq?
                                //
                                Delay_ms(500);
                }
}

//    **********************************************************************


コメント(0) 
メッセージを送る

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。

×

この広告は1年以上新しい記事の更新がないブログに表示されております。