質問

Mikrocを使ってPIC16F84Aをプログラムしています、そして私は次の関数

を持っています
volatile unsigned short d;  // global variable

void put_data(){
    RA3_bit = d & 1;
    d >>= 1;
    RA4_bit = d & 1;
    d >>= 1;
    PORTB.B0 = d & 1;
    d >>= 1;
    PORTB.B1 = d & 1;
    d >>= 1;
    PORTB.B2 = d & 1;
    d >>= 1;
    PORTB.B3 = d & 1;
    d >>= 1;
    PORTB.B4 = d & 1;
    d >>= 1;
    PORTB.B5 = d & 1;
}
.

この関数は、D(8ビット)から各ビットを取り、それをポートピンRA3、RA4、RB0、...、RB5に出力します。

このコードをどのように最適化するか、そしてメモリは私の最初の関心事です。

更新::

PIC16F84A.H:

volatile unsigned char           PORTA               @ 0x005;
// bit and bitfield definitions
volatile bit RA0                 @ ((unsigned)&PORTA*8)+0;
volatile bit RA1                 @ ((unsigned)&PORTA*8)+1;
volatile bit RA2                 @ ((unsigned)&PORTA*8)+2;
volatile bit RA3                 @ ((unsigned)&PORTA*8)+3;
volatile bit RA4                 @ ((unsigned)&PORTA*8)+4;

volatile unsigned char           PORTB               @ 0x006;
// bit and bitfield definitions
volatile bit RB0                 @ ((unsigned)&PORTB*8)+0;
volatile bit RB1                 @ ((unsigned)&PORTB*8)+1;
volatile bit RB2                 @ ((unsigned)&PORTB*8)+2;
volatile bit RB3                 @ ((unsigned)&PORTB*8)+3;
volatile bit RB4                 @ ((unsigned)&PORTB*8)+4;
volatile bit RB5                 @ ((unsigned)&PORTB*8)+5;
volatile bit RB6                 @ ((unsigned)&PORTB*8)+6;
volatile bit RB7                 @ ((unsigned)&PORTB*8)+7;
.

ヘッダファイルからこれらの値を使用することができます。

役に立ちましたか?

解決

portb.b0からportb.b5がアウトポートのビットであると仮定すると、これを行うことが速くなる可能性があります:


volatile unsigned short d;  // global variable

void put_data(){
    RA3_bit = d & 1;
    d >>= 1;
    RA4_bit = d & 1;
    d >>= 1;

    PORTB &= 0x3F; // Mask out the low 6 bits
    PORTB |= d & 0x3f;  // Or in the low 6 bits of d

    // Clean out the bits if needed in d
    d >>= 6;
}
.

私はアセンブラがあなたが今やっているのと同じくらい速く倍の2倍になると期待します。最初の2つの命令で3番目と4番目のビットが、ポート内のビットの位置には価値がないでしょう。ただし、常にアセンブラ出力を再確認してください。あなたのアセンブラのオペコードは十分に簡単なことで、確認するのはかなり早くなるでしょう。

他のヒント

A&BのポートまたはLATレジスタの現在の値を読み取る。その写真がポート&LATの両方を持っている場合、その違いを知ることが重要ですので、どちらを使うべきかわからない場合はいくつかの研究をすることをお勧めします。。

適切なピンのみを変更して、1つの書き込み操作だけを確認するために必要なシフト&マスキングを行います。

あるいは、ポートA&Bの他のすべてのピンが各ポートに関連付けられているTRISレジスタを介して入力に設定されている場合は、読み取りステップをスキップしてください。

SOの場合:

tmp = PORTA;
tmp = (tmp & 0xFC) | (d & 0x3);
PORTA = tmp;

tmp = PORTB;
tmp = (tmp & 0xE0) | ((d >> 2) & 0x1F);
PORTB = tmp;
.

実際にあなたのコードのどんなビット順をあなたに与えるでしょう。

また、実際にはPICコードが速くなることを保証しません。あなたが本当にその絶対最速のアプローチを必要とするならば、あなたはいくつかのアセンブリを書く必要があるかもしれません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top