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)

khangcodt 17-03-2007 03:42 PM

Trích:

Nguyên văn bởi fdv (Post 7754)
chuong trình khi mình viết 1 cổng input thì chạy được ,còn viết input cho nhiều cổng thì lại chỉ chạy được 1 input đầu tiên thôi,chương trình mình viết như thế này mong các bạn xem giúp mình
#include<16F877A.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=10000000)

void main(){
while(true){
IF (input(pin_a0)) output_low(pin_b0);
else output_high(pin_b0);
IF (input(pin_a1)) output_low(pin_b1);
else output_high(pin_b1);
}}

chương trình trên khi mình nạp thì chỉ chạy được input pina0 à
không biết sao nữa,mong các bạn sửa giúp mình
cám ơn

Chương trình của bạn viết không vấn đề gì đâu. Mình tin là nó chạy đúng theo 2 input. Có điều lưu ý viết từ khóa thôi. Bạn nên viết 'if' ... thì đúng hơn. (Mình không rõ 'IF' viết hoa thì ct dịch nó có hiểu là lệnh if không?).

Trivinhu 18-03-2007 02:25 PM

help me!ai co chuong trinh viet bang CCS ve van de dieu khien nhiet do dung 16F877A co nhieu chu thich thi gui len mang di.tui cong luc thap kem moi tu luyen duoi qua

kysikodau 26-03-2007 12:17 PM

chào các bác, em vừa cài MPLAB 7.51 thấy có nhúng sẵn CCS C nhưng ko biết là phiên bản mấy và CCS C mới nhất bi giừ là bao nhiêu rùi

tranvanthuong 09-04-2007 03:33 PM

em tải phần mền ở trang 1 ở đâu bây giờ hở các anh?

hoanglinh23 10-04-2007 02:42 PM

Mình viết chương trình ngắt cho các chân từ RB4-RB7.Khi có ngắt thì đọc ADC và gửi ra portc.Nhưng không hiểu sao nó cứ đọc liên tục và gửi ra liên tục như kiểu cờ ngắt không bị xóa đi sau khi thực hiện ngắt vậy.Bạn nào rõ về ngắt chỉ dùm mình với.

namqn 10-04-2007 06:33 PM

Trích:

Nguyên văn bởi hoanglinh23 (Post 8179)
Mình viết chương trình ngắt cho các chân từ RB4-RB7.Khi có ngắt thì đọc ADC và gửi ra portc.Nhưng không hiểu sao nó cứ đọc liên tục và gửi ra liên tục như kiểu cờ ngắt không bị xóa đi sau khi thực hiện ngắt vậy.Bạn nào rõ về ngắt chỉ dùm mình với.

Trong chương trình xử lý ngắt của bạn phải có thao tác xóa cờ ngắt sau khi đã xử lý xong. Các cờ ngắt không được PIC tự động xóa sau khi thoát khỏi chương trình xử lý ngắt.

Thân,

hawinter 13-04-2007 03:14 PM

Em viết trương trinh CCS có đoạn mã sau:
#include<16f877.h>
#use delay(clock=20000000)
#device *=16 ADC=8
khi dich chương trình báo lỗi sau:
*** Error 23 "ADC877.c" Line 3(8,9): Can not change device type this far into the code
*** Error 43 "ADC877.c" Line 3(9,11): Expecting a declaration
*** Error 43 "ADC877.c" Line 3(11,13): Expecting a declaration
*** Error 48 "ADC877.c" Line 3(14,17): Expecting a (
*** Error 43 "ADC877.c" Line 3(18,19): Expecting a declaration
5 Errors, 0 Warnings.
dòng 3 lỗi là dòng :
#device *=16 ADC=8
Em dùng bản CCS v4.01 ko biết tại sao lỗi mong các sư huynh chỉ dúp ??

hoanglinh23 13-04-2007 09:04 PM

Thắc mắc về ngắt các chân RB4-RB7
 
các anh cho em hỏi tại sao khi em dùng ngắt các chân từ RB4-RB7 của pic 16f877a thì ngắt cứ xảy ra liên tục không thoát là sao với a.Em lập trình bằng CCSC.Cụ thể là chương trình ngắt các chân này em viết cứ khi nào có ngắt xảy ra thì đọc ADC và gửi ra portC.Nhưng khi em kich hoạt ngắt thử thì thấy nó cứ đọc ADC liên tục.Em cảm ơn các anh.

namqn: Bạn đã hỏi câu này ở trên, và tôi cũng đã trả lời ở trên rồi. Bạn đã xem lại những gì mình hỏi và được trả lời chưa?

nhh 16-04-2007 01:19 PM

Trích:

Nguyên văn bởi hawinter (Post 8216)
Em viết trương trinh CCS có đoạn mã sau:
#include<16f877.h>
#use delay(clock=20000000)
#device *=16 ADC=8
khi dich chương trình báo lỗi sau:
*** Error 23 "ADC877.c" Line 3(8,9): Can not change device type this far into the code
*** Error 43 "ADC877.c" Line 3(9,11): Expecting a declaration
*** Error 43 "ADC877.c" Line 3(11,13): Expecting a declaration
*** Error 48 "ADC877.c" Line 3(14,17): Expecting a (
*** Error 43 "ADC877.c" Line 3(18,19): Expecting a declaration
5 Errors, 0 Warnings.
dòng 3 lỗi là dòng :
#device *=16 ADC=8
Em dùng bản CCS v4.01 ko biết tại sao lỗi mong các sư huynh chỉ dúp ??

Có bạn từng gặp lỗi như bạn, xem ở đây:
http://www.picvietnam.com/forum//sho...p?t=357&page=1

hawinter 19-04-2007 02:02 AM

Cam ơn huynh đã quan tâm em khắc được lỗi đó rồi bằng cách đưa khai báo #device *=16 ADC=8 nằm ngay dưới include...

tranvanthuong 21-04-2007 09:13 AM

các anh ơi giúp em nha!em caì mplab rồi nhưng khi viết chương trình theo hướng dẫn của mấy anh, em kiếm file soure của 16f877a không có(picc/device/..)chỉ có 16f54.. thoi em bây giờ làm sao ha anh!

khangcodt 21-04-2007 12:25 PM

re
 
Trích:

Nguyên văn bởi tranvanthuong (Post 8344)
các anh ơi giúp em nha!em caì mplab rồi nhưng khi viết chương trình theo hướng dẫn của mấy anh, em kiếm file soure của 16f877a không có(picc/device/..)chỉ có 16f54.. thoi em bây giờ làm sao ha anh!

Phải cài CCSC rồi lấy trong device của thư mục PICC (thư mục cài ra của CCSC) thì mới có chứ!
Good luck!

tranvanthuong 25-04-2007 02:56 PM

em hieu roi

tranvanthuong 25-04-2007 02:59 PM

hi hi em cam on anh nhe!

em xai ccs khoi nhung mplab cho khoe, may anh co file def_16f877a.h cua anh Nguyen Chí Linh cho em với(linh308@yahoo.com) em đang rất cần vì em học từ các chương trình của anh ấy viết anh khangcodt có không? cho em nha! cám ơn anh trước nha

tranvanthuong 25-04-2007 03:05 PM

lộn rồi anh linhnc308@yahoo.com mới đúng!

tranvanthuong 25-04-2007 03:08 PM

liên hệ em cho anh!!!!
 
Trích:

Nguyên văn bởi Trivinhu (Post 7806)
help me!ai co chuong trinh viet bang CCS ve van de dieu khien nhiet do dung 16F877A co nhieu chu thich thi gui len mang di.tui cong luc thap kem moi tu luyen duoi qua

em có đề tài đó nè! nhưng của anh linhnc308 anh cho mail cua anh di em goi cho anh!
than chao anh!

Lattice 25-04-2007 04:32 PM

Trích:

Nguyên văn bởi ncv (Post 2818)
Chương trình gửi ký tự ra 2x16 LCD dùng CCS C

#include "16F877A.h" // PIC16F877A header file
#use delay(clock=4000000) // for 4Mhz crystal
#fuses XT, NOWDT, NOPROTECT, NOLVP // for debug mode

#define WRITE_DATA 0
#define WRITE_COMMAND 1

#define NCHAR_PER_LINE 16 // max char numbers per line
#define MS10 10 // 10 milliseconds
#define US400 400 // 400 microseconds

#define LCD_RS PIN_A1
#define LCD_RW PIN_A2
#define LCD_E PIN_A3

///////////////////////////////////////////////////////////
//
/* private */ void lcd_write(byte dat, int1 option) {
delay_us(US400);
if (option == WRITE_DATA)
output_high(LCD_RS);
else // option == WRITE_COMMAND
output_low(LCD_RS);
output_low(LCD_RW);
output_b(dat);

output_high(LCD_E);
delay_us(US400);
output_low(LCD_E);
}

///////////////////////////////////////////////////////////
//
void lcd_init(void) {
output_low(LCD_E); // Let LCD E line low

lcd_write(0x38, WRITE_COMMAND); // Set LCD 16x2, 5x7, 8bits data
delay_ms(15);
lcd_write(0x01, WRITE_COMMAND); // Clear LCD display
delay_ms(MS10);
lcd_write(0x0f, WRITE_COMMAND); // Open display & current
delay_ms(MS10);
lcd_write(0x06, WRITE_COMMAND); // Window fixed (Character Entry Mode?)
delay_ms(MS10);
}

///////////////////////////////////////////////////////////
//
void lcd_display_char(int8 line, int8 pos, char ch) {
line = (line == 0) ? 0 : 1;
pos = (pos > NCHAR_PER_LINE) ? NCHAR_PER_LINE : pos;

lcd_write(0x80 + 0x40 * line + pos, WRITE_COMMAND);
lcd_write(ch, WRITE_DATA);
}

///////////////////////////////////////////////////////////
void lcd_display_str(int8 line, char str[], int8 nchars) {
int8 i;
for (i = 0; i < nchars; i++)
lcd_display_char(line, i, str[i]);
}

///////////////////////////////////////////////////////////
/**
* Display characters to a 2x16 LCD
*
* (1) LCD1 to GND
* (2) LCD2 to VDD 5 volts
* (3) LCD4 (RS) - LCD5 (RW) - LCD6 (E) to A1, A2, A3
* (4) LCD7-LCD14 to B0-B7 (bus data)
*
* Ref: http://pic16.com/bbs/dispbbs.asp?boa...ID=5879&page=1
*/
void main(void) {
int8 i;
char LINE1[] = { "SGN Tech" };
char LINE2[] = { "Xin chao" };

lcd_init();

// use of lcd_display_char()
for (i = 0; i < 8; i++)
lcd_display_char(0, i, LINE1[i]);

// use of lcd_display_str
lcd_display_str(1, LINE2, 8);
}

Bạn có cách nào khai báo LINE1,LINE2 thành một biến không nhỉ, kiểu thế này, mình thử mà không được:
char LINE[] = { "SGN Tech" ,"Xin chao" };
for (i = 0; i < 8; i++)
lcd_display_char(0, i, LINE[i]);
for (i = 9; i < 16; i++)
lcd_display_char(1, i-8, LINE[i]);
À, bạn có bài nào trong C sử dụng kỹ thuật bảng giống bài trong MPLAB của bác Falleaf không, mình khai báo nhiều hằng kiểu char quá nên RAM tốn kinh khủng.

namqn 25-04-2007 07:27 PM

Trích:

Nguyên văn bởi Lattice (Post 8403)
Bạn có cách nào khai báo LINE1,LINE2 thành một biến không nhỉ, kiểu thế này, mình thử mà không được:
char LINE[] = { "SGN Tech" ,"Xin chao" };
for (i = 0; i < 8; i++)
lcd_display_char(0, i, LINE[i]);
for (i = 9; i < 16; i++)
lcd_display_char(1, i-8, LINE[i]);
À, bạn có bài nào trong C sử dụng kỹ thuật bảng giống bài trong MPLAB của bác Falleaf không, mình khai báo nhiều hằng kiểu char quá nên RAM tốn kinh khủng.

Thử thế này xem:
Code:

char LINE[] = {"SGN TechXin chao"};
Để dùng Flash thay vì dùng RAM như trên, bạn thêm từ khóa const vào khai báo:
Code:

char const LINE[] = {"SGN TechXin chao"};
Thân,

anh_gioi 28-04-2007 10:40 AM

cần hỏi
 
:
//************************************************** ***************************
// 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(d)
#byte portb=0x06
#byte portd=0x08
const unsigned char digital[]={0b00000110, 0b01011011, 0b01001111, 0b01100110,\
0b01101101, 0b01111101, 0b00000111, 0b01111111, 0b01101111};
// ma hoa digital duoi dang mang
// Chuong trinh ngat
#int_ext
void ngat_RB0()
{
int i;
if(i<9)
{
portd=digital[i];
++i;
}
if(i==9)
{
i=0;
}
}
// Chuong trinh chinh
main()
{
set_tris_b(0b00000001);
set_tris_d(0);
enable_interrupts(global);
enable_interrupts(int_ext);
ext_int_edge(H_to_L);
portd=0b00111111;
while(true)
{
// chi doi ngat nen vong lap nay ko co gi ca !
}
}




cho mình hỏi trong chương trình này thì :
lệnh này :
#use fast_io(b)

#use fast_io(d)

#byte portb=0x06

#byte portd=0x08
có ý nghĩa là gì vậy?
và lệnh này nữa: #int_ext
chưa hết: enable_interrupts(global);

enable_interrupts(int_ext);

ext_int_edge(H_to_L);
cám ơn nha

nhh 28-04-2007 04:17 PM

Trích:

Nguyên văn bởi anh_gioi (Post 8433)
:
cho mình hỏi trong chương trình này thì :
lệnh này :
#use fast_io(b)

#use fast_io(d)

#byte portb=0x06

#byte portd=0x08
có ý nghĩa là gì vậy?
và lệnh này nữa: #int_ext
chưa hết: enable_interrupts(global);

enable_interrupts(int_ext);

ext_int_edge(H_to_L);
cám ơn nha

- #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.

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!

necati 19-05-2007 03:29 AM

frequencymeter
 
Code:

#include <16f628.H>
#use  delay(clock=4000000)//
#fuses NOPROTECT,NOWDT,PUT,noBROWNOUT,noLVP,NOMCLR,xt
#BYTE    PORT_A=0X05
#BYTE    PORT_B=0X06
/***entegreterbiyecisi@yahoo.com***//***entegreterbiyecisi@yahoo.com***/
// LCD STUFF
#define LCD_RS      PIN_b0
#define LCD_EN      PIN_b1
#define LCD_D4      PIN_b2
#define LCD_D5      PIN_b3
#define LCD_D6      PIN_b4
#define LCD_D7      PIN_b5
#define FIRST_LINE  0x00
#define SECOND_LINE 0x40
#define CLEAR_DISP  0x01
#define CURS_ON    0x0e
#define CURS_OFF    0x0c
/***entegreterbiyecisi@yahoo.com***/
#use standard_io ( a )
#use standard_io ( b )
/***entegreterbiyecisi@yahoo.com***/
// proto statements
void LCD_Init        ( void );
void LCD_SetPosition ( unsigned int cX );
void LCD_PutChar    ( unsigned int cX );
void LCD_PutCmd      ( unsigned int cX );
void LCD_PulseEnable ( void );
void LCD_SetData    ( unsigned int cX );
/***entegreterbiyecisi@yahoo.com***//***entegreterbiyecisi@yahoo.com***/
/*************************entegreterbiyecisi@yahoo.com******************************/
int32 ab=0,hz=0;
int1 stept_say=0,data_bitti=0,step,aa=0;
int16 sayi=0,tr=20;
/*************************entegreterbiyecisi@yahoo.com******************************/
#int_timer1
tas(){
ab++;
}
#int_timer0
sn(){sayi=0;
 set_timer0(61);//(255-60)*195*20=1000000us=dahili 1sn icin
 if(tr){ tr--;}
 else{delay_us ( 698 );
      output_low(pin_a0);
      disable_interrupts (global);
      disable_interrupts(int_timer0);
      disable_interrupts(int_timer1);
      sayi=get_timer1();
      aa=1;
      hz=sayi+(65536*ab);
      tr=20;
                              }}
/*************************entegreterbiyecisi@yahoo.com******************************/
  void main() {

      setup_timer_1(t1_external|t1_div_by_1);
      setup_timer_0 (RTCC_INTERNAL|RTCC_DIV_256);
      enable_interrupts(int_timer0); // timer0
      enable_interrupts(int_timer1);
      enable_interrupts(global);
      lcd_init();
      SET_TRIS_A(0b00100000);
      SET_TRIS_B(0b11000000);
      set_timer0(61);
      set_timer1(0);

      LCD_SetPosition(first_LINE+0);
      printf(lcd_putchar,"\NECATi KIYLIOGLU ");
      LCD_SetPosition(second_LINE+1);
      printf(lcd_putchar,"\ 0532 613 65 87");
      delay_ms (500);
      LCD_PutCmd ( CLEAR_DISP );
      sayi=0;
      hz=0;
/*************************entegreterbiyecisi@yahoo.com******************************/
while(true){
  if(aa==1){
      //LCD_PutCmd ( CLEAR_DISP );
      LCD_SetPosition(first_LINE+0);
      printf(lcd_putchar,"\FREQUENCYMETER    ");

    if(999>=hz){
      LCD_SetPosition(second_LINE+0);
      printf(lcd_putchar,"\FRQ=%ldHz          ",hz);}
      //////////////////////////////////////////
    if(hz>=1000){
    if(999999>=hz){
      LCD_SetPosition(second_LINE+0);
      printf(lcd_putchar,"\FRQ=%3.3wKhz        ",hz);}}
      /////////////////////////////////////////////
    if(hz>=1000000){
      LCD_SetPosition(second_LINE+0);
      printf(lcd_putchar,"\FRQ=%2.6wMhz          ",hz);}
      ////////////////////////////////////////////
      delay_ms (1);

      set_timer1(0);
      enable_interrupts(int_timer0);
      enable_interrupts(int_timer1);
      enable_interrupts (global);
      aa=0;
      ab=0;
      }
            }}
/*************************entegreterbiyecisi@yahoo.com******************************/
/***entegreterbiyecisi@yahoo.com***/ //lcd basla
void LCD_Init ( void ){
    LCD_SetData ( 0x00 );
    output_low ( LCD_RS );
    LCD_SetData ( 0x03 );  // init with specific nibbles to start 4-bit mode
    LCD_PulseEnable();
    LCD_PulseEnable();
    LCD_PulseEnable();
    LCD_SetData ( 0x02 );  // set 4-bit interface
    LCD_PulseEnable();      // send dual nibbles hereafter, MSN first
    LCD_PutCmd ( 0x2C );    // function set (all lines, 5x7 characters)
    LCD_PutCmd ( 0x0C );    // display ON, cursor off, no blink
    LCD_PutCmd ( 0x01 );    // clear display
    LCD_PutCmd ( 0x06 );    // entry mode set, increment
    }
/***entegreterbiyecisi@yahoo.com***/
void LCD_SetPosition ( unsigned int cX )
    {
    // this subroutine works specifically for 4-bit Port A
    LCD_SetData ( swap ( cX ) | 0x08 );
    LCD_PulseEnable();
    LCD_SetData ( swap ( cX ) );
    LCD_PulseEnable();
    }
/***entegreterbiyecisi@yahoo.com***/
void LCD_PutChar ( unsigned int cX )
    {
    // this subroutine works specifically for 4-bit Port A
    output_high ( LCD_RS );
    LCD_SetData ( swap ( cX ) );    // send high nibble
    LCD_PulseEnable();
    LCD_SetData ( swap ( cX ) );    // send low nibble
    LCD_PulseEnable();
    output_low ( LCD_RS );
    }
/***entegreterbiyecisi@yahoo.com***/
void LCD_PutCmd ( unsigned int cX )
    {
    // this subroutine works specifically for 4-bit Port A
    LCD_SetData ( swap ( cX ) );    // send high nibble
    LCD_PulseEnable();
    LCD_SetData ( swap ( cX ) );    // send low nibble
    LCD_PulseEnable();
    }
/***entegreterbiyecisi@yahoo.com***/
void LCD_PulseEnable ( void )
    {
    output_high ( LCD_EN );
    delay_us ( 100 );
    output_low ( LCD_EN );
    delay_ms ( 5 );
    }
/***entegreterbiyecisi@yahoo.com***/
void LCD_SetData ( unsigned int cX )
    {
    output_bit ( LCD_D4, cX & 0x01 );
    output_bit ( LCD_D5, cX & 0x02 );
    output_bit ( LCD_D6, cX & 0x04 );
    output_bit ( LCD_D7, cX & 0x08 );
    }
/***entegreterbiyecisi@yahoo.com***/ //lcd son
////////////////////////////////////////////////////////////////////////////


An Hiep 21-05-2007 10:07 AM

Cảm ơn bạn Necati đã Post lên chương trình mà tôi và nhiều anh em đang quan tâm. Tôi muốn hỏi thêm là nếu muốn đo 1 tần số sóng mang nằm trong tín hiệu điều chế thì giải quyết như thế nào. Giả sử có 1 tín hiệu cần điều chế có f = 2KHz độ rộng xung là 2us, tín hiệu sóng mang có f0 = 20MHz, nghĩa là trong 2us của tín hiệu điều chế sẽ có 20*2 = 40 chu kỳ xung của sóng mang trong đó. Bài toán ở đây là đo được tần số 20MHz từ tín hiệu đã điều chế đó.
Rất mong anh Necati và các anh em trong diễn đàn giúp đỡ!
Thanks alot!

An Hiep 21-05-2007 10:34 AM

Tôi đọc kỹ thì thấy chương trình của anh Necati cũng đo tần số liên tục, nhưng sử dụng thêm Timer0 để định thời 1 giây, và Timer1 cũng để lấy giá trị đếm số lần xuất hiện xung vào. Tất nhiên, chương trình viết rất chuyên nghiệp, đó cũng là điều mà tôi và nhiều anh em cần học hỏi thêm rất nhiều. Chân thành cảm ơn anh!

suongrong17 22-05-2007 05:18 PM

Xin hỏi tại sao chương trình dùng ngắt timer0 em làm giống nhu hướng dẫn mà nó không chịu chạy?

suongrong17 22-05-2007 05:36 PM

#include<18F4450.h>
#fuses NOWDT,PUT,HS,NOPROTECT
#use delay(clock=20000000)
#use fast_io(b)
#byte portb=0x6
#define led pin_B0
int8 a;
void ngat()
{
delay_ms(1000);
a=a<<1; // dich trai a 1bit
if(a==256)
a=1;
}
main()
{
a=1;
set_tris_b(0);
while(true)
{
ngat();
output_b(a);
}
}
Cách này thì PIC18F4550 cũng dịch leds vô tư. Nhưng mà muốn dùng TIMER0 như của bác nhh . Khi mình làm không hiểu tại sao lại không thể chạy. Nhờ bác chỉ giáo giùm nhé!
#include <18F4550.h>
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=20000000) . Mình đã sửa lại code của nhh như vậy để phù hợp với PIC18F4550, nhưng không hiểu sao vẫn không chạy đơợc. Bạn có thể hướng dẫn kỹ hơn về Interrup và Timer không, cảm on bạn nhiều.


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