PDA

View Full Version : Nguyễn Thế Vinh - căn bản lập trình CCS


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:

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

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ụ:
//...
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
#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
#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
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
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
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
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 đó.

NTVinh
12-05-2006, 09:48 AM
Hôm nay, mình cũng chưa có ý định viết tiếp vấn đề đã nêu. Mà, muốn dừng lại để cùng trao đổi với ntc cái đã. OSI, bản thân nó là một mô hình qui chiếu cho việc phát triển các hệ thống. OSI nó không phải là một chuẩn truyền thông! Nó cũng chẳng qui định rằng hệ thống của bạn phải dùng lớp vật lý này kia, nó cũng chẳng bắt hệ thống của bạn phải xây dựng lớp liên kết dữ liệu như thế nào cả. Như vậy??? Không có lý do nào bảo rằng một hệ thống A, xây dựng truyền thông dựa trên mô hình OSI, lại có thể giao tiếp được với một hệ thống B cũng xây dựng truyền thông dựa theo mô hình qui chiếu. Tóm lại, OSI chỉ có nhiệm vụ làm cơ sở để đối chiếu hệ truyền thông đã có, cũng như làm cơ sở cho việc xây dựng một hệ thống mới.
Nguyen The Vinh.

ntc
12-05-2006, 11:14 AM
Như vậy bản chất của OSI chỉ là một mô hình để đối chiếu thôi. Uh nhỉ. Khi phát triển một hệ thống mới, cũng như nghiên cứu các hệ thống trong thực tế, OSI được dùng làm cở sở để phân tích hệ thống, đúng không anh.

Khi xây dựng một hệ thống, ta sẽ dựa trên OSI để phân tích, rằng có những vấn đề gì cần quan tâm, có những mô hình nào cần xây dựng, có những công việc nào cần làm, dựa theo yêu cầu của từng lớp cụ thể, ví dụ như lựa chọn lớp vật lí phù hợp với hệ thống, chọn cơ chế mã hóa, cơ chế định địa chỉ, cơ chế sửa lỗi, cơ chế truy xuất đối với lớp vật lí và lớp liên kết dữ liệu, các lớp tiếp theo có thể liên quan đến các vấn đề như chọn cơ chế tạo tuyến, cơ chế đóng gói dữ liệu, vân vân và vân vân... Mỗi hệ thống trong thực tế sẽ có nhiều sự lựa chọn và cách xây dựng khác nhau, do đó không thể đảm bảo rằng hệ thống này có thể giao tiếp với hệ thống khác khi cùng xây dựng trên mô hình OSI.

Khi phân tích một hệ thống, các thao tác cũng tương tự: phân tích cấu trúc lớp vật lí, phân tích các cơ chế có liên quan dựa trên hệ tham chiếu OSI 7 lớp như vậy.

Em có thể hiểu được sơ lược các vấn đề anh Vinh muốn đề cập rồi. :D.

Mục đích các bài viết sẽ là xây dựng một mạng truyền thông ứng dụng trong công nghiệp với lớp vật lí được lựa chọn là RS485. Các công việc cần tiến hành sẽ là:

- Phân tích cấu trúc lớp vật lí RS485 để làm cơ sở cho việc xây dựng mạng truyền thông, đồng thời xác định một số cơ chế thích hợp về mã hóa và tốc độ truyền bit phù hợp cho lớp vật lí RS485 (các vấn đề liên quan đến lớp 1).

- Xây dựng một số cơ chế trong lớp 2 cho mạng, các công việc sẽ bao gồm: xây dựng cơ chế định địa chỉ các thiết bị trong mạng, xây dựng cơ chế sửa lỗi và kiểm tra lỗi truyền thông cho mạng, xây dựng cở chế điều khiển truy nhập BUS.

Còn thiếu chỗ nào nữa không anh??

Em sẽ tìm hiểu về RS485 để tham gia luồng này với anh. Mình làm tới nơi tới chốn dzụ này luôn nhá.

:D

NTVinh
17-05-2006, 10:50 AM
Bài viết này tiếp nối cho vấn đề mà tôi đang đề cập, xây dựng một mạng truyền thông công nghiệp, những bài viết trước tôi đã nói về một số các mào đầu: các ví dụ nhỏ cụ thể là các subroutine cũng như giải thuật về việc truyền data định dạng số thực trên cơ sở vi điều khiển PIC (tất nhiên rồi, PIC được lựa chọn vì bài viết này đang nằm trên http://www.picvietnam.com), một số điều vắn tắt về mô hình tham chiếu OSI. Hôm nay, chúng ta sẽ đề cập đến lớp vật lý trên cơ sở chuẩn RS485 một cách chi tiết hơn, tất nhiên, trong bài viết nho nhỏ này thì cũng thật khó để truyền tải được nhiều lắm những vấn đề.
- RS485 là chuẩn truyền thông do EIA đưa ra, có khả năng truyền thông đa điểm trên bus chung duy nhât.
- Cấu hình mạng thông dụng nhất là sử dụng 2 dây dẫn cho việc truyền thông data, trong trường hợp này thì, hệ thống chỉ làm việc trong chế độ truyền thông bán song công (half-duplex). Có thể nói thêm về cấu hình này là, đây là cấu hình mà cho phép ta xây dựng lớp Datalink mềm dẻo hơn (so với cấu hình sử dụng 4 dây dẫn, đề cập ngay sau đây). Một cấu hình mạng khác là sử dụng 4 dây dẫn cho việc truyền thông data, trong trường hợp này thì, hệ thống làm việc trong chế độ truyền thông song công (full-duplex).
- Số lượng thành viên tham gia trong mạng, có thể nói rằng đây chỉ là một con số mang tính thời sự, lên tới 128 thành viên.
- Các qui định về mặt điện học, hay nói cách khác là các thông số quan trọng về mặt điện học của RS485 (có lẽ tôi cũng chỉ muốn đề cập đến nó hơn là các qui định về mặt cơ học..., điều này các bạn có thể tham khảo thêm: ví dụ về giắc nối, vỏ bọc chống nhiều cho cáp truyền thông, loại cáp là cặp dây xoắn...): RS485 sử dụng tín hiệu áp chênh lệch đối xứng trên đôi dây dẫn. Các trở đầu cuối cần được cài vào tại đầu cuối của mạng, điều này sẽ tránh được (triệt tiêu được) các sóng phản hồi trên đường dây dẫn. (Các bạn có thể hiểu rõ hơn về vấn đề sóng tới, sóng phản hồi cũng như tác hại của nó trong lý thuyết đường dây dài). Có lẽ, đấy là các thông số quan trọng trực tiếp liên quan đến việc xây dựng mạng RS485 trên quan điểm của người thiết kế.
Tôi xin giới thiệu một số IC truyền thông RS485 tiêu biểu: 75176, IL485 (con này thì tuyệt cú mèo).
Nguyen The Vinh.

thancongbao
25-05-2006, 10:23 PM
Chào Bạn Vinh !!! Tớ cũng khoái cái mảng này !!! Nhưng xem ra cậu vào không được hoan nghênh lắm !!! He he he
Mạng công nghiệp theo mình nghĩ thì không nên tự xây dựng.Trường hợp tự xây dựng chỉ nên dùng khi bạn muốn đào tạo một người nào đó về mạng thôi !!! Hoặc bạn làm một Project nhỏ với các bộ điều khiển của riêng bạn thôi .
Nếu bạn có thời gian thì chao đổi với mình
Thancongbao@gmail.com -> Rất vui vì bạn rất nhiệt tình chia sẻ !!!

thancongbao
25-05-2006, 10:35 PM
Không thấy bác nhắc đến chuyện viết OPC hoặc Activex hay DLL thế !!!

thancongbao
25-05-2006, 10:40 PM
#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.

thancongbao
25-05-2006, 10:46 PM
putc(*(temp+i)); vì trong C temp là con trỏ của mảng.

*(temp+i)=getc();

hpecom
06-06-2006, 10:36 AM
#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.
Xin anh giải thích:
_ Tại sao anh khai báo mảng 32 phần tử mà khi sử dụng lại dùng tới 128 phần tử?
_ Cú pháp &temp[0] có phải lấy địa chỉ của temp[0]?
_ Và *(&temp[0]+i) là giá trị trong ô nhớ có địa chỉ (&temp[0]+i).
_ Nếu khai báo biến và sử dụng biến như trên thì CCS sẽ xử lý như thế nào? vì trong trường hợp nào sẽ xảy ra lỗi?
Cảm ơn anh rất nhiều!
Mong anh.
hpecom.

hpecom
06-06-2006, 10:43 AM
#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.
Mong anh chỉ bảo:
_ Nếu em muốn truyền một số thực từ máy tính xuống PIC qua RS232 thì có được không?
_ Nếu được mong anh cho em một ví dụ viết trên MS Comm của Visual Basic 6.0.
Cảm ơn anh!
Rất mong anh.
hpecom.

thancongbao
08-06-2006, 09:20 AM
http://www.modbus.pl/downloads.htm
Anh em dùng PIC load về nhé !!! Tham khảo được khối thứ !!!

hoangngoc
26-09-2006, 09:19 PM
Em chuẩn bị làm ĐATN về mạng công nghiệp, tuy nhiên em chưa rõ lắm về cách thức chuyển đổi chuẩn RS232->RS485. Em có tham khảo 1 mạch giao tiếp máy tính dùng RS485 như sau, mong các anh giải thích giúp em chức năng của các IC cũng như hoạt động của mạch. Em rất cảm ơn

NTVinh
27-09-2006, 10:11 AM
Mạch chuyển đổi RS232/RS485 của bạn có những đặc điểm như sau (mình cứ đọc mạch nguyên lí chỗ nào thì mình viết chỗ ấy nhé, nên có thể sắp xếp không được hay lắm):
* Chuyển đổi về mặt vật lí giữa hai chuẩn RS232 và chuẩn RS485.
* Theo như mạch nguyên lí thì mạng RS485 của em có thể có tới 64 thành viên tham gia, 32 thành viên nối với J7 và 32 thành viên nối với J3 (nếu MAX485 cho phép 32 thành viên, 32x2=64. Chú ý rằng bây giờ có những IC cho phép tới 64 thành viên tham gia trên mạng, và nếu dùng nó thay cho MAX485 thì mạng của bạn cho phép 128 thành viên trên bus). Các thành viên trên mạng sẽ tạo thành một mạng kiểu một Master, giao tiếp song công RS485 4 dây.
* Cách li về điện bởi các opto 6N137, H11AG1.
* Các IC U3 và U4 luôn ở trạng thái truyền vì các chân /R/E, DE luôn ở mức logic 1.
* Các IC U5 và U6 luôn ở trạng thái nhận vì các chân /R/E, DE luôn ở mức logic 0.
* Chương trình viết cho thiết bị mà nối với cổng P1 cần chú ý là ngoài việc thiết lập các vấn đề như tốc độ truyền thông, khung dữ liệu cho một byte... thì cần thiết lập các chân 7 (của jắc P1) lên mức logic 1, và chân 4 (của jắc P1) xuống mức logic 0.
Bình luận về mạch của bạn: nói chung là không hay lắm vì mạch quá phức tạp và chưa có bảo vệ. Bạn có thể thay phần cách li và MAX485 bởi IL485W, con này hay lắm. Nữa là phần bảo vệ, có thể lắp thêm cầu chì (100mA) cho bus RS485, các bảo vệ chống điện áp cao, chống sét...
...
Nguyễn Thế Vinh.

hoangngoc
27-09-2006, 08:09 PM
Rất cám ơn anh Vinh đã trả lời sớm như vậy. Cho em hỏi 1 vài câu hỏi sau:

-Câu "nếu MAX485 cho phép 32 thành viên" có nghĩa là gì, Max 485 luôn cho phép 32 thành viên hay chỉ đối với mạch này?

-Ở mỗi đầu ra J7 và J3 chỉ có 4 dây, 2 truyền và 2 nhận, như vậy nối với 32 thành viên như thế nào?

-Tại sao phải cách ly về điện và hoạt động cách ly của 2 IC đó như thế nào?

-Em chưa từng biết con IL485, anh có thể cho em thông tin về nó, hoặc nếu có thể, anh cho em xin mạch giao tiếp máy tính dùng IL485 được không ạ?

Cảm ơn anh

(learning electronic, quite hard for a girl !!)

NTVinh
28-09-2006, 09:48 AM
Q: Câu "nếu MAX485 cho phép 32 thành viên" có nghĩa là gì, Max 485 luôn cho phép 32 thành viên hay chỉ đối với mạch này?
A: Chính xác là MAX485 cho phép 32 thành viên rồi, hôm trước chưa đọc datasheet của nó nên anh mới nói là "nếu MAX485 cho phép 32 thành viên". Như vậy với khả năng như vậy thì toàn bộ mạch của em cho phép 32x2=64 thành viên tham gia (vì mạch của em có tới những hai bộ truyền, hai bộ nhận). Về vấn đề MAX485 cho phép tối đa chỉ có 32 thành viên tham gia trên bus vì lí do dòng điện.
Q:Ở mỗi đầu ra J7 và J3 chỉ có 4 dây, 2 truyền và 2 nhận, như vậy nối với 32 thành viên như thế nào?
A: Câu này trả lời qua mạng thì hơi khó, thôi thì em tham khảo một mạng RS485 kiểu 4 dây sau nhé, lắp như họ là được. http://www.maxim-ic.com/appnotes.cfm/appnote_number/2116.
Q: Tại sao phải cách ly về điện và hoạt động cách ly của 2 IC đó như thế nào?
A: Vấn đề cách ly về điện để đảm bảo an toàn cho các thành viên trên mạng, hihi, nó như kiểu mình đeo kính khi đi xe máy ý, vẫn nhìn thấy đường đi mà không sợ bị bụi. Hoạt động của hai IC cách ly? Nó liên quan đến vấn đề chuyển đổi Điện~~>Quang và Quang~~>Điện, em có thể tham khảo trong các quyển sách về Điện tử số.
Q: Em chưa từng biết con IL485, anh có thể cho em thông tin về nó, hoặc nếu có thể, anh cho em xin mạch giao tiếp máy tính dùng IL485 được không ạ?
A: Em vào trang này xem nhé, www.nve.com. Con IL485W nó có một số đặc điểm rất hay, ví dụ như tốc độ truyền cao, cách li, tương thích Profibus...
Nguyễn Thế Vinh.

ntc
28-09-2006, 08:39 PM
-Câu "nếu MAX485 cho phép 32 thành viên" có nghĩa là gì, Max 485 luôn cho phép 32 thành viên hay chỉ đối với mạch này?


Chính xác hơn, là đường truyền RS485 cho phép 32 UL (Unit Load,tạm dịch là đơn vị tải) được gắn vào đường truyền tín hiệu. Các đặc tính của một UL bạn có thể search trên google để nắm thêm.

Việc qui định các đặc tính của một đơn vị tải cho phép người thiết kế linh động hơn trong việc quyết định cho phép gắn bao nhiêu thiết bị trên một đường truyền. Bởi vì các đặc tính tải của các thiết bị trong thực tế rất đa dạng.

Ví dụ, một thiết bị có các đặc tính tải đáp ứng đúng với các yêu cầu của một UL, thì có thể gắn được 32 thiết bị như vậy trên đường truyền. Các chip như MAX485, 75176 được thiết kế để phù hợp với các đặc tính của một đơn vị tải, nên có thể gắn được 32 bộ chuyển đổi như vậy.

Trong một trường hợp khác, một thiết bị có khả năng đáp ứng tốt hơn các yêu cầu của một UL (1/2 UL, 1/4 UL, 1/8 UL, ...), thì cho phép gắn nhiều thiết bị hơn trên đường truyền. Ví dụ như thiết bị có đặc tính tải bằng 1/2 UL thì có thể gắn được 64 thiết bị như vậy, ...

Cái khái niệm UL hơi khó hiểu, bạn cử tìm hiểu thêm rồi mình cùng trao đổi.

hoangngoc
28-09-2006, 11:26 PM
Mỗi đường truyền RS485 có thể kết nối với 32 thiết bị. Như vậy giả sử có một mạng gồm < 32 kit điều khiển thì chỉ cần dùng 1 cặp max485 (song công), và 32 kit này sẽ được nối với 4 đường dây đó thông qua một mạch ghép nối trung gian?

Em có tham khảo một mạng chỉ có 2 kit điều khiển nhưng dùng 2 cặp max485 như trong hình. 1 kit nối với J7 và 1 kit nối với J3. Vậy là sao?

ghosts_84
28-09-2006, 11:33 PM
các bác có biết lập trình mô phỏng OpenGL ko chỉ cho đệ biết với
Bác nào có tài liệu nào tiếng việt nào ko? chỉ giúp em

hoangminh1234
29-09-2006, 03:37 AM
#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.

minh ko hieu cho nay *(&temp[0]+i)=getc(); mong bạn chỉ kỹ hơn tí nhé

NTVinh
29-09-2006, 09:55 AM
Mỗi đường truyền RS485 có thể kết nối với 32 thiết bị. Như vậy giả sử có một mạng gồm < 32 kit điều khiển thì chỉ cần dùng 1 cặp max485 (song công), và 32 kit này sẽ được nối với 4 đường dây đó thông qua một mạch ghép nối trung gian?

A: Em có thể đặt lại câu hỏi rõ ràng hơn được không. Nói chung là nếu chuyển nguyên văn câu hỏi trên thành một câu trả lời thì cũng được.
Nguyễn Thế Vinh.

NTVinh
29-09-2006, 10:05 AM
Em có tham khảo một mạng chỉ có 2 kit điều khiển nhưng dùng 2 cặp max485 như trong hình. 1 kit nối với J7 và 1 kit nối với J3. Vậy là sao?
A: Oki, nối như vậy là được rồi. Tuy nhiên, nối như vậy chỉ mang tính chất là minh hoạ thôi, chứ thực tế ai lại nối như thế đúng không, tốn tiền. Chỉ có hai kit điều khiển thôi mà lại phải làm phức tạp!!! Cái mạch nguyên lý của em "chỉ thích hợp" khi:
1. Em muốn thiết kế một mạng có hơn 32 thành viên tham gia.
2. Em không mua được IC truyền thông RS485 mà IC đó cho phép đấu nối lớn hơn 32 thành viên, ví dụ IL485W.
3. Em cần một mạng truyền thông song công.

Nguyễn Thế Vinh.

NTVinh
29-09-2006, 10:22 AM
minh ko hieu cho nay *(&temp[0]+i)=getc(); mong bạn chỉ kỹ hơn tí nhé.
A: Để dễ hình dung, mình xin lấy một ví dụ mã giả như sau nhé. Cái mã giả này có nội dung là, bạn muốn nhận 32 số kiểu float về vi điều khiển (PIC6F877, AT89C51, DS89C420,...) từ một thiết bị đầu cuối nào đó thông qua cổng truyền thông RS232. Theo chuẩn RS232, và theo đặc điểm của các vi điều khiển đã liệt kê ở trên, ta thực hiên mã giả như sau.
- Khai báo một mảng 32 phần tử dạng float, bắt đầu từ địa chỉ 0x0010 trong ram.
float temp[32] _at_ 0x0010;
- Như vậy, tại địa chi 0x0010 sẽ đựng nôi dung của byte chứa bit dấu của số thực temp[0]..., tại địa chỉ 0x0014 đựng nội dung của byte chứa bit dấu của số thự temp[1]...
- Như vậy thì...ôi, thôi, viết dài quá!!! Bạn tự suy luận tiếp nhé.
Nguyễn Thế Vinh.

hoangngoc
30-09-2006, 09:37 AM
Em hiểu rồi, cảm ơn anh Vinh nhé. Trong quá trình làm, nếu có gì vướng mắc, em sẽ hỏi tiếp. :D

falleaf
30-09-2006, 01:54 PM
Khi cám ơn một bài viết, hãy bấm vào nút cám ơn, thay vì viết một bài khác. Diễn đàn mới có tính năng này. Số lượng bài được mọi người cám ơn sẽ hiện ngay bên dưới nick.

to NTVinh: khi bạn bấm quote một bài để trả lời, bạn xóa hết các phần không quan trọng, nhưng nhớ chừa lại chữ [/quote] để nó hiển thị đúng. Nếu không nó sẽ hiển thị sai và nhìn rất rối rắm.

Rất cám ơn các bạn :).

chúc vui.

phamhuydangcdt
05-02-2007, 03:20 PM
chao cac ban cac ban co the cho minh mot cai nhin tong quan nhat ve
CCSC va HTPIC duoc khong ? cam on

hungnp
09-04-2007, 04:17 PM
Chào tất cả các bác,

Tôi cũng có đọc về mạng truyền thông modbus sử dụng chuẩn 485 cho lớp vật lý(lớp 1), và giao thức truyền thông master/slave cho lớp 2(datalink). Tôi có một số thắc mắc mà đến giờ vẫn chưa giải đáp được, mong các bác giúp đỡ.

Câu 1: Về lý thuyết tôi thấy trong giao thức master/slave cho phép kết nối tối đa 256(vì nó dùng một byte để định địa chỉ cho các slave) slave. Nhưng chắc chắn trong thực tế số lượng này là viễn tưởng. vậy các bác có thể đưa ra được những nguyên nhân rõ ràng nhất để mọi người có thể biết một cái RS232/RS485 converter mà họ làm ra có thế kết nối được bao nhiêu slave không?

Câu 2: khả năng tải của cặp dây(nếu dùng loại 2 dây) và đôi cặp dây( nếu dùng loại 4 dây), có nghĩa là độ dài của đường truyền tối đa của nó được ước lượng như thế nào?(trong khi lý thuyết của nó vào khoảng 1200m).

Cảm ơn các bác nhiều.

hampic
25-10-2007, 10:49 PM
Mong anh chỉ bảo:
_ Nếu em muốn truyền một số thực từ máy tính xuống PIC qua RS232 thì có được không?
_ Nếu được mong anh cho em một ví dụ viết trên MS Comm của Visual Basic 6.0.
Cảm ơn anh!
Rất mong anh.
hpecom.

hehe, theo mình nghĩ thì truyền cái gì cũng được nhưng chú ý là rs232 mỗi lần truyền 1 byte cho nên, một số có giá trị lớn hơn 255 thì truyền coi chừng bị sai. Khi đó, bạn nên chuyển sang chuỗi và truyền rồi khi nhận thì ghép lại.
Viết bằng MS Comm trong VB thì dể mà, bạn muốn thử gửi 1 giá trị nào thì có thể tạo một editbox rồi lấy giá trị trong nó gán cho hàm Output. Nhận thì dùng cách bẩy sự kiện OnComm() với CommEvent = comEvReceive rồi nhận giá trị từ hàm Input.
Xem file đính kèm để hiểu rỏ hơn (có ví dụ).

Thân

LeDuc
16-11-2007, 01:01 AM
Cho mình hỏi vậy nếu ta truyền một dữ liệu 8bit qua cổng nối tiếp thì làm thế nào vậy?

#include <16F877.h>
#device *=16 adc=8
#fuses HS,NOWDT,NOPROTECT,NOLVP

#use delay(clock=20000000)
#use fast_io(a)
#use fast_io(d)
#use rs232(baud=19200,parity=n,xmit=pin_C6,rcv=pin_c7,b its=8)

int8 led[] ={0,1,2,3,4,5,6,7,8,9},k=0;
int8 so[4];
int8 quet[]={128,64,32,16};
int32 a,b,value;

#int_rtcc
void rtcc()
{
set_timer0(99);
b=a;
so[0]=a%10; a/=10;
so[1]=a%10;a/=10;
so[2]=a%10; a/=10;
so[3]=a; a=b;
portd=led[so[k]]+ quet[k]; k++;
if(k==4); k=0;
}

void main()
{
trisa=255;
trisd=0;
setup_adc(adc_clock_internal);
setup_adc_ports(all_analog);
set_adc_channel(0);
set-timer_0(rtcc_internal|rtcc_div_128);
enable_interrupts(int_rtcc);
enable_interrupts(global);
set_timer0(99);
while(true)
{
delay_ms(10);
value=read_adc();
a=value;
}
}


Bây giờ để truyền dữ liệu qua cồng nối tiếp , mình phải làm sao đây ?
Bình thường phải tốn hết 8 chân VDK ở port d , nếu truyền qua cổng nối tiếp thì chỉ cần tốn có 2 chân con VDK hà . Rất mong các huynh chi giáo giúp đệ...
Thanks

tiendungkct
17-11-2007, 10:35 AM
Bạn Thử Dung Giao Tiếp I2c Or Usart Xem Sao
Phấn Mền Thì Có Thể Tự Viết Bắng Vc++or Vb
Mình Cũng đang Làm Về Phần Này Hỵ Vọng Sẽ đươc Các Bạn Hỗ Trợ
Thanks

thuyvu
20-06-2008, 05:55 AM
A: Để dễ hình dung, mình xin lấy một ví dụ mã giả như sau nhé. Cái mã giả này có nội dung là, bạn muốn nhận 32 số kiểu float về vi điều khiển (PIC6F877, AT89C51, DS89C420,...) từ một thiết bị đầu cuối nào đó thông qua cổng truyền thông RS232. Theo chuẩn RS232, và theo đặc điểm của các vi điều khiển đã liệt kê ở trên, ta thực hiên mã giả như sau.
- Khai báo một mảng 32 phần tử dạng float, bắt đầu từ địa chỉ 0x0010 trong ram.
float temp[32] _at_ 0x0010;
- Như vậy, tại địa chi 0x0010 sẽ đựng nôi dung của byte chứa bit dấu của số thực temp[0]..., tại địa chỉ 0x0014 đựng nội dung của byte chứa bit dấu của số thự temp[1]...
- Như vậy thì...ôi, thôi, viết dài quá!!! Bạn tự suy luận tiếp nhé.
Nguyễn Thế Vinh.

Bạn nào có mạch chuyển đổi RS485 sang RS232 thì gửi cho mình xin vơi:xuanvudk2@gmail.com

Hard
20-06-2008, 10:26 AM
Hi,
Các bác cho tui hỏi cách nhảy đến Địa chỉ = (địa chỉ hiện tại + 2000) trong CCS bằng cách nào. Tui tìm trong Help mà không thấy cách nào để lấy địa chỉ con trỏ chương trình cả. Rất mong các bác chỉ giáo vụ này vì tui cũng chưa tiếp xúc với CCS nhiều.
Thân ái.

phucan30
04-09-2009, 01:24 AM
có bác nào có tài liệu hướng dẫn sử dụng phần mền mplab IDE 8.02 ko?cho em đi.đây là địa chỉ mail của em nè:nguyenphucan19@yahoo.com,
các bác giúp giùm em nha,em thank nhiều

phucan30
04-09-2009, 01:40 AM
ah.bac nao co tai lieu huong dan hoc lap trinh ccs thi cho em nha,em cam on nhieu,lan nay em quyet hoc cho ra tro ,cac bac lam on giup do em nha

12345X
13-09-2010, 11:41 PM
anh vinh oi. a co tai lieu huong dan viet ccs c ko.
may cai ham cua ccs c do. chu a viet vay e cung ko piet vo ve ham no su dung lam sao nua, ne e doc ma ko hieu j nhieu lam. tai e moi hoc nen cung ko ranh lam. a thong cam nha. a giai thich dum e cong dung viet cua tung ham lun nha.

thanhks a
chuc a vui

dinhminh09
15-09-2010, 08:27 PM
ah.bac nao co tai lieu huong dan hoc lap trinh ccs thi cho em nha,em cam on nhieu,lan nay em quyet hoc cho ra tro ,cac bac lam on giup do em nha


minh cho các bạn cái link cái này mình sưu tâm và gộp lại nói chung chỉ cần có bộ này là cũng đủ múa lửa về ccs c rôi
http://www.mediafire.com/?caus3w6276riwi7

linhdang
26-11-2010, 11:14 PM
ai co bai tap[ c cho pic 16f887 ko cho minh xin voi minh cam on rat nhieu
email:hoanglinh_111988@yahoo.com

quangvanvo
08-01-2011, 09:37 AM
trong mấy đoạn code thì thấy bạn sử dụng portx được còn mình thi nó báo lỗi hoài àh mình chỉ dùng set_tris_x(giá trị), set_port_x(giá trị) không à tại sao lại vậy áh có biết thì chỉ mình với you!!!!!!
nếu có thể giữ qua mail hoặc yahoo giùm mình nha:
<<phieudu_cunggio951@yahoo.com.vn>>

quangvanvo
11-01-2011, 10:12 AM
các anh chị ơi em mới viết code cho pic lần đầu ma em đang muốn tìm hiểu về các ngắt mà đọc các tài liệu thì no không có các vidu rõ cho từng ngắt; thí dụ như ngắt timer1 khi nó đếm tràn thì xảy ra hiên tương ngắt tùi vào trong timer1 mình có cần nạp lai giá tri cho timer1 không hả các anh chị? các anh chị hãy bode len các ví dụ và có giai thích cho tuwng dòng giùm ưm với!!!!!!

hangocminh1989
10-07-2011, 05:35 PM
Em làm đoạn code test cổng com với pic 16f887 như sau:
#include <16f887.h>
#include <def_887.h>
#device *=16adc=8
#use delay(clock=20M)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bi ts=8)//,stream=PORT1)
#include <lcd_lib_8bit.c>
//---------------------------
boolean flag_rb4=0;
//---------------------------
#INT_RB
void RB_isr(void)
{
if(!input(pin_b2))
{
flag_rb4=1;
clear_interrupt(INT_RB2);
}
}
#int_RDA
void RDA_isr(void)
{

}
void main()
{
lcd_init();
set_tris_c(0xf0);
lcd_putcmd(0xc0);
lcd_putchar("TEST");
setup_comparator(NC_NC_NC_NC);
enable_interrupts(INT_RDA);
enable_interrupts(INT_RB2);
enable_interrupts(GLOBAL);
while(1)
{
if(flag_rb4==1)
{
flag_rb4=0;
PRINTF("TEST");
lcd_putcmd(0x01);
lcd_putchar("DA TRUYEN");
}
}

}
khi em nhấn phím b4 thì truyền chuỗi từ pic lên terminal và lcd. nhưng sao trên terminal em không thấy cái dòng chữ nào hết, hic. bác nào biết giúp dỡ em chỗ này đi

chanhtho_1991
28-09-2012, 12:08 PM
các anh ơi, em đang làm bài về mô phỏng các bài tập ví dụ trong thư viện của CCS4. em làm tới mô phỏng của 2 ví dụ này thì không biết làm sao nửa. các anh giúp em vẽ mạch mô phỏng trên protues với, hay là chỉ giúp em những linh kiện nào trong mạch, và cách kết nối sao với. em gửi ví dụ này các anh xem giúp và chỉ dẫn giúp em với, em chân thành cảm ơn

/////////////////////////////////////////////////////////////////////////
//// EX_CAN_CCS_A.C ////
//// ////
//// Example of CCS's CAN library, using the PIC18Fxx8. This ////
//// example was tested with and written for the CCS CAN Prototype ////
//// board. ////
//// ////
//// The CCS CAN Prototype board has four CAN nodes that communicate ////
//// to each other. Node A is the 18F458 with it's internal CAN ////
//// peripheral, Node B is a PIC16F87x connected to an external ////
//// MCP2510 CAN peripheral, and Node C and Node D are both MCP250xx ////
//// stand-alone CAN I/O expanders. This example is the firmware ////
//// for Node A. ////
//// ////
//// Every two seconds this firmware sends out a command to node B ////
//// to change it's leds (CAN ID 0x202) ////
//// ////
//// Upon change of the A/D reading, a value of 0-9 is sent to ////
//// Node D which is displayed on the 8-seg LCD (CAN ID 0x400) ////
//// ////
//// Pressing the Node A button sends a request to Node B (CAN ID ////
//// 0x201) for Node B's A/D reading, which Node B will respond ////
//// with a CAN message with it's A/D reading (with CAN ID 0x201). ////
//// Also, pressing the Node A button will change the LEDs on Node ////
//// C (CAN ID 0x300) ////
//// ////
//// Pressing Node C's buttons will cause Node A's buttons to change ////
//// (Node C transmits button changes with CAN ID 0x303) ////
//// ////
//// Using a serial port, you can examine all the CAN traffic as ////
//// seen by the 18xxx8. ////
//// ////
//// For more documentation on the CCS CAN library, see can-18xxx8.c ////
//// ////
//// Jumpers: ////
//// PCH pin C7 to RS232 RX, pin C6 to RS232 TX ////
//// ////
//// This example will work with the PCH compiler. ////
/////////////////////////////////////////////////////////////////////////
//// ////
//// Baud rate settings to use to connect to the CCS CAN Prototype ////
//// board at 20Mhz: ////
//// ////
//// Baud Rate Prescalar: 4 ////
//// Propagation Segment: 3xTq ////
//// Phase Segment 1: 6xTq ////
//// Phase Segment 2: 6xTq ////
//// Synchronized Jump Width: 1xTq ////
//// Sample Rate: 1x ////
//// Wakeup Filter: Off ////
//// ////
/////////////////////////////////////////////////////////////////////////
//// ////
//// Node C and D are seperate stand-alone MCP250xx CAN I/O ////
//// expanders. The CCS CAN Prototype board has these chips already ////
//// programmed correctly. However, if you wish to program your own ////
//// to work with this example, then use the provided .HEX files ////
//// a programmer capable of programming these chips. Or, make a ////
//// a new HEX file with these properties: ////
//// ////
//// NODE C: Set RX ID mask and buffers to receive ID 0x3**. (The ** ////
//// means make the least signifcant 8bits no-care in the mask). ////
//// Set TX1 buffer to ID 0x301, TX2 buffer to ID 0x302, TX3 buffer ////
//// to ID 0x303. Set GP0 to analog (and enable the A/D). Set GP1, ////
//// GP2 and GP3 to OUTPUT. Set GP4, GP5 and GP6 as INPUT with edge ////
//// trigger enable. Leave OPTREG2 clear, disable PWM1 and PWM2, ////
//// and disable scheduled transmission. Also, see the baud rate ////
//// settings above. ////
//// ////
//// NODE D: Set RX ID mask and buffers to receive ID 0x4**. (The ** ////
//// means make the least signifcant 8bits no-care in the mask). ////
//// Set TX1 buffer to ID 0x401, TX2 buffer to ID 0x402, TX3 buffer ////
//// to ID 0x403. Configure all ports as OUTPUT. Leave OPTREG2 ////
//// clear, disable PWM1 and PWM2, and disable scheduled ////
//// transmission. Also, see the baud rate settings above. ////
//// ////
/////////////////////////////////////////////////////////////////////////
//// (C) Copyright 1996,2003 Custom Computer Services ////
//// This source code may only be used by licensed users of the CCS ////
//// C compiler. This source code may only be distributed to other ////
//// licensed users of the CCS C compiler. No other use, ////
//// reproduction or distribution is permitted without written ////
//// permission. Derivative programs created using this software ////
//// in object code form are not restricted in any way. ////
/////////////////////////////////////////////////////////////////////////

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

#define CAN_DO_DEBUG TRUE

#include <can-18xxx8.c>

#define PIN_LED1 PIN_A5
#define PIN_LED2 PIN_B5
#define PIN_LED3 PIN_B4

#define LED1_HIGH output_low(PIN_LED1)
#define LED1_LOW output_high(PIN_LED1)
#define LED2_HIGH output_low(PIN_LED2)
#define LED2_LOW output_high(PIN_LED2)
#define LED3_HIGH output_low(PIN_LED3)
#define LED3_LOW output_high(PIN_LED3)

#define BUTTON PIN_A4

#define BUTTON_PRESSED !input(BUTTON)

int16 ms;

const char lcd_seg[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x1 0}; //0 for on, 1 for off

#int_timer2
void isr_timer2(void) {
ms++; //keep a running timer that increments every milli-second
}

#define ASK_FOR_ID_AD_B 0x201 //ask for AD info from CAN port B
#define SET_LED_ID_B 0x202 //set LEDs for CAN port B
#define RESPOND_TO_LED_C_ID 0x303
#define WRITE_REGISTER_C_ID 0x300
#define WRITE_REGISTER_D_ID 0x400

void main() {
int b_leds=0;
int c_leds=1;
int a_leds=0;
struct rx_stat rxstat;
int32 rx_id;
int buffer[8];
int rx_len;

int last_lcd_output=0xFF;
int i,curr_lcd_output;

setup_port_a(RA0_ANALOG);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);

for(i=0;i<8;i++) {
buffer[i]=0;
}

LED1_HIGH;
LED2_HIGH;
LED3_HIGH;
printf("\r\n\r\nCCS CAN EXAMPLE\r\n");
delay_ms(1000);
LED1_LOW;
LED2_LOW;
LED3_LOW;

setup_timer_2(T2_DIV_BY_4,79,16); //setup up timer2 to interrupt every 1ms if using 20Mhz clock

can_init();

enable_interrupts(INT_TIMER2);
enable_interrupts(GLOBAL);

printf("\r\nRunning...");

while(TRUE)
{
if ( can_kbhit() )
{
printf("\r\n");
if(can_getd(rx_id, &buffer[0], rx_len, rxstat)) {
if (rx_id == ASK_FOR_ID_AD_B) {
printf("Channel B AD: %X\r\n",buffer[0]);
}
else if (rx_id == RESPOND_TO_LED_C_ID) { //node C is an mcp250x0 which sends out a message upon edge detection on IO
printf("Chaning LEDs\r\n"); //in_data[0]=iointfl, in_data[1]=gpio
a_leds=~(buffer[1]);
if (bit_test(a_leds,4)) {LED1_HIGH;} else {LED1_LOW;}
if (bit_test(a_leds,5)) {LED2_HIGH;} else {LED2_LOW;}
if (bit_test(a_leds,6)) {LED3_HIGH;} else {LED3_LOW;}
}
}
}

if ( can_tbe() && (ms > 2000)) //every two seconds, send new data if transmit buffer is empty
{
ms=0;

//change leds on port b
printf("\r\n\r\nSet LEDs on Port B to %U",b_leds);
can_putd(SET_LED_ID_B, &b_leds, 1, 1, 1, 0);
b_leds++;
if (b_leds > 7) {b_leds=0;}
}

if (BUTTON_PRESSED) {
while (BUTTON_PRESSED) {}
delay_ms(200);

//ask for AD on port B
printf("\r\n\r\nAsking for A/D reading on Port B...");
can_putd(ASK_FOR_ID_AD_B, 0, 1, 1, 1, 1);

//change LEDs on port C
buffer[0]=0x1E; //addr of gplat on 25050
buffer[1]=0x0E; //mask
buffer[2]=~(c_leds << 1); //new gplat values
printf("\r\nIncrementing LED on Port C");
can_putd(WRITE_REGISTER_C_ID, &buffer[0], 3, 1, 1, 0);
c_leds++;
if (c_leds > 7) {c_leds=0;}
}

//change lcd segment on port d
i=read_adc();
curr_lcd_output=i/26; //scale to 0-9
if (curr_lcd_output != last_lcd_output) {
last_lcd_output=curr_lcd_output;
printf("\r\nChanging 8-seg LCD on D to current A/D reading (%X, %X)",i,curr_lcd_output);
buffer[0]=0x1E; //addr of gplat
buffer[1]=0x7F; //mask
buffer[2]=lcd_seg[curr_lcd_output]; //new gplat values
can_putd(WRITE_REGISTER_D_ID, &buffer[0], 3, 1, 1, 0);
}
}
}