• slider image 442
  • slider image 483
  • slider image 484
  • slider image 485
  • slider image 486
  • slider image 487
  • slider image 488
  • slider image 491
:::

論壇索引


Board index » All Posts (shiyong)




SCI接收中斷只能響應一次是為什麼
#11
新會員
新會員


我的異步串行通訊發送正常,但是接收數據時候好像接收中斷只能響應一次,不能正確接收數據,請問又没有人遇到過這種問題,請各位幫幫忙

發表於: 2009/3/27 22:20
頂部


请教16F876写EEPROM的问题
#12
新會員
新會員


我在准程序中调用 了
unsigned char I2C_Byte_Read(unsigned char AddH,unsigned char AddL);
void I2C_Byte_Write(unsigned char AddH,unsigned char AddL,unsigned char WriteByte);

Main程序中这么写的
I2C_Byte_Write(0x00,0x00,11);
I2C_Byte_Write(0x00,0x02,99);
I2C_Byte_Write(0x00,0x04,99);
m_Values[7]=I2C_CurrentByte_Read();
m_Values[1]=I2C_Byte_Read(0x00,0x00);
m_Values[2]=I2C_Byte_Read(0x00,0x04);

利用ICD2仿真器看看m_Values一直是零,但是发送好像是能够收到应答的,我查看了I2C_Error1,I2C_Error2,I2C_Error3都一直是零吧中断是没有写进去还是没有读出来。不知道问题出在哪里。请大家帮我看看,谢谢
#ifndef E2prom_h
#define E2prom_h
//#include <pic168xa.h>
#include <pic.h>


#define D_SCL TRISC3 //SCL方向控制
#define D_SDA TRISC4 //SDA方向控制
#define SCL RC3
#define SDA RC4
#define WriteCommand 0xA0 //写命令字
#define ReadCommand 0xA1 //读命令字
char Ack_Temp=0; //用于检测应答,为0有应答,1无应答

char I2C_Error1=0;//0无通讯错误,1有通讯错误
char I2C_Error2=0;
char I2C_Error3=0;
char I2C_Error=0;

void Delays(unsigned char Time_delay);
void I2C_Delay(unsigned char Time_delay);
void I2C_Init(void);
void I2C_Start(void);
void I2C_Stop(void);
void I2C_AckOut(void);
void I2C_NAckOut(void);
void I2C_AckRec();
void I2C_OneByteOut(unsigned char OneByte) ;
unsigned char I2C_OneByteIn(void);
//unsigned char I2C_ReadOneByte();
//unsigned int I2C_ReadOneWord();
void I2C_WriteAddress(unsigned char cmd,unsigned char addh,unsigned char addl);
void I2C_Byte_Write(unsigned char AddH,unsigned char AddL,unsigned char WriteByte);

void I2C_Word_Write(unsigned char AddH,unsigned char AddL,unsigned char DataH,unsigned char DataL);
void I2C_Page_Write(unsigned char AddH,unsigned char AddL,unsigned char Datanum,unsigned char *P_Data);
unsigned char I2C_CurrentByte_Read();
unsigned char I2C_Byte_Read(unsigned char AddH,unsigned char AddL);
unsigned int I2C_Word_Read(unsigned char AddH,unsigned char AddL);
void I2C_Page_Read(unsigned char AddH,unsigned char AddL,unsigned char Datanum,unsigned char *P_Data);
void I2C_WriteAll();

/*----------------------------------------------------------
长延时程序
Time_delay=1时 延时250us
-----------------------------------------------------------*/
void Delays(unsigned char Time_delay)
{
unsigned char i,j;
for(i=0;i<=Time_delay-1;i++)
{for(j=0;j<0xfd;j++)asm("nop");}
}

/*--------------------------------------------------------
I2C总线延时程序
---------------------------------------------------------*/
void I2C_Delay(unsigned char Time_delay)
{
unsigned char i;
for(i=0;i<=Time_delay;i++)
asm("nop");
}

/*--------------------------------------------------------
E2prom初始化设置
---------------------------------------------------------*/
void I2C_Init(void)
{
D_SCL=0;
D_SDA=0;
SDA=1;
SCL=1;
}

/*---------------------------------------------------------
在I2C总线上产生起始信号
----------------------------------------------------------*/
void I2C_Start(void)
{
D_SCL=0;
D_SDA=0;
SCL=0;
I2C_Delay(8);
SDA=1; //SCL SDA为高电平
SCL=1;
I2C_Delay(8);
SDA=0; //SCL高时,SDA由1变0产生起始位
I2C_Delay(3);
SCL=0;
I2C_Delay(8);
}


/*---------------------------------------------------------
在I2C总线上产生停止信号
----------------------------------------------------------*/
void I2C_Stop(void)
{
D_SCL=0;
D_SDA=0;
SCL=0;
I2C_Delay(8);
SDA=0; //确保SDA=0
SCL=1; //确保SCL=1
I2C_Delay(8);
SDA=1; //SCL=1时,SDA有0变1产生停止位
SCL=0;
I2C_Delay(8);
}
/*---------------------------------------------------------
在I2C总线上产生应答信号
----------------------------------------------------------*/
void I2C_AckOut(void)
{
D_SCL=0;
D_SDA=0;
SCL=0;
I2C_Delay(8);
SDA=0; //SDA=0
I2C_Delay(3);
SCL=1; //产生时钟上升沿,产生应答
I2C_Delay(10); //准备发送应答
SCL=0;
I2C_Delay(8);
// SDA=1;
I2C_Delay(8);
}


/*---------------------------------------------------------
在I2C总线上产生非应答信号
----------------------------------------------------------*/
void I2C_NAckOut(void)
{
D_SCL=0;
D_SDA=0;
SCL=0;
I2C_Delay(8);
SDA=1; //SDA=1
I2C_Delay(8);
SCL=1; //SCL=1产生时钟上升沿
I2C_Delay(8); //发送非应答
SCL=0; //时钟结束
I2C_Delay(8);
// SDA=1;
// I2C_Delay(8);
}


/*----------------------------------------------------
从总线上接受应答信号,存放到Ack_Temp中
-----------------------------------------------------*/
void I2C_AckRec()
{
//SCL=0;I2C_Delay(8);
//SCL-1;I2C_Delay(8);
//SCL=0;I2C_Delay(8);
Ack_Temp=1;
D_SCL=0;
D_SDA=1;
SDA=1; //SDA置高,准备接受应答
//I2C_Delay(8);
SCL=1;
//Ack_Temp=SDA;
if(SDA)Ack_Temp=1;
else Ack_Temp=0;
I2C_Delay(3);
SCL=0; //
I2C_Delay(6);
}

/*--------------------------------------------------
向E2PROM写一个字节
入口参数:OneByte是要写入的数
---------------------------------------------------*/
void I2C_OneByteOut(unsigned char OneByte)
{
unsigned char i;
D_SCL=0;
D_SDA=0;

SCL=0;
I2C_Delay(8);
for(i=0;i<8;i++)
{
if(OneByte&0x80==0x80)SDA=1;
else SDA=0;
// I2C_Delay(10);
SCL=1;
I2C_Delay(10);
OneByte=OneByte<<1;
SCL=0;
//SDA=0;
}
I2C_AckRec(); //接收从器件应答信号
}

/*---------------------------------------------------
从E2PROM读取一个字节数据
函数返回值:OneByte是从E2PROM读取的字节
----------------------------------------------------*/
unsigned char I2C_OneByteIn()
{
unsigned char i, OneByte;
D_SDA=1;
SCL=0;
OneByte=0;
for(i=0;i<=7;i++)
{
SDA = 1;
OneByte<<=1; //左移一位
SCL=1;
I2C_Delay(5);
if(SDA) OneByte|=0x01;
else OneByte=OneByte&0xfe;
I2C_Delay(5);asm("nop");
SCL=0;
I2C_Delay(5);
} //从i2c总线上读取字数据的高位字节
//D_SDA=0;
return(OneByte);
}






/*---------------------------------------------------
向E2prom写地址高字节和地址低字节
入口参数:Cmd控制命令字
AddH,AddL分别是地址高八位好低八位
----------------------------------------------------*/
void I2C_WriteAddress(unsigned char Cmd,unsigned char AddH,unsigned char AddL)
{
I2C_Start();
I2C_OneByteOut(Cmd);
I2C_AckRec();
if(Ack_Temp==1)
{I2C_Error1=1; return;}

I2C_OneByteOut(AddH);
if(Ack_Temp==1)
{
I2C_Error2=1; return;}
I2C_OneByteOut(AddL);
if(Ack_Temp==1)
{
I2C_Error3=1; return;}
}


/*---------------------------------------------------
向E2prom写一个字节,并产生停止位
入口参数:WriteByte 要写入的字节
AddH,AddL要写入的E2PROM的高低地址
----------------------------------------------------*/
void I2C_Byte_Write(unsigned char AddH,unsigned char AddL,unsigned char WriteByte)
{
I2C_WriteAddress(WriteCommand,AddH,AddL);
/*I2C_OneByteOut(WriteCommand);
I2C_Delay(8);
I2C_OneByteOut(AddH);
I2C_Delay(8);
I2C_OneByteOut(AddL);
I2C_Delay(8); */
I2C_OneByteOut(WriteByte);
if(Ack_Temp==1)
{
I2C_Error=1; return;}
I2C_Stop();
}


/*---------------------------------------------------
向E2prom写一个字,并产生停止位
入口参数:DataH 要写入字的高字节
DataL 要写入字的低字节
----------------------------------------------------*/
void I2C_Word_Write(unsigned char AddH,unsigned char AddL,unsigned char DataH,unsigned char DataL)
{
I2C_WriteAddress(WriteCommand,AddH,AddL);
I2C_OneByteOut(DataH); //送高字节
I2C_OneByteOut(DataL); //送低字节
I2C_Stop();
}


/*---------------------------------------------------
向E2prom连续写一组数,(即按页写入)
入口参数:AddH,AddL 起始地址的高位和低位
Datanum 一次写入的字节数
*P_Data指向存放被写入的数据数组的指针
----------------------------------------------------*/
void I2C_Page_Write(unsigned char AddH,unsigned char AddL,unsigned char Datanum,unsigned char *P_Data)
{
unsigned char i;
I2C_WriteAddress(WriteCommand,AddH,AddL);
for (i=0;i<Datanum;i++)
{
I2C_OneByteOut(*(P_Data+i));
}
I2C_Stop();
Delays(0x0f); //延时

}
void I2C_WriteAll()
{
unsigned int i,j;
unsigned char k;
I2C_WriteAddress(WriteCommand,0x00,0x00);
for (i=0;i<1024;i++)
{
if(k==0)k=1;
else if(k!=0)k=0;
for(j=0;j<256;j++)
{I2C_OneByteOut(11);
I2C_Delay(8);
I2C_OneByteOut(22);RA5=k; }
}
I2C_Stop();
Delays(0x0f); //延时
}
/*--------------------------------------------------------
---------------------------------------------------------*/
unsigned char I2C_CurrentByte_Read()
{
unsigned char CurrentByte;
I2C_Start();
I2C_OneByteOut(ReadCommand);
CurrentByte= I2C_OneByteIn();
I2C_Delay(5);
I2C_NAckOut();
I2C_Stop();
return(CurrentByte);
}
/*-------------------------------------------------------
从E2PROM读取一个字节
入口参数:AddH,AddL是读取数据存放地址的高位好低位
函数返回值:从E2PROM读取的字节数据 ReadByte
--------------------------------------------------------*/
unsigned char I2C_Byte_Read(unsigned char AddH,unsigned char AddL)
{
unsigned char ReadByte;
I2C_WriteAddress(WriteCommand,AddH,AddL);
I2C_Start();
I2C_OneByteOut(ReadCommand) ;
//I2C_AckOut();
ReadByte= I2C_OneByteIn();
I2C_Delay(5);
I2C_NAckOut();
I2C_Stop();
Delays(0xff); //延时
return(ReadByte);
}
/*-------------------------------------------------------
从E2PROM读取一个字节
入口参数:AddH,AddL是读取数据存放地址的高位好低位
函数返回值:从E2PROM读取的字节数据 ReadByte
--------------------------------------------------------*/
unsigned int I2C_Word_Read(unsigned char AddH,unsigned char AddL)
{
unsigned char ReadWord;
I2C_WriteAddress(WriteCommand,AddH,AddL);
I2C_Start();
I2C_OneByteOut(ReadCommand);

ReadWord= I2C_OneByteIn();
I2C_AckOut();
ReadWord=ReadWord<<8;
I2C_Delay(8);
ReadWord=ReadWord+I2C_OneByteIn();
I2C_NAckOut();
I2C_Stop();
Delays(0xff); //延时
return(ReadWord);
}
/*--------------------------------------------------------------
向E2prom连续读取一组数,(即按页读)
入口参数:AddH,AddL 起始地址的高位和低位
Datanum 一次读出的字节数
*P_Data指向存放读出的数据数组的指针
---------------------------------------------------------------*/
void I2C_Page_Read(unsigned char AddH,unsigned char AddL,unsigned char Datanum,unsigned char *P_Data)
{
unsigned char i;
I2C_WriteAddress(WriteCommand,AddH,AddL);
I2C_Start();
I2C_OneByteOut(ReadCommand);
for(i=0;i<Datanum;i++)
{
*(P_Data+i)=I2C_OneByteIn();
if(i==Datanum) I2C_NAckOut();
else I2C_AckOut();
}
I2C_Stop();
Delays(0xff); //延时
Delays(0xff); //延时
}


#endif

發表於: 2009/3/15 17:43
頂部


Re: 開發板一上電,電源電壓就講下去了
#13
新會員
新會員


謝謝
可能是電源問題,今天換一個電源就好了,但是我不敢確定,因為之前又焊了三個LED上去。

發表於: 2008/12/8 20:47
頂部


PICC中的I2C例程问题
#14
新會員
新會員


我要做一個軟件實現是I2C讀寫E2PROM的程序,剛好看到PICC中有例子,就想在它的例子上修改,這樣寫起來方便一些,可是有些地方看不懂,想再次問一下,呵呵
void
i2c_Restart(void)
{
SCL_LOW(); /* ensure clock is low */
SDA_HIGH(); /* ensure data is high */

DelayUs(I2C_TM_DATA_SU);

SCL_DIR = I2C_INPUT; /* clock pulse high */
DelayUs(I2C_TM_SCL_HIGH);

SDA_LOW(); /* the high->low transition */
DelayUs(I2C_TM_START_HD);
return;
}
在上面這段產生重复起始位的程序中,我不明白這句
SCL_DIR = I2C_INPUT; /* clock pulse high */
這句應該理解為將scl設置為輸出對嗎,可是重复起始位設置是要在SCL為1時,SDA由1變為零產生啊,感覺這一句應該寫為SCL_HIGH();才對啊。也許是我理解錯了,請幫忙看看。(I2C_INPUT在頭文件中定義為1,SCL_DIR定義為TRISC3)

發表於: 2008/12/8 20:44
頂部


開發板一上電,電源電壓就講下去了
#15
新會員
新會員


開發板一上電,電源電壓就講下去了,我是先用可調的電源跳到5V,將開發板一接上,電源電壓就降到了2V的樣子,電流上升到1A(單片機最高是不能超過25mA的吧)。電路都檢查了,也没發現什麽問題;之前有三極管接反了,但那樣的話電源與地直接短路,不會對單片機有什麽影響的,後來我又將三極管重新焊接了,還是同樣的問題。不加電的時候測量VCC與GND之間大約17k歐,大家幫忙看看啊

發表於: 2008/12/7 17:07
頂部


Re: PICC編譯時將錯誤指向了頭文件了
#16
新會員
新會員


谢谢
這個問題剛剛解決了,的確是在主程序中少了一個大括號。
但又出現了新的問題,提示下面段錯誤
for(n= ZFLocation[0][0];n>=0;n--)
{
i= ZFLocation[0][n];
DISPONEWORD();
}
ZFLocation數組是我在頭文件中定義的數組unsigned char類型
錯誤提示
Error[000] D:\Program Files\Microchip\SHIYONG\DispInitbar.c 20 : undefined identifier: ZFLocation
Error[000] D:\Program Files\Microchip\SHIYONG\DispInitbar.c 20 : pointer required
我是初學者,謝謝大家

發表於: 2008/12/6 12:50
頂部


PICC編譯時將錯誤指向了頭文件了
#17
新會員
新會員


我做了一個小顯示器程序,編譯時發現了一個很奇怪的問題,出錯信息總是指向頭文件,
它的意思是頭文件的
static volatile unsigned char TMR0 @ 0x01;行
少了半個大括號,當我將之一行注釋掉,它又会指向下一行,提示同样的错误,高手幫我看看吧
一般来说头文件是不会错的吧,可是我是在不知道怎么回事。
这是编译的出错信息:
Clean: Deleting intermediary and output files.
Clean: Deleted file "D:\Program Files\Microchip\SHIYONG\MAIN.cce".
Clean: Done.
Executing: "d:\program files\microchip\picc\BIN\PICC.EXE" -C -E"MAIN.cce" "MAIN.c" -O"MAIN.obj" -I"D:\Program Files\Microchip\PICC\include" -Zg9 -O -ASMLIST -ICD -Q -MPLAB -16F73
Error[000] D:\Program Files\Microchip\PICC\include\pic16f7x.h 16 : probable missing '}' in previous block
Halting build on first failure as requested.
BUILD FAILED: Sat Dec 06 09:34:07 2008
这是頭文件的一部分
/*
* Header file for the Microchip
* PIC 16F72 chip
* PIC 16F73 chip
* PIC 16F74 chip
* PIC 16F76 chip
* PIC 16F77 chip
* Midrange Microcontroller
*/

#if defined(_16F74) || defined(_16F77)
#define __PINS_40
#endif


static volatile unsigned char TMR0 @ 0x01;
static volatile unsigned char PCL @ 0x02;
static volatile unsigned char STATUS @ 0x03;
static unsigned char FSR @ 0x04;
static volatile unsigned char PORTA @ 0x05;
static volatile unsigned char PORTB @ 0x06;
static volatile unsigned char PORTC @ 0x07;

#ifdef __PINS_40

發表於: 2008/12/6 10:29
頂部



« 1 (2)



:::

Microchip連結

https://www.facebook.com/microchiptechnologytaiwan/
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=13
https://mu.microchip.com/page/tmu
http://elearning.microchip.com.tw/modules/tad_link/index.php?cate_sn=1
https://page.microchip.com/APAC-PrefCenters-TW.html
http://www.microchip.com/
http://www.microchip.com/treelink
http://www.microchipdirect.com/
http://www.microchip.com.cn/newcommunity/index.php?m=Video&a=index&id=103
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=2
http://www.microchip.com.tw/Data_CD/eLearning/index.html
http://www.microchip.com.tw/RTC/RTC_DVD/
https://www.microchip.com/development-tools/
https://www.youtube.com/user/MicrochipTechnology
[ more... ]

教育訓練中心

!開發工具購買
辦法說明 [業界客戶] [教育單位]
----------------------------------
!校園樣品申請
辦法說明 [教師資格] [學生資格]
----------------------------------