查看: 2964|回复: 38
|
PIC Project (IR 计数 + RS232)
[复制链接]
|
|
发表于 17-1-2007 11:37 AM
|
显示全部楼层
回复 #1 meimeyz 的帖子
你已经做了什么?
很清楚的说。。。
如有PIC Code, 电路, 请放出来。 |
|
|
|
|
|
|
|
楼主 |
发表于 18-1-2007 09:17 AM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 18-1-2007 12:16 PM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 18-1-2007 06:57 PM
|
显示全部楼层
抱歉,我不是要扑冷水。
(assume hardware 100% ok)
但下个星期六要交货,现在还没开始写 pic code,而且还无从下手,你须要的是一个能为你写完整个 code 的人。
pm pic 大大吧!
原帖由 pic 于 18-1-2007 12:16 PM 发表
...
当然, 如果是商业的Project,欢迎你付费找我,我会乐意帮你完成,因为那是我的工作和饭碗。
... |
|
|
|
|
|
|
|
楼主 |
发表于 18-1-2007 11:01 PM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 19-1-2007 09:22 AM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 19-1-2007 10:20 AM
|
显示全部楼层
回复 #6 meimeyz 的帖子
你放的图, IR 的部分能操作吗?那是receiver吗? Transmitter呢?
先不管,我假设你的IR beam是可以操作的,有人走过时relay会click 一下。
其实, 还有更简单的方法,就是用PWM 产生38Khz 的IR signal, 再用IR Module 接收,可是我看不要节外生枝了。
以下是电路, 和PIC code。我花1.5小时作的,你要珍惜。
Firmware 已在Simulator操作, 没问题的。
PC 的RS232接收,用hyperterminal, baud :9600,N,8, flow control:none
当有relay 触发(count/ trigger), counter会自动送出到PC。
如你要request value, 可以按“Q”键。
如你要reset counter, 可以按“X”键。
如你要VB program,请参考旧贴, 有源码。
- /*
- Project Desc:
- 1. This program will count relay input at Pin B0,
- 2. and will automatic send value to PC
- 3. User can request counter value by command "Q"
- 4. User can reset counter value by command "X"
- At PC side:
- a. To test the code, use hyperterminal
- b. Set baud rate : 9600,N,8, Flow control: None
- Code written by: PIC@cArI
- Date: 19 Jan 2007
- Note: This code is tested and work fine in simulator
- */
- #include <16F877A.H>
- #fuses HS,NoPROTECT,noWDT,put,nobrownout,noLVP
- #use delay(clock=20000000) // 20 Mhz
- #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7,ERRORS)
- #define oLED pin_B1
- #define iRelay pin_b0
- #define LEDOn output_high(oLED); // Turn on LED
- #define LEDOff output_low(oLED); // Turn off LED
- int16 counter; // define a 16 bit counter, from 0- 65535
- void ReadRS232()
- {
- int cmd;
- ////////////////////////////////
- // Check If there is Data from PC
- if(kbhit())
- {
- cmd=getc(); // Get Data
- //////////////////////////////
- // If data is "X", Reset Command
- if(cmd=='X')
- {
- counter=0; // reset Counter to 0
- // Send counter to PC
- printf("%lu\n\r",counter);
- }
- //////////////////////////////
- // If data is "Q" , Query command
- if(cmd=='Q')
- {
- // Send counter to PC
- printf("%lu\n\r",counter);
- }
- }
- }
- void main()
- {
- int x;
-
- // Blink LED 5 time, to Indicate MCU is working
- for (x=0; x<5;x++)
- {
- LEDOn; // On LED
- delay_ms(100); // delay 100ms
- LEDOff; // Off LED
- delay_ms(100); // delay 100ms
- }
- counter=0; // reset counter value
- while(1)
- {
- ///////////////////////////////////////
- // If Input is Low, Relay Close/Short
- if(!input(iRelay))
- {
- counter++; // increase counter by 1
- LEDOn; // On LED
-
- printf("%lu\n\r",counter); // send counter value to PC
- while( !input(iRelay) )
- {
- // wait until input go high
- ReadRS232(); // Read RS232
- }
- LEDOff; // Off LED
- }
- ///////////////////////////////////////
- // Read RS232
- ReadRS232();
- }
- }
复制代码 |
|
|
|
|
|
|
|
发表于 19-1-2007 11:40 AM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 19-1-2007 02:13 PM
|
显示全部楼层
我在提醒 楼主 在这么短的时间内,要从 完全不会 coding 到 完成project 做 demo, 机会接近零。 (以我本身的经验,自己第一次 从 0 到 完成 pic coding 也要超过1个星期,而且已有多年电脑 programming 经验)
这一次帮她是救她,以后就。。。保重。。。
“商业的Project”>>钱是可以解决问题的,不一定是商业问题。。。hint hint 。。。 |
|
|
|
|
|
|
|
楼主 |
发表于 22-1-2007 11:34 AM
|
显示全部楼层
PIC Brother, sorry i need to use english comminicate with you is it due to I am using my University's PC to online. I notice some problem, when I test the program there have many "QQQQQ" appear in the hyperterminal. It is i need to add up all the "QQQQQ" when display on my VB???Sry for always disturb.
==========================================
请尽快编辑你的帖子。网上中文输入法 [ 本帖最后由 pic 于 22-1-2007 05:51 PM 编辑 ]
==========================================
GeMan 的翻译:
{翻译}
PIC大大, 对不起, 我须要用英文来与你沟通因为我正在用大学的电脑上网。 我发现一些问题,当我测试程序时,有很多"QQQQQ"出现在 hyperterminal。 我是否需要在 VB 里显示出来的时后,将所有的 "QQQQQ"加起来? 对不起,经常打扰。
{翻译完}
[ 本帖最后由 pic 于 23-1-2007 10:29 AM 编辑 ] |
|
|
|
|
|
|
|
楼主 |
发表于 22-1-2007 12:22 PM
|
显示全部楼层
PIC bro, I am sorry for disturb. I just found that i have make a stupid mistake. I put the wrong cystal for my PIC and now my problem solved and it works very well.Thanks. I will try to make some changes on the PIC code it is because I need 2 Relay input for the PIC. That means I need to collect 2 relay data.
==================================
请尽快编辑你的帖子。网上中文输入法 [ 本帖最后由 pic 于 22-1-2007 05:52 PM 编辑 ]
==================================
GeMan 的翻译:
{翻译}
PIC大大, 对不起 又打扰了。 我刚发现我犯了一个错误。 我在 PIC 里使用不对的 cystal。现在我的问题解决了,操作得非常好。 我现在将要更改一些 PIC 程序,因为我的 PIC 需要 2 个 relay input。 也就是说我需要读 2 个 relay 资料。
{翻译完}
[ 本帖最后由 pic 于 23-1-2007 10:31 AM 编辑 ] |
评分
-
查看全部评分
|
|
|
|
|
|
|
发表于 22-1-2007 05:57 PM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 22-1-2007 06:37 PM
|
显示全部楼层
原帖由 pic 于 22-1-2007 05:57 PM 发表
...
或,有谁可以把搂主的帖翻译成中文,我会把楼主的积分转移给他/她, 不够我再加。
如何改楼主的帖? 没有他的 password ?! |
|
|
|
|
|
|
|
发表于 22-1-2007 06:50 PM
|
显示全部楼层
原帖由 meimeyz 于 22-1-2007 11:34 AM 发表
PIC Brother, sorry i need to use english comminicate with you is it due to I am using my University's PC to online. I notice some problem, when I test the program there have many "QQQQQ" appear in the hyperterminal. It is i need to add up all the "QQQQQ" when display on my VB???Sry for always disturb.
{翻译}
PIC大大, 对不起, 我须要用英文来与你沟通因为我正在用大学的电脑上网。 我发现一些问题,当我测试程序时,有很多"QQQQQ"出现在 hyperterminal。 我是否需要在 VB 里显示出来的时后,将所有的 "QQQQQ"加起来? 对不起,经常打扰。
{翻译完}
原帖由 meimeyz 于 22-1-2007 12:22 PM 发表
PIC bro, I am sorry for disturb. I just found that i have make a stupid mistake. I put the wrong cystal for my PIC and now my problem solved and it works very well.Thanks. I will try to make some changes on the PIC code it is because I need 2 Relay input for the PIC. That means I need to collect 2 relay data.
{翻译}
PIC大大, 对不起 又打扰了。 我刚发现我犯了一个错误。 我在 PIC 里使用不对的 cystal。现在我的问题解决了,操作得非常好。 我现在将要更改一些 PIC 程序,因为我的 PIC 需要 2 个 relay input。 也就是说我需要读 2 个 relay 资料。
{翻译完}
[ 本帖最后由 GeMan 于 22-1-2007 06:52 PM 编辑 ] |
评分
-
查看全部评分
|
|
|
|
|
|
|
发表于 23-1-2007 10:38 AM
|
显示全部楼层
|
|
|
|
|
|
|
楼主 |
发表于 24-1-2007 01:53 AM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 24-1-2007 10:44 AM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 24-1-2007 07:39 PM
|
显示全部楼层
原帖由 meimeyz 于 24-1-2007 01:53 AM 发表
哇!!! 别扣我的分数嘛。。。对不起咯!!!在那个时候得我根本就没时间找网上中文的软件啊!!!我保证没下次了啦。。。别生气嘛!!! 不过在这同时我还是需要PIC大大帮我最后一个忙 ...
我从来不用中文的软件来打字,我都用:
使用网上输入法发表新帖: 简体英中、 简体拼音、 简繁拼音、 简体仓颉、 简繁仓颉
使用网上输入法回复帖子: 简体英中、 简体拼音、 简繁拼音、 简体仓颉、 简繁仓颉
很好用的。 这次当作是交学费吧。
看了 PIC 大大的 c++ code, (对不起,不是要踢馆), 比较适合 一个 relay input 的操作。
如果要 2 个 relay, 概念要有些改变。 要不然,当一个人站在第一个 IR 前 不动, 第二个 IR 有人走过,就 detect 不到第二个 IR 的人了。 |
|
|
|
|
|
|
|
发表于 24-1-2007 10:26 PM
|
显示全部楼层
OK,受了"学费",就要教一点点。
以下是改至 PIC 大大 的 ,还是要谢谢 PIC 大大:
这个 code 没有经过 compile check 因为我没有 c compiler (我用 assembly 的)。
请 PIC 大大 ,帮忙 complie 看有没有 syntax 问题。
//modifed from PIC da da's code
// relay 1 definition
#define oLED1 pin_B1
#define iRelay1 pin_b0
#define LED1On output_high(oLED1); // Turn on LED 1
#define LED1Off output_low(oLED1); // Turn off LED 1
// relay 2 definition
#define oLED2 pin_B???
#define iRelay2 pin_b???
#define LED2On output_high(oLED2); // Turn on LED 2
#define LED2Off output_low(oLED2); // Turn off LED 2
int16 counter1;
int16 counter2;
void ReadRS232()
{
int cmd;
////////////////////////////////
// Check If there is Data from PC
if(kbhit())
{
cmd=getc(); // Get Data
//////////////////////////////
// If data is "X", Reset Command
if(cmd=='X')
{
counter1=0; // reset Counter to 0
counter2=0; // reset Counter to 0
// Send counter to PC
printf("%lu\n\r",counter1);
printf("%lu\n\r",counter2);
}
//////////////////////////////
// If data is "Q" , Query command
if(cmd=='Q')
{
// Send counter to PC
printf("%lu\n\r",counter1);
printf("%lu\n\r",counter2);
}
}
}
void main()
{
int x;
int RlyInput1; //relay 1 input
int PrevRlyInput1; //previous relay 1 input
int RlyInput2; //relay 2 input
int PrevRlyInput2; //previous relay 2 input
// Blink LED 5 time, to Indicate MCU is working
for (x=0; x<5;x++)
{
LEDOn; // On LED
delay_ms(100); // delay 100ms
LEDOff; // Off LED
delay_ms(100); // delay 100ms
}
counter1=0; // reset counter value
counter2=0; // reset counter value
RlyInput1=input(iRelay1);
RlyInput2=input(iRelay2);
while(1)
{
// remember previous relay input status
PrevRlyInput1=RlyInput1;
PrevRlyInput2=RlyInput2;
// get current relay input status
RlyInput1=input(iRelay1);
RlyInput2=input(iRelay2);
///////////////////////////////////////
// If Input is Low, Relay Close/Short
if(!RlyInput1)
{
if(PrevRlyInput1) // if previous input high (open) , this means relay clicked, need to add 1
{
counter1++; // increase counter by 1
// always send 2 counter values so that PC will not confuse
printf("%lu\n\r",counter1); // send counter value to PC
printf("%lu\n\r",counter2); // send counter value to PC
}
LED1On; // On LED
}
if(RlyInput1) // If Input is high, Relay open
{
LED1Off; // Off LED
}
///////////////////////////////////////
// If Input is Low, Relay Close/Short
if(!RlyInput2)
{
if(PrevRlyInput2) // if previous input high (open) , this means relay clicked, need to add 1
{
counter2++; // increase counter by 1
// always send 2 counter values so that PC will not confuse
printf("%lu\n\r",counter1); // send counter value to PC
printf("%lu\n\r",counter2); // send counter value to PC
}
LED2On; // On LED
}
if(RlyInput2) // If Input is high, Relay open
{
LED2Off; // Off LED
}
///////////////////////////////////////
// Read RS232
ReadRS232();
}
} |
|
|
|
|
|
|
| |
本周最热论坛帖子
|