查看: 2375|回复: 16
|
soft I2C & soft uart的问题 (mikro c & ccs c)
[复制链接]
|
|
嗨!我是新会员。我不是很会用soft I2C 的功能 (我是用 microC compiler), 要如何更改soft i2C 的clock?
[ 本帖最后由 fritlizt 于 19-8-2009 01:44 PM 编辑 ] |
|
|
|
|
|
|
|
楼主 |
发表于 19-8-2009 12:24 PM
|
显示全部楼层
如何用io port (除了C7)来收 8 bits data?
我想问要如何用io port (除了C7)来收 8 bits data. 我是用CCS compiler 来写这些程序的。我试过用
“#USE RS232(BAUD=9600, XMIT=PIN_B1, RCV=PIN_B0)“, 这个程序可以发送data, 可是不能收data. 有没有决解方法。 |
|
|
|
|
|
|
|
发表于 19-8-2009 02:04 PM
|
显示全部楼层
|
|
|
|
|
|
|
楼主 |
发表于 19-8-2009 02:49 PM
|
显示全部楼层
回复 3# fritlizt 的帖子
对不起,小弟是MMU 二年级的学生, 刚刚 学用CCS compiler,有很多功能我都不是很会用。请大师多多指教。我的问题是无法用port_B0来 receive data. 我用的IC是PIC16f887. 我试了很多天, 可是都收不到data。请大师打救小弟. |
|
|
|
|
|
|
|
发表于 19-8-2009 04:08 PM
|
显示全部楼层
回复 4# xiao1987 的帖子
port B0 input/output有没有 设好? |
|
|
|
|
|
|
|
楼主 |
发表于 19-8-2009 04:36 PM
|
显示全部楼层
回复 5# bakayalo 的帖子
以下是小弟写的程序,我用MULTIMETER 试了很多次,PIN_C2都无法试拿到 五 VOLTS. 我都是拿 0 VOLTS。请大师指点迷津。
#include <16F887.h>
#fuses INTRC
#use delay(clock = 4000000)
char state=0;
#USE RS232(BAUD=9600, XMIT=PIN_B1, RCV=PIN_B0)
#INT_RDA
void isr_rs232(){
state=1;
}
void main (){
setup_oscillator(OSC_4MHZ);
enable_interrupts(GLOBAL);
enable_interrupts(INT_RDA);
output_low(PIN_C2);
while(TRUE){
if(state==1){
output_high(PIN_C2);
}else{
output_low(PIN_C2);
}
}
} |
|
|
|
|
|
|
|
发表于 19-8-2009 04:52 PM
|
显示全部楼层
回复 6# xiao1987 的帖子
两个主要可能性:
1。uart收到了,只是你的C2不能high
2。uart收不到
-〉2。用debug mode,试下 放break point在 “state=1;”看uart有没有收到?
--〉port 的 input/output好像没有设好将的(B0 和C2)? 请参考 datasheet,port direction, tris。。 |
|
|
|
|
|
|
|
楼主 |
发表于 19-8-2009 05:34 PM
|
显示全部楼层
回复 7# bakayalo 的帖子
小弟用过大师教的方法, 得到的结果是UART 没收到DATA. 小弟想请问大师,我用的是CCS COMPILER , 有需要更改TRIS 吗? 我试过更改TRIS, 可是USART 还是拿不到DATA? 大师救救小弟!!! |
|
|
|
|
|
|
|
发表于 20-8-2009 11:23 AM
|
显示全部楼层
为什么你不选用 RS485 来做你的多个传送和接收 data 的连接点呢? |
|
|
|
|
|
|
|
楼主 |
发表于 20-8-2009 12:51 PM
|
显示全部楼层
回复 9# sky_cs1986 的帖子
我不会用RS485, 大师请你传我两招!!! |
|
|
|
|
|
|
|
发表于 20-8-2009 03:15 PM
|
显示全部楼层
原帖由 xiao1987 于 19-8-2009 04:36 PM 发表
以下是小弟写的程序,我用MULTIMETER 试了很多次,PIN_C2都无法试拿到 五 VOLTS. 我都是拿 0 VOLTS。请大师指点迷津。
#include
#fuses INTRC
#use delay(clock = 4000000)
char state=0;
#USE RS232(BAUD=960 ...
#int_rda 是给hardware usart.
你用是software usart
software usart不能有receive interrupt,除非你接在external interrupt pin.用external interrupt来trigger receive. |
|
|
|
|
|
|
|
发表于 20-8-2009 04:12 PM
|
显示全部楼层
|
|
|
|
|
|
|
楼主 |
发表于 21-8-2009 09:27 AM
|
显示全部楼层
回复 11# fritlizt 的帖子
以下是小弟修改的程序,小弟用PORTB_0 as EXTERNAL INTERRUPT PIN, PORTB_0 会被triggered 当收到送来的data的时候, 可是小弟收不到送来的 8-bits data. 请老师教教小弟要如何用IO port 来收data。
#include <16F887.h>
#fuses INTRC
#use delay(clock = 4000000)
char state=0;
char data;
#USE RS232(BAUD=9600, XMIT=PIN_B1, RCV=PIN_B0)
//#INT_RDA
//void isr_rs232(){
// state=1;
//}
#INT_RB
void isr_RB(){
data=getc();
state=1;
}
void main (){
setup_oscillator(OSC_4MHZ);
enable_interrupts(GLOBAL);
enable_interrupts(INT_RDA);
enable_interrupts(INT_RB0);
enable_interrupts(INT_RB);
output_low(PIN_C2);
while(TRUE){
if(state==1){
if(data==0x01){
output_high(PIN_C2);
}
}
}
} |
|
|
|
|
|
|
|
楼主 |
发表于 21-8-2009 09:36 AM
|
显示全部楼层
回复 12# pic 的帖子
各位版主,在小弟心里,你们已经是大师了, 可是你们如此谦虚,小弟要和各位老师们多多学习。请各位多多指教。 |
|
|
|
|
|
|
|
发表于 21-8-2009 10:46 PM
|
显示全部楼层
#include <16F887.h>
#fuses INTRC
#use delay(clock = 4000000)
char state=0;
char data;
#USE RS232(BAUD=9600, XMIT=PIN_B1, RCV=PIN_B0)
//#INT_RDA
//void isr_rs232(){
// state=1;
//}
//#INT_RB
//void isr_RB(){
// data=getc();
// state=1;
//}
void main (){
setup_oscillator(OSC_4MHZ);
enable_interrupts(GLOBAL);
enable_interrupts(INT_RDA);
enable_interrupts(INT_RB0);
enable_interrupts(INT_RB);
output_low(PIN_C2);
while(TRUE){
if(kbhit())//if rs232 got data input
{
data=getc();
//if(data==0x01)
//{
output_high(PIN_C2);
//}
}
}
} |
|
|
|
|
|
|
|
楼主 |
发表于 22-8-2009 10:44 AM
|
显示全部楼层
回复 15# hi--520 的帖子
小弟用你的code试了,结果可以接收到8-bits data。真的是非常感谢这位老师的帮忙。谢谢老师出手打救小弟。还有各位曾经给过宝贵意见的老师们,小弟也非常感谢你们。衷心地感谢各位老师们。 |
|
|
|
|
|
|
|
发表于 22-8-2009 11:20 AM
|
显示全部楼层
回复 15# hi--520 的帖子
我用了你的方法在PIC16F877A, 通常我们用 PIN_C6 & PIN_C7 来传送和接收 data。现在这个方法可以用其它 PIN 来当作传送和接收来用,真的很不错。感谢这位大大!
#include <16F877A.h>
#fuses HS, NOWDT, NOPUT, NODEBUG, NOLVP, NOBROWNOUT, CPD, PROTECT, NOWRT
#use delay(clock = 20000000)
#USE RS232(BAUD=9600, XMIT=PIN_B1, RCV=PIN_B0)
char data;
void main ()
{
output_low(PIN_C0);
while(TRUE){
if(kbhit())//if rs232 got data input
{
data=getc();
if(data==0x01)
{
output_high(PIN_C0);
}
else
{
output_low(PIN_C0);
}
}
} |
|
|
|
|
|
|
| |
本周最热论坛帖子
|