PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Giao tiếp cổng COM và LPT (http://www.picvietnam.com/forum/forumdisplay.php?f=44)
-   -   giao tiếp rs232 (http://www.picvietnam.com/forum/showthread.php?t=2959)

digan 15-04-2009 08:10 PM

các tiền bối xem hộ với đệ đang cấp bách quá. code
#include "D:\RS232\RS232.h"
#include <float.h>
#include <math.h>
#include <string.h>
#include <def_877a.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOWRT
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7)

char buf;
#int_EXT
EXT_isr()
{
}
#int_TBE
TBE_isr()
{
}
#int_RDA
RDA_isr()
{
buf=getc();
portb = 0x0f;
}

void main()
{
trisb=0x00;
portb = 0x00;
enable_interrupts(INT_EXT);
enable_interrupts(INT_TBE);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);

while(1)
{

}
}

dịch báo warning: function not void and does not reurn value RDA_isr
mội ng jup với nha

bonsevich 16-04-2009 10:53 PM

Kinh nghiệm khi làm mạch thực tế là bao giờ cũng phải đi từ đơn giản đến phức tạp. Một mạch sau khi làm xong trước hết phải test xem nó có chạy được chương trình cơ bản không đã. Đối với vi điều khiển, đơn giản nhất là chương trình test I/O và sử dụng hàm delay. Các bạn chưa test mà đã làm ngay chương trình rồi thì rất khó gỡ.
#include "D:\RS232\RS232.h" : không biết bạn còn thêm định nghĩa gì nữa, những định nghĩa ở dưới khá đủ rồi.
#include <float.h>,#include <math.h>,#include <string.h> với chương trình đơn giản không cần phải thêm những thứ này.
#include <def_877a.h> mình nghĩ là #include <16f877a.h> chứ nhỉ.
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7) thiếu bits=8.
2 ngắt ngoài chưa thấy để làm gì thì có thể bỏ qua.
portb là cái gì thế nhỉ? cần phải có định nghĩa trước: #byte portb=6.

bạn thử sửa xem có chạy được không nhé. bạn nên thêm vào lênh putc(buf) sau lệnh getc() trong ngắt nhận. và so sánh ký tự nhận được với 1 giá trị nào đó rồi hãy bật cổng B
Chúc bạn thành công

digan 18-04-2009 12:26 PM

<def_877a.h> là thư viên mình vào ra lấy trên mạng không biet có phải nó kiểm soát RC6, RC7 không:
#define W 0
#define F 1
//----- Register Files------------------------------------------------------
#byte INDF =0x00
#byte TMR0 =0x01
#byte PCL =0x02
#byte STATUS =0x03
#byte FSR =0x04
#byte PORTA =0x05
#byte PORTB =0x06
#byte PORTC =0x07
#byte PCLATH =0x0A
#byte INTCON =0x0B
#byte PIR1 =0x0C
#byte PIR2 =0x0D
#byte TMR1L =0x0E
#byte TMR1H =0x0F
#byte T1CON =0x10
#byte TMR2 =0x11
#byte T2CON =0x12
#byte SSPCON =0x14
#byte CCPR1L =0x15
#byte CCPR1H =0x16
#byte CCP1CON =0x17
#byte RCSTA =0x18
#byte TXREG =0x19
#byte RCREG =0x1A
#byte CCPR2L =0x1B
#byte CCPR2H =0x1C
#byte CCP2CON =0x1D
#byte ADRESH =0x1E
#byte ADCON0 =0x1F
/* bank 1 registers */
#byte OPTION_REG =0x81
#byte TRISA =0x85
#byte TRISB =0x86
#byte TRISC =0x87
#byte PIE1 =0x8C
#byte PIE2 =0x8D
#byte PCON =0x8E
#byte SSPCON2 =0x91
#byte PR2 =0x92
#byte SSPADD =0x93
#byte SSPSTAT =0x94
#byte TXSTA =0x98
#byte SPBRG =0x99
#byte ADRESL =0x9E
#byte ADCON1 =0x9F
/* bank 2 registers */
#byte EEDATA =0x010C
#byte EEADR =0x010D
#byte EEDATH =0x010E
#byte EEADRH =0x010F
/* bank 3 registers */
#byte EECON1 =0x018C
#byte EECON2 =0x018D

//----- STATUS Bits --------------------------------------------------------
// For Assembly Language - Note upper case
#define IRP 7
#define RP1 6
#define RP0 5
#define NOT_TO 4
#define NOT_PD 3
#define Z 2
#define DC 1
#define C 0
//----- INTCON Bits for c --------------------------------------------------------
#bit gie = 0x0b.7
#bit eeie = 0x0b.6
#bit t0ie = 0x0b.5
#bit inte = 0x0b.4
#bit rbie = 0x0b.3
#bit t0if = 0x0b.2
#bit intf = 0x0b.1
#bit rbif = 0x0b.0
//---------PORTA bits------------------
#bit ra5 =0x05.5
#bit ra4 =0x05.4
#bit ra3 =0x05.3
#bit ra2 =0x05.2
#bit ra1 =0x05.1
#bit ra0 =0x05.0
//---------PORTB bits------------------
#bit rb7 =0x06.7
#bit rb6 =0x06.6
#bit rb5 =0x06.5
#bit rb4 =0x06.4
#bit rb3 =0x06.3
#bit rb2 =0x06.2
#bit rb1 =0x06.1
#bit rb0 =0x06.0
//---------PORTC bits------------------
#bit rc7 =0x07.7
#bit rc6 =0x07.6
#bit rc5 =0x07.5
#bit rc4 =0x07.4
#bit rc3 =0x07.3
#bit rc2 =0x07.2
#bit rc1 =0x07.1
#bit rc0 =0x07.0
//----- PIR1 Bits ----------------------------------------------------------
#bit PSPIF =0x0C.7
#bit ADIF =0x0C.6
#bit RCIF =0x0C.5
#bit TXIF =0x0C.4
#bit SSPIF =0x0C.3
#bit CCP1IF =0x0C.2
#bit TMR2IF =0x0C.1
#bit TMR1IF =0x0C.0
//----- PIR2 Bits ----------------------------------------------------------
#bit CMIF =0x0D.6
#bit EEIF =0x0D.4
#bit BCLIF =0x0D.3
#bit CCP2IF =0x0D.0
//----- T1CON Bits ---------------------------------------------------------
#bit T1CKPS1 =0x10.5
#bit T1CKPS0 =0x10.4
#bit T1OSCEN =0x10.3
#bit T1SYNC =0x10.2
#bit TMR1CS =0x10.1
#bit TMR1ON =0x10.0
//----- T2CON Bits ---------------------------------------------------------
#bit TOUTPS3 =0x12.6
#bit TOUTPS2 =0x12.5
#bit TOUTPS1 =0x12.4
#bit TOUTPS0 =0x12.3
#bit TMR2ON =0x12.2
#bit T2CKPS1 =0x12.1
#bit T2CKPS0 =0x12.0
//-------------SSPCON bits--------------------------
#bit WCOL =0x14.7
#bit SSPOV =0x14.6
#bit SSPEN =0x14.5
#bit CKP =0x14.4
#bit SSPM3 =0x14.3
#bit SSPM2 =0x14.2
#bit SSPM1 =0x14.1
#bit SSPM0 =0x14.0
//---------------CCP1CON bits--------
#bit CCP1X =0x17.5
#bit CCP1Y =0x17.4
#bit CCP1M3 =0x17.3
#bit CCP1M2 =0x17.2
#bit CCP1M1 =0x17.1
#bit CCP1M0 =0x17.0
//---------------RCSTA bits-------------------
#bit SPEN =0x18.7
#bit RX9 =0x18.6
#bit SREN =0x18.5
#bit CREN =0x18.4
#bit ADDEN =0x18.3
#bit FERR =0x18.2
#bit OERR =0x18.1
#bit RX9D =0x18.0
//-----------------------CCP2CON bits----------
#bit CCP2X =0x1D.5
#bit CCP2Y =0x1D.4
#bit CCP2M3 =0x1D.3
#bit CCP2M2 =0x1D.2
#bit CCP2M1 =0x1D.1
#bit CCP2M0 =0x1D.0
//----- ADCON0 Bits --------------------------------------------------------
#bit ADCS1 =0x1F.7
#bit ADCS0 =0x1F.6
#bit CHS2 =0x1F.5
#bit CHS1 =0x1F.4
#bit CHS0 =0x1F.3
#bit ADGO =0x1F.2
#bit ADON =0x1F.0
//----- OPTION_reg Bits --------------------------------------------------------
#bit RBPU =0x81.7
#bit INTEDG =0x81.6
#bit T0CS =0x81.5
#bit T0SE =0x81.4
#bit PSA =0x81.3
#bit PS2 =0x81.2
#bit PS1 =0x81.1
#bit PS0 =0x81.0
//------------------TRISA bits---------------------------
#bit TRISA5 =0x85.5
#bit TRISA4 =0x85.4
#bit TRISA3 =0x85.3
#bit TRISA2 =0x85.2
#bit TRISA1 =0x85.1
#bit TRISA0 =0x85.0
//-----------------TRISB bits-----------------------------
#bit TRISB7 =0x86.7
#bit TRISB6 =0x86.6
#bit TRISB5 =0x86.5
#bit TRISB4 =0x86.4
#bit TRISB3 =0x86.3
#bit TRISB2 =0x86.2
#bit TRISB1 =0x86.1
#bit TRISB0 =0x86.0
//----------------TRISC bits-------------------
#bit TRISC7 =0x87.7
#bit TRISC6 =0x87.6
#bit TRISC5 =0x87.5
#bit TRISC4 =0x87.4
#bit TRISC3 =0x87.3
#bit TRISC2 =0x87.2
#bit TRISC1 =0x87.1
#bit TRISC0 =0x87.0
//----- PIE1 Bits ----------------------------------------------------------
#bit PSPIE =0x8C.7
#bit ADIE =0x8C.6
#bit RCIE =0x8C.5
#bit TXIE =0x8C.4
#bit SSPIE =0x8C.3
#bit CCP1IE =0x8C.2
#bit TMR2IE =0x8C.1
#bit TMR1IE =0x8C.0
//----- PIE2 Bits -----------------------------------------------------
#bit CMIE =0x8D.6
#bit EEIE =0x8D.4
#bit BCLIE =0x8D.3
#bit CCP2IE =0x8D.0
//----- PCON Bits ----------------------------------------------------------
#bit POR =0x8E.1
#bit BOD =0x8E.0
//-----------SSPCON2 bits---------------------------------------------
#bit GCEN =0x91.7
#bit ACKSTAT =0x91.6
#bit ACKDT =0x91.5
#bit ACKEN =0x91.4
#bit RCEN =0x91.3
#bit PEN =0x91.2
#bit RSEN =0x91.1
#bit SEN =0x91.0
//---------------------SSPSTAT bits------------------------
#bit STAT_SMP =0x94.7
#bit STAT_CKE =0x94.6
#bit STAT_DA =0x94.5
#bit STAT_P =0x94.4
#bit STAT_S =0x94.3
#bit STAT_RW =0x94.2
#bit STAT_UA =0x94.1
#bit STAT_BF =0x94.0
//----------------TXSTA bits-----------------
#bit CSRC =0x98.7
#bit TX9 =0x98.6
#bit TXEN =0x98.5
#bit SYNC =0x98.4
#bit BRGH =0x98.2
#bit TRMT =0x98.1
#bit TX9D =0x98.0
//--------------ADCON1 bits---------------
#bit ADFM =0x9F.7
#bit ADCS2 =0x9F.6
#bit PCFG3 =0x9F.3
#bit PCFG2 =0x9F.2
#bit PCFG1 =0x9F.1
#bit PCFG0 =0x9F.0
//-----------EECON1 bits----------
#bit EEPGD =0x018C.7
#bit WRERR =0x018C.3
#bit WREN =0x018C.2
#bit WR =0x018C.1
#bit RD =0x018C.0

phandinh 18-04-2009 01:18 PM

*đây chỉ là file do người dùng định nghĩa thôi bạn.
ví dụ nhé :
bạn tên : Nguyễn Văn A , giới tính : nam , sinh ngày : ... , quê quán:.... : , lớp :.... , mssv : ....
Vậy thì nhà trường chỉ cần biết MSSV là có thề biết thông tin chi tiết về bạn.
Và khi bạn lên phòng đào tạo xin bảng điểm thì bạn chỉ cần ghi MSSV chứ không
cần phải dài dòng nữa..
*khi bạn khai báo #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bi ts = 8)
thì c.trình tự hiểu địa chỉ của XMIT , RCV

0509592 19-04-2009 07:16 PM

Trích:


bonsevich
Nhập môn đệ tử

Tham gia ngày: Feb 2007
Bài gửi: 1
Thanks: 0
Thanked 0 Times in 0 Posts

Kinh nghiệm khi làm mạch thực tế là bao giờ cũng phải đi từ đơn giản đến phức tạp. Một mạch sau khi làm xong trước hết phải test xem nó có chạy được chương trình cơ bản không đã. Đối với vi điều khiển, đơn giản nhất là chương trình test I/O và sử dụng hàm delay. Các bạn chưa test mà đã làm ngay chương trình rồi thì rất khó gỡ.
#include "D:\RS232\RS232.h" : không biết bạn còn thêm định nghĩa gì nữa, những định nghĩa ở dưới khá đủ rồi.
#include <float.h>,#include <math.h>,#include <string.h> với chương trình đơn giản không cần phải thêm những thứ này.
#include <def_877a.h> mình nghĩ là #include <16f877a.h> chứ nhỉ.
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7) thiếu bits=8.
2 ngắt ngoài chưa thấy để làm gì thì có thể bỏ qua.
portb là cái gì thế nhỉ? cần phải có định nghĩa trước: #byte portb=6.

bạn thử sửa xem có chạy được không nhé. bạn nên thêm vào lênh putc(buf) sau lệnh getc() trong ngắt nhận. và so sánh ký tự nhận được với 1 giá trị nào đó rồi hãy bật cổng B
Chúc bạn thành công
#include "D:\RS232\RS232.h" đây là include đường link cho bài của bạn digan thay vì include thư viện 16f877a.h

còn thư viện def_877a.h là thư viện tự định nghĩa địa chỉ của người dùng chứ không phải thư viện 16f877a.h như bạn bonsevich nghĩ! và nó không ảnh hưởng đến chương trình của bạn!

bonsevich 20-04-2009 12:06 PM

@ 0509592
Mình biết đấy là định nghĩa của riêng các bạn. Nhưng trong một chương trình nhờ góp ý thì nên đưa lên đầy đủ tất cả những định nghĩa. Vả lại, để kiểm tra xem mạch có chạy được hay không chỉ cần sử dụng những định nghĩa đơn giản và cơ bản nhất mà thôi.

digan 23-04-2009 01:00 AM

Ngâm cứu mãi khoản RS232 ko dc, tôi mua kit PICLAB40 về nghiên cứu để đảm bảo ko có lloi trong mạch cứng khi chạy đoạn code bên dưới và KT bằng serial port monitor thì thấy pic gửi lên toàn số 00 với chu kỳ ngắn (cỡ 0,3s), mọi ng chỉ giúp với.

#include<16f877.h>
#fuses XT,NOLVP,NOWDT,PUT
#use delay(clock=4000000) // defind crystal = 4MHz
#use rs232(baud=9600,xmit=PIN_C6, rcv=PIN_C7)
// Uses RS232 Baud-rate 9600 , TX PIN = RC6, RX PIN = RC7
main()
{
char key_in;
while (true)
{
key_in=getc()
delay_ms(1000);
putc(key_in);
}
}

digan 23-04-2009 09:07 AM

Ngâm cứu mãi khoản RS232 ko dc, tôi mua kit PICLAB40 về nghiên cứu để đảm bảo ko có lloi trong mạch cứng khi chạy đoạn code bên dưới và KT bằng serial port monitor cua CCS thì thấy pic gửi lên toàn số 00 liên tục, có thể đây là nguyên nhân ngắt nhận ko xảy ra. mọi ng chỉ giúp với.

#include<16f877.h>
#FUSES NOWDT, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOWRT
#use delay(clock=4000000) // defind crystal = 4MHz
#use rs232(baud=9600,xmit=PIN_C6, rcv=PIN_C7)
// Uses RS232 Baud-rate 9600 , TX PIN = RC6, RX PIN = RC7
main()
{
char key_in;
while (true)
{
key_in=getc()
delay_ms(1000);
putc(key_in);
}
}

bonsevich 23-04-2009 11:36 AM

@ digan
Mình sửa code cho bạn, bạn thử xem có chạy tốt không nhé
#include<16f877.h> //cẩn thận nhầm 16f877a
#FUSES XT, NOWDT, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOWRT
#use delay(clock=4000000) // defind crystal = 4MHz
#use rs232(baud=9600,xmit=PIN_C6, rcv=PIN_C7, bits=8)
// Uses RS232 Baud-rate 9600 , TX PIN = RC6, RX PIN = RC7
#int_RDA
void RDA_isr() {
char key_in;
key_in=getc()
//delay_ms(1000); trong 1s lại có ký tự gửi đến thì trả về không đúng
putc(key_in);
}
main()
{
enable_interrupts(global);
enable_interrupts(INT_RDA);
while (true)
{
}
}
digan vẫn chưa có mặt trong diễn đàn

bonsevich 23-04-2009 11:43 AM

Bạn nên kiểm tra cổng Com của bạn trước, rồi đến con Max 232, rồi đến Pic. Sau khi ok rồi thì mới nạp chương trình rs232 vào. Có lần mình làm cổng Com bị lỗi, tự nối tắt chân 2 với chân 3 nên kiểm tra tưởng ngon nào ngờ không thể nào điều khiển được mạch. Con Max 232 nếu chuyển đổi mức điện áp không đúng thì cũng không chạy được, thành ra pic nó cũng không biết đấy là ký tự gì (trong trường hợp nhận dạng ký tự để điều khiển các cổng). PIC ít khi hỏng ngay cả khi cấp nguồn ngược, nhưng cũng không hoàn toàn loại trừ khả năng này.
Chúc bạn thành công

digan 23-04-2009 12:19 PM

Mình thử trên PICLAB40 của TME và sử dụng luôn serial port monitor cua trình dịch CCS để test nên khả năng lỗi phần cứng dc giảm thiểu. khi nạp xong ct và vào serial port monitor thấy nhận dc dữ liệu hexa 00 00 00 00 00 00 tuần tự xuất hiện cho đến khi đầy màn hình. kiểm tra form VB tự viết thì ký tự nhận dc luôn là 0. Như vậy có phải là PIC phát dữ liệu liên tục lên PC ko?

digan 04-05-2009 02:47 PM

Chán quá, lọ mọ một mình mãi vẫn không được. mình Post cả phần VB nhờ mọi ng kiểm tra xem có lối định dạng dữ liệu không nhé. Mình nối tắt chân 11 và 12 của Max232 để thử thì mình gửi chữ A nó trả về đúng chư A luôn.

Private Sub Exit_Click()
MSComm1.PortOpen = False
End
End Sub

Private Sub Form_Load()
With MSComm1
.CommPort = 1
.RThreshold = 1
.Settings = "9600,n,8,1"
.PortOpen = True

End With

TText.Text = "NHAP KY TU TRUYEN DI"
RText.Text = "KY TU NHAN DUOC"

End Sub

Private Sub MSComm1_OnComm()
If (MSComm1.CommEvent = comEvReceive) Then
buff = MSComm1.Input
a = Asc(buff)
RText.Text = a

End If

End Sub

Private Sub RButton_Click()
RText.Text = a
End Sub

Private Sub TButton_Click()
MSComm1.Output = TText.Text
End Sub
http://i424.photobucket.com/albums/p...Hunter_001.jpg


Phần Code cho pic mình dùng code do Đồng chí Bolsevik sửa giúp. (Thanks đồng chí!)

#include<16f877.h> //cẩn thận nhầm 16f877a
#FUSES XT, NOWDT, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOWRT
#use delay(clock=4000000) // defind crystal = 4MHz
#use rs232(baud=9600,xmit=PIN_C6, rcv=PIN_C7, bits=8)
// Uses RS232 Baud-rate 9600 , TX PIN = RC6, RX PIN = RC7
#int_RDA
void RDA_isr() {
char key_in;
key_in=getc();
//delay_ms(1000); trong 1s lại có ký tự gửi đến thì trả về không đúng
putc(key_in);
}
main()
{
enable_interrupts(global);
enable_interrupts(INT_RDA);
while (true)
{
}
}

phandinh 04-05-2009 03:44 PM

Nếu bạn đã chắc chắn khi nối chân 11, 12 của max 232 thì VB truyền nhận dc( gửi A , nhận A ) thì bạn kiểm tra xem ( thật kĩ ) từ chân 11,12 của max232 có đến đúng thứ tự chân RC6, RC7 hay không ? Mình nói lại bạn hãy kểm tra thật kĩ , xem 11, 12 trong data shet là ngõ vào hay ngõ ra .
Cũng chính vì quá tin tưởng Easy PiC ( phiên bản cũ ) của TM nên mình cũng bị như bạn.
chỉ cần đảo chéo RC6 , RC7 là dc.
còn PIClab 40 thì mình không biết thế nào

thienkien 28-05-2009 01:51 PM

mình cũng mới làm giao tiếp, mình dùng chương trình kiểm tra đơn giản dưới đây thì nhận và gửi đều chính xác,..Nhưng khi muốn khai báo xung lên 40M ( thạch anh thật là 10M) dung hspll thì không nhận đúng nữa, nó gửi lên những ký tự lung tung,... không biết khi khai báo hspll thì có tính lai baurate không nhỉ????? #include<18f4550.h>
#fuses hs,noprotect,nowdt
#use delay(clock=10M)
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,bits=8,pari ty=N)
#use fast_io(b)
int16 dodai,dem=0;
int input_ready;
char mang[1000];

int8 text[100];
#int_rda
void nhan()
{
//disable_interrupts(int_timer0);
//if(kbhit())
mang[dem]=getc();
putc(mang[dem]);

if(mang[dem]==0x0d)
{
dodai=dem;
mang[dem]='\0';
input_ready=1;
dem=0;

}
dem++;


// enable_interrupts(int_timer0);

}

void main()
{
int16 i,j;

input_ready=0;
set_tris_b(0);
enable_interrupts(global);
enable_interrupts(int_rda);
output_b(255);
while(1)
{
if(input_ready==1)
{
printf("CHUOI=%s",mang);
input_ready=0;
dem=0;
}



}
}

thienkien 29-05-2009 07:40 PM

ko ai giúp minh à???chương trình truyền và nhận đều ok, chỉ có điều mình muốn hỏi là khi khai báo nhân xung thạch anh(10M*4) thì khai báo baurate nhu thế nào(có phải nhân : baud=9600*4 lên không nhỉ???? help!! gấp nhé các bạn


Múi giờ GMT. Hiện tại là 03:32 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam