![]() |
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 |
Trích:
|
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
|
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) |
Trích:
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ì |
em vẫn đang chờ mọi người trả lời!!!!
|
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; } |
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 |
Trích:
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