So-net無料ブログ作成
検索選択

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) 

コメント 3

通りすがり

>if (UP | DOWN) { // スイッチの押下をチェックする。
> if (UP) {
> if (cnt < 64)
> cnt++;
> cnt = 0;
> }

これだと、cntは常に0になっちまいますけど。
 else cnt = 0; なら大丈夫。
でも、コンパイルを通ったからといってもその先は長い。
by 通りすがり (2012-08-19 19:15) 

nekonoko

おおまちがってます。
if (cnt < 64)
cnt++;
> else
cnt = 0;
}
if (DOWN) {
if (cnt > 0)
cnt--;
> else
cnt = 63;
max と miniの判定が抜けています。
mikrpcproは {}が要りましたっけ?
by nekonoko (2012-08-29 21:14) 

kuga

>mikrpcproは {}が要りましたっけ?
標準のC言語のままです。特に規格から逸脱していません。



by kuga (2012-08-30 18:36) 

コメントを書く

お名前:[必須]
URL:[必須]
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

メッセージを送る

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