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)

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.


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