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)
-   -   CCS C for PIC16F877A (http://www.picvietnam.com/forum/showthread.php?t=357)

cooloo 12-10-2007 12:59 AM

Trích:

Nguyên văn bởi nhh (Post 2109)
Chương trình này làm nhấp nháy con led ở chân RB0 1s sáng, 1s tắt.
Code:

#include<16F877A.h>
#fuses NOWDT,PUT,HS,NOPROTECT
#use delay(clock=10000000)
main()
{
while(true)
        {
        output_high(PIN_B0);
        delay_ms(1000);
        output_low(PIN_B0);
        delay_ms(1000);
        }
}

Trên đây:
Code:

#include<16F877A.h>
Khai báo con PIC bạn sử dụng, file này chương trình viết sẵn nhằm khai báo các bit, thanh ghi quan trọng trong con pic này.Các bạn có thể vào thư mục cài đặt C:\Program Files\PICC\Devices\16F877A.h để xem nó khai báo được những gì trong đó!
Code:

#fuses NOWDT,PUT,HS,NOPROTECT
Thiết lập các config
Code:

#use delay(clock=10000000)
Khai báo tần số dao động cấp cho PIC
Code:

output_high(PIN_B0)
Xuất ra chân RB0 mức logic 1 (tức 5V), do khi thực hiện hàm này đã bao hàm luôn việc tác động lên thanh ghi TRISB (dùng chọn chân I/O) do vậy ta không cần viết lệnh chọn chân I/O nữa.
Code:

output_low(PIN_B0)
Ngược lại
Code:

delay_ms(1000)
Tạo trễ khoảng thời gian theo mili giây là 1000 (tức 1s)
Chú ý hàm này chỉ có tác dụng khi có khai báo tần số dao động cấp cho PIC

Và bây giờ thử làm cho tất cả 8 led nối với portB chớp tắt 1s xem nào!Phải chăng ta sẽ làm như sau (Viết trong vòng lặp while):
Code:

{
output_high(PIN_B0);
output_high(PIN_B1);
output_high(PIN_B2);
output_high(PIN_B3);
output_high(PIN_B4);
output_high(PIN_B5);
output_high(PIN_B6);
output_high(PIN_B7);
delay_ms(1000);
output_low(PIN_B0);
output_low(PIN_B1);
output_low(PIN_B2);
output_low(PIN_B3);
output_low(PIN_B4);
output_low(PIN_B5);
output_low(PIN_B6);
output_low(PIN_B7);
delay_ms(1000);
}

Viết như thế này thì quá dài và thiếu chính xác nữa, có cách nào khác hay hơn không ? Sao ta không xuất đẩy hẳn portB lên mức cao,tạo trễ 1s rồi ép cho nó xuống mức thấp,tạo trễ 1s cùng một lúc nhỉ !
Bài tiếp theo sẽ đưa ra câu trả lời....
http://www.freewebtown.com/nhhao/PIC...201s%20RB0.GIF

Bạn ơi , khi mình compile cái code như trên thì nó báo lỗi warning về thiếu "void" . Mình bỏ thêm : void main(void) vào thì nó mới chạy .
Những function : delay() , rs232(), i2c thì tìm ở đâu vậy ???

thanco112 12-10-2007 02:43 AM

Hỏi về PWM
 
Oe oe, các bác lừa em nhá. Các bác bảo là tập trung mổ xẻ phần PWM làm em đọc mãi hết hai mấy trang mà thấy có mỗi 2 bài liên quan. Bác nào biết về phần này thì chỉ bảo em với ạ.

Em đang có một con step motor 4 dây (đỏ, xám- đen, vàng). Em đang tìm cách điều khiển nó (chạy, dừng, đảo chiều) nhưng mà chưa biết làm thế nào cả. Các bác cho em hỏi:

1. Em dùng 16f877 điều khiển nó có được không?
2. Cần phải có những kiến thức gì để điều khiển nó?

Bác nào có tài liệu về phần này bằng tiếng Việt thì share cho em với ạ.

Em cám ơn các bác ạ!!!!

nhh 12-10-2007 09:01 AM

Tất nhiên dùng 16F877 được, phí phạm nữa là đằng khác.

Tài liệu tiếng Việt về stepper motor, bạn vào phần điều khiển motor trong diễn đàn này tìm.

Stepper motor của bạn nếu công suất bé có thể dùng ULN lái.
Tham khảo điều khiển stepper motor ở đây:http://www.interq.or.jp/japan/se-inoue/e_step.htm
http://www.interq.or.jp/japan/se-ino...ture/step1.jpg

Nguoidumuc204 12-10-2007 09:41 AM

output_high(pin_xx);
output_low (pin_xx);

Hai câu lệnh trên chỉ làm cho chân ra xx là cao hay thấp, ứng với mức logic 1 hoặc 0.trong bài trên ta muốn cho sáng tất một port thì chỉ càn câu lệnh :
Code:

void main (void )
{
  set_tris_b(0);      // cả port B là port ra
  set_tris_c(0);    // cả port C là port ra
  port_b(0x00);    // khởi tạo giá trị đầu port B là 0 ( Tất cả led đều tắt )
  port_c(0x00);  // khởi tạo giá trị đầu port B là 0 ( Tất cả led đều tắt )
  delay_ms(100);
  while(1)
  {
        port_b(0xff); 
        delay_ms(1000);
        port_c(0xff);
        delay_ms(1000);
  } 
}


vandungevn 12-10-2007 06:12 PM

Những function : delay() , rs232(), i2c thì tìm ở đâu vậy ???

bạn xem rõ hơn trong phần help của nó nhé, hoặc tạo new project = PIC Wizard xem trong đó có nói về Những function : delay() , rs232(), i2c ......!

manhckgtcck45 12-10-2007 10:28 PM

Các anh ơi giúp e với. Các anh có thể chỉ cho em cách sử dụng ngắt ngoài để đếm thời gian của sự thay đổi tín hiệu vào port B không?

thongtr 13-10-2007 12:13 AM

1 Attachment(s)
cá pac ơi giúp em!! em bi lỗi gì vậy!

nhh 13-10-2007 09:09 AM

Trích:

Nguyên văn bởi thongtr (Post 12048)
cá pac ơi giúp em!! em bi lỗi gì vậy!

Bạn không nhận thấy chương trình đòi dấu "}" à?

thongtr 13-10-2007 12:52 PM

1 Attachment(s)
mình cũng a thêm đấu } vào rồi nhưng cũng ko có tác dụng!! với lại mình đưa chuột tới đấu } cuối cùng đó thì nó hiện ra màu xanh và nhìn lên trên thì thấy màu xanh đó ứng với đấu { dưới hàm void main(void) !!!
mình cũng ko biết bị chuyện nữa!!

thongtr 13-10-2007 02:04 PM

1 Attachment(s)
Trích:

Nguyên văn bởi thongtr (Post 11866)
Em vừa mới viết xong ct hiển thị LCD 4 bit! có hiệu ứng chữ chạy rất hay!! em post lên cho các pác tham khảo nhé! và góp ý cho em nhé!

#include <16F877A.h>
#include <DEFS_16F877A.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#define use_portb_lcd TRUE
#include <lcd.c>
const unsigned char line1[]={'H','E','L','L','O',' ','P','I','C','V','N','!','#'};
const unsigned char line2[]={'Y','H',':','T','H','O','N','G','T','R','0','6', '0','1','@',\
'Y','A','H','O','O','.','C','O','M','#'};

void main(void)
{ while(true)
{
int I=0,y=0,k=0,z=0;
delay_ms(100); // tao tre 100ms cho LCD khoi dong
lcd_init();
lcd_gotoxy(1,1);
while (line1[y]!='#')
{
lcd_putc(line1[y]);
delay_ms(200);
y++;
}
lcd_gotoxy(1,2);
while (i<16)
{
lcd_putc(line2[I]);
i++;
delay_ms(200);
}
i=2;

while (line2[z]!='#')
{
lcd_init();
lcd_gotoxy(1,1);
y=0;
while (line1[y]!='#')
{
lcd_putc(line1[y]);
y++; }

lcd_gotoxy(1,2);
k=i+16;
for(z=i;z<k;z++)
{lcd_putc(line2[z]);}
delay_ms(400);
i++;
}
}
}

Chương trình này minh mô phỏng chạy rồi nhung sao khi cho chạy thực tế khì ko dc!!
Mình đã mắc mạch theo sơ đồ này!! (chỉ có thay thạch anh 20M thôi!)

nhh 13-10-2007 02:05 PM

1 Attachment(s)
Trích:

Nguyên văn bởi thongtr (Post 12063)
mình cũng a thêm đấu } vào rồi nhưng cũng ko có tác dụng!! với lại mình đưa chuột tới đấu } cuối cùng đó thì nó hiện ra màu xanh và nhìn lên trên thì thấy màu xanh đó ứng với đấu { dưới hàm void main(void) !!!
mình cũng ko biết bị chuyện nữa!!

- Bạn thiếu dấu ngoặc kép của line1[].

- Chưa include file lcd.c

- Chú ý phép gán = và phép so sánh bằng ==

Việc chạy mô phỏng đúng ko hẳn thực tế sẽ đúng nhưng chạy mô phỏng sai thì chạy trên mạch thật sai là cái chắc.

ghosttn 13-10-2007 05:21 PM

Xin loi vi chen ngang các anh
 
1 Attachment(s)
Em muon' cho 595 ra 8 bit 1 luc nhung lam mai khong duoc. Em sai ởi chỗ nào
do mới học em chỉ có thể nghĩ đơực như vậy thôi. các anh tối ưu code+ mạch hộ em với.
====================================

#include <16f877a.h>
#use delay(clock=4M)
int8 i;
void input_byte(){
for(i=0;i<=7;i++){
output_bit(pin_B0,0); //1.tao xung cho pin_sck
output_bit(pin_B1,i%=2);//2.dich du lieu vao luc pin_sck o trang thai suon
output_bit(pin_B0,1); //3.ket thuc xung tai pin_sck
}
}
void output_byte(){
output_bit(pin_B2,0); //1.tao xung clock cho pin_rck
delay_ms(100); //2.dung lai de xem
output_bit(pin_B2,1); //3.ket thuc xung tai pin_rck
}

void main(){
set_tris_b(0);
output_bit(pin_B4,0);//khoi dong 595 pin_/OE

while(1){
output_bit(pin_B3,1);//cho phep ghi du lieu pin_MR =1
input_byte();
output_byte();
output_bit(pin_B3,0);//all pin out 595= level low
}//end while
}// end main
==========================

thanco112 14-10-2007 01:12 AM

hỏi về ngắt
 
Các bác cho em hỏi về các loại ngắt của con 16f877 này với ạ. Tên của nó này, chế độ hoạt động của nó như thế nào (khi nào thì ngắt ấy ạ). Em gà, mới nghiên cứu pic, các bác giúp cho!

GLOBAL
INT_RTCC
INT_RB
INT_EXT
INT_AD
INT_TBE
INT_RDA
INT_TIMER1
INT_TIMER2
INT_CCP1
INT_CCP2
INT_SSP
INT_PSP
INT_BUSCOL
INT_EEPROM
INT_TIMER0

Thanks các bác nhiều

vandungevn 22-10-2007 02:45 PM

Hiển thị dùng 595 trên CCS
 
Dưới đây là một chương trình đưa một byte bằng 74hc595 dùng trên CCS

Code:

void display(unsigned char dataout)
{
        unsigned char temp;
        //dataout = 0xa4;
        output_low(pin_c0);
for(i=0;i<8;i++)
{     
        temp = dataout;
        temp = temp&0x80;
        if(temp==0x80)
        {
        output_high(pin_c1);    // Data
        }
        else
        {
        output_low(pin_c1);          // Data
        }
        output_high(pin_c0);        // Clock
        dataout *=2; 
        output_low(pin_c0);        // Clock
}
output_high(pin_c2);                // Latch
output_low(pin_c2);                // Latch
}

chúc bạn thành công.!

Yeu PIC 26-10-2007 07:06 PM

1 Attachment(s)
trong ct mình dùng hai file của bộ compiler: lcd.c và ds1307.c
khi biên dịch thành file .hex thì bị những lỗi về delay như thế này:
Nguyên nhân do đau vậy!


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