2015年1月20日 星期二

S,Q值計算範例:濾波器

使用整數計算方式,順便記下一階濾波器程式

#define  K              0.01
#define  Q_K            16
#define  Const_Q_K      (int)(K*(1<<Q_K))
#define  K_MUL(x)       (((x)*Const_Q_K)>>Q_K)

#define  Q_ADC          8

#define  INT_Q(x,a)     ((x)<<( a))
#define  Q_INT(x,a)     ((x)>>( a))

_IO  ADC = 0x40001000;
extern int Read_IO(unsigned int address);

int ADC_IN()
{
     static int  Output; // Q_ADC variable
     int Last_Output;    // Q_ADC variable
    
     Last_Output = Output;
     Output += K_MUL(INT_Q(Read_IO(ADC),Q_ADC) - Output );
     if( Q_INT(Last_Output,Q_ADC) != Q_INT(Output,Q_ADC) ) TFT_string( Q_INT(Output,Q_ADC));
     return Q_INT(Output,Q_ADC);
}



2015年1月3日 星期六

Game Mechaninations新體認

Bee很早就看了第五項修練,這本書將控制理論推展到現實世界中。
提供了公司或是經濟系統的解釋。但只能解釋,無法有效了解。因為現實難以量化。
經過許多年,Bee在看Advanced Game Design發現Game Mechaninations這套圖形化語言。
這下總算可以將多年以來的困感解除了。
利用Game Mechaninations可以將第五項修練中的模型圖形化,再加上預估量化,就可以建造可解釋模型。
電腦語言確實可以將抽象理論現實化,並可以模擬。
這算是不同知識系統組合下的結果。

STM32 Quad-SPI Flash支援

STM32最近出了一系列支援Quad-SPI Flash。
Bee一開始不以為意,直到原廠人員特別強調時,才去看有何不同。
Quad-SPI Flash這個規格Bee早知道,但無MCU支援下,大概只有用FPGA才可以寫出來有效發揮的硬體。
不過在看完新的STM32 MCU規格後,發現果然原廠強調是有原因的。
因為Quad-SPI Flash在新MCU上可以支援程式執行。
新的MCU將quad-SPI Flash通信後,直接映射在Memory Space上,所以可以直接使用,包括執行。
這使得MCU外部擴充變得很方便,且讀取速度理論上最大可達40MB/sec,足以應付大部分外擴需求。
有了這項功能,可以將外掛資料及函式庫一起包在一起,提高程式部分升級的應用。

FIFO程式

使用在Verilog及MCU上用的。
在verilog中Buffer管理以2的指數為大小比較好管理。因為運算上方便,只需要用AND取得餘數。
在MCU上則是用在中斷及主程式之間的管理。
程式如下:

#define BUF_SIZE    0x8
#define SIZE_MASK   (BUF_SIZE-1)

int buffer[BUF_SIZE];

unsigned char fifo_wr_count, fifo_rd_count;

int fifo_reset(void)
{
    fifo_wr_count = 0;
    fifo_rd_count = 0;
    return -1;
}


int fifo_write(int data)
{
    unsigned int dist;

    dist = (unsigned char)(fifo_wr_count - fifo_rd_count);
    if ( dist >= BUF_SIZE)
    {
        return 0;
    }
    else
    {
        buffer[(fifo_wr_count&SIZE_MASK)] = data;
        fifo_wr_count++;
        return -1;
    }
}

int fifo_read(int *data)
{
    if ( fifo_rd_count == fifo_wr_count )
    {
        return 0;
    }
    else
    {
        *data = buffer[(fifo_rd_count&SIZE_MASK)];
        fifo_rd_count++;
        return -1;
    }
}