XC8コンパイラでdelayを使う

下記コードのニーズが高いようなので

先に成果物だけ貼っておく


#define _XTAL_FREQ 32000000    //  delay用に必要(クロック32MHzを指定)


#define __delay(x) _delay((unsigned long)((x)))
#define __delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000UL)))
#define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000UL)))

// 指定した時間(num x o.1ms)だけウエイトを行う処理関数
void Wait(unsigned int num)
{
    int i ;
    // numで指定した回数だけ繰り返す
    for (i=0 ; i<num ; i++) 
    {
        __delay_us(100);    // 100usプログラムの一時停止
    }
}


PIC16F648Aが遊休品で転がっていたので,先日回路図書いたステッピングモータドライバのコントローラ代わりに使ってみようと画策している.


PICなんていじるのは5年ぶり.
大学4年の実習授業でやりすぎライントレーサーを作って以来.

開発環境を整えるところから始めたわけだが,
5年前からはいろいろ様変わりしていてCコンパイラが出ているようだ.

MPLABR XC: Compiler
http://www.microchip.com/pagehandler/en-us/devtools/mplabxc/

MPLAB X IDEを入れてXC8コンパイラをインストールする.

新規プロジェクトを作成する際に,使用するマイコンとコンパイラを選択できるようになるので648AとXC8を選択する.

(※インストールの仕方に関しては様々な解説サイトがあるようなので割愛)


早速4層の1-2相励磁プログラムを書いてみることにしたが,
PICではアセンブラしか使ったことがないのでいろいろわからないことばかり.

新しいものを学ぶときはコピペから始める習慣があるのだが早速詰まった.

cf)http://www.geocities.jp/zattouka/GarageHouse/micon/Motor/Stepping2.htm

----
// 指定した時間(num x o.1ms)だけウエイトを行う処理関数
void Wait(unsigned int num)
{
int i ;
// numで指定した回数だけ繰り返す
for (i=0 ; i<num ; i++)
{
__delay_us(100); // 100usプログラムの一時停止
}
}
-----


__delay_us()が見つからないとのエラーが消えない.
コンソールには「BUILD SUCCESSFUL」とは表示されているんだが・・・

HelpからLibrary Functionを調べてみた.

引用)MPLAB XC8 C Compiler Help Library Functions : __DELAY_MS, __DELAY_US, __delaywdt_us, __delaywdt_Ms


-------
__DELAY_MS, __DELAY_US, __delaywdt_us, __delaywdt_Ms
Synopsis

__delay_ms(x) // request a delay in milliseconds
__delay_us(x) // request a delay in microseconds
__delaywdt_ms(x) // request a delay in milliseconds
__delaywdt_us(x) // request a delay in microseconds

Description

It is often more convenient to request a delay in time-based terms, than in cycle counts. The macros
__delay_ms(x) and __delay_us(x) are provided to meet this need. These macros convert the time-based request into instruction cycles that can be used with _delay(n). In order to achieve this, these macros require the prior definition of preprocessor symbol _XTAL_FREQ, which indicates the system frequency. This symbol should equate to the oscillator frequency (in hertz) used by the system.
On PIC18 devices only, you can use the alternate WDT-form of these functions, which uses the
CLRWDT instruction as part of the delay code. See the _delay function.
An error will result if these macros are used without defining the oscillator frequency -symbol or if the delay period requested is too large.

See also
_delay()
-------

そのまま_delay()を読んでみる.

-------
_DELAY() , _delaywdt

Synopsis
#include <xc.h>

void _delay(unsigned long cycles);
void _delaywdt(unsigned long cycles);

Description
This is an in-line function that is expanded by the code generator. When called, this routine expands to an in-line assembly delay sequence. The sequence will consist of code that delays for the number of instruction cycles that is specified as the argument. The argument must be a literal constant.
The
_delay in-line function can use loops and the NOP instruction to implement the delay. On PIC18 devices only, the _delaywdt in-line function performs the same task, but can use the CLRWDT instruction, as well as loops to achieve the specified delay.
An error will result if the delay period requested is too large (approximately 179,200 for PIC18 devices, and 50,659,000 instructions for other 8-bit PIC devices). For very large delays, call this function multiple times.
Example
#include <xc.h>
?
void
main (void)
{
control |= 0x80;
_delay(10); // delay for 10 cycles
control &= 0x7F;
}
See Also
_delay3(), __delay_us()
, __delay_ms()
-------

というわけで_delay()を使用して自分で定義すればエラーが消えるようだ.
ただし,__delay_ms()に関してもビルドは通るようだし,使えそうな気もする.

とかいう話を後輩としていると「こんなん定義しとけばエラー消えますよ」なんて教えてくれた.

素晴らしいノウハウである.

----
#define _XTAL_FREQ 32000000 // delay用に必要(クロック32MHzを指定)


#define __delay(x) _delay((unsigned long)((x)))
#define __delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000UL)))
#define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000UL)))
----


明日辺りには実機に書き込みしたいところである.

コメント(0)

コメントを投稿する