上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
--.--.-- -- l スポンサー広告 l top
キャプチャ部のアセンブラ高速化に取りかかる前に、PIC32MX用インラインアセンブルを練習してみました。

アセンブラはZ80(歳が分かる(^^;)以来ですし、今のMIPS32は初めてですので。

まずはC言語との変数やり取りとPICレジスタ直接制御をやってみました。
変数やり取りは先日開通したシリアルポートからアセンブラ前後の値を出力しての確認です。
PICレジスタは一番簡単なPORTA読み取り、LATB書き込みにしました。
今の回路はichigojamが繋がっていますので、PORTAのビット0,1にビデオ同期とデータが入っています。
うまくいくとそのままPORTBにでてくるはずです。

動作結果はこの通り。数値引き継ぎはどうやらうまくいきました。
シリアルポートが繋がってコンソールデバッグができるようになると俄然やりやすくなります。



「スポンサードリンク」

style="display:block"
data-ad-client="ca-pub-0620260288102702"
data-ad-slot="9773401572"
data-ad-format="auto">



オシロでPORTBの波形を見たところでは、PORTAリード、LATB書き込みもうまくいっているようです。

ということで、今回のテストプログラムを残しておきます。
次に時間ができたらいよいよカラーアダプタのアセンブラ化を始めます。


/*
* File: main.c
*
* MIPS32 ASSEMBLER TEST
* Created on 2015/06/30
*/

#include
#include
#include
#include


#pragma config PMDL1WAY = OFF
#pragma config IOL1WAY = OFF
#pragma config FUSBIDIO = OFF
#pragma config FVBUSONIO = OFF
#pragma config FPLLIDIV = DIV_1
#pragma config FPLLMUL = MUL_15
#pragma config FPLLODIV = DIV_1
#pragma config FNOSC = FRCPLL
#pragma config FSOSCEN = OFF
#pragma config POSCMOD = XT
#pragma config OSCIOFNC = OFF
#pragma config FPBDIV = DIV_1
#pragma config FCKSM = CSDCMD
#pragma config WDTPS = PS1
#pragma config WINDIS = OFF
#pragma config FWDTEN = OFF
#pragma config FWDTWINSZ = WINSZ_50
#pragma config DEBUG = OFF
#pragma config JTAGEN = OFF
#pragma config ICESEL = RESERVED
#pragma config PWP = OFF
#pragma config BWP = OFF
#pragma config CP = OFF

#define PROC_ONE_PIXEL4 LATB = (PORTAbits.RA1*FC)|0x08;asm volatile("NOP");asm volatile("NOP");asm volatile("NOP");asm volatile("NOP");


void uart_putc (unsigned char);
unsigned int uart_getc(void);
void uart_puttext(unsigned char *);
void uart_putnum (unsigned int n);

int WORK;


//************ MAIN ******************

int main() {

SYSTEMConfigPerformance(120000000);
ANSELB = 0;
ANSELA = 0;
TRISB = 0x0002000; // RB3-0 VIDEO OUTPUT , RB13= RXD1
TRISA = 0x0000007; // RA1-0 VISEO INPUT
ODCA = 0;

REFOCONbits.RODIV = 2;
REFOTRIMbits.ROTRIM = 256;
REFOCONbits.ON = 1; // Reference Oscillator Module enabled
REFOCONbits.OE = 1; // Reference clock is driven out on REFCLKO pin
RPA4Rbits.RPA4R = 0b0111;

RPB15R =0x0001; // RB15 = TXD1
U1RXR =0x0003; // RB13= RXD1

U1MODE = 0x0000;
U1STAbits.UTXEN = 1; // enable transmit pin
U1STAbits.URXEN = 1; // enable receive pin
U1BRG = 30000000 / 16 / 115200 - 1;
U1STAbits.OERR=0;
U1MODEbits.ON = 1; // enable UART

LATB = 0x08;

uart_puttext("***** PIC32MX ASSEMBLER TEST *****************\n");

// ****** グローバル変数をアセンブラで読み書きするテスト

uart_puttext("BEFORE.\n");
uart_putnum(WORK);
asm volatile("la $t0,%0"::"i"(&WORK)); // WORKのアドレスをt0に
asm volatile("lw $t1,0($t0)"); // アドレスt0の値をt1に
asm volatile("addi $t1,$t1,123"); // t1に123を加算
asm volatile("sw $t1,0($t0)"); // t1をアドレスt0に戻す
uart_puttext("AFTER.\n");
uart_putnum(WORK);


// ****** ポートAの状態を読み取ってポートBに出力するテスト

while (1) {
asm volatile("la $t0,%0"::"i"(&PORTA)); // PORTAアドレスをt0に
asm volatile("la $t1,%0"::"i"(&LATB)); // LATAアドレスをt1に
asm volatile("lw $t2,0($t0)"); // アドレスt0の値をt2に
asm volatile("sw $t2,0($t1)"); // t2をアドレスt1に
}

}

void uart_putnum (unsigned int n){
int n0,i,n1;
n0 = n % 100000; n1=10000;
for (i=0;i<5;i++) {
uart_putc(0x30 + (n0/n1));
n0 %= n1;
n1 /= 10;
}
uart_putc(0x0a);
uart_putc(0x0d);
}

void uart_putc (unsigned char c)
{
while (U1STAbits.UTXBF); // wait for trasmit buffer enmpty
U1TXREG = c; // set data
}

void uart_puttext(unsigned char *c)
{
unsigned char *c0;
c0 = c;
while (*c0 != 0x00) {
while (U1STAbits.UTXBF); // wait for trasmit buffer enmpty
U1TXREG = *c0; // set data
c0++;
}
}

unsigned int uart_getc(void)
{
if (!U1STAbits.URXDA) {
return 0xffff;
}else{
return ((unsigned int)(U1RXREG)&0x00ff);
}
}



2015.06.30 Tue l ICHIGOJAM l コメント (0) l top

コメント

コメントの投稿












上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。