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)

bigtitan 19-08-2006 09:17 PM

Trích:

Nguyên văn bởi nhh
Bài cuối về LCD. Hoạt động theo 8bit interface, có hỏi cờ bận đảm bảo LCD luôn thực thi đúng lệnh yêu cầu ! Chú ý việc hỏi cờ bận là hết sức cần thiết!

Một điều nữa là Protues mô phỏng cho LCD hơi cà thoạt, nên dùng Picsimulator.Tốt nhất kiếm 1 chú LCD làm cho xom!:rolleyes:

Sao em thấy cái PICsimlator này nó tét ra kết quả lâu quá.ngồi đợi nó chạy ra hàng chữ HELLO muốn....tắt mày cho rồi.Mặc dù thiết lập mức độ chạy hết công suất(Ctrl+F5 thì phải) nhưng ó vẫn rề quá.Hay là còn chỗ nào nữa.Các bác chỉ giúp.

namqn 20-08-2006 01:12 AM

Trích:

Nguyên văn bởi bigtitan
Sao em thấy cái PICsimlator này nó tét ra kết quả lâu quá.ngồi đợi nó chạy ra hàng chữ HELLO muốn....tắt mày cho rồi.Mặc dù thiết lập mức độ chạy hết công suất(Ctrl+F5 thì phải) nhưng ó vẫn rề quá.Hay là còn chỗ nào nữa.Các bác chỉ giúp.

Lại nữa rồi, PIC Simulator để kiểm tra logic của chương trình, chứ không phải để thử xem máy tính của bạn chạy nhanh đến mức nào. Bạn vào đọc thêm trong luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=330

Thân,

vtt 20-08-2006 12:34 PM

Chào bác nhh!
Tôi copy nguyen bai delay1s_RB0 của bác về nạp thử, nhưng không hiểu sao nó không chạy, mà phải cắm chân RB3 (chân PGM) xuống đất thì nó mới chạy, bác có thể cho tôi biết tại sao không?
Cám ơn bác!

namqn 20-08-2006 06:59 PM

Trích:

Nguyên văn bởi vtt
Chào bác nhh!
Tôi copy nguyen bai delay1s_RB0 của bác về nạp thử, nhưng không hiểu sao nó không chạy, mà phải cắm chân RB3 (chân PGM) xuống đất thì nó mới chạy, bác có thể cho tôi biết tại sao không?
Cám ơn bác!

Ở một số chip, chân RB3 còn là chân PGM dùng để cấp nguồn cho chế độ nạp chip điện áp thấp (Low-Voltage Programming). Nếu chip của bạn còn mới, có thể nó đang được bật chế độ LVP (mặc định khi xuất xưởng), do đó bạn để hở RB3 sẽ không cho phép chip chạy chương trình, và bạn phải nối RB3 xuống 0V (nên nối qua một điện trở khoảng 1k) thì chip mới không đi vào chế độ LVP và mới chạy được chương trình đã có trong chip.

Thân,

hpecom 21-08-2006 05:07 PM

Trích:

Nguyên văn bởi boys3509_2006
Em mượn tạm đoạn code của nhh anh mổ xẻ nó giùm em nhé

//************************************************** **
// Author : nhh
// Date : 02/04/06
// Hardware: PIC16F877A
//************************************************** **
#include <16F877A.h>
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=4000000)
#use fast_io(b)
#byte portb=0x06
#define led pin_B0
int16 count;
int8 a;

//Chuong trinh ngat TMR0
#int_timer0
void interrupt_timer0()
{
set_timer0(6);
++count;
if(count==2000)
{
count=0;
a=a<<1; // dich trai a 1bit :confused:
}
if(a==256)
{
a=1;
count=0;
}
}

//Chuong trinh chinh
main()
{
set_tris_b(0);
enable_interrupts(global);
enable_interrupts(int_timer0);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); :confused:
set_timer0(6);
count=0;
a=1;
while(true)
{
portb=a; :confused:
}
}

Anh giải thích mấy cỗ có :confused: giùm em. Tại sao phải setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); mà ko Div 3, 4,... hở anh ?

*Dấu :confused: thứ nhất:
[CODE:]
a=a<<1; // dich trai a 1bit
[/CODE]
Như tác giả đã chú thích đó là lệnh dịch trái 1 bit.
VD: trước khi dịch, a có giá trị 0 0 0 0 0 0 0 1 (0x01) thì sau lệnh dịch này giá trị biến a sẽ là 0 0 0 0 0 0 1 0 (0x02).
Vậy lệnh dịch trái sẽ làm tăng giá trị biến bị dịch lên 2 lần: 2 thành 4. Giống như bạn dịch trong hệ thập phân số 0500 thì được 5000 tức tăng 10 lần. Hệ nhị phân (2 số) dịch trái 1 bit sẽ tăng giá trị 2 lần, hệ thập phân (10 số) dịch trái một bit, số sẽ tăng giá trị 10 lần.
Vậy nhiều lệnh dịch sẽ làm cho a thay đổi như sau
0 0 0 0 0 1 0 0
0 0 0 0 1 0 0 0
0 0 0 1 0 0 0 0
0 0 1 0 0 0 0 0
0 1 0 0 0 0 0 0
1 0 0 0 0 0 0 0
* Dấu :confused: thứ 2:
[CODE:]
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
[/CODE]
mode may be one or two of the constants defined in the devices .h file. RTCC_INTERNAL, RTCC_EXT_L_TO_H or RTCC_EXT_H_TO_L

RTCC_DIV_2, RTCC_DIV_4, RTCC_DIV_8, RTCC_DIV_16, RTCC_DIV_32, RTCC_DIV_64, RTCC_DIV_128, RTCC_DIV_256
Bạn hãy đọc Help và các ví dụ của nó thì bạn sẽ hiểu được cách tính.
Bạn hãy tìm hiều kỹ về bộ chia tần trong DataSheet của chip sẽ hiểu tại sao chỉ làm 2 mũ n.
* Dấu :confused: thứ 3:
[CODE:]
portb=a;
[/CODE]
Đây là lệnh xuất giá trị biến a ra PortB. a có 8 bit, PortB có 8 chân B7 đến B0.
Lệnh trên sẽ áp các bit của a vào PortB theo đúng trọng số.
Chúc bạn thành công. (và lần sau hỏi dễ xíu:D ).
hpecom.

lep 21-08-2006 08:42 PM

làm thế naò để vi điêù khiển pic16f877a nhận biết số vong quay cuả motor động cợ? khi khởi động output chân BO cho mức cao high motor động cợ 1 quay 20 vong phát ra 20 xung vuông đến input chân D0 ,chan D0 nhan 20 xung xu li cho ra chan output BO muc thap low motor dong co thu 1 ngung quay va output B1 cao high motor dong co thu 2 quay 10 vong tao ra 10 xung vuong den chan D1 chan D1 nhan 10 xung thi B1 low dong co motor2 dung va B0 high dong co motor 1 quay va nguoc lai
Cho minh hoi cach lam mach dem vong quay motor dong co?xin cac huynh cho luon so do mach nay?va can mua nhung linh kien gi về ráp mạch?
Va xin cac huynh chi cho cach viet chay chuong trinh nay dung ngon ngu C _CCS_C
tan so 20Mhz
pic 16f877a

vtt 21-08-2006 11:08 PM

Cảm ơn ngài trưởng lão Pic bang!
Bây giờ thì tôi đã hiểu, nhưng khi phải nối mass chân RB3 rồi thì coi như chân đó không thể dùng được nữa hả?

namqn 21-08-2006 11:18 PM

Trích:

Nguyên văn bởi vtt
Cảm ơn ngài trưởng lão Pic bang!
Bây giờ thì tôi đã hiểu, nhưng khi phải nối mass chân RB3 rồi thì coi như chân đó không thể dùng được nữa hả?

Bạn vẫn có thể dùng chân RB3 như bình thường khi chip đã ở chế độ chạy chương trình bình thường. Nhưng nếu bạn nối thẳng RB3 vào mức 0V và sau đó dùng RB3 như ngõ ra, thì khi bạn xuất mức cao ra RB3 sẽ gây ngắn mạch giữa các chân Vdd và Vss (vì bạn đã nối thẳng RB3 vào Vss, và sau đó lại yêu cầu ngõ ra RB3 được nối lên Vdd trong chương trình). Đó chính là lý do của lời khuyên nên nối RB3 xuống mức 0V thông qua một điện trở khoảng 1k, nếu bạn muốn RB3 khi dùng như ngõ ra được nhẹ tải hơn thì có thể dùng giá trị 4.7k hay 10k cho điện trở kéo xuống 0V đó.

Thân,

minhquancdt 23-08-2006 09:48 AM

Luồng này sôi động gớm ta!
Sao không thấy bác nhh post bài nữa kà!
Anh em nào rảnh rỗi post tiếp cho bà con hào tham gia với....!:D

Sangcao 23-08-2006 02:30 PM

Mình đang thử ctr điều khiển động cơ: Khi có tín hiệu từ chân RB0 thì động cỏ quay, nếu đang quay mà có tín hiệu từ RB1 thì động cơ quay ngược lại bằng thời gian no đã quay xuôi, bạn nào có thể viết cho mình một ví dụ như vậy bằng CCS được ko, cảm ơn nhiều.

vtt 24-08-2006 09:19 PM

Cám ơn bác namqn!
Các bác ơi, tôi đang loay hoay với việc giao tiếp giữa PIC 16F877A với eeprom 24C64 mà chưa được, bác nào đã làm được hoạc có kinh nghiệm giao tiếp với bộ nhớ ngoài xin chỉ giùm.

namqn 24-08-2006 10:03 PM

Bạn đọc tài liệu sau của Microchip về giao tiếp PIC16 với I2C EEPROM:
http://ww1.microchip.com/downloads/en/DeviceDoc/i2c.pdf

Thân,

nhh 26-08-2006 10:00 PM

Trích:

Nguyên văn bởi Sangcao
Mình đang thử ctr điều khiển động cơ: Khi có tín hiệu từ chân RB0 thì động cỏ quay, nếu đang quay mà có tín hiệu từ RB1 thì động cơ quay ngược lại bằng thời gian no đã quay xuôi, bạn nào có thể viết cho mình một ví dụ như vậy bằng CCS được ko, cảm ơn nhiều.

Bạn có thể dùng ngắt ngoài để điều khiển cái động cơ của bạn:
http://www.picvietnam.com/forum//sho...p?t=357&page=2

son_um 04-10-2006 01:38 AM

Đoạn mã hiển thị led 7 thanh này, dấu ^ có ý nghĩa là vì hả các bác
void display(int8 digit) {
output_c(DIGITS[digit] ^ 0xff);
off_on_led_transistor();
}
Thân.

minhquancdt 04-10-2006 12:11 PM

Trích:

Nguyên văn bởi son_um (Post 5248)
Đoạn mã hiển thị led 7 thanh này, dấu ^ có ý nghĩa là vì hả các bác
void display(int8 digit) {
output_c(DIGITS[digit] ^ 0xff);
off_on_led_transistor();
}
Thân.

Ặc ặc...
Bác dùng mấy cái mảng + hàm con mà chẳng ai biết từ đâu ra thì ai mà hiểu được bác đang nghĩ gì !

Hãy post cả code hoàn thiện để mọi nguời cùng mổ xẻ !

son_um 04-10-2006 10:10 PM

Thì đoạn chương trình đấy từ bài viết về hiển thị led7 thanh,post lại vậy:

Chương trình hiển thị phím số trên ma trận phím 4x3 ra đèn 7 đoạn (không dùng interrupt)

#include <16F877A.h>
#fuses NOWDT, XT
#fuses NOLVP // important
#use delay(clock=4000000)

#include <kbd.c> // in PICC\Drivers

// 0 1 2 3 4 5 6 7 8 9
byte const DIGITS[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f };

///////////////////////////////////////////////////////////
/* private */void off_on_led_transistor() {
output_low(PIN_D1);
delay_ms(1);
output_high(PIN_D1);
}

///////////////////////////////////////////////////////////
void display(int8 digit) {
output_c(DIGITS[digit] ^ 0xff);
off_on_led_transistor();
}

///////////////////////////////////////////////////////////
int8 char_to_digit(char c) {
return c & 0b00001111; // first 4 bits only
}

///////////////////////////////////////////////////////////
int1 digit_key_pressed(char key) {
byte pattern;
pattern = 0b00110000;
return (key & pattern) == pattern;
}

///////////////////////////////////////////////////////////
void main() {
int8 i, digit;
char key;

kbd_init();
while (true) {
key = kbd_getc();
if (digit_key_pressed(key)) {
digit = char_to_digit(key);
for (i = 0; i < 200; i++) // repeat the display for human eyes
display(digit);
}
}
}

namqn 04-10-2006 10:31 PM

Trích:

Nguyên văn bởi son_um (Post 5248)
Đoạn mã hiển thị led 7 thanh này, dấu ^ có ý nghĩa là vì hả các bác
void display(int8 digit) {
output_c(DIGITS[digit] ^ 0xff);
off_on_led_transistor();
}
Thân.

Dấu "^" là ký hiệu phép toán XOR (exclusive OR) trong C.

Thân,

son_um 06-10-2006 03:27 AM

Trong đoạn code về quét bàn phím, có lệnh sau e không hiếu,mong được các bác giải thích: IF((RBIF)&&(RBIE)....

#int_RB
void ngat_RB()
{
if((RBIF)&&(RBIE))
{
{
if(RB4&&RB0)
a=dig[0];
}
{
if(RB4&&RB1)
a=dig[4];
Thân.

nhh 06-10-2006 05:40 PM

Trích:

Nguyên văn bởi son_um (Post 5309)
Trong đoạn code về quét bàn phím, có lệnh sau e không hiếu,mong được các bác giải thích: IF((RBIF)&&(RBIE)....

#int_RB
void ngat_RB()
{
if((RBIF)&&(RBIE))
{
{
if(RB4&&RB0)
a=dig[0];
}
{
if(RB4&&RB1)
a=dig[4];
Thân.

Phép toán && là phép and logic.Chắc là không phải giải thích về phép toán này.

phamvanthang 09-10-2006 09:47 PM

Ban lam on cho biet cho tim may thu vien cua CCS C, vi du nhu lcd_lib_4bit.h hay def_877a.h. Cam on!

mp3pic 10-10-2006 10:24 AM

cho biêt có sự khác nào giữa pic16f877-20p với 16f877a không

bantrang25 11-10-2006 01:56 PM

Bác nào có chương trình mẫu viết cho ADC 16bit ngoài, và ctr viết cho Rom ngoài bằng CCS ko up lên cho anh em học với.Thêm nữa là chưa thấy bác namqn hướng dẫn về làm ctr Calibrate trong quá trình ghi vào Rom: Ví dụ như đo nhiệt độ bằng can nhiệt thì nên dung bảng calip để đo thực tế rồi ghi vào Rom hay hơn là dùng công thức . Mình nghĩ đây cũng là một vấn đề mọi người nên quan tâm, có ai đã làm rồi thì có thể hướng dẫn cho moi người nhé!

vdt 11-11-2006 01:18 AM

Trích:

Nguyên văn bởi mp3pic (Post 5378)
cho biêt có sự khác nào giữa pic16f877-20p với 16f877a không

Bạn có thể tham khảo tài liệu sau http://ww1.microchip.com/downloads/e...Doc/39591a.pdf
Chúc vui

alamanda 04-12-2006 11:20 AM

[QUOTE=nhh;2261]Còn đây là ứng dụng ngắt ngoài trên RB4 đến RB7 để thay đổi kiểu cũng như tốc độ chớp nháy mấy con led chỉ để....ngắm cho vui mắt !

Ấn sw1, led1 nhấp nháy với delay 250ms
Ấn sw2, led1,2 nhấp nháy với delay 200ms
Ấn sw3, led1,2,3 nhấp nháy với delay 150ms
Ấn sw4, led1,2,3,4 nhấp nháy với delay 100ms
[code]//************************************************** ***************************
// Author : nhh
// Date : 03/04/06
// Hardware: PIC16F877A
//************************************************** ***************************
Bác nhh ơi,tui đang đang dùng CCS C version 4.013 ( tui mới học PIC gần đây). Khi tui copy file của bác về chạy thử thì nó báo lỗi. Ở khai báo #byte portb=0x06, nó báo lỗi là Expecting an identifier và Expecting a declaration. Còn ở lệnh: portb=led;thì nó báo lỗi Expecting LVALUE such as a variable name or *expression. Cụ thể là bài của bác tui dịch ra là 8 lỗi. Tui pó tay:confused: .Rất mong sự chỉ giáo của bác,và các bậc tiền bối.

alamanda 04-12-2006 01:26 PM

ha ha,tui gỡ version 4.013,và cài version 3.249,rồi dịch bài của bác nhh thì khg có lỗi nào cả.Pó tay.Có ai bít giải thích giùm.

tranhuyky 20-12-2006 09:22 PM

Mình thay led 7 đoạn bằng LCD thì không chạy được
 
Trích:

Nguyên văn bởi nhh (Post 2386)
Mạch quét 16 phím, hiện kết quả lên led 7 đoạn.
Code:

//*****************************************************************************
// Author  : nhh
// Date    : 03/04/06
// Hardware: PIC16F877A
//*****************************************************************************
#include <16F877A.h>
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=4000000)
#use fast_io(b)
#use fast_io(c)
#byte portb = 0x06
#byte portc = 0x07
#bit RB0 = 0x06.0
#bit RB1 = 0x06.1
#bit RB2 = 0x06.2
#bit RB3 = 0x06.3
#bit RB4 = 0x06.4
#bit RB5 = 0x06.5
#bit RB6 = 0x06.6
#bit RB7 = 0x06.7
#bit RBIF=intcon.0 //dinh nghia co ngat RB
#bit RBIE=intcon.3 //dinh nghia bit cho phep ngat RB
int a;
const unsigned char dig[]={0b00111111,0b00000110, 0b01011011,0b01001111,\
0b01100110,0b01101101,0b01111101,0b00000111,0b01111111,0b01101111,0b01110111,\
0b01111100,0b00111001,0b01011110,0b11111001,0b11110001};
                  // ma hoa digital duoi dang mang
// Chuong trinh ngat
#int_RB
void ngat_RB()
{
if((RBIF)&&(RBIE))
  {
        {
        if(RB4&&RB0)
        a=dig[0];
        }
        {
        if(RB4&&RB1)
        a=dig[4];
        }
        {
        if(RB4&&RB2)
        a=dig[8];
        }
        {
        if(RB4&&RB3)
        a=dig[12];
        }
//.......
        {
        if(RB5&&RB0)
        a=dig[1];
        }
        {
        if(RB5&&RB1)
        a=dig[5];
        }
        {
        if(RB5&&RB2)
        a=dig[9];
        }
        {
        if(RB5&&RB3)
        a=dig[13];
        }
//........
          {
        if(RB6&&RB0)
        a=dig[2];
        }
        {
        if(RB6&&RB1)
        a=dig[6];
        }
        {
        if(RB6&&RB2)
        a=dig[10];
        }
        {
        if(RB6&&RB3)
        a=dig[14];
        }
//........
          {
        if(RB7&&RB0)
        a=dig[3];
        }
        {
        if(RB7&&RB1)
        a=dig[7];
        }
        {
        if(RB7&&RB2)
        a=dig[11];
        }
        {
        if(RB7&&RB3)
        a=dig[15];
        }
  RBIF=0; //Xoa co ngat RB
  }
}
// Chuong trinh chinh
main()
{
set_tris_b(0b11110000);
set_tris_c(0);
enable_interrupts(global);
enable_interrupts(int_RB);
ext_int_edge(H_to_L);
portb=0;
portc=0;
while(true)
  {
  portb=1;
  portb=2;
  portb=4;
  portb=8;
  portc=a;
  }
}

http://www.freewebtown.com/nhhao/PIC/Giaimabanphim.gif

Chào bạn mình thay led 7 đoạn bằng LCD thì chương trình chạy không đúng, bạn có thể hướng dẫn cho mình dùng ngắt để giải mã phím xuất ra lcd được không, cám ơn bạn nhiều.

nhh 23-12-2006 09:06 AM

LCD và led 7 đoạn tất nhiên là khác nhau rồi.

Để thực hiện tốt giải mã matrix phím, bác phải có giải pháp chống nhiễu (run phím) bằng phần cứng, hoặc phần mềm, thông thường là dùng phần mềm. Code bên trên chưa có chống nhiễu :D .Để khi nào tôi gởi code cho các bác !

LEO-XBS 24-12-2006 05:03 PM

mình đang viết chương trình cho Robot bằng C nhưng khi chay thì có một số đoạn bị bỏ qua. Thỉnh thoảng thì lại chạy đúng. Các cao thủ về CCS C có thể giải thích giúp mình được ko?

minhpic 25-12-2006 07:57 AM

bạn phải mói cụ thể hơn công việc của bạn cũng như chương trình thì mọi người mới có thể giúp đỡ chứ

LEO-XBS 01-01-2007 02:07 PM

các bác xem thử một chương trình nhé. ở đây em chỉ viết các modul chương trình con thực hiện chức năng của robot còn chương trình chính thì sẽ gọi các chương trình con tùy theo mình muốn dùng chức năng nào của robot.
Code:

//**************************************************************
/////////*FILENAME: CHUONG TRINH DIEU KHIEN ROBOT*//////////////
/////////*HARDWARE: PIC16F877                    *//////////////
/////////*DATE:  19-Nov-06 09:40                *//////////////
/////////*CCS PCM C Compiler, Version 3.227      *//////////////
/////////*NGUOI THUC HIEN: LEO-XBS              *//////////////
//**************************************************************
#include <16F877A.h>
#include <DEFS_16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)
//****************************************
//////DINH NGHIA CAC CHAN VA CAC CONG/////
//****************************************
#define dc_trai1 rc1
#define dc_trai2 rb1
#define dc_phai1 rc2
#define dc_phai2 rb3
#define dc_nang1 rb4
#define dc_nang2 rb5
#define dc_day1 rb6
#define dc_day2 rb7
#define dc_kep1 rd0
#define dc_kep2 rd1
#define sw1 rc0
//*******************************************
///////KHAI BAO CAC HAM VA BIEN//////////////
//*******************************************
void setup();
void tien();
void lui();
void dung();
void dk_tien();
void sang_phai();
void sang_trai();
void quay_phai();
void quay_trai();
void dieu_khien();
int led_thu();
void nang();
void ha();
void kep();
void nha();
void day();
void thu();
void program1();
void program2();
int dem,led;
const unsigned char lech_phai[7]={0b00001000,0b00010000,0b00011000,0b00100000,0b00101000,0b00110000,0b00111000};
const unsigned char lech_trai[7]={0b00000001,0b00000010,0b00000011,0b00000100,0b00000101,0b00000110,0b00000111};
const unsigned char nhieu[50]={0b00000000,0b00001001,0b00001010,0b00001011,0b00001100,0b00001101,0b00001110,0b00010001,\
                              0b00010010,0b00010011,0b00010100,0b00010101,0b00010110,0b00011001,0b00011010,\
                              0b00011100,0b00100001,0b00100010,0b00100011,0b00100100,0b00100101,0b00100110,\
                              0b00101001,0b00101010,0b00101100,0b00110001,0b00110010,0b00110100,0b00011110,\
                              0b00111111,0b00111011,0b00111101,0b00111110,0b00111001,0b00111010,0b00111100,\
                              0b00110111,0b00101111,0b00011111,0b00100111,0b00010111,0b00001111,0b00110011,\
                              0b00110101,0b00110110,0b00101011,0b00101101,0b00101110,0b00011011,0b00011101};
//*****************************************************************************************************************
/////////////////////////////////CHUONG TRINH CHINH////////////////////////////////////////////////////////////////
//*****************************************************************************************************************
void main()
{
 setup();
}
//*****************************************************************************************************************
///////////////////////////////////CHUONG TRINH 1//////////////////////////////////////////////////////////////////
//*****************************************************************************************************************
void program1()
{
  while(true)
  {
    dieu_khien();
  }
}
//****************************************************************************************************************
//////////////////////////CAC CHUONG TRINH CON////////////////////////////////////////////////////////////////////
//****************************************************************************************************************
void setup()
{
 set_tris_a(0b00111111);
 set_tris_b(0b00000101);
 set_tris_c(0b11111001);
 set_tris_d(0);
 set_tris_e(0b00000111);
 portb=0;
 portd=0;
 led=0;
 dem=0;
 dc_trai1=0;
 dc_phai1=0;
 while(true){
  if(sw1==0) program1();
  }
}
//***********************************************
void dieu_khien()
{
 led=led_thu();
 switch(led)
 {
  case 0: dk_tien(); break;
  case 01: sang_phai(); break;
  case 02: sang_trai(); break;
 }
 if (re0) ++dem;
}
//*************************************************
void tien()
{
 dc_trai1=1;
 dc_trai2=0;
 dc_phai1=1;
 dc_phai2=0;
 delay_ms(500);
}
//**************************************************
void dk_tien()
{
 while(led_thu()==0)
 {
  dc_trai1=1;
  dc_trai2=0;
  dc_phai1=1;
  dc_phai2=0;
 }
}
//**************************************************
void lui()
{
 dc_trai1=0;
 dc_trai2=1;
 dc_phai1=0;
 dc_phai2=1;
 delay_ms(1000);
}
//**************************************************
void sang_phai()
{
 setup_ccp1(CCP_PWM);
 setup_ccp2(CCP_PWM);
 setup_timer_2(T2_DIV_BY_16, 127, 1);
 while(led_thu()==1)
 {
 set_pwm2_duty(1023);
 set_pwm1_duty(400);
 }
 setup_ccp1(CCP_OFF);
 setup_ccp2(CCP_OFF);
}
//**************************************************
void sang_trai()
{
 setup_ccp1(CCP_PWM);
 setup_ccp2(CCP_PWM);
 setup_timer_2(T2_DIV_BY_16, 127, 1);
 while(led_thu()==2)
 {
 set_pwm2_duty(400);
 set_pwm1_duty(1023);
 }
 setup_ccp1(CCP_OFF);
 setup_ccp2(CCP_OFF);
}
//**************************************************
void quay_phai()
{
 while(ra1>0){
 dc_trai1=1;
 dc_trai2=0;
 dc_phai1=0;
 dc_phai2=1;
 }
}
//**************************************************
void quay_trai()
{
 while(ra4>0){
 dc_trai1=0;
 dc_trai2=1;
 dc_phai1=1;
 dc_phai2=0;
 }
}
//**************************************************
void dung()
{
 dc_trai1=1;
 dc_trai2=1;
 dc_phai1=1;
 dc_phai2=1;
 delay_ms(1000);
}
//**************************************************
void nang()
{
 dc_nang1=1;
 dc_nang2=0;
 delay_ms(1000);
}
//**************************************************
void ha()
{
 dc_nang1=0;
 dc_nang2=1;
 delay_ms(1000);
}
//**************************************************
void day()
{
 dc_day1=1;
 dc_day2=0;
 delay_ms(1000);
}
//*************************************************
void thu()
{
 dc_day1=0;
 dc_day2=1;
 delay_ms(1000);
}
//*************************************************
void kep()
{
 dc_kep1=1;
 dc_kep2=0;
 delay_ms(1000);
}
//*************************************************
void nha()
{
 dc_kep1=0;
 dc_kep2=1;
 delay_ms(1000);
}
//*************************************************
int led_thu()
{
 int i;
 for (i=0;i<7;i++)
 {
    if (porta==lech_trai[i]) return(1);
    else if (porta==lech_phai[i]) return(2);
 }
 for (i=0;i<50;i++)
 {
    if(porta==nhieu[i]) return(0);
 }
}

namqn: bạn nhớ dùng các tag [ code] và [ /code] để bọc các đoạn mã nguồn, như vậy sẽ dễ đọc hơn (nhớ là các tag không có khoảng trắng nhé).

navy 20-01-2007 03:29 PM

ccs c for PIC
 
Ban nao co kinh nghiem ve dieu khien PID post len cho minh tham khao moi! Minh dang chuan bi lam voi PIC 877A.

nhh 23-01-2007 11:49 AM

Đây là khai báo địa chỉ của thanh ghi portB và thanh ghi intcon. Thường thì mỗi thanh ghi có một địa chỉ, giống như số nhà ấy, bạn khai báo nhầm địa chỉ của nó, nghĩa là bạn vào nhầm nhà rồi còn gì.

Với 16F877A
PORTB : địa chỉ 06h
INTCON : địa chỉ 0Bh

Vì trong file 16F877A.h của CCS C không có khai báo tường tận như trong các file .inc của Microchip, muốn sử dụng cho tiện thì khai báo thêm vào. Bạn mở file .h của con pic đang làm việc ra xem người ta đã khai báo những gì rồi.

giaosucan 23-01-2007 02:12 PM

Nguyên văn bởi ngoalongdochanh
Cho toi hoi tai sao khi khai bao:
#device PIC16F877 *=16 ADC=10

thi CCSC bao loi: "Can not change device type this far into the code"
Cach khac phuc

minh cung hay gap loi nay ,ko bit ly do la seo ????

nhh 25-01-2007 11:01 AM

Trích:

Nguyên văn bởi giaosucan (Post 7003)
Nguyên văn bởi ngoalongdochanh
Cho toi hoi tai sao khi khai bao:
#device PIC16F877 *=16 ADC=10

thi CCSC bao loi: "Can not change device type this far into the code"
Cach khac phuc

minh cung hay gap loi nay ,ko bit ly do la seo ????

Nguyên nhân đây:
Trích:

Nguyên văn bởi ngoalongdochanh
do lần trước mình khai báo chưa đúng cách giữa 16f877A và *=16 đúng ra phải viết liền như bạn minh lại viết cách ra như thế này "16f877A *=16".

giaosucan 26-01-2007 12:59 AM

vậy giữa CCS và HT-pic thì phần mềm được đánh giá ưu việt hơn

nhh 27-01-2007 09:21 AM

Trích:

Nguyên văn bởi giaosucan (Post 7041)
vậy giữa CCS và HT-pic thì phần mềm được đánh giá ưu việt hơn

Kha kha...Cái này mọi người tranh luận nhiều rồi ! Nói nhiều đâu có được gì đâu.Dùng trình biên dịch nào cũng được, ai viết C chuẩn tốt thì chọn HT PIC, tớ là thực dụng nên dùng CCS C cho đỡ khổ.

Bên điện tử Việt Nam có luồng so sánh hai cái này đó, bác hứng thú thì qua đó xem.

nhh 27-01-2007 09:29 AM

To anhoa1608: porb = 1,2,4,8 để set từng hàng lên mức 1. Chương trình đó dùng ngắt RB, chưa có chống nhiễu, bạn xem thêm ở đây: http://www.picvietnam.com/forum//showthread.php?t=839

Còn cái LCD đó, hồi trước hứng chí gắp từng ảnh lại đó :p .Bạn nào có LCD, kiểm tra thử mấy chương trình đó, cái LCD tớ lấy của thằng bạn về chạy thử chẳng thấy có tín hiệu gì cả, load mấy chương trình mẫu vào cũng chẳng có gì nốt, không biết làm cách nào để kiểm tra LCD đã chết hay còn sống nữa...

anhthang 06-02-2007 09:33 AM

Trong Pic16f877a có 3 timer :
+ Timer0 : 8 bit
+ Timer1 : 16 bit
+ Timer2 : 8 bit
Timer dùng cho nhiều ứng dụng : định thời, capture, pwm, ...

1.Timer0

Thanh ghi tác động:

Các lệnh:

Code:
setup_TIMER_0(mode);
setup_COUNTERS (rtcc_state, ps_state); // hay setup_WDT()
set_TIMER0(value); // hay set_RTCC(value) :xác định giá trị ban đầu (8bit) cho Timer0
get_TIMER0(); // hay get_RTCC() :trả về số nguyên (8bit) của Timer0
Trong đó mode là một hoặc hai constant (nếu dùng hai thì chèn dấu "|"ở giữa) được định nghĩa trong file 16F877A.h gồm :

RTCC_INTERNAL : chọn xung clock nội
RTCC_EXT_L_TO_H : chọn bit cạnh lên trên chân RA4
RTCC_EXT_H_TO_L : chọn bit cạnh xuống trên chân RA4

RTCC_DIV_2 :chia prescaler 1:2
RTCC_DIV_4 1:4
RTCC_DIV_8 1:8
RTCC_DIV_16 1:16
RTCC_DIV_32 1:32
RTCC_DIV_64 1:64
RTCC_DIV_128 1:128
RTCC_DIV_256 1:256

rtcc_state là một trong những constant sau:

RTCC_INTERNAL
RTCC_EXT_L_TO_H
RTCC_EXT_H_TO_L

ps_state là một trong những constant sau:

RTCC_DIV_2
RTCC_DIV_4
RTCC_DIV_8
RTCC_DIV_16
RTCC_DIV_32
RTCC_DIV_64
RTCC_DIV_128
RTCC_DIV_256
WDT_18MS
WDT_36MS
WDT_72MS
WDT_144MS
WDT_288MS
WDT_576MS
WDT_1152MS
WDT_2304MS

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxx

Em thật sự không hiểu câu này:" (nếu dùng hai thì chèn dấu "|"ở giữa) " anh NHH có thể minh họa cho em được không? em mới tìm hiểu về Pic được một tuần, nhưng chắc chắn là anh chỉ rõ hơn thì em sẽ hiểu! cảm ơn anh và chúc anh vui!

anhthang 06-02-2007 09:36 AM

xin lỗi vì Em không biết cách trích dẫn bài viết vào câu hỏi của em nên "copy" từ bài của anh NHH qua, nếu rãnh anh chỉ em luôn cách trích dẫn luôn nha!

anhthang 06-02-2007 06:00 PM

Các Anh có thể giúp Thắng tải được trình biên dịch CCSC 3.242 không? Thắng tải hoài không được! chúc Các Anh vui khỏe!


Múi giờ GMT. Hiện tại là 06:56 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam