使用整數計算方式,順便記下一階濾波器程式
#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月20日 星期二
2015年1月3日 星期六
Game Mechaninations新體認
Bee很早就看了第五項修練,這本書將控制理論推展到現實世界中。
提供了公司或是經濟系統的解釋。但只能解釋,無法有效了解。因為現實難以量化。
經過許多年,Bee在看Advanced Game Design發現Game Mechaninations這套圖形化語言。
這下總算可以將多年以來的困感解除了。
利用Game Mechaninations可以將第五項修練中的模型圖形化,再加上預估量化,就可以建造可解釋模型。
電腦語言確實可以將抽象理論現實化,並可以模擬。
這算是不同知識系統組合下的結果。
提供了公司或是經濟系統的解釋。但只能解釋,無法有效了解。因為現實難以量化。
經過許多年,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,足以應付大部分外擴需求。
有了這項功能,可以將外掛資料及函式庫一起包在一起,提高程式部分升級的應用。
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;
}
}
在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;
}
}
訂閱:
文章 (Atom)