查看: 2586|回复: 25
|
IR RX(CCSC)
[复制链接]
|
|
1。 应用 :Rolling Code security system
2。用途:学校FYP
3。需要效果 :当我成功transmit一个code, 这个code就会变. 所以我是要做双向的.. transmitter send code to RX. 接收器会再send一个signal回去TX告诉它"现在可以变你的Code" 了..暂时想要用LCD..
4。遇到的问题:不知道RX有没成功received我的Code
5。经过什么试验/检查 :breadboard .. 不成功.. 暂时不想出PCB先.
6. 电路图 :
7。 对于问题的头绪/见解:就是不懂什么问题.
.8。对于问题需要的解决方案:
9。资金/资源 全部 Max RM500
[ 本帖最后由 蒙恩健太 于 11-3-2009 05:13 PM 编辑 ] |
|
|
|
|
|
|
|
发表于 11-3-2009 11:43 AM
|
显示全部楼层
|
|
|
|
|
|
|
楼主 |
发表于 11-3-2009 12:10 PM
|
显示全部楼层
是,版主。看过好多边。我明白。。但是你后面说的什么rising time 什么的就不明白。。.但是,我还是想不到。 这里说的是一个signal(一个"bit" ) .但是我是send data. 加start bit 共有9个bits.. 我知道可以用timer辅助, 但是,我没有idea怎样写。。 我检查了我的TSOP1138,成功收到了。。但是,要怎样去capture 那个data,我就没idea.还有。。 我还要compare我的security code.我做的就像是send一个password去on我的东西。。唉。。 真的不知道该怎么办。。
[ 本帖最后由 蒙恩健太 于 11-3-2009 12:14 PM 编辑 ] |
|
|
|
|
|
|
|
楼主 |
发表于 11-3-2009 12:14 PM
|
显示全部楼层
我知道其实是很简单的东西。。但是。。我就是想不到了。。 而且。。 时间要到了。。 没那么多时间去研究。 我的报告还没开始。。 我已经死在 RX 这里很久了。。 对不起大家了。。 |
|
|
|
|
|
|
|
发表于 11-3-2009 12:35 PM
|
显示全部楼层
原帖由 蒙恩健太 于 11-3-2009 12:14 PM 发表
我知道其实是很简单的东西。。但是。。我就是想不到了。。 而且。。 时间要到了。。 没那么多时间去研究。 我的报告还没开始。。 我已经死在 RX 这里很久了。。 对不起大家了。。
要别人帮你, 你就要让别人明白你要做的。。。
现在只知道你要用UART 送Data, 但是过后要做什么?
你现在只是拆一个问题来讲, 但我们希望知道你的整个应用, 不要隐瞒什么的。。
因为方法有很多种, 你可能知道其中一种, 但我们可以建议其他的方法。。。
要自救, 按 【指南】开帖格式发过你的问题。
请不要省略任何一项, 如果不适用于你请放"N.A." (not applicable) |
|
|
|
|
|
|
|
楼主 |
发表于 11-3-2009 05:05 PM
|
显示全部楼层
这是我暂时能想到的TX的Code
- #include <16F877A.h>
- #fuses HS,NOWDT,NOBROWNOUT,PUT,NOPROTECT,NOLVP
- #use delay(clock=20000000)
- #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
- #BYTE PORTB = 0x06
- #BYTE PORTC = 0x07
- #BYTE PORTD = 0x08
- void send_data(char code)
- {
- char temp, whichbit;
- setup_ccp1(CCP_PWM);
- set_pwm1_duty(263L); //38kHz,50%duty
- delay_us(800);
- whichBit = 0;
- while(whichBit<8)
- {
- temp = 1 << whichBit;
- if ((code & temp)==0)
- {
- setup_ccp1(CCP_PWM);
- set_pwm1_duty(263L);
- delay_us(800);
- }
-
- else
- {
- setup_ccp1(CCP_OFF);
- delay_us(800);
- }
-
- whichBit++;
- }
-
- setup_ccp1(CCP_OFF);
- delay_us(800);
- }
-
- void main(){
- //initialize variables
- char code,cmd;
- int z, CAcode,x=5;
- //initialize timer2 for PWM use
- setup_timer_2(T2_DIV_BY_1,132,1);
- printf("Enter the Command\n\r");
- printf("O - Open the Door\n\r");
- printf("C - Close the Door\n\r");
- printf("R - Reset the system\n\r");
- while (1)
- {
-
- //cyclic algorithm equation
- z = (x*x*x + x*x + 1);
- CAcode = z % 256;
-
- //get inputs from PC
- cmd=getc();
-
- if ((cmd=='O')||(cmd=='o'))
- {
- code = (CAcode | 0b00000001);
- do
- {
- send_data(code);
- delay_ms(50);
- }while(input(pin_B0));
- x++;
- }
-
- if ((cmd=='C')||(cmd=='c'))
- {
- code = (CAcode & 0b11111110);
- do
- {
- send_data(code);
- delay_ms(50);
- }while(input(pin_B0));
- x++;
- }
-
- if ((cmd=='R')||(cmd=='r'))
- {
- code = 0b11001011;
- do
- {
- send_data(code);
- delay_ms(10);
- }while(input(pin_B0));
- x = 5;
- }
- }
- }
复制代码
[ 本帖最后由 pic 于 11-3-2009 07:05 PM 编辑 ] |
|
|
|
|
|
|
|
楼主 |
发表于 11-3-2009 05:10 PM
|
显示全部楼层
我暂时能想到的RX...
- #include <16F877A.h>
- #fuses HS,NOWDT,NOBROWNOUT,PUT
- #use delay(clock=20000000)
- #BIT PIRTMR2IF = 0x0c.1
- #BYTE PORTD = 0x08
- #use fast_io(B)
- //LCD Program
- struct lcd_pin_map { // This structure is overlayed
- BOOLEAN enable; // on to an I/O port to gain
- BOOLEAN rs; // access to the LCD pins.
- BOOLEAN rw; // The bits are allocated from
- BOOLEAN unused; // low order up. ENABLE will
- int data : 4; // be pin B0.
- } lcd;
-
- #locate lcd = getenv("sfrORTD") // This puts the entire structure over the port
- #define set_tris_lcd(x) set_tris_d(x)
- #define lcd_type 2 // 0=5x7, 1=5x10, 2=2 lines
- #define lcd_line_two 0x40 // LCD RAM address for the second line
- BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};
- // These bytes need to be sent to the LCD
- // to start it up.
- // The following are used for setting
- // the I/O port direction register.
- struct lcd_pin_map const LCD_WRITE = {0,0,0,0,0}; // For write mode all pins are out
- struct lcd_pin_map const LCD_READ = {0,0,0,0,15}; // For read mode data pins are in
- BYTE lcd_read_byte() {
- BYTE low,high;
- set_tris_lcd(LCD_READ);
- lcd.rw = 1;
- delay_cycles(1);
- lcd.enable = 1;
- delay_cycles(1);
- high = lcd.data;
- lcd.enable = 0;
- delay_cycles(1);
- lcd.enable = 1;
- delay_us(1);
- low = lcd.data;
- lcd.enable = 0;
- set_tris_lcd(LCD_WRITE);
- return( (high<<4) | low);
- }
- void lcd_send_nibble( BYTE n ) {
- lcd.data = n;
- delay_cycles(1);
- lcd.enable = 1;
- delay_us(2);
- lcd.enable = 0;
- }
- void lcd_send_byte( BYTE address, BYTE n ) {
- lcd.rs = 0;
- while ( bit_test(lcd_read_byte(),7) ) ;
- lcd.rs = address;
- delay_cycles(1);
- lcd.rw = 0;
- delay_cycles(1);
- lcd.enable = 0;
- lcd_send_nibble(n >> 4);
- lcd_send_nibble(n & 0xf);
- }
- void lcd_init() {
- BYTE i;
- set_tris_lcd(LCD_WRITE);
- lcd.rs = 0;
- lcd.rw = 0;
- lcd.enable = 0;
- delay_ms(15);
- for(i=1;i<=3;++i) {
- lcd_send_nibble(3);
- delay_ms(5);
- }
- lcd_send_nibble(2);
- for(i=0;i<=3;++i)
- lcd_send_byte(0,LCD_INIT_STRING);
- }
- void lcd_gotoxy( BYTE x, BYTE y) {
- BYTE address;
- if(y!=1)
- address=lcd_line_two;
- else
- address=0;
- address+=x-1;
- lcd_send_byte(0,0x80|address);
- }
- void lcd_putc( char c) {
- switch (c) {
- case '\f' : lcd_send_byte(0,1);
- delay_ms(2);
- break;
- case '\n' : lcd_gotoxy(1,2); break;
- case '\b' : lcd_send_byte(0,0x10); break;
- default : lcd_send_byte(1,c); break;
- }
- }
- char lcd_getc( BYTE x, BYTE y) {
- char value;
- lcd_gotoxy(x,y);
- while ( bit_test(lcd_read_byte(),7) ); // wait until busy flag is low
- lcd.rs=1;
- value = lcd_read_byte();
- lcd.rs=0;
- return(value);
- }
- void feedback()
- {
-
- setup_ccp1(CCP_PWM);
- set_pwm1_duty(263L);
- delay_ms(10);
- }
- void main(){
- //initialize variables
- char whichBit, temp, total,test;
- int code,z,x=5;
- //Setup PortB
- set_tris_b(0xff);
- port_b_pullups (TRUE);
- setup_timer_2(T2_DIV_BY_1,132,1);
- while(1)
- { output_low(pin_D0);
- whichBit = 0;
- total = 0;
- lcd_init();
- lcd_putc("\f");
- lcd_gotoxy(1,1);
- lcd_putc("Standby Mode");
- delay_ms(100);*/
-
- while(!input(Pin_B0)){
-
- delay_us(1000);
-
- while(whichBit<8)
- {
- if(!input(PIN_B0))
- {
- temp = 1 << whichBit;
- total += temp;
- }
- whichBit++;
- delay_us(800);
- }
-
- z = (x*x*x + x*x + 1);
- code = z % 256;
- test = (code & 0b11111110);
-
- if((total&0b11111110) == test)
- {
- if((total&0b00000001)==1)
- { output_high(Pin_D0);
-
- lcd_putc("\f");
- lcd_gotoxy(1,1);
- lcd_putc("Signal Received");
- lcd_gotoxy(1,2);
- lcd_putc("Please Wait!");
- delay_ms(5000);
- lcd_putc("\f");
- lcd_gotoxy(1,1);
- lcd_putc("Opening..");
- delay_ms(5000);
- lcd_putc("\f");
- lcd_gotoxy(1,1);
- lcd_putc("done");
- delay_ms(5000);
- feedback();
- x++;
- }
- if((total&0b00000001)==0)
- {output_high(Pin_D1);
- lcd_putc("\f");
- lcd_gotoxy(1,1);
- lcd_putc("Signal Received");
- lcd_gotoxy(1,2);
- lcd_putc("Please Wait!");
- delay_ms(5000);
- lcd_putc("\f");
- lcd_gotoxy(1,1);
- lcd_putc("Closing..");
- delay_ms(5000);
- lcd_putc("\f");
- lcd_gotoxy(1,1);
- lcd_putc("done");
- delay_ms(5000);
- feedback();
- x++;
- }
- }
- if (total == 0b11001011)
- {
- x=5;
- feedback();
- }*/
- }
- }
-
复制代码
[ 本帖最后由 pic 于 11-3-2009 07:04 PM 编辑 ] |
|
|
|
|
|
|
|
发表于 11-3-2009 06:12 PM
|
显示全部楼层
回复 7# 蒙恩健太 的帖子
请看 5# 吧。 |
|
|
|
|
|
|
|
发表于 11-3-2009 07:02 PM
|
显示全部楼层
|
|
|
|
|
|
|
楼主 |
发表于 11-3-2009 07:18 PM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 11-3-2009 11:57 PM
|
显示全部楼层
原帖由 pic 于 11-3-2009 07:02 PM 发表
复杂的版本要学习TX 的counter, 好像汽车用的, 但是, 有一个要注意的,
就是每一次 RX 都一定能解码?会不会解不到?呵呵。。。
汽车用的是不是有限定次数的?比如说如果你吃饱没事做,在接收范围之外按 Tx,超过一定次数后,你就开不道车门了。得拿回去给人 reset。 |
|
|
|
|
|
|
|
发表于 12-3-2009 12:10 AM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 12-3-2009 12:13 AM
|
显示全部楼层
原帖由 waiweng83 于 11-3-2009 11:57 PM 发表
汽车用的是不是有限定次数的?比如说如果你吃饱没事做,在接收范围之外按 Tx,超过一定次数后,你就开不道车门了。得拿回去给人 reset。
对, 没有错。那个次数, 好像是256次。 |
|
|
|
|
|
|
|
楼主 |
发表于 12-3-2009 09:33 AM
|
显示全部楼层
原帖由 pic 于 12-3-2009 12:10 AM 发表
所谓简单的运算法, 可以很简单很简单, 不一定要做到像KeeLoq 那么强。
只要不重复就可以了, 可以结合随机数字, 如timer 产生的16bit 号码, 然后算出一个或几个数字, 方法是你定的, 只要接收机能解, 能还原 ...
对我现在的程度, 有点点的复杂.. 不过.. 我想我明白你说的.. 让我再花点时间来消化...谢谢噢...
在这个Project..其实有点激发我继续研究PIC的兴趣咯.. 觉得很好玩.. 只是...我太笨了.. 很多东西不懂.. 希望能继续学习更多的东西.. 谢谢指导..
[ 本帖最后由 蒙恩健太 于 12-3-2009 09:51 AM 编辑 ] |
|
|
|
|
|
|
|
发表于 12-3-2009 11:35 AM
|
显示全部楼层
原帖由 蒙恩健太 于 12-3-2009 09:33 AM 发表
在这个Project..其实有点激发我继续研究PIC的兴趣咯.. 觉得很好玩.. 只是...我太笨了.. 很多东西不懂.. 希望能继续学习更多的东西..
欢迎加入这个家庭 我相信你并不笨,只是经验不足。但是只要你真的有兴趣,而且不是“得个讲字“而已,多多上来这里交流,将来一定不简单。 |
|
|
|
|
|
|
|
发表于 13-3-2009 12:08 PM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 13-3-2009 12:45 PM
|
显示全部楼层
|
|
|
|
|
|
|
楼主 |
发表于 16-3-2009 05:45 PM
|
显示全部楼层
我试了几天还是不行.. 我太笨了... @.@"关于那个计算的 ,我还在努力的消化中..
目前我找到的是 CRC-8, 什么x^8 + X^2 +X^1+1.. 关于这个还蛮复杂的.. 还在学习中..
不过, 我现在还是transmit不到..我的TSOP 是一直send high de..当detect到38Khz的时候就会output low..所以.. TX那边是不是要用 NOR gate?? 我之前有试过用AND gate..但是还是不能.. 可能我太笨了.. code 那边有问题吧...@.@" 希望哪位高人能帮忙检查下..谢谢噢..
#include <16F876A.h>
#fuses HS,NOWDT,NOBROWNOUT,PUT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=1200, xmit=PIN_C6, rcv=PIN_C7)
#BYTE PORTB = 0x06
#BYTE PORTC = 0x07
#BYTE PORTD = 0x08
void main()
{
char try;
//initialize timer2 for PWM use
setup_timer_2(T2_DIV_BY_1,132,1);
set_tris_b(0xff);
while (1){
if(input(pin_B0)){
setup_ccp1(CCP_PWM);
set_pwm1_duty(263L); //38kHz,50%duty
putc(try);
}
setup_ccp1(CCP_OFF);
}
}
RXcode
#include <16F877A.h>
#fuses HS,NOWDT,NOBROWNOUT,PUT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=1200, xmit=PIN_C6, rcv=PIN_C7)
#BYTE PORTB = 0x06
#BYTE PORTC = 0x07
#BYTE PORTD = 0x08
void main()
{
char try;
set_tris_d(0x00);
while (1){
output_low(pin_D0);
delay_ms(1000);
if(kbhit()){
try = getc();
if(try =='a')
{
output_high(pin_D0);
delay_ms(5000);
output_low(pin_D0);
delay_ms(5000);
}
}
}
}
[ 本帖最后由 蒙恩健太 于 16-3-2009 08:57 PM 编辑 ] |
|
|
|
|
|
|
|
发表于 16-3-2009 11:19 PM
|
显示全部楼层
原帖由 蒙恩健太 于 16-3-2009 05:45 PM 发表
我试了几天还是不行.. 我太笨了... @.@"关于那个计算的 ,我还在努力的消化中..
目前我找到的是 CRC-8, 什么x^8 + X^2 +X^1+1.. 关于这个还蛮复杂的.. 还在学习中..
不过, 我现在还是transmit不到..我的TSOP 是 ...
你不是笨, 只是在钻牛角尖。。。
【教学】简易IR 遥控电路 (16/03/2009 新增4ch 遥控概念)
http://cforum3.cari.com.my/viewthread.php?tid=1159631&page=1&extra=#pid40194642
我不直接给你答案, 但你看明白我上面的教学后, 你的疑惑应该可以立即解50%, 另50% 就看你的运算法吧。。。
其实不要想那么复杂, 可能只是简单的加减乘除, 比如x=x+2×3/2之类的,你还真的要做到像KEELOQ那样, 你就发达咯。。。呵呵。。
大家也来帮楼主想运算法吧, 就当作是练习好了。。 |
|
|
|
|
|
|
|
楼主 |
发表于 16-3-2009 11:25 PM
|
显示全部楼层
版主.. 我真的很感动.. 你为了我另外再写个教学(明眼人看到都知道你是为我写的..,因为所有的东西都是我需要的.. ) 谢谢噢..我会努力的.. 谢谢..我现在就去消化你的教学..谢谢..  |
|
|
|
|
|
|
| |
本周最热论坛帖子
|