Thảo luận DIY mạch nạp ISP...

NgoHungCuong

http://ngohungcuong.com
#1
Mạch nạp nối tiếp (ISP)
Mạch nạp chương trình cho 89Sxx thì đã có rất nhiều và cũng dễ làm, kid cũng không có ý định cạnh tranh hay buôn bán gì cả :D:D:D. Chỉ là do kid muốn tìm hiểu để học hỏi thêm.
Sau thời gian tìm hiểu và cũng có thút thành quả :D:D:D
Kid sẽ lần lượt Post tại luồng này tất cả những gì mà kid tìm hiểu được
Hi vọng trong thời gian tới sẽ cho ra mắt mạch nạp cho 89S DIY từ giao diện chương trình PC đến chương trình cho chip Master :):):)
 

NgoHungCuong

http://ngohungcuong.com
#2
Nạp chương trình cho 89Sxx có 2 giao thức là nạp nối tiếp và nạp song song
kid thấy nạp theo kiểu nối tiếp (ISP) tiện nhất ở chỗ có thể nạp chương trình mà không cần tháo chip ra khỏi mạch
bạn có thể nạp trực tiếp chip ở trên mạch ứng dụng...., sau khi nạp xong thì chip được Reset và chạy luôn
Chương trình sẽ được nạp sử dụng các chân MOSI, MISO, SCK, RST

fig1.JPG

cụ thể hơn về ISP bạn xem trong Datasheet của 89s52 hay 89s51 nhé
 

Đính kèm

NgoHungCuong

http://ngohungcuong.com
#3
kid dùng cổng COM nên kid giới thiệu 1 chút về lập trình với cổng COM (truyền thông nối tiếp UART)
nếu các bạn xài các MFC hay VB... thì sẽ dễ hơn nhưng nói thật là kid không biết xài MFC, kid xài API và các thư viện tự tạo :D:D:D
Các bạn cần biết 1 chút về lập trình C/C++ nhé
để mở cổng COM bạn xài CreateFile hoặc OpenFile
đọc từ cổng COM bạn xài ReadFile và để ghi giá trị ra cổng COM bạn xài WriteFile
ví dụ kid mở cổng COM1 kid xài như sau:
Mã:
HANDLE hComm;
    hComm=CreateFile("COM1",GENERIC_READ | GENERIC_WRITE,\
        0,0,OPEN_EXISTING,0,0);
nếu mở cổng COM2 bạn thay chỗ COM1 thành COM2....
nếu mở thành công thì HComm chứa Handle của cổng COM và ta sẽ xài nó để giao tiếp với cổng COM
ngược lại nếu thất bại hComm=NULL
để ghi ra cổng COM ta xài WriteFile như trên đã nói:
Mã:
WriteFile(hComm,szBuff,1,&dwNum,NULL);
với hComm là handle của cổng COM, là kết quả trả về của hàm CreateFile ở trên
để đọc từ cổng COM ta dùng:
Mã:
ReadFile(hComm,szBuff,1,&dwNum,NULL);
kid viết 1 chương trình console sẽ đọc ký tự bạn gõ vào bàn phím
nếu bạn gõ 'a' thì nó sẽ truyền 'a' ra cổng COM1
nếu bạn gõ chữ 'b' thì nó sẽ truyền 'b' ra cổng COM1
nếu bạn gõ 's' thì sẽ kết thúc chương trình
Mã:
#include <STDIO.H>
#include <CONIO.H>
#include <WINDOWS.H>
unsigned char szBuff[2];
//unsigned char szrBuff[2];
//char szRead[20];
DWORD dwNum;
int main() {
    //printf("Hello World");
    //thu mo cong com 1 xem sao
    HANDLE hComm;
    hComm=CreateFile("COM1",GENERIC_READ | GENERIC_WRITE,\
        0,0,OPEN_EXISTING,0,0);
    if(!hComm) {
        printf("Khong mo duoc\n");
        return 0;
    } else {
        printf("mo thanh cong\n");
    }
    DCB dcb;
    memset(&dcb,0,sizeof(dcb));
    if(!GetCommState(hComm,&dcb)) {
        printf("Khong lay duoc thong so cong COM\n");
        CloseHandle(hComm);
        return 0;
    } else {
        printf("Lay thanh cong thong so cong COM\n");
    }
    dcb.BaudRate=CBR_9600;
    //dcb.fParity=0;
    if(!SetCommState(hComm,&dcb)) {
        printf("Khong dat duoc thong so cong\n");
        CloseHandle(hComm);
        return 0;
    } else {
        printf("Dat thong so 9600\n");
    }
    char c;
    while(1) {
        c=getchar();
        if(c=='a') {
            szBuff[0]='a';
            WriteFile(hComm,szBuff,1,&dwNum,NULL);
            continue;
        }
        if(c=='b') {
            szBuff[0]='b';
            WriteFile(hComm,szBuff,1,&dwNum,NULL);
            continue;
        }
        if(c=='s') {
            break;
        }
   
    }
    CloseHandle(hComm);
    printf("\nBam phim bat ky de ket thuc\n");
    getch();
    return 0;
}
và code cho 8051 nếu nhận được ký tự 'a' thì bật led
nếu nhận được ký tự 'b' thì tắt led
Mã:
; Test UART 8051
; coder: Ngo Hung Cuong
; Compiler: Kidteam ASM for 8051
; 10/10/2012
.define
    led        p1_0
.enddefine
.code
org        0x0000
    ljmp    main
org        0x0030
main:
    lcall    init
loop:
    lcall    rec
    cjne    a,        #97,    tt1    ; 'a'
    clr        led                      ; turn on led
tt1:
    cjne    a,        #98,    tt2    ; 'b'
    setb    led                    ; turn off led
tt2:
    ljmp    loop
    ljmp    $
init:
    mov        tmod,    #0x20
    mov        th1,    #0xfd
    mov        tl1,    #0xfd
    mov        scon,    #0x50
    setb    tr1
    ret
rec:
    clr        ri
    jnb        ri,        $
    mov        a,        sbuf
    clr        ri
    ret
.endcode
.end
 

NgoHungCuong

http://ngohungcuong.com
#4
phần phân tích file Hex thì các bạn tham khảo thêm bên luồng viết Compiler cho 8051 nhé
giờ kid bắt tay vào viết giao diện chương trình trên máy tính
updating...
fig1.JPG
 

NgoHungCuong

http://ngohungcuong.com
#6
đã cơ bản xong phần giao tiếp PC giờ kid bắt đầu viết Firmware cho chip master
kid sử dụng 89S51 luôn vì kid có sẵn con này :D:D:D
fig1.JPG
khi nào xong (nếu thành công) kid sẽ show cùng ace :D:D:D
 

chúng

Kỹ sư
#7
đã cơ bản xong phần giao tiếp PC giờ kid bắt đầu viết Firmware cho chip master
kid sử dụng 89S51 luôn vì kid có sẵn con này :D:D:D
khi nào xong (nếu thành công) kid sẽ show cùng ace :D:D:D
xí chú, nhớ dùng chân mà 89C2051 có nha để còn có thể lấy 2051 làm master @@
ờ mà detect VDK theo chu kì hay sao mà ko thấy ô chọn VDK
 

nvt

Học sinh phổ thông
#10
Kidteam quá Pro!!!Thật là ngưỡng mộ anh quá.Muốn làm một cái như anh thì em phải bắt đầu từ đâu ạ?
 

Quảng cáo Google