マイクロテクニカ製品サポートFAQ
[一覧] [1つ前に戻る] [マニュアル及び各種ダウンロードページへ]
PIC18Fシリーズ等で40MHz以上でPORTの出力動作をさせる場合の注意
mikroC PROではPIC18シリーズで外部発振子又は内蔵発振子にて40MHz以上の動作をするプログラムを作成することができます。例えば内蔵発振子16MHzを使用して、内蔵4×PLLにて4逓倍して64MHzをシステムクロックとして動作させる場合などです。

この場合、mikroCに限らずアセンブラなど開発言語を問わず、ポートの出力制御はPORTxレジスタではなく、LATxレジスタをご使用して駆動しないと、正しく動作しません。これは出力ピンに容量性の負荷がある場合(通常の場合には基板パターンなどによる)、PORTレジスタは入力方向の制御も兼ねているため、この容量性負荷によるO→1又は1→0の立ち上がり、立ち下がりでに時間がかかり意図した動作をしなくなるためです。動作クロックが高速になると、PORTに値をセットするレジスタの動作に実際のピンの状態が追従しないためです。

高速動作するPICマイコンにはPORTレジスタの他に、出力制御専用のLATレジスタがあります。LATレジスタはこの問題を解決するために装備されたもので、出力専用に動作します。そのためピン(PORT)に物理的にかかる容量性負荷の影響を受けず駆動が可能となります。

高速動作、とりわけ40MHzを超えるスピードで動作させるプログラムを作る場合には、出力制御は必ずLATレジスタを使うことを徹底してください。高速動作のPICにLATレジスタが搭載されたのはそのためです。

例1:RB0とRB1を交互に点灯させる (システムクロック64MHzの場合)

while(1){
  LATB.B0 = 0;
  LATB.B1 = 1;

  LATB.B0 = 1;
  LATB.B1 = 0;
}

※上記プログラムを"PORTB.B0 = 0"のように記述すると正しく動作しません。


例2:LCD制御をする場合のポートの設定 (システムクロック64MHzの場合)

sbit LCD_RS at LATB4_bit;
sbit LCD_EN at LATB5_bit;
sbit LCD_D4 at LATB0_bit;
sbit LCD_D5 at LATB1_bit;
sbit LCD_D6 at LATB2_bit;
sbit LCD_D7 at LATB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;

void init(){
  ANSELA = 0; ANSELB = 0; ANSELC = 0; ANSELD = 0;
  LCD_Init();
  Lcd_Cmd(_LCD_CURSOR_OFF);
  Delay_ms(100);
  return;
}

void main() {

  OSCCON = 0b01111100;
  OSCCON2 =0b10000000;
  OSCTUNE.B6 = 1;

  init();

  Lcd_Out(1,1,"HELLO WORLD");

}

※上記プログラムを"sbit LCD_RS at PORTB4_bit"のように記述すると正しく動作しません。

オリジナル - FAQみたいです - 猫でいいです