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)
-   -   Nguyễn Thế Vinh - căn bản lập trình CCS (http://www.picvietnam.com/forum/showthread.php?t=841)

NTVinh 08-05-2006 03:17 PM

Làm thế nào để timeout khi dùng hàm getc() của CCS sau một thời gian nhất định, định trước? GETC() là một hàm mà CCS đã có sẵn trong thư viện của nó, nhiệm vụ của getc() là chờ nhận một ký tự mà ký tự đó được truyền tới từ một đầu cuối khác thông qua công truyền thông nối tiếp UART. Khi dùng hàm này, chúng ta hết sức cẩn trọng bởi cái việc "chờ" một ký tự được coi là hợp lệ. Vấn đề này giải quyết thế nào đây? CCS đã mách rằng, hãy sử dụng hàm khbit(). Sau đây là một ví dụ mà CCS cung cấp để giải quyết vấn đề này:

Code:

short timeout_error;

char timed_getc() {

  long timeout;

  timeout_error=FALSE;

  timeout=0;

  while(!kbhit&&(++timeout<50000))  // 1/2 second

      delay_us(10);

  if(kbhit())

    return(getc());

  else {

    timeout_error=TRUE;

    return(0);

  }

}

Nguyen The Vinh.

NTVinh 08-05-2006 03:29 PM

Cách sử dụng hàm timed_getc()

Code:

char temp;
//...
char timed_getc(){
    //...
}
void main(void){
    //...
    while(1){
        //...
        temp=timed_getc();
        //...
    }
}

Nguyen The Vinh.

NTVinh 08-05-2006 03:37 PM

Vấn đề kỳ tới, mời các bạn cùng tham gia: "Làm thế nào để truyền đi một số thực thông qua cổng truyền thông nối tiếp UART với CCS?"
Nguyen The Vinh.

NTVinh 08-05-2006 03:56 PM

Ví dụ:
Code:

//...
float temp[32];
void main (void)
{
int8 i;
for(i=0;i<32;i++)temp[i]=i;
while(1)
{
//Bây giờ ta muốn truyền temp[0], temp[1],...,temp[i],...,temp[31]
//cho PC. Phải làm thế nào đây. Xin mời các bạn!
}
}

Nguyen The Vinh.

falleaf 09-05-2006 01:34 AM

Mình di chuyển bài của bạn ra đây, vì lý do bạn post bài không đúng luồng.

Rất cám ơn những bài viết của bạn, nếu được, bạn nên viết bài kèm theo các sơ đồ nguyên lý minh họa để người đọc dễ theo dõi.

Chúc vui.

NTVinh 09-05-2006 03:36 PM

Phương án giải quyết vấn đề truyền mảng số thực
 
Code:

#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

float temp[32];

void main (void)
{
int8 i;
for(i=0;i<32;i++)temp[i]=i;
while(1)
{
//Bây giờ ta truyền temp[0], temp[1],...,temp[i],...,temp[31] cho PC như sau.
for(i=0;i<128;i++) putc(*(&temp[0]+i));
}
}

Nguyen The Vinh.

NTVinh 09-05-2006 03:39 PM

Vấn đề kỳ tới, mời các bạn cùng tham gia: "Làm thế nào để nhận một mảng số thực thông qua cổng truyền thông nối tiếp UART với CCS?"
Nguyen The Vinh.

ThanhPhuc 10-05-2006 11:19 PM

Theo mình bạn nên dùng thêm 1 hoặc 2 phím để định hướng cho việc truyền dử liệu.Ví dụ phím 1 truyền mảng dử liệu trên,phím 2 dùng cho mục đích khác của chương trình.Như vậy dể kiểm soát hoạt động của chương trình,Theo đoạn code của bạn Pic sẻ liên tục gởi số liệu về PC làm PC có thể chỉ nhận được số liệu đầu tiên.Bạn nên thêm lệnh Delay_ms(x); sau lệnh putc... để PC kịp nhận dữ liệu.

NTVinh 11-05-2006 09:55 AM

Phương án giải quyết vấn đề nhận mảng số thực
 
Code:

#include <16F877.h>
#device *=16
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=2000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)  //

int8 i;
float temp[32];

#int_rda
void serial_isr() {
*(&temp[0]+i)=getc();
i++;if(i==128)i=0;
}
void main() {
i=0;
do {
//...
} while (TRUE);
}

Nguyen The Vinh.

NTVinh 11-05-2006 10:04 AM

Vấn đề kỳ tới, mời các bạn cùng tham gia: "Tạo một lớp liên kết dữ liệu (Datalink layer) trên cơ sở lớp vật lý (Physical layer) là chuẩn truyền thông công nghiệp RS485?"
Nguyen The Vinh.

NTVinh 11-05-2006 10:45 AM

Vài nét về mô hình OSI.
 
ISO (International Standardization Organization) có trụ sở tại Giơnevơ, Thụy sĩ. Năm 1977, ISO được giao trách nhiệm thiết kế một chuẩn truyền thông dựa trên lý thuyết về kiến trúc các hệ thống mở, qua đó thiết kế các mạng máy tính. Mô hình này có tên là OSI (Open System Interconnect).
Mô hình OSI tổ chức các giao thức truyền thông thành bảy lớp. Mỗi lớp giải quyết một phần hẹp của việc truyền thông.

7)Application layer
6)Presentation layer
5)Session layer
4)Transport layer
3)Network layer
2)Data link layer
1)Physical layer

Trong phạm trù của mạng truyền thông công nghiệp nhất là với bus trường thì Physical layer, Data link layer được xây dựng và đã được chuẩn hóa ví dụ Profibus-DP, DA. Các lớp khác không được xây dựng hoặc nếu có thì là chỉ là sự bổ xung nho nhỏ, ví dụ Application layer.

Nguyen The Vinh.

NTVinh 11-05-2006 11:16 AM

Giới thiệu các lớp trong mô hình OSI
 
Lớp 1 : lớp vật lý (physical layer)
Qui định về các tính chất vật lý của hệ thống, chú ý rằng OSI không bắt buộc hay nói cách khác không qui định phải dùng một lớp vật lý cụ thể nào. Tầng vật lý liên quan đến nhiệm vụ truyền dòng bit qua đường truyền vật lý, truy nhập đường truyền vật lý nhờ các phương tiện cơ, điện...
Lớp này định nghĩa vào đặc tính chính của mạng vật lý, bao gồm:
1. Cấu trúc vật lý của mạng.
2. Các định chuẩn cơ học và điện.
3. Mã hoá và định thời gian việc truyền bit.

Lớp 2 : lớp liên kết dữ liệu (data link layer)
Cung cấp phương tiện để truyền thông tin qua liên kết vật lý bảo đảm độ tin cậy. Lớp này qui định về sự đồng bộ hóa, đặc tính của khung dữ liệu, đánh số khung, kiểm tra lỗi, kiểm tra luồng dữ liệu trong quá trình liên lạc.
Lớp nối kết dữ liệu thực hiện các công việc sau:
1. Định địa chỉ các thiết bị trong mạng.
2. Kiểm tra và có thể chỉnh sửa các lỗi truyền thông.
3. Điều khiển truy nhập bus.
...
Các lớp khác không được trình bày ở đây vì mức độ quan trọng của nó trong phạm trù này, cũng như tránh việc gây ra nhiễu người đọc.
Nguyen The Vinh.

NTVinh 11-05-2006 11:40 AM

Một ví dụ về xây dựng lớp vật lý
 
Các bạn xem hình sau. Hình vẽ một trạm thiết bị tham gia trong mạng truyền thông Profibus/RS485, cách ly. Ơ lạ nhỉ, sao không gửi được nhỉ?
Nguyen The Vinh.

ntc 11-05-2006 12:26 PM

Em chưa hiểu rõ lắm về ý định của các bài viết, cũng như các vấn đề có liên quan khác. Anh nói rõ hơn nhé. :D

Anh đang viết về việc xây dựng một hệ thống mở OSI ?? Hay chỉ xây dựng lớp liên kết dữ liệu dựa trên lớp vật lí RS485??

Nếu như vậy thì nó sẽ bao gồm các vấn đề gì nhẩy? Xây dựng cơ chế định địa chỉ, xây dựng cơ chế sửa lỗi, ..., theo các cách như Profibus-DP, DA đã làm ?

Tại sao mình không sử dụng chuẩn Profibus-DP, DA?

Nếu như vậy thì vấn đề này có mối liên quan như thế nào đến hệ thống mở OSI. Nếu anh chỉ đặt vấn đề xây dựng lớp liên kết dữ liệu, thì các giao tiếp chỉ mang tính nội bộ, chứ chưa giao tiếp được với hệ thống OSI, vì nó cần đến các lớp cao hơn. Vấn đề về OSI đặt ra ở đây có tác dụng gì nhẩy. Và tại sao phải tuân theo OSI trong trường hợp này?

Chưa hiểu rõ lắm. Anh giải thích thêm nhé.

Vấn đề này em cũng đang tìm hiểu thôi, theo em biết thì hệ thống OSI tuân theo chuẩn ISO được ứng dụng trong việc trao đổi dữ liệu cho hệ thống máy tính, ngoài ra nó là cơ sở cho các dịch vụ viễn thông (N-ISDN, B-ISDN, ...).

Hì, cái này được đó. Chắc sẽ còn hỏi nhiều. :D

ntc 11-05-2006 12:28 PM

Trích:

Các bạn xem hình sau. Hình vẽ một trạm thiết bị tham gia trong mạng truyền thông Profibus/RS485, cách ly. Ơ lạ nhỉ, sao không gửi được nhỉ?
Anh bấm cái nút "Đổi sang khung lớn", bên đó có cái phần tải file từ máy đó.


Múi giờ GMT. Hiện tại là 01:08 PM.

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