PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Các ngôn ngữ lập trình khác (CCS C, HT PIC,...) (http://www.picvietnam.com/forum/forumdisplay.php?f=12)
-   -   Bỏ bồ già ASM, chuyển sang bồ nhí C mà rắc rối quá! (http://www.picvietnam.com/forum/showthread.php?t=1897)

falleaf 24-01-2008 03:00 PM

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

Jerry 24-01-2008 03:34 PM

Để 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é.

Jerry 24-01-2008 03:38 PM

@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)

Jerry 24-01-2008 03:55 PM

@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ý.

LeDuc 24-01-2008 06:15 PM

Trích:

Nguyên văn bởi picthanh (Post 14077)
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 .

hanhluckyly 24-01-2008 06:56 PM

Bạn đã thử debug chương trình chưa lỗi ở dòng nào

namqn 24-01-2008 08:52 PM

Trích:

Nguyên văn bởi Jerry (Post 14073)
...
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,

picthanh 24-01-2008 11:05 PM

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.

picthanh 24-01-2008 11:15 PM

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

Jerry 25-01-2008 07:57 AM

@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.

linhnc308 25-01-2008 09:51 AM

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.

picthanh 25-01-2008 11:19 AM

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.

Jerry 25-01-2008 11:47 AM

Trong cái link mà linhnc308 đưa không thấy có phần USART. Bạn xem lại giúp nhé.

Jerry 26-01-2008 03:20 PM

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.

Jerry 29-01-2008 10:35 AM

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



Múi giờ GMT. Hiện tại là 07:45 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