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)

tranvanthuong 03-05-2007 02:47 PM

[QUOTE=nhh;8442]- #use fast_io(b): dùng cái này thì trình dịch chỉ set chân i/o với 1 lệnh duy nhất, nhớ là trong hàm main() phải dùng lệnh set_trix_x(); thì mới được.

- #byte portb=0x06: địa chỉ portb

-tấc cả nhửng cái này đã được định nghĩa rất kĩ và dể hiểu bạn tìm các bài của anh linhnc308, tìm bài nói về file _def_877a.h ấy.
chúc may mắn!!!

anh_gioi 05-05-2007 11:56 PM

Trích:

Nguyên văn bởi nhh (Post 8442)
- #use fast_io(b): dùng cái này thì trình dịch chỉ set chân i/o với 1 lệnh duy nhất, nhớ là trong hàm main() phải dùng lệnh set_trix_x(); thì mới được.

- #byte portb=0x06: địa chỉ portb

- #int_ext: chỉ thị hàm ngắt ngoài trên chân RB0

- enable_interrupts(global);: cho phép ngắt toàn cục

- enable_interrupts(int_ext);: cho phép ngắt ngoài trên chân RB0

- ext_int_edge(H_to_L);: kiểu ngắt cạnh xung cao xuống thấp

Bạn cố gắng tìm hiểu trong help của trình biên dịch, có cả đó. Đừng hỏi những câu dạng như thế này vì sẽ không ai trả lời cho bạn đâu.


vâng! em cám ơn anh.em cũng chưa kịp đọc help nên mới như vậy.

Jackie85 06-05-2007 03:38 PM

1 Attachment(s)
Mọi người cho em hỏi chút ạ,

Em đang viết ct hiện số cho led 7 thanh như mạch dưới dùng polling nhưng ko sao chạy được T_T. Nhất là ko chọn được 2 chân Anode chung, lúc nào cũng hiện cả 2 led cùng lúc.

Đoạn code của em như sau:

Code:

int chuso[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
int i, j;

void main()
{
  while(1){
      output_b(0x00);        //tat cac led
      output_e(0xFF);
      i = 0;
      //output_e(0x00);
      while(i<3){
        output_e(i);
        for(j = 0; j<=9; j++){
            output_b(~chuso[j]);
            delay_ms(10);
        }
        //delay_ms(30);
        i++;
      }
  }
}

Mong các bác giúp em với ạ O:-)

huybo02 06-05-2007 09:27 PM

Trích:

Nguyên văn bởi Jackie85 (Post 8535)
Mọi người cho em hỏi chút ạ,

Em đang viết ct hiện số cho led 7 thanh như mạch dưới dùng polling nhưng ko sao chạy được T_T. Nhất là ko chọn được 2 chân Anode chung, lúc nào cũng hiện cả 2 led cùng lúc.

Mong các bác giúp em với ạ O:-)

Hình như bạn mắc mạch trans bị sai nên lúc nào chân anod của LED 7 đoạn luôn được đặt lên mức 1 làm cả 2 LED luôn sáng. Bạn mắc lại mạch trans đi. Dùng 2 NPN mắc C lên 5V qua 1 điện trở, E xuống 0 còn B thì nối giống bạn. 2 chân Anod nối với 2 E của 2 trans
Còn code khi tăng thời gian delay lên 1000 thì thấy rõ nhưng không hiểu bạn định làm gì.
Sao ko post được file đính kèm :(. Nhấn vào tải file từ máy rồi mà nó ko hiện ra

Jackie85 07-05-2007 08:57 AM

Trích:

Nguyên văn bởi huybo02 (Post 8538)
Hình như bạn mắc mạch trans bị sai nên lúc nào chân anod của LED 7 đoạn luôn được đặt lên mức 1 làm cả 2 LED luôn sáng. Bạn mắc lại mạch trans đi. Dùng 2 NPN mắc C lên 5V qua 1 điện trở, E xuống 0 còn B thì nối giống bạn. 2 chân Anod nối với 2 E của 2 trans

Đúng đấy bạn ạ, đã thay thành npn và chạy được.

Dù sao cũng cám ơn bạn nhé.

meishun 07-05-2007 04:19 PM

Mình viết chương trình đọc giá trị trả về từ bộ ADC của PIC, sau đó xử lý dữ liệu để xuất ra LED 7 đoạn. Khi chạy thử thì thấy hiển thị sai, hiển thị lung tung. Kiểm tra lại phần cứng và phần mềm thấy OK. Cho chạy Deburg thì phát hiện CCS thực hiện phép chia sai (kết quả luôn bằng 0 bất chấp kiểu của biến).Bó tay!
Có ai biết lí do xin chỉ giúp mình với.
Cảm ơn!

tranvanthuong 07-05-2007 05:12 PM

Anh nào có phần mền viết font 32 x 16 cho em xin với em chân thành cám on

conanhung 09-05-2007 11:36 AM

Code:

#include<16F876A.h>
#fuses NOLVP, NOWDT,PUT,HS,NOPROTECT
#use delay(clock=12000000)
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#byte porta=0x5
#byte portb=0x6
#byte portc=0x7
#bit RB0=portb.0
#bit G1 = porta.0
#bit G2 = porta.1
#bit G3 = porta.2
#bit G4 = porta.3
#bit G5 = porta.4
#bit G6 = porta.5
#bit G7 = portc.0
#bit G8 = portc.1
#bit G9 = portc.2
#bit G10 = portc.3
#bit G11 = portc.4
#bit G12 = portc.5
#bit G13 = portc.6
#bit G14 = portc.7
#bit G15 = portb.1
#bit G16 = portb.2
#bit G17 = portb.3
#bit G18 = portb.4
#bit G19 = portb.5
#bit G20 = portb.6
#bit led = portb.7
main()
{
setup_adc( ADC_OFF );
set_tris_a(0);
set_tris_b(0b00000001);
set_tris_c(0);
while(true)
        {
G1=1;
G2=1;
G3=1;
G4=1;
G5=1;
G6=1;
G7=1;
G8=1;
G9=1;
G10=1;
G11=1;
G12=1;
G13=1;
G14=1;
G15=1;
G16=1;
G17=1;
G18=1;
G19=1;
G20=1;
        }
}

Mạch em mắc 20 đèn led vào 3 port thông qua 20 điện trở R=4k7 xuống GND, khi nạp cho PIC6F876A thì 19 đèn đều sáng, chỉ có đèn G5, tức là ở port RA4, mặc dù port này em đã kéo lên Vdd qua điện trở 4k7 rồi, mà đèn led nối ở RA4 vẫn ko sáng.

Ah, em đã thử thêm dòng lệnh

Code:

ADCON1 = 0x06;
vào hàm main() nhưng chương trình CSS C lại báo lỗi ADCON1 chưa khai báo và không dịch được.

Cho em hỏi chương trình em viết có thiếu gì không? và thiếu thì thêm như thế nào? Em xin cám ơn.

picpicpic 09-05-2007 04:29 PM

Trích:

Nguyên văn bởi conanhung (Post 8580)
Code:

#include<16F876A.h>
#fuses NOLVP, NOWDT,PUT,HS,NOPROTECT
#use delay(clock=12000000)
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#byte porta=0x5
#byte portb=0x6
#byte portc=0x7
#bit RB0=portb.0
#bit G1 = porta.0
#bit G2 = porta.1
#bit G3 = porta.2
#bit G4 = porta.3
#bit G5 = porta.4
#bit G6 = porta.5
#bit G7 = portc.0
#bit G8 = portc.1
#bit G9 = portc.2
#bit G10 = portc.3
#bit G11 = portc.4
#bit G12 = portc.5
#bit G13 = portc.6
#bit G14 = portc.7
#bit G15 = portb.1
#bit G16 = portb.2
#bit G17 = portb.3
#bit G18 = portb.4
#bit G19 = portb.5
#bit G20 = portb.6
#bit led = portb.7
main()
{
setup_adc( ADC_OFF );
set_tris_a(0);
set_tris_b(0b00000001);
set_tris_c(0);
while(true)
        {
G1=1;
G2=1;
G3=1;
G4=1;
G5=1;
G6=1;
G7=1;
G8=1;
G9=1;
G10=1;
G11=1;
G12=1;
G13=1;
G14=1;
G15=1;
G16=1;
G17=1;
G18=1;
G19=1;
G20=1;
        }
}

Mạch em mắc 20 đèn led vào 3 port thông qua 20 điện trở R=4k7 xuống GND, khi nạp cho PIC6F876A thì 19 đèn đều sáng, chỉ có đèn G5, tức là ở port RA4, mặc dù port này em đã kéo lên Vdd qua điện trở 4k7 rồi, mà đèn led nối ở RA4 vẫn ko sáng.

Ah, em đã thử thêm dòng lệnh

Code:

ADCON1 = 0x06;
vào hàm main() nhưng chương trình CSS C lại báo lỗi ADCON1 chưa khai báo và không dịch được.

Cho em hỏi chương trình em viết có thiếu gì không? và thiếu thì thêm như thế nào? Em xin cám ơn.

RA4 là chân ngõ vào cực thu hở, bạn cho nó lên mức cao (5V), bạn lại mắc con trở kéo lên nguồn (5V). Như thế thì đèn nào sáng cho được.

Bạn cho G5 = 0; thì đèn sáng thôi.

conanhung 09-05-2007 05:53 PM

Em viết lại đoạn code này và cho chạy:
Code:

#include<16F876A.h>
#fuses NOLVP, NOWDT,PUT,HS,NOPROTECT
#use delay(clock=12000000)
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#byte adcon1=0x9F
#byte porta=0x5
#byte portb=0x6
#byte portc=0x7

#bit G5 = porta.4
#bit G6 = porta.5

main()
{
adcon1=0x06;
set_tris_a(0);
set_tris_b(0b00000001);
set_tris_c(0);
while(true)
        {
      G5=1;
      G6=1;
      delay_ms(2000);
      G5=0;
      G6=0;
      delay_ms(2000);
        }
}

Nếu như anh picpicpic nói thì đèn G5 (chân RA4) phải nhấp nháy chứ, đằng này chỉ có đèn G6 nhấp nháy. Em không hiểu tại sao?

2 lệnh
Code:

#byte adcon1=0x9F

adcon1=0x6;

để cài đặt tất cả các chân của port A là digital viết vậy có đúng không?

bien_van_khat 09-05-2007 09:05 PM

Trích:

Nguyên văn bởi conanhung (Post 8583)
Em viết lại đoạn code này và cho chạy:
Nếu như anh picpicpic nói thì đèn G5 (chân RA4) phải nhấp nháy chứ, đằng này chỉ có đèn G6 nhấp nháy. Em không hiểu tại sao?

Trên chân RA4 của bạn có 2 con điện trở, giữ nguyên con pull-up, bỏ con 4K7 mắc với LED xuống GND. Bạn để 2 con thế thành 10K, áp sụt trên con LED chừng 2V -> dòng qua LED chỉ có 0.3mA ko đủ cho led sáng.

Thông thường để hạn dòng bạn chỉ nên dùng 470 ohm.

Trích:

Nguyên văn bởi picpicpic
RA4 là chân ngõ vào cực thu hở, bạn cho nó lên mức cao (5V), bạn lại mắc con trở kéo lên nguồn (5V). Như thế thì đèn nào sáng cho được.

Bạn cho G5 = 0; thì đèn sáng thôi.

So với các chân RA khác, trong sơ đồ mạch vào ra của chân RA4 không có con MOSFET P bên trên, chỉ có con MOSFET N bên dưới. Bạn set bit RA4=0 thì con FET bên dưới dẫn, làm áp trên chân RA4 về 0 vậy làm sao LED sáng được. Khi set 1, con FET N tắt, nếu có pull-up thì áp trên chân RA4 cao.

Đã lỡ sửa bạn thì sửa luôn, không có ngõ vào cực thu hở chỉ có ngõ ra cực thu hở. Ở đây gọi chính xác là cực máng hở - Open Drain, cực thu hở - Open Collector chỉ trong các mạch logic TTL.
Trích:

2 lệnh
Code:

#byte adcon1=0x9F

adcon1=0x6;

để cài đặt tất cả các chân của port A là digital viết vậy có đúng không?
Bạn làm vậy đúng, nhưng CCS hỗ trợ hàm setup_adc_ports, dùng hàm này nhanh hơn.

conanhung 11-05-2007 12:58 AM

ok, thanks các bác nhiều, thật ra em dùng điện trở hạn dòng 330, còn điện trở kéo lên Vcc là 4k7 mà ghi nhầm, sory. Thanks các bác.

anh_gioi 12-05-2007 07:54 PM

Trích:

Nguyên văn bởi tranvanthuong (Post 8402)
em có đề tài đó nè! nhưng của anh linhnc308 anh cho mail cua anh di em goi cho anh!
than chao anh!

chào cậu! cậu có thể gửi cho mình cái đề tài đó được ko vay?
mail cua mình: anh_gioi@yhaoo.com
cám ơn cậu nha

An Hiep 18-05-2007 12:29 PM

Đo tấn số
Xin chào! Tôi là thành viên mới. Thấy anh em trong diễn đàn tao đổi hay quá, tôi xin tham gia cùng.
Tôi gửi chương trình làm với PIC6F876A cho anh em tham khảo cùng. Mạch này đo được tần số lên đến 50MHz. Tôi muốn anh em giúp tôi khi muốn đo tần số sóng mang trong tín hiệu đã điều chế biên độ thì làm thế nào?

Code:

/*==============================================================================
* Author        :DRAGON(Hungnv0401@gmail.com)
* File Name    :Do tan so den 50MHz va hien thi tren LCD
* Data          :16/5/2007
* Hardware      :PIC16F876A
* Compiler      :CCS C 3.249
* Description  :50MHz frequency Counter & Display on LCD, Input is PIN_C0(Pin11)
*=============================================================================*/

#include <16F876A.h>

#fuses HS,NOWDT,NOPROTECT,NOLVP


#bit TMR1IF = 0x0C.0
#use delay(clock=20000000)
#define RS PIN_C4
#define RW PIN_C5
#define CE PIN_C7

int8 ch_tr, tr, tr_ngh, van, ngh; // chuc trieu, trieu, tram nghin, van, nghin
int8 cycles8, cycles;
int16 freqc_high;
int16 freqc_low;
int32 freq;
//-----------------------------------------------------------------------------//

//* --------------------- Khoi tao cho LCD -----------------------------------*//
void lcd_init()
{
      output_low(RS);
      output_low(RW);
      output_low(CE);

      OUTPUT_b(0x0f);
      delay_us(100);
      output_high(CE);
      delay_us(100);
      output_low(CE);
}
//-----------------------------------------------------------------------------//

//*---------------------- Dua byte ra LCD -----------------------------------*//
void lcd_put(byte data)
{
      output_high(RS);
      output_low(RW);
      output_low(CE);

      OUTPUT_b(data);
      delay_us(500);
      output_high(CE);
      delay_us(500);
      output_low(CE);
}
//-----------------------------------------------------------------------------//

//*-------------------------- Chon 2 dong cho LCD ---------------------------*//
void lcd_2lines()
{
      output_low(RS);
      output_low(RW);
      output_low(CE);

      OUTPUT_b(0x38);
      delay_us(500);
      output_high(CE);
      delay_us(500);
      output_low(CE);
}
//-----------------------------------------------------------------------------//


//*----------------------------- Gui dia chi cho LCD ------------------------*//
void lcd_add(byte add)
{
      byte real_add;
      real_add = 0x80 + add;

      output_low(RS);
      output_low(RW);
      output_low(CE);

      OUTPUT_b(real_add);
      delay_us(500);
      output_high(CE);
      delay_us(500);
      output_low(CE);
}
//-----------------------------------------------------------------------------//



//*--------------------------- Chuong trinh chinh ---------------------------*//

void main()
{
lcd_init();
lcd_2lines();
 
while (TRUE)
  {
      cycles8=0;
      cycles=0;
      freqc_high=0;
      TMR1IF = 0;
      set_timer1(0);
      setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1);
     
//* -------------------------- Doi 1 giay ---------------------------------- *//
      while (cycles!=0xFF)                       
      {                                       
      cycles8=0;                               
      while (cycles8!=0xFF)
            {
            if (TMR1IF)           
              {
              TMR1IF = 0;freqc_high++;
              } 
            else                                       
              {
              delay_cycles(5);
              }                     
            delay_cycles(62);
            cycles8++;
            }
            delay_cycles(216);       
            cycles++;                       
        }
        delay_cycles(211);       
//*----------------------Ket thuc 1 giay ------------------------------------*//


//* ----------------Lay gia tri tu bo dem tan so ----------------------------*//

        freqc_low = get_timer1();       
        freq=(65536*freqc_high + freqc_low)/5;        //Vi thuc chat thach anh ta su dung
                                                //o day la 4MHz = 1/5 cua 20MHz
        ch_tr = freq/10000000 + 48;
        tr = (freq%10000000)/1000000 + 48;
        tr_ngh = ((freq%10000000)%1000000)/100000 + 48;
        van = (((freq%10000000)%1000000)%100000)/10000 + 48;
        ngh=((((freq%10000000)%1000000)%100000)%10000)/1000 + 48;
       
        lcd_add(0x02);
        lcd_put('F'); lcd_put('r'); lcd_put('e');lcd_put('q'); lcd_put(32);
        lcd_put('C'); lcd_put('o'); lcd_put('u');lcd_put('n'); lcd_put('t');
        lcd_put('e'); lcd_put('r'); lcd_put(32);lcd_put(32); lcd_put(32);
                         
        lcd_add(0x42);
        lcd_put('F'); lcd_put('r'); lcd_put('e');lcd_put('q'); lcd_put(':');
        lcd_put(ch_tr); lcd_put(tr);  lcd_put('.');    lcd_put(tr_ngh);
        lcd_put(van);  lcd_put(ngh);  lcd_put(32);
        lcd_put('M');  lcd_put('H'); lcd_put('z');lcd_put(32);lcd_put(32);
        lcd_put(32);lcd_put(32);lcd_put(32);
        delay_ms(50);
 
    }
} //End


An Hiep 18-05-2007 02:54 PM

Chào anh nhh!
Cảm ơn anh đã post lên nhiều chương trình rất dễ hiểu. Anh cho hỏi: Tôi muốn vừa tiến hành đo điện áp và hiển thị lên LCD vừa định thời gian thì làm thế nào?. Cụ thể là tôi có bài tập tiến hành đo điện áp của 1 thiết bị sạc ác quy, vấn đề này thì không có gì, nhưng tôi muốn đo thời gian nó đã sạc nữa, đơn vị tính thời gian là phút. Mong anh nhh va các anh em trong diễn đàn giúp đỡ!
Thanks alot!


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