PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Cơ bản về vi điều khiển và PIC

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 09-07-2012, 11:26 AM   #1
nickyshadow
Đệ tử 1 túi
 
nickyshadow's Avatar
 
Tham gia ngày: Jun 2012
Bài gửi: 16
:
//Em chưa hiểu cái lỗi "A numeric expression must be appear here"
//Đoạn CT của em ngắn thế này thôi
void main()
{
set_tris_c(0x00);
set_tris_d(0x00);
output_c(0x00);
output_d(0x00);

int j;// nó báo lỗi ngay dòng này cái ỗi "A numeric..,", em đã thử với các kiểu char, int8,...
j=8;

}

//Còn đây là đoạn CT khác, mắc lỗi lặp vô hạn mà em chẳng hiểu tại sao nó vậy
//
char i;
latch=0;
for(i=7;i>=0;i--) //Lỗi lặp vô hạn ở ngay dòng này "The condition always TRUE"
{
int j;
for(j=0;j<8;j++)
{
clk=0;
da=(hang1[i]>>j)&&0x01;
clk=1;
clk=0;
da=(hang2[i]>>j)&&0x01;
}
}
latch=1;
nickyshadow vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 29-07-2012, 04:17 PM   #2
Duynguyen205
Đệ tử 1 túi
 
Tham gia ngày: Jul 2012
Bài gửi: 15
:
bác nào cho em hỏi voi. Em có viết 1 đoạn code của bác Linh chạy thử nhưng mà nó báo lỗi hoài.
còn đây là code chương trình

//================================================
#include <16f877a.h>
#include <def_877a.h>
#device *=16 ADC=8
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)

void main()
{
TRISB = 0x00;
PORTB = 0xFF;
While(1)
{
PORTB = 0;
delay_ms(250);
PORTB = 0xFF;
delay_ms(250);
}
}
khi biên dịch nó báo lỗi này mà em ko biết xử lí tn. Mong các bác giúp em. thansk cac bac nhieu.

"eross 128'' C.\program file\PICC\devices\def_f877a.h" Line 7(2,6) A #DEVICE required before this line.


line 7 : #byte INDF =0x00 ( trong file def_877a.h)

thay đổi nội dung bởi: Duynguyen205, 29-07-2012 lúc 04:41 PM.
Duynguyen205 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 30-07-2012, 09:02 PM   #3
buivantuyen89th
Đệ tử 3 túi
 
buivantuyen89th's Avatar
 
Tham gia ngày: Jun 2012
Bài gửi: 54
:
Trích:
Nguyên văn bởi Duynguyen205 View Post
bác nào cho em hỏi voi. Em có viết 1 đoạn code của bác Linh chạy thử nhưng mà nó báo lỗi hoài.
còn đây là code chương trình

//================================================
#include <16f877a.h>
#include <def_877a.h>
#device *=16 ADC=8
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)

void main()
{
TRISB = 0x00;
PORTB = 0xFF;
While(1)
{
PORTB = 0;
delay_ms(250);
PORTB = 0xFF;
delay_ms(250);
}
}
khi biên dịch nó báo lỗi này mà em ko biết xử lí tn. Mong các bác giúp em. thansk cac bac nhieu.

"eross 128'' C.\program file\PICC\devices\def_f877a.h" Line 7(2,6) A #DEVICE required before this line.


line 7 : #byte INDF =0x00 ( trong file def_877a.h)
chẳng báo lỗi ở đâu cả bạn ạ. bạn thiếu file def_877a.h thôi. bạn download file này về để trong projec của bạn ấy. không thì bạn copy vào devices trong thư mục cài ccs ấy.
goodluck
buivantuyen89th vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 31-07-2012, 08:36 AM   #4
Duynguyen205
Đệ tử 1 túi
 
Tham gia ngày: Jul 2012
Bài gửi: 15
:
Talking Tks

Trích:
Nguyên văn bởi buivantuyen89th View Post
chẳng báo lỗi ở đâu cả bạn ạ. bạn thiếu file def_877a.h thôi. bạn download file này về để trong projec của bạn ấy. không thì bạn copy vào devices trong thư mục cài ccs ấy.
goodluck

Cảm ơn anh nhé. Nó bị lỗi trong device thật. Giờ CCS chạy ngon rồi. ^^~
Duynguyen205 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 30-07-2012, 10:49 PM   #5
nickyshadow
Đệ tử 1 túi
 
nickyshadow's Avatar
 
Tham gia ngày: Jun 2012
Bài gửi: 16
:
nếu đơn giản bạn chỉ muốn nháy led ở port b thôi sao bạn khai báo nhiều vậy
chỉ cần
Code:
#include <16f877a.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
#use fast_io(b) // <<<< dong nay de khai bao dung portb
#byte PORTB=0x006// <<<Đătheo data sheet thì port b là thanh ghi 006
void main()
{
set_tris_b(0x00);
PORTB = 0xFF;
While(1)
{
PORTB = 0;
delay_ms(250);
PORTB = 0xFF;
delay_ms(250);
}
}
nickyshadow vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 31-07-2012, 08:23 AM   #6
Duynguyen205
Đệ tử 1 túi
 
Tham gia ngày: Jul 2012
Bài gửi: 15
:
Cảm ơn anh. Đúng là nó bị lỗi trong device thật. Hôm qua có pro giúp em sửa máy. Mới học

gà quá, bị lỗi cũng ko biết. làm em vất vả với nó.
Duynguyen205 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 31-07-2012, 08:26 AM   #7
Duynguyen205
Đệ tử 1 túi
 
Tham gia ngày: Jul 2012
Bài gửi: 15
:
à tại vì em mới học PIC nên toàn khai báo theo kiểu PIC winar. khai báo đầy đủ nào thì

#fuses

nào thì setup ADC().... ^^.

Bác thấy đoạn code của em thừa chỗ nào thì bỏ hộ em rồi post cho em xem với nhé.
Duynguyen205 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 31-07-2012, 08:32 AM   #8
Duynguyen205
Đệ tử 1 túi
 
Tham gia ngày: Jul 2012
Bài gửi: 15
:
Có bác nào Viết code mà làm video học PIC luôn ko gửu cho em link với. Đọc sách nhiều cứ

u u cái đầu ý. Tks các pro nhiều
Duynguyen205 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-12-2012, 12:49 AM   #9
nhquangdt3
Đệ tử 1 túi
 
Tham gia ngày: Apr 2011
Bài gửi: 18
:
mình thử viết code dùng CCS điều khiển mấy chân IO của PIC16f877A. mô phỏng thì chạy ngon lành nhưng khi nạp vào chip thì không chạy. mình có POST code lên. ai biết chỉ giúp với. thanks.
Code:
#include<16F877A.h>
#fuses NOWDT,PUT,HS,NOPROTECT
#define BUTTON_THUAN pin_B5
#define BUTTON_NGHICH pin_B4
#define BUTTON_TANG pin_B3
#define BUTTON_GIAM pin_B2
 
#define LED_THUAN pin_B1
#define LED_NGUOC pin_B0
 
#define DIEU_KHIEN_QUAY_THUAN pin_B7
#define DIEU_KHIEN_QUAY_NGUOC pin_B6
 
#define NGUOC 1
#define THUAN 2
#define DUNG 3
 
#define TAN_SO_BAM 30
 
#use delay (clock = 4000000 ) //dung thach anh 20Mhz
#use rs232 (baud=9600 , parity=n , xmit=pin_C6 , rcv=pin_C7 )
 
#byte OPTION_REG=0x81
 
int8 chieu_quay;
int16 van_toc=15,van_toc_max=30;
int16 milisec;
 
#int_TIMER0 
void TIMER0_isr(void) 
{ 
 
set_timer0(0xD9) ; // Initial Value for 1ms Interrupt 
clear_interrupt(int_timer0); // Clear TIMER0 interrupt flag 
milisec++;
if(milisec>1000)
milisec=0;
if(input(BUTTON_THUAN)==0)
{
chieu_quay=THUAN;
output_bit(LED_THUAN,1);
output_bit(LED_NGUOC,0);
output_bit(DIEU_KHIEN_QUAY_NGUOC,0);//tat quay nguoc
if(milisec<van_toc)
{
output_bit(DIEU_KHIEN_QUAY_THUAN,1);
output_bit(DIEU_KHIEN_QUAY_NGUOC,0);
}
else if(milisec<TAN_SO_BAM)
{
output_bit(DIEU_KHIEN_QUAY_THUAN,0);
output_bit(DIEU_KHIEN_QUAY_NGUOC,0);
}
else 
milisec=0;
 
}
else if(input(BUTTON_NGHICH)==0)
{
chieu_quay=NGUOC;
output_bit(LED_THUAN,0);
output_bit(LED_NGUOC,1);
if(milisec<van_toc)
{
output_bit(DIEU_KHIEN_QUAY_THUAN,0);
output_bit(DIEU_KHIEN_QUAY_NGUOC,1);
}
else if(milisec<TAN_SO_BAM)
{
output_bit(DIEU_KHIEN_QUAY_THUAN,0);
output_bit(DIEU_KHIEN_QUAY_NGUOC,0);
}
else 
milisec=0;
 
}
else
{
output_bit(LED_THUAN,0);
output_bit(LED_NGUOC,0);
}
 
} 
 
void main()
{
 
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_1,0,1);
enable_interrupts (int_timer0);//ngat timer 0
enable_interrupts ( global ); //cho phep ngat toan cuc
OPTION_REG=0x07;
while(1)
{
output_high(pin_D0);
output_high(pin_D1);
output_high(pin_D2);
output_high(pin_D3);
output_high(pin_D4);
output_high(pin_D5);
output_high(pin_D6);
output_high(pin_D7);
output_B(0x00);
output_A(0x00);
output_C(0x00);
Delay_ms(500) ;
Output_low (pin_D0);
Output_low (pin_D1);
Output_low (pin_D2);
Output_low (pin_D3);
Output_low (pin_D4);
Output_low (pin_D5);
Output_low (pin_D6);
Output_low (pin_D7);
output_B(0xFF);
output_A(0xFF);
output_C(0xFF);
Delay_ms (500 );
}
 
// TODO: USER CODE!!
while(1)
{
 
if(input(BUTTON_TANG)==0)
{
Delay_ms(100);
van_toc++;
if(van_toc>van_toc_max)
van_toc=van_toc_max;
}
else if(input(BUTTON_GIAM)==0)
{
Delay_ms(100);
van_toc--;
if(van_toc<=0)
van_toc=0;
}
}
 
}

thay đổi nội dung bởi: hatuan296, 17-12-2012 lúc 08:06 AM.
nhquangdt3 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-12-2012, 08:13 AM   #10
hatuan296
Làm quen với PIC
 
Tham gia ngày: Oct 2005
Nơi Cư Ngụ: Hcm
Bài gửi: 160
:
Trích:
Nguyên văn bởi nhquangdt3 View Post
mình thử viết code dùng CCS điều khiển mấy chân IO của PIC16f877A. mô phỏng thì chạy ngon lành nhưng khi nạp vào chip thì không chạy. mình có POST code lên. ai biết chỉ giúp với. thanks.
Code:
#include<16F877A.h>
#fuses NOWDT,PUT,HS,NOPROTECT
#define BUTTON_THUAN pin_B5
#define BUTTON_NGHICH pin_B4
#define BUTTON_TANG pin_B3
#define BUTTON_GIAM pin_B2
 
#define LED_THUAN pin_B1
#define LED_NGUOC pin_B0
 
#define DIEU_KHIEN_QUAY_THUAN pin_B7
#define DIEU_KHIEN_QUAY_NGUOC pin_B6
 
#define NGUOC 1
#define THUAN 2
#define DUNG 3
 
#define TAN_SO_BAM 30
 
#use delay (clock = 4000000 ) //dung thach anh 20Mhz
#use rs232 (baud=9600 , parity=n , xmit=pin_C6 , rcv=pin_C7 )
 
#byte OPTION_REG=0x81
 
int8 chieu_quay;
int16 van_toc=15,van_toc_max=30;
int16 milisec;
 
#int_TIMER0 
void TIMER0_isr(void) 
{ 
 
set_timer0(0xD9) ; // Initial Value for 1ms Interrupt 
clear_interrupt(int_timer0); // Clear TIMER0 interrupt flag 
milisec++;
if(milisec>1000)
milisec=0;
if(input(BUTTON_THUAN)==0)
{
chieu_quay=THUAN;
output_bit(LED_THUAN,1);
output_bit(LED_NGUOC,0);
output_bit(DIEU_KHIEN_QUAY_NGUOC,0);//tat quay nguoc
if(milisec<van_toc)
{
output_bit(DIEU_KHIEN_QUAY_THUAN,1);
output_bit(DIEU_KHIEN_QUAY_NGUOC,0);
}
else if(milisec<TAN_SO_BAM)
{
output_bit(DIEU_KHIEN_QUAY_THUAN,0);
output_bit(DIEU_KHIEN_QUAY_NGUOC,0);
}
else 
milisec=0;
 
}
else if(input(BUTTON_NGHICH)==0)
{
chieu_quay=NGUOC;
output_bit(LED_THUAN,0);
output_bit(LED_NGUOC,1);
if(milisec<van_toc)
{
output_bit(DIEU_KHIEN_QUAY_THUAN,0);
output_bit(DIEU_KHIEN_QUAY_NGUOC,1);
}
else if(milisec<TAN_SO_BAM)
{
output_bit(DIEU_KHIEN_QUAY_THUAN,0);
output_bit(DIEU_KHIEN_QUAY_NGUOC,0);
}
else 
milisec=0;
 
}
else
{
output_bit(LED_THUAN,0);
output_bit(LED_NGUOC,0);
}
 
} 
 
void main()
{
 
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_1,0,1);
enable_interrupts (int_timer0);//ngat timer 0
enable_interrupts ( global ); //cho phep ngat toan cuc
OPTION_REG=0x07;
while(1)
{
output_high(pin_D0);
output_high(pin_D1);
output_high(pin_D2);
output_high(pin_D3);
output_high(pin_D4);
output_high(pin_D5);
output_high(pin_D6);
output_high(pin_D7);
output_B(0x00);
output_A(0x00);
output_C(0x00);
Delay_ms(500) ;
Output_low (pin_D0);
Output_low (pin_D1);
Output_low (pin_D2);
Output_low (pin_D3);
Output_low (pin_D4);
Output_low (pin_D5);
Output_low (pin_D6);
Output_low (pin_D7);
output_B(0xFF);
output_A(0xFF);
output_C(0xFF);
Delay_ms (500 );
}
 
// TODO: USER CODE!!
while(1)
{
 
if(input(BUTTON_TANG)==0)
{
Delay_ms(100);
van_toc++;
if(van_toc>van_toc_max)
van_toc=van_toc_max;
}
else if(input(BUTTON_GIAM)==0)
{
Delay_ms(100);
van_toc--;
if(van_toc<=0)
van_toc=0;
}
}
 
}
Theo bạn mô tả , mô phỏng ok nhưng mạch thật không chạy vậy bạn hãy kiểm tra lại kĩ 2 phần sau .
1/Phần config của thạch anh , mình thấy bạn set là HS trong khi clock lại là 4000000 .
2/Trên mạch thật của bạn có điện trở kéo lên cho MCLR chưa . Các chân nối với phím BUTTON của bạn có các điện trở kéo lên chứ ?

HY vọng giúp được bạn .
hatuan296 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-12-2012, 09:48 AM   #11
nhquangdt3
Đệ tử 1 túi
 
Tham gia ngày: Apr 2011
Bài gửi: 18
:
Trích:
Nguyên văn bởi hatuan296 View Post
Theo bạn mô tả , mô phỏng ok nhưng mạch thật không chạy vậy bạn hãy kiểm tra lại kĩ 2 phần sau .
1/Phần config của thạch anh , mình thấy bạn set là HS trong khi clock lại là 4000000 .
2/Trên mạch thật của bạn có điện trở kéo lên cho MCLR chưa . Các chân nối với phím BUTTON của bạn có các điện trở kéo lên chứ ?

HY vọng giúp được bạn .
thanks bác. e dùng kit nên phần cứng OK. em dùng thạch anh ngoài 4Mhz không biết set fuse thế nào nhỉ? thanks
nhquangdt3 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-12-2012, 12:47 PM   #12
nhquangdt3
Đệ tử 1 túi
 
Tham gia ngày: Apr 2011
Bài gửi: 18
:
có bác nào biết chỉ e với. điều khiển mỗi chân IO mà nó không xuất ra được.
nhquangdt3 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-12-2012, 07:47 PM   #13
hatuan296
Làm quen với PIC
 
Tham gia ngày: Oct 2005
Nơi Cư Ngụ: Hcm
Bài gửi: 160
:
Trích:
Nguyên văn bởi nhquangdt3 View Post
có bác nào biết chỉ e với. điều khiển mỗi chân IO mà nó không xuất ra được.
Mình không dùng CCS bạn ạ , nên giúp bạn chuyên sâu về code thì mình không giúp được rồi . Nhưng tựu chung nó thế này . Bạn nên search trên diễn đàn những code mẫu rồi từ đó bạn rút ra được những đoạn code phù hợp với đề tài của mình .

1/Bạn xem datasheet thì chắc cũng biết , với thạch anh dưới 10Mhz thì ta phải set OSC là XTAL chứ không phải HS
2/ Để điều khiển được từng bit thì bạn phải set bit đó là output trước đã . Thường nó có dạng TRISX.NUMBER=0 , với X là tên port ,vd : b , c . Còn NUMBER là thứ tự bit của PORT đó , vd : portb.0 , portc.5 ....
Khi set cho cả port thì là trisb = %00000000
Trong code của bạn mình chưa thấy bạn làm công việc định chân output này .
3/ Tương tự để nhận một giá trị hoặc 1 bit nào đó thì bạn phải set port hoặc bit là input . Thường có dạng TRISX.NUMBER=1 là cho từng bit , hoặc có dạng TRISX = %11111111 . Trong code của bạn có các phím bấm nhưng mình cũng chưa thấy bạn set phần này .

Về các bước phía trên bạn nên tham khảo thêm các code mẫu có trong diễn đàn nhé , vì mình không chuyên về CCS nên không thể giúp bạn từng câu lệnh được .

Bạn mới bắt đầu nghiên cứu thì tốt hơn là nên thực hành với những bài tập nho nhỏ về phím bấm , về bật tắt led chứ chưa nên đi sâu vào ngắt , vào giao tiếp SPI ....
Từ từ rồi sẽ quen thôi bạn .
hatuan296 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 01-01-2013, 06:38 PM   #14
learnpicvn
Nhập môn đệ tử
 
Tham gia ngày: May 2012
Bài gửi: 8
:
Sao phần này dành cho ngưới mới học pic mà nhiều bài viết các bạn gửi mình thấy cao siêu quá, không phải dành cho member là elementary thì phải!
__________________
Đường tuy ngắn không đi không đến,
Việc tuy dễ không làm không xong!
Đường dù dài cố đi cũng đến,
Việc dù khó gắng làm sẽ xong!
learnpicvn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 01-01-2013, 08:07 PM   #15
luong9
Nhập môn đệ tử
 
Tham gia ngày: Oct 2012
Bài gửi: 5
:
Kính chào các bạn trong 4rum, Mình mới học PIC nên có 1 vấn đề nhỏ mong các bạn giúp đỡ;
Mình tạo 1 project bằng CCS 4.14 bằng PIC Wizard, biên dịch OK, chạy được. Nhưng khi mình Chép sang máy tính khác, mở lên, thì mở file lên không được. Hoặc là khi mình Copy toàn thư mục chứ Project sang 1 ổ đĩa khác thì tình trạng cũng tương tự. Vẫn mở lên nhưng không mở file main.c được. Mong các bác có Video hoặc gì đó giúp mình với...


Link CCS 4.14 Mình up mê đi a phai các bạn tải về và làm các bước tạo dự án của các bạn và quay video gửi cho mình với nhé. Cám ơn nhiều các bạn giúp mình.
Thân ái...

http://www.mediafire.com/?xvd2fod6jvhgy4r
luong9 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 04:58 AM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam