PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Giao tiếp USB, CAN, I2C, SPI, USART... (http://www.picvietnam.com/forum/forumdisplay.php?f=45)
-   -   USART đơn giản (http://www.picvietnam.com/forum/showthread.php?t=13373)

vakk 27-02-2012 12:39 AM

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

hoc_picpicpic 28-02-2012 02:26 PM

Trích:

Nguyên văn bởi vakk (Post 54523)
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

vakk 29-02-2012 12:45 AM

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

hoc_picpicpic 29-02-2012 09:54 AM

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)

vakk 02-03-2012 12:56 AM

Trích:

Nguyên văn bởi hoc_picpicpic (Post 54590)
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 08-03-2012 01:16 AM

em vẫn đang chờ mọi người trả lời!!!!

duy.hut.fet 20-03-2012 10:59 AM

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;
}

vakk 25-03-2012 12:02 AM

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

semipower 07-08-2012 11:13 PM

Trích:

Nguyên văn bởi vakk (Post 54523)
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;


Múi giờ GMT. Hiện tại là 11:02 AM.

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