PDA

View Full Version : USART đơn giản


vakk
27-02-2012, 12:39 AM
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
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
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
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
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;