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)
-   -   HTPIC - các chương trình cho PIC6F877A (http://www.picvietnam.com/forum/showthread.php?t=339)

tranvanthuong 07-04-2007 04:32 PM

em cai custom roi nhung cung ko duoc anh a!
ko hiểu nỗi hôm trước em cài và dùng được nhưng từ khi gở ra cài lại thì ko thảnh công không biết tại sao nữa

@ngohaibac: Lần sau em viết bài thì phải viết dài, hỏi thì hỏi vào một bài là được. Em vào luồng về MPASM để thảo luận và xem các anh chị đã làm nhé.
http://www.picvietnam.com/forum//forumdisplay.php?f=34

Chúc em thành công.

ngohaibac 09-04-2007 01:41 AM

Thư viện I2C Master.
 
Tiếp theo là về module I2C, một chuẩn giao tiếp quan trọng khi giao tiếp với ngoại vi như EEPROM, RTS(DS1307),...

Do đó, mình xin cung cấp cho các bạn các hàm và thực thi của các hàm này trên HTPIC. Mình có tham khảo cả ở bọn htsoft nhưng nó viết sai một số hàm không chạy được, mình đã viết lại toàn bộ.

Đầu tiên là hàm I2C.h:

Code:

//I2C.h
//Declare some functions
void I2C_Init(void);          // khởi tạo I2C ở chế độ Master, Baud = 100 Khz
void I2C_waitForIdle(void); // Chờ khi nào đường bus ở chế độ Idle (rảnh rỗi)
void I2C_Start(void);        // Khởi động I2C - Master chiếm đường bus
void I2C_repStart(void);  // Chế độ Restart
void I2C_stop(void);        // Stop I2C - Master nhường đường bus cho thiết bị khác
unsigned char I2C_write( unsigned char I2CWriteData ); // ghi một byte lên đường SDA
unsigned char I2C_read( unsigned char ack ); // Đọc một byte với mã ACK (ACK = 0 nếu ack = 1, và ACK = 1 nếu ack = 0) -> dùng xác nhận từ master đối với slave.
void I2C_NACK(void);  // tạo bít Not Ack

Và sau đây là thực thi của các hàm này:

Code:

// I2C.c
# include "pic.h"
# include "I2C.h"
//======================================================================================================
void I2C_Init(void){
/*        // Configure for Master Mode
        SSPM3 = 1;
        SSPM2 = 0;
        SSPM1 = 0;
        SSPM0 = 0;                                ss        // I2C Master Mode, clock = Fosc/(4*(SSPADD + 1));
       
        WCOL = 0;                                        //No conllision
       
        SSPEN = 1;                                        // Enables the serial port and
*/       
        SSPCON = 0b00101000;                // set IIC port to Master mode with BRG       
        SSPSTAT = 0b00000000;                // Standard speed mode - 100Hz
        SSPCON2 = 0;
       
        //TRIS_SCL = 0;
        //TRIS_SDA = 0;                                // configure SDA and SCL as Output
       
        SSPADD = 9;                                    // BAUD = 100KHz
        SSPIF = 0;                                      // clear SSPIF interrupt flag
        BCLIF = 0;                                      // clear bus collision flag
        STAT_CKE  = 0;                            // use I2C levels      worked also with '0'
        STAT_SMP = 1;                            // disable slew rate control  worked also with '0'
}
//=============================================================================
void I2C_waitForIdle(void)
{
        while (( SSPCON2 & 0x1F ) | STAT_RW) ; //CLRWDT(); // wait for idle and not writing
}

//=============================================================================
void I2C_Start(void){
        //SSPIF = 0;
        SEN = 1;
        //while(!SSPIF);
        while(SEN);
}
//==============================================================================
void I2C_repStart(void)
{
        I2C_waitForIdle();
        RSEN = 1;
}
//=============================================================================
void I2C_stop(void)       
{
        I2C_waitForIdle();
        PEN = 1;
}
//==============================================================================
unsigned char I2C_write( unsigned char I2CWriteData ){
        I2C_waitForIdle();
        SSPBUF = I2CWriteData;
        I2C_waitForIdle();
          return (!ACKSTAT); // function returns '1' if transmission is acknowledged       
        // 1: Success
        // 0: Fail to send
}
//============================================================================
unsigned char I2C_read( unsigned char ack ){
        unsigned char I2C_ReadData;
        I2C_waitForIdle();
        RCEN = 1;
        I2C_waitForIdle();
        I2C_ReadData = SSPBUF;
        I2C_waitForIdle();
        if ( ack )          ACKDT=0;
            else            ACKDT = 1;
          ACKEN = 1;              // send acknowledge sequence
        I2C_waitForIdle();
        return( I2C_ReadData );
}
/******************************************************************************************/

void I2C_NACK(void)
{
        I2C_waitForIdle();
        if (ACKSTAT){
                PEN=1;                                                //Stop
                  I2C_waitForIdle();                        //Wait until action is finished
                while(PEN);
          };
}

Còn việc dùng nó quá đơn giản, ví dụ với Ds1307 thì đầu tiên bạn phải:

- Khởi tạo I2C bằng I2C_Start();
- Start bằng I2C_Start();
- Chọn slave giao tiếp bằng cách ghi địa chỉ và bit RW tương ứng với chế độ đọc hay ghi.
- Ghi dữ liệu lựa chọn byte nào cần ghi hay cần đọc trong bảng RAM của DS1307.
- Ghi dữ liệu hay là đọc dữ liệu.

Chú ý: khi ghi xong, muốn đọc thì phải làm lại tức là phải restart nhé.

Chúc các bạn thành công.

tranvanthuong 09-04-2007 09:39 AM

cám ơn anh ngohaibac để em cài cái máy tính của em rồi em làm lại những gì anh hướng dẫn thữ xem sao! em sẽ không bao giờ bỏ cuộc cả hôm nay em sẽ cài máy lại rồi cài MPLAP rồi cài HT-pic và CCS C luôn

@nohb: những cái này em có thể chát Yahoo với anh. Anh đề nghị không spam bài ở đây. Để cài HTPIC, CCS em xem hướng dẫn là cài được.

Em xem xong anh sẽ del bài này đó.

ngohaibac 27-07-2007 04:50 PM

Chào các bạn.

Mình thấy các thư viện của mình vẫn chưa tối ưu. Thư viện sẽ phải có thêm các lựa chọn là các constant để thiết lập cho các hàm Init.

Các trình dịch tự sinh mã đều có các yếu tố này nhưng mà thấy C18, C30 có cách đặt tên các lựa chọn này khá hay.

Nên bạn nào có thời gian thì nên viết lại và thêm các constant này vào thì chương trình sẽ có tính sử dụng lại cao. Mình có thời gian sẽ viết lại thêm.

Chúc các bạn thành công.

toanck86 28-11-2007 12:04 AM

các bác cho em hỏi HTPIC với HTPIC 18 có khác nhau không vậy :D

quangdk 24-01-2008 10:30 AM

Em cam on Bac nhieu lam.Bac that rong luong.thanh vien moi

minhham 28-04-2008 10:22 PM

HT-PIC cho động cơ bước
 
chào các bác, em đang làm bài tập điều khiển động cơ bước loại 4 pha,2cuộn dây, 1 nguồn 5V chung cho 2 cuộn dây. Góc bước 7.5 độ. Làm và mô phỏng trên mạch thật mà mãi ko được. phát nản cả người. với đoạn code dưới thì động cơ quay bốn bước thì dừng, ko quay nữa, bấm nút thì động cơ lại quay tiếp.
Hình trên proteous mang tính chất minh họa, vì ko mô phỏng trên proteous
thuật toán là cứ sau mỗi lần cấp xung tới các cuộn dây của động cơ thì lại check nút bấm và cấp xung tiếp theo đúng chiều để động cơ quay cho phù hợp với yêu cầu nút bấm.
nếu bác nào có code về bài tập này thì up lên cho anh em xem với!
code:
// DIEU KHIEN DONG CO BUOC: loai 4 pha, goc buoc 7.5do, dien ap 5V
// Nut bam RB0 : Quay trai; nut RB1 : dung; RB2 : Quay phai
// yeu cau: dong co dang quay trai neu bam nut quay phai (mot lan, ko can bam nhieu lan) thi doi chieu va quay phai.
// dong co dang quay phai neu bam nut quay trai (mot lan) thi doi chieu va quay trai
// dong co dang quay bam nut dung thi dung lai, nhung PORTD van duoc xuat ra 1 gia tri bang gia tri cuoi cung ngay truoc khi dung

#include<pic.h>
__CONFIG(HS & PWRTEN & BOREN & LVPDIS & WDTDIS);
// ============= KHAI BAO CAC CHUONG TRINH CON ===========
// ============= CHU Y: phai xap xep theo dung thu tu chuong trinh con o duoi. Mot loi ngo ngan HAHAHA =========
char phimbam(void);
void DL(unsigned int i);

// ============= CHUONG TRINH CHINH ===========
void main ()
{ // ============= KHOI TAO ============
static char a; // bien a dieu khien trang thai hoat dong cua cua dong co
OPTION = 0b00000000; // dung prescaler cho timer0 voi ti le 1:2 Va dung tro keo len PORTB
TRISB = 0b00000111; // chan RB0, RB1, RB2 la input
TRISD = 0b00000000; // PORTD la cong ra
PORTD = 0b01010000; // PORTD gia su dang o vi tri dau ung voi gia tri 0b01010000, cac vi tri vai tro nhu nhau.
while (1)
{ a = phimbam();
if (PORTD == 0b01010000)
{ switch(a)
{ case 1 : { DL (5000); //trai
PORTD = 0b10010000; };
break;
case 2 : { DL (5000);
PORTD = 0b01010000; };
break;
case 3 : { DL (5000);
PORTD = 0b01100000; }; //phai
break;
};
};

if (PORTD == 0b10010000)
{ switch(a)
{ case 1 : { DL (5000); //trai
PORTD = 0b10100000; };
break;
case 2 : { DL (5000);
PORTD = 0b10010000; };
break;
case 3 : { DL (5000);
PORTD = 0b01010000; }; //phai
break;
};
};

if (PORTD == 0b10100000)
{ switch(a)
{ case 1 : { DL (5000); //trai
PORTD = 0b01100000; };
break;
case 2 : { DL (5000);
PORTD = 0b10100000; };
break;
case 3 : { DL (5000);
PORTD = 0b10010000; }; //phai
break;
};
};

if (PORTD == 0b01100000)
{ switch(a)
{ case 1 : { DL (5000); //trai
PORTD = 0b01010000; };
break;
case 2 : { DL (5000);
PORTD = 0b01100000; };
break;
case 3 : { DL (5000);
PORTD = 0b10100000; }; //phai
break;
};
};
}
}


// =========== CAC CHUONG TRINH CON ============
//==============================================
// chuong trinh "phimbam" phai lam sao de an 1 lan la duoc? chu ko can an nhieu lan hoac la phai giu nut an 1 luc ???????

static char phimbam(void)
{ if ((RB0==0)&&(RB1==1)&&(RB2==1)) return (1); // dong co quay trai

if ((RB1==0)&&(RB0==1)&&(RB2==1)) return (2); // dong co dung

if ((RB2==0)&&(RB1==1)&&(RB0==1)) return (3); // dong co quay phai
}
//================ HAM DELAY DUNG TIMER0 =============
void DL(unsigned int i)
{ while (i--)
{
TMR0 = 6;
T0IF = 0;
while (!T0IF);
};
}

-> động cơ quay bốn bước dừng chắc do biến ''a'' ko giữ được giá trị ở vòng while tiếp theo.

tran_binh 28-11-2009 01:41 PM

hiên nay minh đang làm đồ án đồng hồ số hiện thị trên led 7 đoạn (dùng led đơn kết nối như led 7 đoạn). với kích thước 43*130 cm. nhưng phần cứng thì minh đã làm nhưng chưa chạy được vì port quét led chưa hoạt động còn port quét dữ liệu data thì hoạt động. mong các anh em tư vấn giùm minh. minh sử dụng ic 89c51 lập trình và chương trình đã thành công nhưng phần cứng thì chưa {minh xuất dữ liệu ra mưc 0} http://www.megaupload.com/?d=KH8OLX77
nho tu van goi qua mail: tranthanhbinh8888@gmail.com

Locangel 15-12-2009 12:45 AM

Bac ơi cho mình hỏi bạn viết bằng chuong trình biên dịch nào thế CCS-C hay là HTPICC

nhulinh 15-12-2009 07:39 AM

Anh Bắc ơi, có bài nghiên cứu nào của anh về điều khiển LED ma trận post cho mọi người tham khảo với...
Thanks

ALU 27-01-2010 10:57 AM

Trích:

Nguyên văn bởi ngohaibac (Post 8127)
Lỗi này là do khi em cài MPLAB không đủ đó, nó thiếu MPASM toolsuiteASM30 (asm cho PIC30F) nên nó không khởi động dc. Có lẽ là do em cài kiểu gì đó nên k cài cái MPASM toolsuite là complier ASM.

Em cài lại chú ý chọn Custom Option khi nó cho lựa chọn khi cài nhé, rùi chọn hết mà cài cho chắc chắn. Cái này giống cài nhiều phần mềm mà em.

Chúc em thành công.

Theo tôi đây là lỗi khá nhiều người gặp nhưng vẫn chưa có một trả lời nào xác đáng! Ngay cả trên forum của microchip cũng chưa trả lời rõ ràng.

Tôi cũng gặp tình cảnh tương tự!
Win của tôi là XP SP2 có bản quyền, phần mềm chống virus cũng là BKAV bản quyền.

Cài xong thì không thể khởi động nên không thể chỉ đường dẫn nhúng các trình biên dịch vào mplab IDE như hỉ dẫn trên microchip được.

Ai thực sự đã giải quyết triệt để lỗi trên thì chỉ dẫn cho anh em!
-------------------------------
Tôi đã xử lý được theo cách sau:
http://www.picvietnam.com/forum/showthread.php?t=5804

congtam1189 18-03-2010 09:28 AM

sao khobg cho dơn de

congtam1189 18-03-2010 09:34 AM

sao ko cho dơn ve

dienbk36 27-03-2010 12:31 PM

Cám ơn anh Bắc!

eros_89_a 28-05-2010 08:01 PM

anh Bắc cho em hỏi tí ở chỗ bài nháy led dùng pp delay .theo em thấy mỗi vòng lặp while (time--) chi co 250us phải kô anh ?anh giải thik dùm em với.em mới học pic .cám ơn anh!


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