1. Tuyển Mod quản lý diễn đàn. Các thành viên xem chi tiết tại đây

Lượm Lặt

Chủ đề trong 'Điện - Điện tử - Viễn thông' bởi txnghia, 30/10/2003.

  1. 1 người đang xem box này (Thành viên: 0, Khách: 1)
  1. txnghia

    txnghia Thành viên mới

    Tham gia ngày:
    13/10/2003
    Bài viết:
    216
    Đã được thích:
    0
    bài dịch trên báo Circuit Cellar
    BẢNG ÐÈN ÐIỆN TỬ
    Phần I: Mạch Ðiện Tử Ðằng Sau Các Bóng Ðèn Chớp.
    Một trong các thứ luôn làm tôi say đắm là làm đèn chớp. Dù là đèn LED hay đèn bóng 110 vôn, nhóm chúng với nhau cho khả năng tạo ra chữ, số, ảnh họa đồ. Trong bài viết này, tôi sẽ mô tả cách điều khiển bảng đèn điện tử, với 384 bóng đèn, mỗi bóng được điều khiển riêng biệt chỉ với 3 tín hiệu từ cổng máy in của máy tính cá nhân (PC). Một phần cảm hứng của đề án này đến từ bài viết về BYTE của Steve Ciarcia nhiều năm trước đây.
    Tổng Quát
    Bảng đèn chớp gồm sáu bảng nhỏ mỗi chiều 4'''' (1, 2 mét) , với mỗi bảng chứa 64 bóng (25 W, 120-VAC) lập thành ma trận 8 x 8. Các bảng nhỏ có thể được xếp theo hàng dọc hay ngang. Khi xếp theo hàng ngang, nó lập thành bảng hiện thị kích thước 24'''' x 4''''. Nó đủ lớn để hiện thị dòng thông tin chạy có thể đọc được ở một khoảng cách xa. Hình 1 mô tả cách các bảng nhỏ được nối với nhau. Mỗi bảng nhỏ có một ngõ tín hiệu vào nối tiếp và một ngõ tín hiệu ra nối tiếp. Bằng cách nối tiếp các tín hiệu các bảng thì cả bảng đèn lớn được điều khiển bằng 3 dây tín hiệu từ cổng máy in máy tính cá nhân. Ðể dẫn tín hiệu từ máy vi tính đến bảng hiện thị một quảng dài thì tín hiệu được đổi sang mức +/- 12 V.
    Hình 1
    Chi Tiết
    Mỗi bảng 64 bóng gồm một thanh ghi dịch 64-bít và bộ lái 8-bít. Các bóng đèn lập ma trận 8 x 8 được sắp xếp như trong hình 2. Mỗi dạng sáng được tạo bằng cách gới 64-bit dữ kiện vào bảng đèn. Bít đầu tiên tải vào bảng mang giá trị lớn nhất (MSB) và bít sau cùng mang giá trị nhỏ nhất (LSB). Mỗi dãy đèn ngang được điều khiển bởi một bộ lái riêng, gồm linh kiện (photo-isolated TRIAC) cách ly giữa các cổng ra của bộ điều khiển điện tử với mạng cấp điện 120 VAC cho từng bóng đèn. Xem hình 3.
    Hình 4 cho biết thêm chi tiết các bảng có GFI (cho vấn đề an toàn), bộ cấp điện DC, cầu chì bảo vệ.
    Bộ Công Suất
    Bộ công suất dùng 8-bít dữ kiện số để điều khiển 8 bóng 25 W, 120 VAC. Mỗi bít điều khiển một linh kiện MOC3031 (bộ cách ly quang học - photo isolated). Linh kiện này tạo tín hiệu điều khiển TRIAC 2N6344. Ðặc điễm zero-crossing của linh kiện giúp làm giảm tối đa xung dòng khi đèn được bật. Hình 5 là sơ đồ mạch của bộ lái.
    Một bóng đèn LED được mắc nối tiếp với mỗi ngõ tín hiệu số vào cho phép thấy được trạng thái từng bóng. Chú ý rằng các bóng được điều khiển theo kỹ thuật tĩnh chứ không phải cách đa hợp. Vì vậy nếu tất cả 64 bóng được bậc, một bảng tiêu thụ công suất là 1600 W! Ðó là tại sao GFI được dùng cho mỗi bảng, nó cần dòng hơn 13 A khi tất cả các bóng sáng. Và cũng chú ý rằng, mặc dù TRIAC tắc đi khi điện thế AC đi qua mức 0 V (1 chu kỳ 2 lần), nó bật trở lại nếu tín hiệu số ngõ vào ở mức cao. Vì vậy dạng chữ 64-bít được tải vào trong bảng để giữ dạng sáng của đèn.
    Được txnghia sửa chữa / chuyển vào 03:13 ngày 19/10/2004
  2. txnghia

    txnghia Thành viên mới

    Tham gia ngày:
    13/10/2003
    Bài viết:
    216
    Đã được thích:
    0
    Thanh Ghi Dịch 64-bít
    Thanh ghi dịch 64-bít dùng để điều khiển tất cả các bóng trong một bảng được nối tiếp nhau bởi IC có 8 thanh ghi dịch 74HC595. Thường thì một chốt (latch) được dùng ở cổng ra của thanh ghi dịch để tránh trường hợp bóng đèn lóe lên không theo ý muốn mỗi khi một dạng hiển thị mới được tải vào bảng đèn. Như cũng may, IC 74HC595 có chứa 8 thanh ghi dịch lẫn 8-bít cỗng chốt trong cùng một IC. Vì vậy sau khi tải dạng 64-bít vào bảng điện, một xung mở chốt (latch) được dùng để truyền dạng sáng đèn chứa trong các thanh ghi ra đến các bóng đèn. Hình 6 cho sơ đồ của bảng điện của thanh ghi dịch. Nhớ rằng bảng điện được lái với dòng dữ kiện nối tiếp +/-12 V để có thể truyển tín hiệu đi được xa từ máy vi tính ra đến bảng đèn.
    Hình 5
    IC 1488 và 1489 là bộ chuyển từ TTL sang +/-12 V và ngược lại. Các IC cũ được dùng thay vì dùng IC MAX232 vì khả năng chuyển tải dòng cao hơn. Nhưng không may, thời cạnh lên và xuống của 1488 và 1489 (mất đến vài trăm nanosecond) đưa đến một vấn đề trong khi chạy thử các chương trình phần mềm, 2 bảng điện cuối không nhận được dữ kiện một cách thích hợp. Và vấn đề đã được giải bằng cách thêm vào thời trì hoãn giữa các bít dữ kiện.
    Cái hay của các thanh ghi dịch là các bảng bổ xung được dễ dàng cộng thêm vào mà không cần sữa đổi phần chương trình phần mềm và phần mạch điện. Một dòng đọc trạng thái được dùng để biết được số bảng điện gắn vào. Máy vi tính chỉ gởi thêm ra các nhóm 64-bít dữ kiện mỗi khi một bảng hiện thị được thêm vào.
    Giao Diện Với Máy Vi Tính
    Một mục đích của đề án bảng hiện thị là xử dụng cổng máy in để điều khiển nó. Tín hiệu ra từ cổng máy in được đổi thành tín hiệu +/-12 V. Hình 7 mô tả sơ đồ mạch cấp điện của đường dẫn nối tiếp giữa máy vi tính và bảng điện số 1. Bộ lái 1488 đổi TTL thành +/-12 V để đưa tín hiệu đến bảng điện số 1. Ba bóng LED được dùng để chỉ báo trạng thái tín hiệu ra từ máy vi tính (Tín hiệu dữ kiện nối tiếp: Serial Data, tín hiệu xung: Clock, và tín hiệu chốt mở: Latch).
    Chút Xíu Tính Toán
    Bởi vì hoạt động của bảng hiện thị đòi hỏi nhiều dạng thông tin nên có một số câu hỏi được đưa ra. Ví dụ, tốc độ truyền tải dữ kiện trên cáp là bao nhiêu? Bao lâu thì thay đổi dạng sáng? Và máy tính có đủ nhanh để hiển thị các chữ số và ảnh động.
    Với 384 đèn để điều khiển, dòng dữ kiện 384 bít phải được gởi đến tất cả 6 bảng nhỏ. Dù cho 500 nano-giây là thời gian mỗi bít (mất nhiều thời gian tại cạnh lên và xuống của 1489 và 1488), thì mất khoảng 192 mico-giây cho một lần thay đổi toàn bộ hiển thị.
    Hình 7
    Với các chữ động thì máy tính phải gởi ra 10 dạng mới trong một giây. Và cũng dễ dàng thôi vì tồng thời gian mất ít hơn 2ms. Thật ra, thời gian của 1 bít có thể dài thêm (vài micro-giây) để tránh làm biến dạng tín hiệu trên cáp truyền. Tuy nhiên, tại 500 nano-giây cho mỗi bít, máy tính chạy trên Windows 40 MHz là có thể điều khiển được bảng hiện thị mà không bị lỗi gì.
    Dự kiến cho 4 bảng hiện thị thêm vào làm tăng bít lên 640. Vẫn có nhiều thời gian dư cho thiết kế này.
    CÒN TIẾP PHẦN 2

  3. txnghia

    txnghia Thành viên mới

    Tham gia ngày:
    13/10/2003
    Bài viết:
    216
    Đã được thích:
    0
    Thanh Ghi Dịch 64-bít
    Thanh ghi dịch 64-bít dùng để điều khiển tất cả các bóng trong một bảng được nối tiếp nhau bởi IC có 8 thanh ghi dịch 74HC595. Thường thì một chốt (latch) được dùng ở cổng ra của thanh ghi dịch để tránh trường hợp bóng đèn lóe lên không theo ý muốn mỗi khi một dạng hiển thị mới được tải vào bảng đèn. Như cũng may, IC 74HC595 có chứa 8 thanh ghi dịch lẫn 8-bít cỗng chốt trong cùng một IC. Vì vậy sau khi tải dạng 64-bít vào bảng điện, một xung mở chốt (latch) được dùng để truyền dạng sáng đèn chứa trong các thanh ghi ra đến các bóng đèn. Hình 6 cho sơ đồ của bảng điện của thanh ghi dịch. Nhớ rằng bảng điện được lái với dòng dữ kiện nối tiếp +/-12 V để có thể truyển tín hiệu đi được xa từ máy vi tính ra đến bảng đèn.
    Hình 5
    IC 1488 và 1489 là bộ chuyển từ TTL sang +/-12 V và ngược lại. Các IC cũ được dùng thay vì dùng IC MAX232 vì khả năng chuyển tải dòng cao hơn. Nhưng không may, thời cạnh lên và xuống của 1488 và 1489 (mất đến vài trăm nanosecond) đưa đến một vấn đề trong khi chạy thử các chương trình phần mềm, 2 bảng điện cuối không nhận được dữ kiện một cách thích hợp. Và vấn đề đã được giải bằng cách thêm vào thời trì hoãn giữa các bít dữ kiện.
    Cái hay của các thanh ghi dịch là các bảng bổ xung được dễ dàng cộng thêm vào mà không cần sữa đổi phần chương trình phần mềm và phần mạch điện. Một dòng đọc trạng thái được dùng để biết được số bảng điện gắn vào. Máy vi tính chỉ gởi thêm ra các nhóm 64-bít dữ kiện mỗi khi một bảng hiện thị được thêm vào.
    Giao Diện Với Máy Vi Tính
    Một mục đích của đề án bảng hiện thị là xử dụng cổng máy in để điều khiển nó. Tín hiệu ra từ cổng máy in được đổi thành tín hiệu +/-12 V. Hình 7 mô tả sơ đồ mạch cấp điện của đường dẫn nối tiếp giữa máy vi tính và bảng điện số 1. Bộ lái 1488 đổi TTL thành +/-12 V để đưa tín hiệu đến bảng điện số 1. Ba bóng LED được dùng để chỉ báo trạng thái tín hiệu ra từ máy vi tính (Tín hiệu dữ kiện nối tiếp: Serial Data, tín hiệu xung: Clock, và tín hiệu chốt mở: Latch).
    Chút Xíu Tính Toán
    Bởi vì hoạt động của bảng hiện thị đòi hỏi nhiều dạng thông tin nên có một số câu hỏi được đưa ra. Ví dụ, tốc độ truyền tải dữ kiện trên cáp là bao nhiêu? Bao lâu thì thay đổi dạng sáng? Và máy tính có đủ nhanh để hiển thị các chữ số và ảnh động.
    Với 384 đèn để điều khiển, dòng dữ kiện 384 bít phải được gởi đến tất cả 6 bảng nhỏ. Dù cho 500 nano-giây là thời gian mỗi bít (mất nhiều thời gian tại cạnh lên và xuống của 1489 và 1488), thì mất khoảng 192 mico-giây cho một lần thay đổi toàn bộ hiển thị.
    Hình 7
    Với các chữ động thì máy tính phải gởi ra 10 dạng mới trong một giây. Và cũng dễ dàng thôi vì tồng thời gian mất ít hơn 2ms. Thật ra, thời gian của 1 bít có thể dài thêm (vài micro-giây) để tránh làm biến dạng tín hiệu trên cáp truyền. Tuy nhiên, tại 500 nano-giây cho mỗi bít, máy tính chạy trên Windows 40 MHz là có thể điều khiển được bảng hiện thị mà không bị lỗi gì.
    Dự kiến cho 4 bảng hiện thị thêm vào làm tăng bít lên 640. Vẫn có nhiều thời gian dư cho thiết kế này.
    CÒN TIẾP PHẦN 2

  4. txnghia

    txnghia Thành viên mới

    Tham gia ngày:
    13/10/2003
    Bài viết:
    216
    Đã được thích:
    0
    BẢNG ĐÈN CHẠY ĐIỆN TỬ
    Phần 2: Ðiều Khiển Ðèn Với Chương Trình Máy Tính
    Tháng rồi tôi đã giải thích chi tiết của mạch đèn chạy, nó gồm 384 bóng đèn được điều khiển riêng biệt chỉ với 3 tín hiệu từ cổng máy in computer. Tháng này, tôi sẽ thảo luận về nguyên tắc cơ bản của cách dùng cổng máy in để gởi ra các dữ kiện theo dạng nối tiếp đến bảng đèn chạy, phương pháp tạo bảng mã dữ kiện trong bộ nhớ và ảnh động, và chương trình giao diện mạng TCP/IP dùng để gởi dữ kiện qua mạng nội bộ.
    Sơ lược
    Bảng đèn chạy được điều khiển bởi chương trình phần mềm được viết với ngôn ngữ Visual C++ 6.0. Chương trình này chạy trên một máy chủ PC có nối mạng nội bộ LAN. Sau khi khởi động, máy chủ PC đọc tập tin cài đặt, tải các dữ kiện hiện thị sẵn có trong trong máy chủ từ một tập tin khác, và bắt đầu hiện thị từng thông tin một theo vòng.
    Trong lúc các thông tin đang được hiển thị, thì máy chủ PC này cũng dò mạng, nhận thêm các thông tin hiển thị từ các máy PC khác trong mạng và giữ lại trong bộ nhớ. Các thông tin từ các máy PC khác được cho phép có quyền ưu tiên hơn. Sau khi bảng đèn chạy xong các thông tin sẵn có trong máy chủ thì bảng đèn chạy sẽ chạy các thông tin gởi từ các PC khác trong mạng. Nếu có nhiều thông tin thì các thông tin sắp xếp chạy nối tiếp nhau cho đến cuối của bộ nhớ. Ðến đây thì phần thông tin có sẵn trong máy chủ lại được gởi ra bảng đèn. Tất cả các thông tin trong mạng được lưu giữ trong một tập tin.
    Hình 1a và b trình bày lưu đồ của hoạt động căn bản của bộ đèn chạy trong mạng LAN.
    Khởi Ðộng Chương Trình Phần Mềm
    Sau khi máy chủ được khởi động thì quá trình sau đây phải được thực hiện:
    . Ðọc và xử lý tập tin KONFIG.DAT
    . Tải thông tin sẵn có từ MSG.DAT
    . Khởi động và cài đặt mạng.
    Tập tin KONFIG.DAT được dùng để cài đặt ứng dụng cho máy chủ và số các bảng đèn nhỏ được dùng trong bảng đèn chạy. Mặc dù 6 bảng nhỏ được dùng trong bảng đèn chạy nhưng có thể dùng 1 hoặc một vài bảng nhỏ cũng được. Số bảng nhỏ được dùng tối đa không được xác định nhưng bạn phải cân nhắc về tốc độ truyền mỗi bít dữ kiện được gởi ra từ cổng máy in, thời trì hoãn của chip 1488/1489, và tốc độ chạy các thông tin. Xem tập tin KONFIG.DAT trong Bản 1.
    30
    15610; The order is<speed factor><I/O delay><number of panels><slide rate>

    Bảng 1?" Bạn có thể thấy nội dung của tập tin KONFIG.DAT. Nó được đọc bởi máy chủ trong lúc khởi động.

    Hình 1- Lưu đồ của chương trình máy chủ
    Hệ số tốc độ (speed factor) được dùng để bù cho tốc độ chạy của các chip xử lý khác nhau. Giá trị này lúc đầu để bù cho các mạch điện khác nhau. Giá trị trì hoãn cổng I/O (I/O delay) điều khiển thời gian nghỉ sau mỗi lần đổi trạng thái của dữ kiện được gởi ra từ cổng máy in. Nó được dùng để bù sự trì hoãn tín hiệu của chip 1488/1489. Giá trị số bảng nhỏ được dùng (number of panels) được dùng để điều khiển số bít của dữ kiện được gởi ra cho mỗi lần cập nhật bảng đèn. Và giá trị trượt (slide rate) điều khiển số cột dữ kiện đi qua bảng đèn trong 1 giây.
    Thông tin sẵn có trong tập tin MSG.DAT là dạng chữ đơn giản, mỗi thông tin 1 dòng, giới hạn 132 chữ số cho mỗi dòng. Tối đa thì 100 thông tin được cho phép một lần.
    Khởi động mạng đòi hỏi phải chạy Windows socket, cài đặt các giá trị cho socket, và làm cho socket non-blocking. Bước kế quan trọng vì blocking socket sẽ buộc máy chủ phải chờ đến khi nhận được dữ kiện từ các máy PC khác để phòng trường hợp các thông tin chạy trong lúc đang chờ. Chương trình cho mạng khởi động trong Bảng 2.
    Sau khi socket khởi động, thông điệp sẵn có trong máy chủ được cho phép chạy trên bảng đèn.
    //init winsock
    sockstat = WSAStartup(Version, &wsaData);
    if (wsaData.wVersion != Version)
    {
    printf("Wrong version
    ");
    return;
    }
    //create socket
    LSsocket = socket(AF_INET, // Address family, Internet
    SOCK_DGRAM, // Socket type, datagram
    IPPROTO_UDP); // Protocol, UDP
    if (LSsocket == INVALID_SOCKET)
    {
    printf("Error creating socket
    ");
    return;
    }
    //make socket non-blocking
    sockstat = ioctlsocket(LSsocket,FIONBIO, (u_long FAR *)&temp);
    if (sockstat == SOCKET_ERROR)
    {
    printf("Can not make non-blocking socket
    ");
    return;
    }
    //assign socket addresses
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = INADDR_ANY;
    server.sin_port = htons(7500);
    // bind address to socket
    sockstat = bind(LSsocket,
    (LPSOCKADDR)&server,
    sizeof(struct sockaddr));
    if (sockstat == SOCKET_ERROR)
    {
    printf("Error binding address
    ");
    closesocket(LSsocket);
    return;
    }
    Bảng 2- Ở đây bạn thấy chương trình cho mạng cho máy chủ. UDP socket được tạo ra ở cổng 7500.
    Tạo Dạng Bít.
    Trước khi thông tin trong máy chủ được chạy ngang trên bảng đèn thì một mã số nhị phân dùng để tạo các chữ số phải được tạo ra. Mỗi chữ số được hình thành từ một ma trận 5 x 7 với các giá trị bật/tắc để điều khiển bóng đèn. Dạng mã số cho chữ A, B, và C được mô tả trong bản 3. Ðể tạo sơ đồ mã số, mỗi chữ số từ một thông tin được dùng để tìm ra các dạng mã chữ 5 x 7, và dạng mã chữ này được sao chép vào sơ đồ mã chữ. Khoảng cách giữa 2 chữ số được thực hiện bằng cách bỏ qua một cột bit mã số giữa 2 chữ số. Vì vậy, một thông tin có chứa 20 chữ số sẽ chiếm trong sơ đồ mã số 120 cột mã số dữ kiện. Một khoảng trống nữa được thêm vào cuối mỗi thông điệp để phân biệt 2 thông điệp chạy ngang qua bảng đèn.
    /* A */
    { 0x4 // 0 0 1 0 0
    , 0x0a // 0 1 0 1 0
    , 0x11 // 1 0 0 0 1
    , 0x11 // 1 0 0 0 1
    , 0x1f // 1 1 1 1 1
    , 0x11 // 1 0 0 0 1
    , 0x11 }, // 1 0 0 0 1
    /* B */
    { 0x1e // 1 1 1 1 0
    , 0x11 // 1 0 0 0 1
    , 0x11 // 1 0 0 0 1
    , 0x1e // 1 1 1 1 0
    , 0x11 // 1 0 0 0 1
    , 0x11 // 1 0 0 0 1
    , 0x1e }, // 1 1 1 1 0
    /* C */
    { 0x0e // 0 1 1 1 0
    , 0x11 // 1 0 0 0 1
    , 0x10 // 1 0 0 0 0
    , 0x10 // 1 0 0 0 0
    , 0x10 // 1 0 0 0 0
    , 0x11 // 1 0 0 0 1
    , 0x0e }, // 0 1 1 1 0
    Bản 3-Ðay là ví dụ của dạng chữ số được chứ trong bộ nhớ.
    Gởi Dữ Kiện Ra Bảng Ðèn Chạy
    Ba tín hiệu ra từ cổng máy in computer cung cấp dữ kiện cho bảng đèn: Dữ kiện nối tiếp (Serial Data), Xung nhịp (Data Clock), Chốt thoát (Data Latch).
    Hình 2: Tín hiệu ra từ cổng máy in computer
    Hình 2 trình bày một ví dụ sơ đồ thời gian cho biết 3 tín hiệu này được dùng như thế nào. Các bít dữ kiện được gởi vào các thanh ghi dịch của từng bảng điện nhỏ mỗi khi xung nhịp đi lên. Toàn bộ dòng bít dữ kiện (384 bít cho 6 bảng nhỏ) được truyền ra khỏi các thanh ghi dịch khi tín hiệu chốt thoát được đưa lên cao. Dùng chốt thoát trong trường hợp này tránh được những lóe chớp không muốn trên bảng đèn mỗi khi bảng đèn cập nhật dữ kiện.
    void DisplayBitmap()
    {
    int panel,row;
    portval = 6;
    for(panel = 0; panel NUMOFPANELS; panel++)
    {
    for(row = 0; row 8; row++)
    SendByte(bitmapbuff[panel][row] ^ 0xff);
    }
    Latch();
    }
    Bảng 4-Hàm này gởi ra 8 byte dữ kiện đến từng bảng đèn nhỏ.
    Chương trình để truyền dữ kiện chạy từ phần bộ nhớ được thực hiện với nhiều hàm số (xem Bảng 4). Ðầu tiên hàm DisplayBitmap(), làm nhiệm vụ gởi ra tất các byte liên hệ đến dạng chạy chữ. Hàm này gài tham số portval bằng 6 (00000110), làm cho trạng thái của tín hiệu Xung (Clock) và chốt (Latch) lên mức cao. Tham số portval được quản lý bởi hàm SendBit() và Latch().
    Mỗi byte dữ kiện được đảo ngược (bằng cách exlusive-OR nó với 0xff) trước khi gởi vào hàm SendByte(). Ðiều này cần thiết vì ta dùng bít 1 trong sơ đồ mã số để chỉ thị đèn sáng, nhưng trong phần mạch điện bít 0 tạo tín hiệu bật sáng đèn. Nó được thực hiện để cho phép bảng dữ kiện chứa dạng mã 5 x 7 được tái thiết lại. Exclusive-OR sẽ không cần thiết nếu bảng dữ kiện được viết lại với 0 cho các bít bật và 1 cho các bít tắc.
    void SendByte(unsigned char dispbyte)
    {
    int bitknt;
    for(bitknt = 0; bitknt < 8; bitknt++)
    {
    SendBit(dispbyte & 0x80);
    dispbyte <<= 1;
    }
    }

    Bảng 5?"Hàm này gởi ra 8 bít dữ kiện đến bảng đèn (MSB - LSB).
    Hàm SendByte() gọi SendBit() để gởi ra từng bít một đến bảng đèn (xem Bản 5 và 6). Bít có giá trị lớn nhất (MSB - Most Significant Bit) được gởi ra trước. Dạng byte được chạy qua trái. Bít ra cuối cùng có giá trị nhỏ nhất (LSB - Least Significant Bit).
    void SendBit(unsigned char bitval)
    {
    int tdel;
    if(bitval)
    portval += 1;
    _outp(PORTA,portval);
    for(tdel = 0; tdel delayval; tdel++);
    portval ^= 2;
    _outp(PORTA,portval);
    for(tdel = 0; tdel delayval; tdel++);
    portval ^= 2;
    _outp(PORTA,portval);
    for(tdel = 0; tdel delayval; tdel++);
    if(bitval)
    portval -= 1;
    }
    Bảng 6-Tùy vào giá trị của bít, hàm này đưa ra 0 hoặc 1 trên tín hiệu DATA của cổng máy in computer.
    Giá trị của bitval được gởi đến hàm SendBit() để điều khiển LSB của portval (đưa nó lên mức cao khi bitval là TRUE, và mức thấp khi FALSE). Hàm SendBit() exlusive-OR giá trị portval với 00000010 hai lần để làm lên-xuống tín hiệu xung (Clock) ở cổng máy in. Vòng lặp for() được dùng sau mỗi lần gởi ra cổng A (PORTA - Cổng gởi dữ kiện đến máy in) để cung cấp thời trì hoãn cần thiết cho 1488/1489.
  5. txnghia

    txnghia Thành viên mới

    Tham gia ngày:
    13/10/2003
    Bài viết:
    216
    Đã được thích:
    0
    BẢNG ĐÈN CHẠY ĐIỆN TỬ
    Phần 2: Ðiều Khiển Ðèn Với Chương Trình Máy Tính
    Tháng rồi tôi đã giải thích chi tiết của mạch đèn chạy, nó gồm 384 bóng đèn được điều khiển riêng biệt chỉ với 3 tín hiệu từ cổng máy in computer. Tháng này, tôi sẽ thảo luận về nguyên tắc cơ bản của cách dùng cổng máy in để gởi ra các dữ kiện theo dạng nối tiếp đến bảng đèn chạy, phương pháp tạo bảng mã dữ kiện trong bộ nhớ và ảnh động, và chương trình giao diện mạng TCP/IP dùng để gởi dữ kiện qua mạng nội bộ.
    Sơ lược
    Bảng đèn chạy được điều khiển bởi chương trình phần mềm được viết với ngôn ngữ Visual C++ 6.0. Chương trình này chạy trên một máy chủ PC có nối mạng nội bộ LAN. Sau khi khởi động, máy chủ PC đọc tập tin cài đặt, tải các dữ kiện hiện thị sẵn có trong trong máy chủ từ một tập tin khác, và bắt đầu hiện thị từng thông tin một theo vòng.
    Trong lúc các thông tin đang được hiển thị, thì máy chủ PC này cũng dò mạng, nhận thêm các thông tin hiển thị từ các máy PC khác trong mạng và giữ lại trong bộ nhớ. Các thông tin từ các máy PC khác được cho phép có quyền ưu tiên hơn. Sau khi bảng đèn chạy xong các thông tin sẵn có trong máy chủ thì bảng đèn chạy sẽ chạy các thông tin gởi từ các PC khác trong mạng. Nếu có nhiều thông tin thì các thông tin sắp xếp chạy nối tiếp nhau cho đến cuối của bộ nhớ. Ðến đây thì phần thông tin có sẵn trong máy chủ lại được gởi ra bảng đèn. Tất cả các thông tin trong mạng được lưu giữ trong một tập tin.
    Hình 1a và b trình bày lưu đồ của hoạt động căn bản của bộ đèn chạy trong mạng LAN.
    Khởi Ðộng Chương Trình Phần Mềm
    Sau khi máy chủ được khởi động thì quá trình sau đây phải được thực hiện:
    . Ðọc và xử lý tập tin KONFIG.DAT
    . Tải thông tin sẵn có từ MSG.DAT
    . Khởi động và cài đặt mạng.
    Tập tin KONFIG.DAT được dùng để cài đặt ứng dụng cho máy chủ và số các bảng đèn nhỏ được dùng trong bảng đèn chạy. Mặc dù 6 bảng nhỏ được dùng trong bảng đèn chạy nhưng có thể dùng 1 hoặc một vài bảng nhỏ cũng được. Số bảng nhỏ được dùng tối đa không được xác định nhưng bạn phải cân nhắc về tốc độ truyền mỗi bít dữ kiện được gởi ra từ cổng máy in, thời trì hoãn của chip 1488/1489, và tốc độ chạy các thông tin. Xem tập tin KONFIG.DAT trong Bản 1.
    30
    15610; The order is<speed factor><I/O delay><number of panels><slide rate>

    Bảng 1?" Bạn có thể thấy nội dung của tập tin KONFIG.DAT. Nó được đọc bởi máy chủ trong lúc khởi động.

    Hình 1- Lưu đồ của chương trình máy chủ
    Hệ số tốc độ (speed factor) được dùng để bù cho tốc độ chạy của các chip xử lý khác nhau. Giá trị này lúc đầu để bù cho các mạch điện khác nhau. Giá trị trì hoãn cổng I/O (I/O delay) điều khiển thời gian nghỉ sau mỗi lần đổi trạng thái của dữ kiện được gởi ra từ cổng máy in. Nó được dùng để bù sự trì hoãn tín hiệu của chip 1488/1489. Giá trị số bảng nhỏ được dùng (number of panels) được dùng để điều khiển số bít của dữ kiện được gởi ra cho mỗi lần cập nhật bảng đèn. Và giá trị trượt (slide rate) điều khiển số cột dữ kiện đi qua bảng đèn trong 1 giây.
    Thông tin sẵn có trong tập tin MSG.DAT là dạng chữ đơn giản, mỗi thông tin 1 dòng, giới hạn 132 chữ số cho mỗi dòng. Tối đa thì 100 thông tin được cho phép một lần.
    Khởi động mạng đòi hỏi phải chạy Windows socket, cài đặt các giá trị cho socket, và làm cho socket non-blocking. Bước kế quan trọng vì blocking socket sẽ buộc máy chủ phải chờ đến khi nhận được dữ kiện từ các máy PC khác để phòng trường hợp các thông tin chạy trong lúc đang chờ. Chương trình cho mạng khởi động trong Bảng 2.
    Sau khi socket khởi động, thông điệp sẵn có trong máy chủ được cho phép chạy trên bảng đèn.
    //init winsock
    sockstat = WSAStartup(Version, &wsaData);
    if (wsaData.wVersion != Version)
    {
    printf("Wrong version
    ");
    return;
    }
    //create socket
    LSsocket = socket(AF_INET, // Address family, Internet
    SOCK_DGRAM, // Socket type, datagram
    IPPROTO_UDP); // Protocol, UDP
    if (LSsocket == INVALID_SOCKET)
    {
    printf("Error creating socket
    ");
    return;
    }
    //make socket non-blocking
    sockstat = ioctlsocket(LSsocket,FIONBIO, (u_long FAR *)&temp);
    if (sockstat == SOCKET_ERROR)
    {
    printf("Can not make non-blocking socket
    ");
    return;
    }
    //assign socket addresses
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = INADDR_ANY;
    server.sin_port = htons(7500);
    // bind address to socket
    sockstat = bind(LSsocket,
    (LPSOCKADDR)&server,
    sizeof(struct sockaddr));
    if (sockstat == SOCKET_ERROR)
    {
    printf("Error binding address
    ");
    closesocket(LSsocket);
    return;
    }
    Bảng 2- Ở đây bạn thấy chương trình cho mạng cho máy chủ. UDP socket được tạo ra ở cổng 7500.
    Tạo Dạng Bít.
    Trước khi thông tin trong máy chủ được chạy ngang trên bảng đèn thì một mã số nhị phân dùng để tạo các chữ số phải được tạo ra. Mỗi chữ số được hình thành từ một ma trận 5 x 7 với các giá trị bật/tắc để điều khiển bóng đèn. Dạng mã số cho chữ A, B, và C được mô tả trong bản 3. Ðể tạo sơ đồ mã số, mỗi chữ số từ một thông tin được dùng để tìm ra các dạng mã chữ 5 x 7, và dạng mã chữ này được sao chép vào sơ đồ mã chữ. Khoảng cách giữa 2 chữ số được thực hiện bằng cách bỏ qua một cột bit mã số giữa 2 chữ số. Vì vậy, một thông tin có chứa 20 chữ số sẽ chiếm trong sơ đồ mã số 120 cột mã số dữ kiện. Một khoảng trống nữa được thêm vào cuối mỗi thông điệp để phân biệt 2 thông điệp chạy ngang qua bảng đèn.
    /* A */
    { 0x4 // 0 0 1 0 0
    , 0x0a // 0 1 0 1 0
    , 0x11 // 1 0 0 0 1
    , 0x11 // 1 0 0 0 1
    , 0x1f // 1 1 1 1 1
    , 0x11 // 1 0 0 0 1
    , 0x11 }, // 1 0 0 0 1
    /* B */
    { 0x1e // 1 1 1 1 0
    , 0x11 // 1 0 0 0 1
    , 0x11 // 1 0 0 0 1
    , 0x1e // 1 1 1 1 0
    , 0x11 // 1 0 0 0 1
    , 0x11 // 1 0 0 0 1
    , 0x1e }, // 1 1 1 1 0
    /* C */
    { 0x0e // 0 1 1 1 0
    , 0x11 // 1 0 0 0 1
    , 0x10 // 1 0 0 0 0
    , 0x10 // 1 0 0 0 0
    , 0x10 // 1 0 0 0 0
    , 0x11 // 1 0 0 0 1
    , 0x0e }, // 0 1 1 1 0
    Bản 3-Ðay là ví dụ của dạng chữ số được chứ trong bộ nhớ.
    Gởi Dữ Kiện Ra Bảng Ðèn Chạy
    Ba tín hiệu ra từ cổng máy in computer cung cấp dữ kiện cho bảng đèn: Dữ kiện nối tiếp (Serial Data), Xung nhịp (Data Clock), Chốt thoát (Data Latch).
    Hình 2: Tín hiệu ra từ cổng máy in computer
    Hình 2 trình bày một ví dụ sơ đồ thời gian cho biết 3 tín hiệu này được dùng như thế nào. Các bít dữ kiện được gởi vào các thanh ghi dịch của từng bảng điện nhỏ mỗi khi xung nhịp đi lên. Toàn bộ dòng bít dữ kiện (384 bít cho 6 bảng nhỏ) được truyền ra khỏi các thanh ghi dịch khi tín hiệu chốt thoát được đưa lên cao. Dùng chốt thoát trong trường hợp này tránh được những lóe chớp không muốn trên bảng đèn mỗi khi bảng đèn cập nhật dữ kiện.
    void DisplayBitmap()
    {
    int panel,row;
    portval = 6;
    for(panel = 0; panel NUMOFPANELS; panel++)
    {
    for(row = 0; row 8; row++)
    SendByte(bitmapbuff[panel][row] ^ 0xff);
    }
    Latch();
    }
    Bảng 4-Hàm này gởi ra 8 byte dữ kiện đến từng bảng đèn nhỏ.
    Chương trình để truyền dữ kiện chạy từ phần bộ nhớ được thực hiện với nhiều hàm số (xem Bảng 4). Ðầu tiên hàm DisplayBitmap(), làm nhiệm vụ gởi ra tất các byte liên hệ đến dạng chạy chữ. Hàm này gài tham số portval bằng 6 (00000110), làm cho trạng thái của tín hiệu Xung (Clock) và chốt (Latch) lên mức cao. Tham số portval được quản lý bởi hàm SendBit() và Latch().
    Mỗi byte dữ kiện được đảo ngược (bằng cách exlusive-OR nó với 0xff) trước khi gởi vào hàm SendByte(). Ðiều này cần thiết vì ta dùng bít 1 trong sơ đồ mã số để chỉ thị đèn sáng, nhưng trong phần mạch điện bít 0 tạo tín hiệu bật sáng đèn. Nó được thực hiện để cho phép bảng dữ kiện chứa dạng mã 5 x 7 được tái thiết lại. Exclusive-OR sẽ không cần thiết nếu bảng dữ kiện được viết lại với 0 cho các bít bật và 1 cho các bít tắc.
    void SendByte(unsigned char dispbyte)
    {
    int bitknt;
    for(bitknt = 0; bitknt < 8; bitknt++)
    {
    SendBit(dispbyte & 0x80);
    dispbyte <<= 1;
    }
    }

    Bảng 5?"Hàm này gởi ra 8 bít dữ kiện đến bảng đèn (MSB - LSB).
    Hàm SendByte() gọi SendBit() để gởi ra từng bít một đến bảng đèn (xem Bản 5 và 6). Bít có giá trị lớn nhất (MSB - Most Significant Bit) được gởi ra trước. Dạng byte được chạy qua trái. Bít ra cuối cùng có giá trị nhỏ nhất (LSB - Least Significant Bit).
    void SendBit(unsigned char bitval)
    {
    int tdel;
    if(bitval)
    portval += 1;
    _outp(PORTA,portval);
    for(tdel = 0; tdel delayval; tdel++);
    portval ^= 2;
    _outp(PORTA,portval);
    for(tdel = 0; tdel delayval; tdel++);
    portval ^= 2;
    _outp(PORTA,portval);
    for(tdel = 0; tdel delayval; tdel++);
    if(bitval)
    portval -= 1;
    }
    Bảng 6-Tùy vào giá trị của bít, hàm này đưa ra 0 hoặc 1 trên tín hiệu DATA của cổng máy in computer.
    Giá trị của bitval được gởi đến hàm SendBit() để điều khiển LSB của portval (đưa nó lên mức cao khi bitval là TRUE, và mức thấp khi FALSE). Hàm SendBit() exlusive-OR giá trị portval với 00000010 hai lần để làm lên-xuống tín hiệu xung (Clock) ở cổng máy in. Vòng lặp for() được dùng sau mỗi lần gởi ra cổng A (PORTA - Cổng gởi dữ kiện đến máy in) để cung cấp thời trì hoãn cần thiết cho 1488/1489.
  6. txnghia

    txnghia Thành viên mới

    Tham gia ngày:
    13/10/2003
    Bài viết:
    216
    Đã được thích:
    0
    Hàm Latch() exclusive-ORs giá trị portval với 00000100 hai lần để làm lên-xuống tín hiệu chốt mở (Latch) ở cổng máy in và cập nhật trạng thái của tất cả 384 bóng đèn cùng một lúc (xem Bảng 7).
    void Latch()
    {
    int tdel;
    portval ^= 4;
    _outp(PORTA,portval);
    for(tdel = 0; tdel delayval; tdel++);
    portval ^= 4;
    _outp(PORTA,portval);
    for(tdel = 0; tdel delayval; tdel++);
    Bảng 7-Hàm này tạo tín hiệu LATCH (bit 2 cổng máy in computer).
    Dạng Hiển Thị Chữ Số Chạy
    Dạng chữ số được thực hiện chạy từ phải qua trái bằng cách gởi dữ kiện từ sơ đồ mã chữ đến bảng đèn, trì hoãn trong một quảng thời gian ngắn (thường là 0.10 giây), và sau đó lặp lại với bước truyền bắt đầu từ cột kế trong sơ đồ mã trong bộ nhớ. Hình 3 mô tả quá trình này. Các sơ đồ bít thông điệp trong vùng bộ nhớ đươc sao chép qua 1 vùng bộ nhớ tạm, và vùng này được hàm DisplayBitmap() truy cập.
    Hình 3-Chữ chạy từ phải qua trái trên bảng đèn
    Quản Lý Thông Tin Mạng
    Mô hình tiêu chuẩn giữa máy chủ và máy khác trong mạng đòi hỏi có chương trình chờ để thực hiện một lệnh. Một trong các máy trong mạng gởi thông tin đến máy chủ và muốn máy chủ cho chạy 1 hàng thông tin, máy chủ sẽ cho thông tin này vào trong bộ nhớ, theo sau các thông đã đến trước. Xem hình 1 và ghi chú rằng trong vòng lặp chính trong chương trình, máy chủ dò thăm mạng xem có thông tin mới không mỗi khi bảng đèn được cập nhận. Mỗi lần cập nhật một dạng mới, dời tất cả dữ kiện một cột qua bên trái. Nếu máy chủ chờ đến khi thông tin hiện thời được gởi ra xong trước khi dò thông tin trong mạng, có thể vùng bộ nhớ trong TCP/IP bị đầy và mất thông tin.
    Sau khi máy chủ nhận được 100 thông tin trong mạng thì nó không nhận thêm nữa cho đến bộ nhớ được xóa bớt đi. Vùng bộ nhớ cố định nhằm đễ tránh tình trạng người dùng xấu cố tính làm đầy bộ nhớ bằng cách liên tục gởi thông tin đến máy chủ.
    Hình 4 trình bày bảng đèn chạy trong window các máy trong mạng. Gởi thông tin đến máy chủ rất đơn giản, chỉ cần đánh thông tin vào trong vùng thông tin (Message field) của chương trình chạy đèn và nhấn nút gởi (send). Nút gởi chỉ nhấn được khi mật khẫu chính xác được gõ vào trong hộp thoại.
    Hình 4
    Chương trình LiteShow đóng kiện thông tin dưới dạng UDP và gởi đến máy có tên là liteshow2001. Nó bảo đảm chỉ có các máy trong mạng nội bộ được gởi thông tin đến bảng đèn chạy.
    Máy chủ luôn gởi một hồi đáp đến các máy trong mạng. Nếu bộ nhớ máy chủ đầy thì một thông tin báo lỗi sẽ được hồi đáp, không thì một thông tin báo nhận được sẽ được hồi đáp. Nếu máy trong mạng không thể tiếp xúc với máy chủ, thì sẽ có thông tin báo lỗi sau một số lần thử liên lạc với máy chủ.
    Xem lại hình 1, chú ý rằng khi thông tin hồi đáp dứt thì máy chủ dò thông tin trong bộ nhớ và gởi ra bảng đèn chạy. Nếu bộ nhớ trống thì máy chủ gởi các thông tin sẵn có ra. Hình 5 cho thấy màn hình window của máy chủ. Thông tin được cho hiện ra 2 lần. Thông tin đầu hiện ra khi thông tin này được tải ra bảng đèn lần đầu. Sau đó khi thông tin đang chạy, từng chữ số hiện ra như là nó đang hiện thị trên bảng đèn.
    Cách này được sử dụng vì 2 lý do: để bạn thấy thích thú khi nhìn màn hình máy chủ và biết độ nhanh của thông tin chạy ở bảng đèn.
    Hình 5
    Ứng Dụng Khác
    Vì mỗi bảng điện nhỏ đo được mỗi chiều 4'', nó có thể xếp chồng lên hay xếp cạnh nhau. Khi lần đầu bảng đèn này được làm, các bảng nhỏ được xếp làm 2 hàng, mỗi hàng 3 bảng nhỏ tạo thành bảng đèn kích thướt 8'' x 12''. Tôi viết nhiều chương trình như cho chơi Ping-Pong, chuột trong cung mê, và một vài ảnh động (như pháo bông, cây ngày lễ với đèn chớp).
    James Antonakos là một giáo sư điện kỹ thuật trường Brome Commnity College, với 25 năm kinh nghiệm thiết kế mạch kỹ thuật số và tuyến tính. Ông ta cũng là tác giả của nhiều sách về bộ vi xử lý, lập trình, và hệ thống xử lý. Bạn có thể liên lạc với ông ta tại antonakos_j@sunybroome.edu.
    txnghia dịch
  7. txnghia

    txnghia Thành viên mới

    Tham gia ngày:
    13/10/2003
    Bài viết:
    216
    Đã được thích:
    0
    Hàm Latch() exclusive-ORs giá trị portval với 00000100 hai lần để làm lên-xuống tín hiệu chốt mở (Latch) ở cổng máy in và cập nhật trạng thái của tất cả 384 bóng đèn cùng một lúc (xem Bảng 7).
    void Latch()
    {
    int tdel;
    portval ^= 4;
    _outp(PORTA,portval);
    for(tdel = 0; tdel delayval; tdel++);
    portval ^= 4;
    _outp(PORTA,portval);
    for(tdel = 0; tdel delayval; tdel++);
    Bảng 7-Hàm này tạo tín hiệu LATCH (bit 2 cổng máy in computer).
    Dạng Hiển Thị Chữ Số Chạy
    Dạng chữ số được thực hiện chạy từ phải qua trái bằng cách gởi dữ kiện từ sơ đồ mã chữ đến bảng đèn, trì hoãn trong một quảng thời gian ngắn (thường là 0.10 giây), và sau đó lặp lại với bước truyền bắt đầu từ cột kế trong sơ đồ mã trong bộ nhớ. Hình 3 mô tả quá trình này. Các sơ đồ bít thông điệp trong vùng bộ nhớ đươc sao chép qua 1 vùng bộ nhớ tạm, và vùng này được hàm DisplayBitmap() truy cập.
    Hình 3-Chữ chạy từ phải qua trái trên bảng đèn
    Quản Lý Thông Tin Mạng
    Mô hình tiêu chuẩn giữa máy chủ và máy khác trong mạng đòi hỏi có chương trình chờ để thực hiện một lệnh. Một trong các máy trong mạng gởi thông tin đến máy chủ và muốn máy chủ cho chạy 1 hàng thông tin, máy chủ sẽ cho thông tin này vào trong bộ nhớ, theo sau các thông đã đến trước. Xem hình 1 và ghi chú rằng trong vòng lặp chính trong chương trình, máy chủ dò thăm mạng xem có thông tin mới không mỗi khi bảng đèn được cập nhận. Mỗi lần cập nhật một dạng mới, dời tất cả dữ kiện một cột qua bên trái. Nếu máy chủ chờ đến khi thông tin hiện thời được gởi ra xong trước khi dò thông tin trong mạng, có thể vùng bộ nhớ trong TCP/IP bị đầy và mất thông tin.
    Sau khi máy chủ nhận được 100 thông tin trong mạng thì nó không nhận thêm nữa cho đến bộ nhớ được xóa bớt đi. Vùng bộ nhớ cố định nhằm đễ tránh tình trạng người dùng xấu cố tính làm đầy bộ nhớ bằng cách liên tục gởi thông tin đến máy chủ.
    Hình 4 trình bày bảng đèn chạy trong window các máy trong mạng. Gởi thông tin đến máy chủ rất đơn giản, chỉ cần đánh thông tin vào trong vùng thông tin (Message field) của chương trình chạy đèn và nhấn nút gởi (send). Nút gởi chỉ nhấn được khi mật khẫu chính xác được gõ vào trong hộp thoại.
    Hình 4
    Chương trình LiteShow đóng kiện thông tin dưới dạng UDP và gởi đến máy có tên là liteshow2001. Nó bảo đảm chỉ có các máy trong mạng nội bộ được gởi thông tin đến bảng đèn chạy.
    Máy chủ luôn gởi một hồi đáp đến các máy trong mạng. Nếu bộ nhớ máy chủ đầy thì một thông tin báo lỗi sẽ được hồi đáp, không thì một thông tin báo nhận được sẽ được hồi đáp. Nếu máy trong mạng không thể tiếp xúc với máy chủ, thì sẽ có thông tin báo lỗi sau một số lần thử liên lạc với máy chủ.
    Xem lại hình 1, chú ý rằng khi thông tin hồi đáp dứt thì máy chủ dò thông tin trong bộ nhớ và gởi ra bảng đèn chạy. Nếu bộ nhớ trống thì máy chủ gởi các thông tin sẵn có ra. Hình 5 cho thấy màn hình window của máy chủ. Thông tin được cho hiện ra 2 lần. Thông tin đầu hiện ra khi thông tin này được tải ra bảng đèn lần đầu. Sau đó khi thông tin đang chạy, từng chữ số hiện ra như là nó đang hiện thị trên bảng đèn.
    Cách này được sử dụng vì 2 lý do: để bạn thấy thích thú khi nhìn màn hình máy chủ và biết độ nhanh của thông tin chạy ở bảng đèn.
    Hình 5
    Ứng Dụng Khác
    Vì mỗi bảng điện nhỏ đo được mỗi chiều 4'', nó có thể xếp chồng lên hay xếp cạnh nhau. Khi lần đầu bảng đèn này được làm, các bảng nhỏ được xếp làm 2 hàng, mỗi hàng 3 bảng nhỏ tạo thành bảng đèn kích thướt 8'' x 12''. Tôi viết nhiều chương trình như cho chơi Ping-Pong, chuột trong cung mê, và một vài ảnh động (như pháo bông, cây ngày lễ với đèn chớp).
    James Antonakos là một giáo sư điện kỹ thuật trường Brome Commnity College, với 25 năm kinh nghiệm thiết kế mạch kỹ thuật số và tuyến tính. Ông ta cũng là tác giả của nhiều sách về bộ vi xử lý, lập trình, và hệ thống xử lý. Bạn có thể liên lạc với ông ta tại antonakos_j@sunybroome.edu.
    txnghia dịch
  8. kamejoko80

    kamejoko80 Thành viên mới

    Tham gia ngày:
    25/03/2005
    Bài viết:
    17
    Đã được thích:
    1
    ừh, làm máy nghe nhạc MP3 là hay đó mấy bác , tui cũng tự làm cho mình 1 cái, chạy rất tốt, tui dùng con STA013, con này mua ở Trung Quốcc khoảng 44000 VND cũng rẻ đấy chứ, àh, bác nào có dzịp mua con này ở TQ nhờ mua giùm tui vài con nha, tui post hình lên cho các bác xem thử:

  9. kamejoko80

    kamejoko80 Thành viên mới

    Tham gia ngày:
    25/03/2005
    Bài viết:
    17
    Đã được thích:
    1
    ừh, làm máy nghe nhạc MP3 là hay đó mấy bác , tui cũng tự làm cho mình 1 cái, chạy rất tốt, tui dùng con STA013, con này mua ở Trung Quốcc khoảng 44000 VND cũng rẻ đấy chứ, àh, bác nào có dzịp mua con này ở TQ nhờ mua giùm tui vài con nha, tui post hình lên cho các bác xem thử:

  10. txnghia

    txnghia Thành viên mới

    Tham gia ngày:
    13/10/2003
    Bài viết:
    216
    Đã được thích:
    0
    Ở đây có một bộ sách điện 6 cuốn bằng tiếng Anh
    http://ibiblio.org/obp/electricCircuits/

Chia sẻ trang này