PIC Vietnam

Go Back   PIC Vietnam > Truyền thông > Giao tiếp USB, CAN, I2C, SPI, USART...

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Giao tiếp USB, CAN, I2C, SPI, USART... Những giao tiếp được tích hợp trên PIC

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 27-02-2012, 12:39 AM   #1
vakk
Đệ tử 1 túi
 
Tham gia ngày: Sep 2010
Bài gửi: 17
:
USART đơn giản

Chào các anh em có chương trình đơn giản viết bằng Htpic với pic 18f24j10 như sau

int k;
void interrupt Myint(void)
{
if(RCIF==1)
{
k=RCREG;

RCIF=0;
}
}
........
void main(void)
{
init();
while(1)
{
PORTB =k;
}
}
khi em hiển thị trên led 7 thanh thì chỉ nhận được số 0
nhưng khi em viết thành
int k;
void interrupt Myint(void)
{
if(RCIF==1)
{
k=RCREG;
PORTB =k;
RCIF=0;
}
}
........
void main(void)
{
init();
while(1)
{

}
}
thì led 7 thanh lại hiển thị đúng giá trị
vậy là biến k không lưu được giá trị khi nhảy ra khỏi ngắt hay chương trình em viết có vấn đề ạ?
mong các anh giúp đỡ
Thanks
vakk vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 28-02-2012, 02:26 PM   #2
hoc_picpicpic
Đệ tử 6 túi
 
Tham gia ngày: Feb 2009
Bài gửi: 127
:
Trích:
Nguyên văn bởi vakk View Post
Chào các anh em có chương trình đơn giản viết bằng Htpic với pic 18f24j10 như sau

int k;
void interrupt Myint(void)
{
if(RCIF==1)
{
k=RCREG;

RCIF=0;
}
}
........
void main(void)
{
init();
while(1)
{
PORTB =k;
}
}
khi em hiển thị trên led 7 thanh thì chỉ nhận được số 0
nhưng khi em viết thành
int k;
void interrupt Myint(void)
{
if(RCIF==1)
{
k=RCREG;
PORTB =k;
RCIF=0;
}
}
........
void main(void)
{
init();
while(1)
{

}
}
thì led 7 thanh lại hiển thị đúng giá trị
vậy là biến k không lưu được giá trị khi nhảy ra khỏi ngắt hay chương trình em viết có vấn đề ạ?
mong các anh giúp đỡ
Thanks
thử đổi int k; thành char k; xem
hoc_picpicpic vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 29-02-2012, 12:45 AM   #3
vakk
Đệ tử 1 túi
 
Tham gia ngày: Sep 2010
Bài gửi: 17
:
vẫn không được bác ạ, có lẽ phải tính toán ngay trong hàm ngắt thì mới được, em sợ ra khỏi hàm ngắt mà biến không lưu được giá trị thì các hàm khác sẽ không sử dụng được các biến đó nữa
vakk vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 29-02-2012, 09:54 AM   #4
hoc_picpicpic
Đệ tử 6 túi
 
Tham gia ngày: Feb 2009
Bài gửi: 127
:
void interrupt Myint(void)
{

}

là ngắt gì thế bạn, nếu là ngắt USART thì bạn bỏ lệnh này đi : if(RCIF==1)
hoc_picpicpic vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-03-2012, 12:56 AM   #5
vakk
Đệ tử 1 túi
 
Tham gia ngày: Sep 2010
Bài gửi: 17
:
Trích:
Nguyên văn bởi hoc_picpicpic View Post
void interrupt Myint(void)
{

}

là ngắt gì thế bạn, nếu là ngắt USART thì bạn bỏ lệnh này đi : if(RCIF==1)
đó làm hàm ngắt chung em dùng htpic mà,
if(RCIF==1) đây là ngắt nhận, khi cờ ngắt RCIF lên 1 thì nhấy tới hàm ngắt và đọc giá trị
em nghĩ câu lênh này không vấn đề gì
vakk vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 08-03-2012, 01:16 AM   #6
vakk
Đệ tử 1 túi
 
Tham gia ngày: Sep 2010
Bài gửi: 17
:
em vẫn đang chờ mọi người trả lời!!!!
vakk vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 20-03-2012, 10:59 AM   #7
duy.hut.fet
Nhập môn đệ tử
 
Tham gia ngày: Mar 2010
Bài gửi: 3
:
cho e hoi ve pic 18f4550

em co doan code nay sau chi build thi no cu bao la A device required before the line ma e ko biet sua nhu the nao.mong anh em trong dien dan giup do
// Program to Interface GPS with PIC18F4550 Microcontroller
#define FREQ 12000000
#define baud 4800
#define spbrg_value (((FREQ/64)/baud)-1)
#define rs LATA.F0
#define rw LATA.F1
#define en LATA.F2
#define lcdport LATB

unsigned char rx_data();
void lcd_ini();
void lcdcmd(unsigned char);
void lcddata(unsigned char);

unsigned char longi_data[12];
unsigned char lati_data[12];
unsigned char data,value=0;
unsigned int i=0,pos;

void main()
{
TRISB=0; // Set Port B as output port
LATB=0;
TRISA=0;
LATA=0;
SPBRG=spbrg_value; // Fill SPBRG register to set the baud rate
RCSTA.SPEN=1; // To activate serial port (Tx and Rx pins)
RCSTA.CREN=1; // To enable continuous reception
lcd_ini();
while(1)
{
data=rx_data(); // Check the string '$GPGGA,'
if(data=='$')
{
data=rx_data();
if(data=='G')
{
data=rx_data();
if(data=='P');
{
data=rx_data();
if(data=='G');
{
data=rx_data();
if(data=='G')
{
data=rx_data();
if(data=='A')
{
data=rx_data();
if(data==',')
{
data=rx_data();
while(data!=',')
data=rx_data();
for(i=0;data!='N';i++)
data=rx_data();
lati_data[i]=data; // Store the Latitude data
}
data=rx_data();
if(data==',')
{
for(i=0;data!='E';i++)
{
data=rx_data();
longi_data[i]=data; // Store the Longitude data
}
}
i=0;
lcdcmd(0x80);
while(i<11)
{
lcddata(lati_data[i]); // Print the Latitude data
i++;
}
i=0;
lcdcmd(0xC0);
while(i<12)
{
lcddata(longi_data[i]); // Print the Longitude data
i++;
}
}
}
}
}
}
}
}
Delay_ms(1000);
for(i=0;i<12;i++)
{
data=0;
lati_data[i]=0;
longi_data[i]=0;
}
}
}

unsigned char rx_data(void)
{
while(PIR1.RCIF==0); // Wait until RCIF gets low
return RCREG; // Store data in Reception register
}

void lcd_ini()
{
lcdcmd(0x38); // Configure the LCD in 8-bit mode, 2 line and 5x7 font
lcdcmd(0x0C); // Display On and Cursor Off
lcdcmd(0x01); // Clear display screen
lcdcmd(0x06); // Increment cursor
lcdcmd(0x80); // Set cursor position to 1st line, 1st column
}

void lcdcmd(unsigned char cmdout)
{
lcdport=cmdout; //Send command to lcdport=PORTB
rs=0;
rw=0;
en=1;
Delay_ms(10);
en=0;
}

void lcddata(unsigned char dataout)
{
lcdport=dataout; //Send data to lcdport=PORTB
rs=1;
rw=0;
en=1;
Delay_ms(10);
en=0;
}
duy.hut.fet vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 25-03-2012, 12:02 AM   #8
vakk
Đệ tử 1 túi
 
Tham gia ngày: Sep 2010
Bài gửi: 17
:
Hình như bạn thiếu các dòng config thì phải và không thấy hàm main của bạn đâu
Bạn dùng trình dịch gì vậy

thay đổi nội dung bởi: vakk, 25-03-2012 lúc 12:08 AM.
vakk vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 07-08-2012, 11:13 PM   #9
semipower
Đệ tử 5 túi
 
semipower's Avatar
 
Tham gia ngày: Jul 2010
Nơi Cư Ngụ: Hà Nội, VIE
Bài gửi: 114
:
Trích:
Nguyên văn bởi vakk View Post
Chào các anh em có chương trình đơn giản viết bằng Htpic với pic 18f24j10 như sau

int k;
void interrupt Myint(void)
{
if(RCIF==1)
{
k=RCREG;

RCIF=0;
}
}
........
void main(void)
{
init();
while(1)
{
PORTB =k;
}
}
khi em hiển thị trên led 7 thanh thì chỉ nhận được số 0
nhưng khi em viết thành
int k;
void interrupt Myint(void)
{
if(RCIF==1)
{
k=RCREG;
PORTB =k;
RCIF=0;
}
}
........
void main(void)
{
init();
while(1)
{

}
}
thì led 7 thanh lại hiển thị đúng giá trị
vậy là biến k không lưu được giá trị khi nhảy ra khỏi ngắt hay chương trình em viết có vấn đề ạ?
mong các anh giúp đỡ
Thanks
Bạn khai báo biến k như sau xem sao:
volatile char k;
__________________
Vì sao nên đọc tài liệu tiếng Anh?
http://www.picvietnam.com/forum/showthread.php?t=6819
Nguồn xung các loại: www.semitech.vn
semipower vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


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


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam