PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Các ngôn ngữ lập trình khác (CCS C, HT PIC,...)

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

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 24-01-2008, 03:00 PM   #16
falleaf
PIC Bang chủ
 
falleaf's Avatar
 
Tham gia ngày: May 2005
Bài gửi: 2,631
:
Send a message via Yahoo to falleaf
Lâu rồi không dùng, nhưng hình như dùng printf chứ không phải putc nhỉ?

Chúc vui
falleaf vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 24-01-2008, 03:34 PM   #17
Jerry
Đệ tử 5 túi
 
Jerry's Avatar
 
Tham gia ngày: Sep 2006
Bài gửi: 100
:
Để chương trình dễ theo dõi hơn tui đã làm như sau: Dùng phần mềm Com Master do minhcuong cung cấp ở link này: http://www.picvietnam.com/forum/show...p?t=274&page=4. Phần mềm này sẽ gửi các ký tự gõ vào từ bàn phím xuống cho vi điều khiển, vi điều khiển nhận ký tự trong ngắt nhận và truyền trở lại cho máy tính.
Code:
#include <16F877A.h>
#include <def_877a.h>
#device *=16 adc=10
#FUSES NOWDT, XT, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)
#use fast_io (b)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=9)

#include <lcd_lib_4bit.c>


#INT_RDA
Receive_isr()
{
   char c;
   disable_interrupts(GLOBAL);
   c = getc();                               // nhận ký tự 
   putc(c);                                  // truyền trả lại cho máy tính
   enable_interrupts(GLOBAL);
}

//-----------------------------------------------------------------

void main(void)
{
   output_b(0xC0);
   set_tris_a(0xC0);
   set_tris_b(0xC1);
   port_b_pullups (TRUE);
   set_tris_c(0xD0); 

   LCD_init();
   delay_ms(500);
   LCD_putcmd(0x80);

   enable_interrupts(INT_RDA);
   enable_interrupts (global);
   while (1) {}

}
nhưng vẫn không thấy ký tự nào hiển thị trên màn hình receive của chương trình Com Master. Ai đã làm công việc tương tự thì làm ơn hướng dẫn giúp nhé.
__________________
Do more than exist, LIVE
Jerry vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 24-01-2008, 03:38 PM   #18
Jerry
Đệ tử 5 túi
 
Jerry's Avatar
 
Tham gia ngày: Sep 2006
Bài gửi: 100
:
@falleaf:
- putc(): This function sends a character over the RS232 XMIT pin
- printf(): Outputs a string of characters to either the standard RS-232 pins (first two forms) or to a specified function.

(copy right from CCS C Help)
__________________
Do more than exist, LIVE
Jerry vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 24-01-2008, 03:55 PM   #19
Jerry
Đệ tử 5 túi
 
Jerry's Avatar
 
Tham gia ngày: Sep 2006
Bài gửi: 100
:
@picthanh: Nó gửi liên tục thì chắc do firmware viết cho vi điều khiển của bạn nó gửi liên tục lên thôi. Cái Serial Port Monitor dùng để giám sát các thông tin truyền nhận ở cổng COM của máy tính, nghĩa là ta gửi gì ra cổng COM, hoặc nhận gì về từ cổng COM, nó đều hiển thị lên màn hình máy tính hết. Không hiểu cái "phần mềm để nhận cái chuỗi or ký tự mà mình gửi lên" là bạn muốn đề cập đến phần mềm gì. Nếu ta chỉ cần quan sát việc truyền nhận thôi thì chỉ cần Serial Port Monitor là đủ. Còn khi cần xử lý dữ liệu nhận về thì mới cần phần mềm để xử lý.
__________________
Do more than exist, LIVE
Jerry vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 24-01-2008, 06:15 PM   #20
LeDuc
Đệ tử 6 túi
 
LeDuc's Avatar
 
Tham gia ngày: Mar 2007
Bài gửi: 150
:
Trích:
Nguyên văn bởi picthanh View Post
bác Jerry oi! trước đây tui cũng từng làm như bác vậy,nhưng cung ko được .khi tui gửi lên máy tinh thi chương trình Serial Port Monitor của CCS hiện lên một loạt ký tự kiểu hexa ,và nó cứ gởi liên tục.ko bit tình trạng của bác có giống ko.tui nghe nói trên máy tính phải có phần mền để nhận cái chuỗi or ký tự mà mình gửi lên.tới giờ này tui vẫn pó tay ko bít lam sao để nhận nó hết.
Bạn thử delay một khoản thời gian xem sao .
__________________
_________________________________________________
Le Trung Duc
Industry Research & Application Center
NTT Institute of Hi_technolog
ltduc@ntt.edu.vn
leduc_cktd@yahoo.com.vn
http://www.nttc.edu.vn
CNC DIY : http://quangcaosanpham.com/shop/driverservo
0909300332
LeDuc vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 24-01-2008, 06:56 PM   #21
hanhluckyly
Đệ tử 4 túi
 
hanhluckyly's Avatar
 
Tham gia ngày: Mar 2006
Bài gửi: 83
:
Bạn đã thử debug chương trình chưa lỗi ở dòng nào
hanhluckyly vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 24-01-2008, 08:52 PM   #22
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi Jerry View Post
...
Code:
...
void main(void)
{
...
   while(!txif)      putc('*');
}
Nhưng kết quả là không hề thấy ký tự * được truyền lên. Tại sao vậy? Mong nhận được sự giúp đỡ của mọi người.
TXIF được bật lên '1' khi bộ đệm phát là rỗng (empty). Jerry viết như trên có nghĩa là khi bộ đệm không rỗng thì ta đẩy thêm một ký tự vào bộ đệm!!

Nên viết như sau:
Code:
	while (1) {
		while (!TXIF);		//Wait until the transmit buffer is empty;
		putc(c);		//Send one character
		delay_ms(500);		//Wait for a while so human eye can see it
	}
Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 24-01-2008, 11:05 PM   #23
picthanh
Đệ tử 2 túi
 
Tham gia ngày: Jun 2007
Bài gửi: 44
:
hehe ! các bác xem nè em đã gởi được ký tự lên máy tính và nhận ký tự từ trên máy tính gởi xuống vi diều khiển và hiện lên LCD
em xài con 16f877a

Code:
#include "D:\PIC PROGRAM\RS232\goi ky tu.h"
#include <LCD.C>
#include <KBD.C>
  #include <stdio.h>
  #include <stdlib.h>
  
  char k,c;

#int_RDA
RDA_isr() 
{

   c=getch();
   lcd_gotoxy(1,2);
   cd_putc(c);
}



void main()
{

   port_b_pullups(TRUE);
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   lcd_init();
   kbd_init();
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);

while(1)
   {
   k=kbd_getc();
   if (k!=0)
      {
         if(k!='*')
         {
            lcd_gotoxy(1,1);
            lcd_putc(k);
            printf("key = %c",k);
         }
         else lcd_putc('\f');
      }
   }

}
em xài chương trình ComMaster để nhận dữ liệu.
bác Jerry ơi ! em thư dùng Serial Port Monitor of CCS nhưng nó ko hiện dc ký tự mà em gởi lên, chỉ nhận một dãy số kiểu hexa thôi.trong khi đó ComMaster thì chạy ngon lành.ai giải thích giùm em tại sao vậy.

namqn: Bạn hãy học cách đặt code vào giữa hai tag [code] và [ /code] để định dạng.

thay đổi nội dung bởi: namqn, 24-01-2008 lúc 11:12 PM.
picthanh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 24-01-2008, 11:15 PM   #24
picthanh
Đệ tử 2 túi
 
Tham gia ngày: Jun 2007
Bài gửi: 44
:
các bác cho hỏi ComMaster có gửi một chuỗi ký qua cổng com dc ko nhỉ.em đã sữa chương trình lại một chút để VDK nhận một chuỗi ký tự từ cổng Com sau đó xuất ra LCD nhưng kết quả chăng thấy ký tự nào xuất hiện trên LCD cả.

Code:
  char string[10];
#int_RDA
RDA_isr() 
{
char i;
   
   gets(string);
   lcd_gotoxy(1,2);
   for (i=0;i<strlen(string);i++)
   lcd_putc(string[i]);
   
}
namqn: Nhắc lại lần nữa, bạn hãy học cách đặt code giữa hai tag [code] và [ /code] để định dạng

thay đổi nội dung bởi: namqn, 24-01-2008 lúc 11:28 PM.
picthanh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 25-01-2008, 07:57 AM   #25
Jerry
Đệ tử 5 túi
 
Jerry's Avatar
 
Tham gia ngày: Sep 2006
Bài gửi: 100
:
@picthanh:
- Com Master có cho phép gửi 1 chuỗi ký tự qua cổng COM
- Bạn có thể kiểm tra bằng cách nối tắt chân 2 và chân 3 của cổng COM lại, rồi gõ 1 chuỗi dữ liệu vào cửa sổ transmit của Com Master, sau đó nhấn nút Send.
__________________
Do more than exist, LIVE
Jerry vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 25-01-2008, 09:51 AM   #26
linhnc308
Đệ tử 5 túi
 
Tham gia ngày: Oct 2005
Bài gửi: 117
:
Các bạn vào trang web sau để download code PIC cho CCS. Đây là các chương trình tôi đã viết trước đây.
http://linhnc308.googlepages.com/
http://linhnc308.googlepages.com/myprojects

Chúc thành công.
__________________
CallerID, Ethernet-RS232, PICWEB, Cảnh báo BTS
Giải pháp toàn diện giám sát - điều khiển từ xa qua GSM/Internet
0988006696

http://linhnc308.blogspot.com
linhnc308@gmail.com
linhnc308 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 25-01-2008, 11:19 AM   #27
picthanh
Đệ tử 2 túi
 
Tham gia ngày: Jun 2007
Bài gửi: 44
:
các bác ơi,giúp em với .viết chương trình như đã up ở trên sao con pic 16f877a of em ko được nhận 1 chuỗi từ PC giống như trong phần help of CCS hướng dẫn .loay hoay từ hồi tối tới giờ mà nó vẫn ko chạy dc vậy.
picthanh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 25-01-2008, 11:47 AM   #28
Jerry
Đệ tử 5 túi
 
Jerry's Avatar
 
Tham gia ngày: Sep 2006
Bài gửi: 100
:
Trong cái link mà linhnc308 đưa không thấy có phần USART. Bạn xem lại giúp nhé.
__________________
Do more than exist, LIVE
Jerry vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 26-01-2008, 03:20 PM   #29
Jerry
Đệ tử 5 túi
 
Jerry's Avatar
 
Tham gia ngày: Sep 2006
Bài gửi: 100
:
Hi, đã làm xong phần truyền nhận RS232, nhưng mới chỉ truyền nhận được từng ký tự, chưa truyền nhận chuỗi được. Sau đây là chương trình nhận chuỗi gồm 10 ký tự, bắt đầu bằng ký tự '0', kết thúc bằng ký tự '9'. Mục tiêu là như vậy nhưng chạy thử thì chưa được. Các bạn giúp tớ 1 tay nhé:

Code:
#include <16F877A.h>
#include <def_877a.h>
#device *=16 adc=10
#FUSES NOWDT, XT, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)
#use fast_io (b)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

#define OK PIN_B6
#define Cancel PIN_B7

#define OK_PRESSED  !input(OK)

#include <lcd_lib_4bit.c>

   char mang[11];
   int8  dem=0;
   int1 flag;
   char c;

//-----------------------------------------------------------------
 
void main(void)
{
   int8 i;
   press=0;
   output_b(0xC0);
   set_tris_a(0xC0);
   set_tris_b(0xC1);
   port_b_pullups (TRUE);
   set_tris_c(0x90);
   
   LCD_putcmd(0x01);
   LCD_putcmd(0x80);
  
   while(1)
   {
      if(kbhit()) {c=getc();
      if(c=='0') flag=1;
      if((c=='9')&&(flag==1)){flag=0; break;}
      if(flag==1) {dem++; mang[dem]=c;}}
   }   
      mang[10]='\0';                         // kết thúc xâu ký tự
      printf(LCD_putchar,"%s",mang);  // Hiển thị lên LCD
      printf("%s",mang);                   // truyền lên máy tính
}
Nạp chương trình và thử truyền chuỗi ký tự 0 2 3 1 6 5 4 8 7 9 xuống mà không thấy LCD hiện gì, không thấy PIC truyền gì lên máy tính luôn.
__________________
Do more than exist, LIVE
Jerry vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 29-01-2008, 10:35 AM   #30
Jerry
Đệ tử 5 túi
 
Jerry's Avatar
 
Tham gia ngày: Sep 2006
Bài gửi: 100
:
Báo cáo, tớ đã làm xong phần truyền nhận chuỗi gồm 10 ký tự. Chuỗi này có ký tự bắt đầu là 0, ký tự kết thúc là 9. Có thể dễ dàng modify chương trình để có số ký tự truyền nhận hoặc thay đổi ký tự bắt đầu - kết thúc. Sau đây là chương trình post lên cho những người mới học như tớ tham khảo:

Code:
#include <16F877A.h>
#include <def_877a.h>
#device *=16 adc=10
#FUSES NOWDT, XT, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)
#use fast_io (b)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

#include <lcd_lib_4bit.c>

   char mang[11];
   int8  dem=0;
   int1 flag, flag1;
   char c;

#INT_RDA
Receive_isr()
{
      c=getc();
      if(c=='0') flag=1;
      if((c=='9')&&(flag==1)){mang[dem]=c; dem++; flag=0; flag1=1;}
      if(flag==1) {mang[dem]=c; dem++;}  
}

//-----------------------------------------------------------------
 
void main(void)
{
   output_b(0xC0);
   set_tris_a(0xC0);
   set_tris_b(0xC1);
   port_b_pullups (TRUE);
   set_tris_c(0x90);

   LCD_init();
   delay_ms(500);
   LCD_putcmd(0x80);
   Printf(LCD_putchar,"Hi ev'body");   //Hien thi man hinh 1
   LCD_putcmd(0xC0);
   Printf(LCD_putchar,__DATE__);

   enable_interrupts(INT_RDA);
   enable_interrupts (global); 
   
   while(1)
   {
      if(flag1==1)
      {
         LCD_putcmd(0x01);    //xoa man hinh
         LCD_putcmd(0x80);
         mang[10]='\0';
         printf(LCD_putchar,"%s",mang);
         printf("%s",mang);
      }
   }
}
__________________
Do more than exist, LIVE
Jerry 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à 02:54 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