PDA

View Full Version : PT2262/2272 Lập trình mã hóa/giải mã với PIC C


cskiller
11-06-2009, 04:36 PM
Cặp chip PT2262/2272 được sử dụng rất phổ biến trong việc điều khiển từ xa các thiết bị sử dụng RF. Việc sử dụng vi điều khiển để thay thế chức năng mã hóa/giải mã của PT2262/PT2272 sẽ giúp các thiết kế mạch đơn giản bằng việc sử dụng phần mềm để thay thế chức năng của nó.
Tài liệu này cung cấp 1 trong các cách phân tích phương thức mã hóa/giải mã của PT2262/2272 và hiện thực bằng ngôn ngữ CCS C với vi điều khiển PIC thông dụng.
http://i44.photobucket.com/albums/f7/lmquyen/Forums/suno/image004.jpg
Regards

Downloads: PT2262/2272 Lap trinh va Ung dung voi PIC C.pdf (http://forum.suno.vn/attachment.php?attachmentid=1025&stc=1&d=1244708356)

cskiller
16-12-2009, 01:49 PM
Updated new link.

vu son
23-09-2010, 11:50 PM
Thank bác ''cskiller'' nhiều em đang làm về cái này.

khaidang27
14-01-2011, 11:17 PM
Updated new link.

Chân thành cảm ơn anh rất nhiều, tài liệu tuy chưa đọc (đang chờ down xong), nhưng có lẽ rất là quý hiếm. Cảm ơn sự chia sẽ của anh rất nhiều. hihihihi

picvn_letruyen
15-01-2011, 12:47 AM
cảm ơn bạn đã chia sẽ tài liệu, chúc bạn thành công.

kenburo
23-03-2011, 11:04 PM
Thanks bác vô cùng chúc bác thành công

motu
25-03-2011, 09:55 PM
Thank bác nhiều lắm, dù bài viết đã lâu nhưng gãi đúng chỗ ngứa của em :D.

motu
22-04-2011, 07:37 PM
e đọc tài liệu này cả tháng nay mới hiểu được chút chút, có mấy thắc mắc không tài nào hiểu được, mong ae chỉ giúp.
1. Mấy dòng lệnh này có nghĩa gì:

#ifndef PT_SPEED
#error "not define PT_SPEED"
#endif


#define PT_MCU_CLOCK getenv("CLOCK")

PT_MCU_CLOCK sẽ = bao nhiêu????
2. Về phần tính toán giá trị timing của tốc độ truyền:

#define PT_TIMER (((((PT_MCU_CLOCK/4)/8)/(PT_SPEED/4))))
signed long PT_TX_TIMER = -(PT_TIMER/1);

em hiểu thế này không biết có đúng o
PT_MCU_CLOCK/4 là do 4 xung pic thực hiện 1 lệnh
PT_SPEED/4 cũng do 4 xung tạo thành 1 bit trong thuật toán mã hóa.
PT_TX_TIMER = -(PT_TIMER/1) dấu - là do đếm từ PT_TX_TIMER đến 65535, /1 là hệ số prescale mặc định là 1.
còn (PT_MCU_CLOCK/4)/8 e không hiểu tại sao có /8 ở chỗ này??? ae nào giải thích dùm e, e nghĩ hoài không ra.
3. Cái remote của e có Rosc = 4M3, vậy mình chọn PT_SPEED là bao nhiêu, e gà không biết cách đọc datasheet.
Thk cả nhà, chúc vui.!

motu
27-04-2011, 08:33 PM
Không ai giúp e với. .

motu
08-05-2011, 12:39 AM
Chào cả nhà, dựa theo bài viết trên, e đã viết code cho con pic877a như sau:

#include <16F877A.H>
#include <def_877a.h>
#FUSES NOWDT, HS, PUT, NOPROTECT, NODEBUG, BROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)
#define PT_MCU_CLOCK getenv("CLOCK")
#define PT_SPEED (9600)
#define PT_MAX_FRAME_CHECK 2
#define PT_TX_PIN PIN_B0
#define PT_RX_PIN PIN_B1
#define PT_TIMER (((((PT_MCU_CLOCK/4)/8)/(PT_SPEED/4))))
#define PT_BIT_0 0b00010001
#define PT_BIT_1 0b01110111
#define PT_BIT_F 0b01110001
#define PT_SENDING 0
#define PT_IDLE 1
const char PT_BIT_TABLE[3]={PT_BIT_0,PT_BIT_1,PT_BIT_F};
signed long PT_TX_TIMER = -(PT_TIMER/1);
unsigned long TIME_0a_75_BIT = (float)(PT_TIMER)*(float)0.75;
unsigned long TIME_1a_25_BIT = (float)(PT_TIMER)*(float)1.25;
unsigned long TIME_2a_75_BIT = (float)(PT_TIMER)*(float)2.75;
unsigned long TIME_3a_25_BIT = (float)(PT_TIMER)*(float)3.25;
unsigned long TIME_30a_75_BIT = (float)(PT_TIMER)*(float)30.75;
unsigned long TIME_31a_25_BIT = (float)(PT_TIMER)*(float)31.25;
unsigned long data, addr;
unsigned int Pt2262BuffCurrent, Pt2262BuffCounter, Pt2262LoopCounter;
char PtBuff[16];
int1 PtState;

void Pt2262TxCheck()
{
unsigned short b;

if (Pt2262BuffCurrent!=Pt2262BuffCounter)
{
b = PtBuff[Pt2262BuffCurrent>>3]>>(Pt2262BuffCurrent&0x07);
output_bit(PT_TX_PIN,b);
Pt2262BuffCurrent++;
}
if (Pt2262BuffCurrent==Pt2262BuffCounter)
{
if (--Pt2262LoopCounter>0)
{
Pt2262BuffCurrent=0;
}
else
{
Pt2262BuffCurrent=0;
Pt2262LoopCounter = 4;
output_low(PT_TX_PIN);
clear_interrupt(INT_EXT);
enable_interrupts(INT_EXT);
PtState = PT_IDLE;
}
}
}

#int_timer1
void Timer1_ISR()
{
set_timer1(PT_TX_TIMER);
if(PtState==PT_SENDING)
{
Pt2262TxCheck();
}
else
{
PtState=PT_IDLE;
}
}

void main()
{
int i;
set_tris_b(0b00000010);
portB=0x00;
addr = 22222222;
data = 1111;
for (i=0;i<8;i++)
{
PtBuff[i] = PT_BIT_TABLE[(addr%10)%3];
addr = addr/10;
}
PtBuff[8] = ((data>>3)&0x01)?PT_BIT_1:PT_BIT_0;
PtBuff[9] = ((data>>2)&0x01)?PT_BIT_1:PT_BIT_0;
PtBuff[10] = ((data>>1)&0x01)?PT_BIT_1:PT_BIT_0;
PtBuff[11] = ((data>>0)&0x01)?PT_BIT_1:PT_BIT_0;
PtBuff[12] = 0b00000001;
PtBuff[13] = PtBuff[14] = PtBuff[15] = 0b00000000;
PtState = PT_IDLE;
enable_interrupts(global);
enable_interrupts(int_timer1);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
set_timer1(PT_TX_TIMER);
Pt2262BuffCurrent=0;
Pt2262BuffCounter = 16*8;
Pt2262LoopCounter = 4;
while(1)
{
PtState = PT_SENDING;
}
}

không biết sai sót chỗ nào mà mạch thu không nhận được tín hiệu, pic dùng thạch anh 4MHz, mạch thu dùng pt2272, Rosc = 820K. Ai giúp e với, thk.

sontvak42
17-05-2012, 07:01 PM
Chào anh motu! Hiện tại em cũng mới đang nghiên cứu về phần trên và đang còn gặp phải nhiều vướng mắt về các lệnh đó, chắc anh cũng đã từng làm qua rồi nên có thể giải thích cho em về các dòng lệnh đó cái được không ạ. Nếu có code mẫu phiền anh gửi lên cho em tham khảo chút được không ạ!
Em cám ơn nhiều