最近因為 G Sensor正夯
很多東西的應用都加上了 G Sensor
剛好新案子也是用 G Sensor
因為是剛接觸 G Sensor
很多控制設定都還未測試過
HK又趕著要
雖然這個案子不是由我開發
但........盡在不言中 囧
連續14天半夜2到4點下班
到隔天10點的也有
只能說累啊 ~_~
2/25/2009
AVR Usb Programming
最近在網路上找到新的AT89S5x Programmer
剛好也看到AVR USB Programmer
就試著把它們做出來
測試的結果是ok的
也能正確燒寫
Easy spi......Print port 簡易電路
SPI progrma...增加74ls244穩定用,有分USB POWER AND PRINT POWER
使用軟體 Spipgm or Ponyprog
AVR USB Program...Usb Program
需要使用燒寫器先將usb程式寫入Atmega8
插上USB後電腦會辨視出Device
安裝Drive
使用Avrdude將程式寫入Mcu
遇到的問題是全新的Atmega8
使用Usb萬用燒錄器將程式寫入後
電腦還是無法辨視
但使用Print port寫入後
卻可正常辨視
之後不管使用usb萬用燒錄器還是Print寫入
都能正常執行
參考網站
Usbasp
Avrdude
Avrdude-gui
以下我修改後的電路圖
SPI_PROGRAM.pdf
SPI_PROGRAM.sch
剛好也看到AVR USB Programmer
就試著把它們做出來
測試的結果是ok的
也能正確燒寫
Easy spi......Print port 簡易電路
SPI progrma...增加74ls244穩定用,有分USB POWER AND PRINT POWER
使用軟體 Spipgm or Ponyprog
AVR USB Program...Usb Program
需要使用燒寫器先將usb程式寫入Atmega8
插上USB後電腦會辨視出Device
安裝Drive
使用Avrdude將程式寫入Mcu
遇到的問題是全新的Atmega8
使用Usb萬用燒錄器將程式寫入後
電腦還是無法辨視
但使用Print port寫入後
卻可正常辨視
之後不管使用usb萬用燒錄器還是Print寫入
都能正常執行
參考網站
Usbasp
Avrdude
Avrdude-gui
以下我修改後的電路圖
SPI_PROGRAM.pdf
SPI_PROGRAM.sch
2/05/2009
Easy stocks system
因為小弟需要
所以用三天寫一個簡易的股票小系統
很久沒用BCB寫程式
所以很多小細節沒有注意到
目前只是個簡易的功能
沒有錯誤提示
輸入股票代碼
按find
之後auto up data才能開啟使用
每40秒自動更新一次
如需改秒數
請修改stock.ini裡的
ats=40000
如使用後有bug或需要改進的地方
請告訴我 謝謝
Download Stock.rar
所以用三天寫一個簡易的股票小系統
很久沒用BCB寫程式
所以很多小細節沒有注意到
目前只是個簡易的功能
沒有錯誤提示
輸入股票代碼
按find
之後auto up data才能開啟使用
每40秒自動更新一次
如需改秒數
請修改stock.ini裡的
ats=40000
如使用後有bug或需要改進的地方
請告訴我 謝謝
Download Stock.rar
1/22/2009
1/19/2009
AT89S5x + SS2A16 LCM
使用 SDEC 的 LMC-SS2A16
和網路上的 LMC-SSC2A16
是同樣的所以可參考同一份PDF
想做這個是以後可用一個簡易的LCD
當做Debug使用
因為沒有ICE ~_~
所以就用變通的方法
最少這樣還能簡易的除錯
還不錯用
和網路上的 LMC-SSC2A16
是同樣的所以可參考同一份PDF
想做這個是以後可用一個簡易的LCD
當做Debug使用
因為沒有ICE ~_~
所以就用變通的方法
最少這樣還能簡易的除錯
還不錯用
/*
LMC - ssc2a16 user atmel 89s52
show addr 1 2 3 4 ~~~ 16
one line 00H 01H 02H 03H 10H
two line 40H 41H 42H 43H 50H
By Brian @Taiwan
*/
#include "AT89X52.H"
#define LCM_En P1_0
#define LCM_Rs P1_1
#define LCM_Rw P1_2
#define LCM_Data_port P2
void sys_init(void); //system initial
void msDelay(unsigned int MaxDelay); //del function
void LCM_Init(void); //lcm initial
//void CheckBusy(void); //lcm chech write ok?
void LCM_Com_Writer(void); //lcm write command
void LCM_Show_Data(unsigned char addr,unsigned char *sd);
unsigned int DelayCNT;
unsigned int TimeCNT;
void main(void)
{
unsigned char SData1[]="Brian @Taiwan";
unsigned char SData2[]="LCD Test OK!";
char i=0;
sys_init();
msDelay(10);
LCM_Init();
msDelay(10);
LCM_Show_Data(0x81,SData1);
LCM_Show_Data(0xC2,SData2);
while(1)
{
// code
}
}
void sys_init(void)
{
//ALL SYSTEM REG SET
IE = 0x82; //USER INTERRUPT TIME0
TMOD = 0x02; //SET TIME 0 MODE
TH0 = 256-200; //SET RELOAD VALUE
TL0 = 256-200; // FAST VALUE
TimeCNT=0;
TR0=1; //time enabled
P1=0x00;
P2=0x00;
}
void Time0_int(void)interrupt 1
{
TimeCNT++;
if(TimeCNT>=10)
{
DelayCNT++;
TimeCNT=0;
}
}
void msDelay(unsigned int MaxDelay)
{
DelayCNT = 0x0000;
while(DelayCNT < MaxDelay) {}
}
void LCM_Init(void)
{
LCM_Data_port = 0x30;
LCM_Com_Writer();
LCM_Data_port = 0x30;
LCM_Com_Writer();
/*
function set 001(dl)(n)(f)xx
(dl=1 data=8bit dl=0 4bit)
(n=1 double line n=0 one line)
(f=0=5*7dot f=1 5*10 dot)
*/
LCM_Data_port = 0x38;
LCM_Com_Writer();
LCM_Data_port = 0x06;//enter mode 01(ld)(s) ld=0 addr++ ld=1 addr-- s=1 addr shift
LCM_Com_Writer();
LCM_Data_port = 0x01;//clear lcm show data
LCM_Com_Writer();
/* lcd on/off 1(d)(c)(b) 1=lcd on 0=lcd off d=lcd c=cursor b=bline */
LCM_Data_port = 0x0C;
LCM_Com_Writer();
}
void LCM_Com_Writer(void)
{
LCM_Rs=0;
LCM_Rw=0;
LCM_En=1;
msDelay(1);
LCM_En=0;
msDelay(1);
}
void LCM_Data_Writer(void)
{
LCM_Rs=1;
LCM_Rw=0;
LCM_En=1;
msDelay(1);
LCM_En=0;
LCM_Rs=0;
msDelay(1);
}
void LCM_Show_Data(unsigned char addr,unsigned char *sd)
{
if(addr!=0)
{
LCM_Data_port = addr;
LCM_Com_Writer();
}
while(*sd!=0)
{
LCM_Data_port = *sd++;
LCM_Data_Writer();
}
}
/*void CheckBusy(void)
{
unsigned char i=0x80;
LCM_Rs=0;
LCM_Rw=1;
LCM_En=1;
while(i&0x80)
{
i=P2;
msDelay(2);
}
LCM_Rs=0;
LCM_Rw=0;
LCM_En=0;
} */
1/16/2009
AT89S5X + G_SENSOR
G_SENSOR 使用的是BOSH BMA020
通訊介面是用I2C
由於89s5x沒有提供硬體I2C介面
所以就用軟體模擬
程式只是試驗用的
所以沒有寫的很嚴謹
如果G_SENSOR有問題的話
整個程式會當在ACK
有需要的人可自已在改寫
INT腳未拉出
通訊介面是用I2C
由於89s5x沒有提供硬體I2C介面
所以就用軟體模擬
程式只是試驗用的
所以沒有寫的很嚴謹
如果G_SENSOR有問題的話
整個程式會當在ACK
有需要的人可自已在改寫
INT腳未拉出
/*
BMA020 G_SENSOR 3.3V
需注意io 可使用在16 or 32 bit mcu
USER I2C INTERFACE
By Brian @Taiwan
*/
#include "AT89X52.H"
#define GS_SDI 0x80 //P2.7 low
#define GS_SCK 0x40 //P2.6 low
#define GS_Read 0x71
#define GS_Write 0x70
void sys_init(void);
void msDelay(unsigned int MaxDelay);
void Init_GS(void);
void Send_Comm(unsigned char tx_data);
void Receive_ACK(void);
unsigned char read_Data(unsigned char send_reg);
unsigned char read_Comm(void);
void I2C_Stop(void);
void I2C_Start(void);
void Send_ACK(void);
unsigned int DelayCNT;
unsigned int TimeCNT;
void main(void)
{
unsigned char x_axis_lsb=0,x_axis_msb=0;
sys_init();
Init_GS();
while(1)
{
x_axis_lsb=read_Data(0x02);
x_axis_msb=read_Data(0x03);
//you code
}
}
void sys_init(void)
{
//ALL SYSTEM REG SET
IE = 0x82; //USER INTERRUPT TIME0
TMOD = 0x02; //SET TIME 0 MODE
TH0 = 256-200; //SET RELOAD VALUE
TL0 = 256-200; // FAST VALUE
TimeCNT=0;
TR0=1; //time enabled
P2 = 0x00; //gs port default
}
void Time0_int(void)interrupt 1
{
TimeCNT++;
if(TimeCNT>=10)
{
DelayCNT++;
TimeCNT=0;
}
}
void msDelay(unsigned int MaxDelay)
{
DelayCNT = 0x0000;
while(DelayCNT < MaxDelay) {}
}
void Init_GS(void)
{
I2C_Start();
Send_Comm(GS_Write);
Receive_ACK();
Send_Comm(0x0A); //regedit
Receive_ACK();
Send_Comm(0x02); //soft reset
Receive_ACK();
I2C_Stop();
I2C_Start();
Send_Comm(GS_Write);
Receive_ACK();
Send_Comm(0x14);
Receive_ACK();
Send_Comm(0x16); //+/-4g 1500hz
Receive_ACK();
I2C_Stop();
I2C_Start();
Send_Comm(GS_Write);
Receive_ACK();
Send_Comm(0x15);
Receive_ACK();
Send_Comm(0x40);//enable adv_int
Receive_ACK();
I2C_Stop();
I2C_Start();
Send_Comm(GS_Write);
Receive_ACK();
Send_Comm(0x11);
Receive_ACK();
Send_Comm(0x00);//any_motion_dur hg lg set
Receive_ACK();
I2C_Stop();
I2C_Start();
Send_Comm(GS_Write);
Receive_ACK();
Send_Comm(0x0F);
Receive_ACK();
Send_Comm(0x0A); //hg_dur
Receive_ACK();
I2C_Stop();
I2C_Start();
Send_Comm(GS_Write);
Receive_ACK();
Send_Comm(0x0E);
Receive_ACK();
Send_Comm(0xE0); //hg_thres
Receive_ACK();
I2C_Stop();
I2C_Start();
Send_Comm(GS_Write);
Receive_ACK();
Send_Comm(0x0C);
Receive_ACK();
Send_Comm(0x10); //lg_thres
Receive_ACK();
I2C_Stop();
I2C_Start();
Send_Comm(GS_Write);
Receive_ACK();
Send_Comm(0x0B);
Receive_ACK();
Send_Comm(0x57); //any & hg & lg_enable hg & lg_counter
Receive_ACK();
I2C_Stop();
I2C_Start();
Send_Comm(GS_Write);
Receive_ACK();
Send_Comm(0x0A);
Receive_ACK();
Send_Comm(0x00);
Receive_ACK();
I2C_Stop();
}
void Send_Comm(unsigned char tx_data)
{
unsigned char Port_status;
unsigned char temp;
int i;
for(i=0;i<8;i++)
{
temp = tx_data & GS_SDI;
Port_status = P2;
if(temp)
Port_status |= GS_SDI;
else
Port_status &= ~GS_SDI;
P2 = Port_status;
tx_data<<=1;
// msDelay(1);
P2 |= GS_SCK;
// msDelay(1);
P2 &= ~GS_SCK;
// msDelay(1);
}
}
void Receive_ACK(void)
{
unsigned int i,temp;
P2 |= GS_SDI;
// msDelay(1);
P2 |= GS_SCK;
i=1;
while(i)
{
temp = P2;
temp &=GS_SDI;
if(temp==0)
i=0;
// msDelay(1);
}
P2 &= ~GS_SCK;
// msDelay(1);
}
void I2C_Start(void)
{
P2 |= GS_SCK;
P2 |= GS_SDI;
//msDelay(2);
P2 &= ~GS_SDI;
// msDelay(2);
P2 &= ~GS_SCK;
//msDelay(2);
}
void I2C_Stop(void)
{
P2 |= GS_SCK;
// msDelay(2);
P2 |= GS_SDI;
}
unsigned char read_Data(unsigned char send_reg)
{
unsigned char Rx_data;
I2C_Start();
Send_Comm(GS_Write);
Receive_ACK();
Send_Comm(send_reg);
Receive_ACK();
I2C_Stop();
//msDelay(1);
I2C_Start();
Send_Comm(GS_Read);
Receive_ACK();
// msDelay(1);
Rx_data = read_Comm();
Send_ACK();
I2C_Stop();
return Rx_data;
}
unsigned char read_Comm(void)
{
unsigned char Port_status;
unsigned char temp=0x00;
int i;
for(i=0;i<8;i++)
{
Port_status=P2 & GS_SDI;
Port_status>>=i;
temp|= Port_status;
// msDelay(1);
P2 |= GS_SCK;
// msDelay(1);
P2 &= ~GS_SCK;
// msDelay(1);
}
return temp;
}
void Send_ACK(void)
{
P2 &= ~GS_SDI;
// msDelay(1);
P2 |= GS_SDI;
// msDelay(1);
}
訂閱:
文章 (Atom)