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)
-   -   Học CCS thông qua Tutorial PICVIETNAM (http://www.picvietnam.com/forum/showthread.php?t=689)

quyenk9a 04-04-2009 05:39 PM

help me
 
code của em không chạy các bác ơi
Code:

#include<16f877a.h>
#fuses NOWDT,PUT,HS,NOPROTECT
#device PIC16f877a*=16 ADC=10
#use delay(clock=4000000)
#include <lcd.c>
#byte portb=0x06
#byte portd=0x08
#bit b0=portb.0
#bit b1=portb.1
#bit b2=portb.2
#bit b3=portb.3
#bit b4=portb.4
#bit b5=portb.5
#bit b6=portb.6
#bit b7=portb.7
#int_rb

void docphim()
{
if(b0&&b4)
lcd_putc("giang");
if(b1&&b4)
lcd_putc("hoang");
if(b2&&b4)
lcd_putc("k9a");
if(b3&&b4)
lcd_putc("  ");
if(b0&&b5)
lcd_putc("hoang");
if(b1&&b5)
lcd_putc("giang");
}//end int
void main(void)
{

set_tris_b(0xf0);
set_tris_d(0x00);
enable_interrupts(INT_RB);
enable_interrupts(GLOBAL);
ext_int_edge(H_to_L);

{
portb=1;
  portb=2;
  portb=4;
  portb=8;
  lcd_putc("hoang giang !!!");
  delay_ms(100);
  lcd_putc("\f");
 
  }
  while(true);}


phandinh 04-04-2009 08:24 PM

while (true); /// mình nghĩ có vấn đề ở dấu ' ; '

baodinh88 05-04-2009 06:42 PM

Code:

#include<16F887.h>
#fuses NOWDT,PUT,HS,NOPROTECT
#use delay(clock=20000000)
#use fast_io(b)
#byte portb=0x00
int i;
int j;
main()
{
for(i=0;i<=7;i++)
{
 j=2^i;
portb= j ;  // led 8-1on
delay_ms(1000);
}
}

các bác cho e hỏi sao đoạn code này khi dịch wa file hex đổ vào protues mô phỏng không chạy được là sao ?

namqn 05-04-2009 07:45 PM

Trích:

Nguyên văn bởi baodinh88 (Post 24373)
Code:

#include<16F887.h>
#fuses NOWDT,PUT,HS,NOPROTECT
#use delay(clock=20000000)
#use fast_io(b)
#byte portb=0x00
int i;
int j;
main()
{
for(i=0;i<=7;i++)
{
 j=2^i;
portb= j ;  // led 8-1on
delay_ms(1000);
}
}

các bác cho e hỏi sao đoạn code này khi dịch wa file hex đổ vào protues mô phỏng không chạy được là sao ?

Như thế nào là không chạy được?

Chương trình của bạn không có một vòng lặp vô tận ở cuối để tránh cho vi điều khiển chạy tiếp những lệnh vô nghĩa phía sau mã chương trình. Với loại bài toán thay đổi trạng thái LED, không nên dùng Proteus để mô phỏng.

Thân,

quyenk9a 06-04-2009 01:31 AM

Trích:

Nguyên văn bởi phandinh (Post 24346)
while (true); /// mình nghĩ có vấn đề ở dấu ' ; '

bác chỉnh lại cho em với.ccs van biên dịch sang hex duoc.mà mô fongr không đc

hoangquan_d 19-04-2009 09:31 PM

không hiểu tại sao khi em chép <DEF_16F877A.H> vào thư mục Devices rồi mà khi kiểm lỗi vẩn báo lỗi , các bác giúp em với. chưởng trình như sau
/*******BAT DAU CHUONG TRINH************/
#INCLUDE <16F877A.H>
#INCLUDE <DEF_16F877A.H>
#DEFINE STOP PIN_B4
#DEFINE DKTH PIN_B5
#DEFINE DKNG PIN_B6
#FUSES NOWDT,PUT,HS,NOPROTECT,NOLVP
#USE DELAY(CLOCK=20000000) //SU DUNG THACH ANH 20MHZ
#USE FAST_IO(A)
#USE FAST_IO(B)
#USE FAST_IO(D)
INT8 I,BCHUC,BDVI,VDVI,VCHUC;
INT8 SBUOC=0,A,SVONG=0;
INT8 R_KEY=0;
CONST UNSIGNED CHAR
DIG[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X9 0};
CONST UNSIGNED CHAR ROTATE[]={14,12,13,9,11,3,7,6};
/************************************************** *******
CHUONG TRINH DIEU KHIEN LED QUAY THUAN
SU DUNG LOAI DONG CO BUOC 48 RANG
DIEU KHIEN NUA BUOC
*/
//CHUONG TRINH NGAT RB
#INT_RB
VOID NGAT_RB()
{
IF(RBIF==1)
{
IF(INPUT(STOP)==0){A=0;}
IF(INPUT(DKTH)==0){A=1;}
IF(INPUT(DKNG)==0){A=2;}
}
RBIF=0;
}
//CHUONG TRINH DOI SO BUOC, SO VONG RA SO BCD
HEX_BCD()
{
VCHUC=SVONG/10;
VDVI=SVONG%10;
BCHUC=SBUOC/10;
BDVI=SBUOC%10;
}
HIENTHI1()
{
PORTC=DIG[BDVI]; //HIEN THI SO BUOC DON VI
PORTD=0X0F;
DELAY_US(100);
PORTD=0; //CHONG LEM
PORTC=DIG[BCHUC]; //HIEN THI SO BUOC CHUC
PORTD=0X17;
DELAY_US(100);
PORTD=0;
PORTC=0XBF; //HIEN THI DAU GACH PHAN CACH
PORTD=0X1B;
DELAY_US(100);
PORTD=0;
PORTC=DIG[VDVI]; //HIEN THI SO VONG DON VI
PORTD=0X1D;
DELAY_US(100);
PORTD=0;
PORTC=DIG[VCHUC]; //HIEN THI SO VONG CHUC
PORTD=0X1E;
DELAY_US(100);
PORTD=0;
}
HIENTHI()
{
I=0;
SBUOC++;
IF(SBUOC>95){
SBUOC=0;
SVONG++;
IF(SVONG>99){SVONG=0;}
}
HEX_BCD();
WHILE(I<10)
{
HIENTHI1();
I++;
}
}
QUAYTHUAN()
{
PORTA=ROTATE[R_KEY];
HIENTHI();
IF (R_KEY < 7){R_KEY++;}
ELSE R_KEY=0;
}
QUAYNGICH()
{
IF (R_KEY > 0){R_KEY--;}
ELSE R_KEY=7;
PORTA=ROTATE[R_KEY];
HIENTHI();
}
STP()
{
OUTPUT_A(0XFF);
HEX_BCD();
HIENTHI1();
}
VOID MAIN ()
{
SET_TRIS_A(0); // PORTA DIEU KHIEN DONG CO BUOC
SET_TRIS_B(0XFF); // PORTB LA PORT NHAP DU LIEU
SET_TRIS_C(0); // PORTC XUAT MA HIEN THI
SET_TRIS_D(0); // PORTD QUET LED
ENABLE_INTERRUPTS(GLOBAL); //CHO PHEP NGAT TOAN CUC
ENABLE_INTERRUPTS(INT_RB); //CHO PHEP NGAT RB
EXT_INT_EDGE(H_TO_L); //CHO PHEP NGAT CANH XUONG
A=0;
WHILE(1)
{
SWITCH(A)
{
CASE 0 : STP(); //NEU A=0 THI STOP
BREAK;
CASE 1 : QUAYTHUAN(); //NEU A=1 THI QUAY THUAN
BREAK;
CASE 2 : QUAYNGICH(); //NEU A=2 THI QUAY NGHICH
BREAK;
}
}
}

hoangquan_d 19-04-2009 09:31 PM

không hiểu tại sao khi em chép <DEF_16F877A.H> vào thư mục Devices rồi mà khi kiểm lỗi vẩn báo lỗi , các bác giúp em với. chưởng trình như sau
/*******BAT DAU CHUONG TRINH************/
#INCLUDE <16F877A.H>
#INCLUDE <DEF_16F877A.H>
#DEFINE STOP PIN_B4
#DEFINE DKTH PIN_B5
#DEFINE DKNG PIN_B6
#FUSES NOWDT,PUT,HS,NOPROTECT,NOLVP
#USE DELAY(CLOCK=20000000) //SU DUNG THACH ANH 20MHZ
#USE FAST_IO(A)
#USE FAST_IO(B)
#USE FAST_IO(D)
INT8 I,BCHUC,BDVI,VDVI,VCHUC;
INT8 SBUOC=0,A,SVONG=0;
INT8 R_KEY=0;
CONST UNSIGNED CHAR
DIG[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X9 0};
CONST UNSIGNED CHAR ROTATE[]={14,12,13,9,11,3,7,6};
/************************************************** *******
CHUONG TRINH DIEU KHIEN LED QUAY THUAN
SU DUNG LOAI DONG CO BUOC 48 RANG
DIEU KHIEN NUA BUOC
*/
//CHUONG TRINH NGAT RB
#INT_RB
VOID NGAT_RB()
{
IF(RBIF==1)
{
IF(INPUT(STOP)==0){A=0;}
IF(INPUT(DKTH)==0){A=1;}
IF(INPUT(DKNG)==0){A=2;}
}
RBIF=0;
}
//CHUONG TRINH DOI SO BUOC, SO VONG RA SO BCD
HEX_BCD()
{
VCHUC=SVONG/10;
VDVI=SVONG%10;
BCHUC=SBUOC/10;
BDVI=SBUOC%10;
}
HIENTHI1()
{
PORTC=DIG[BDVI]; //HIEN THI SO BUOC DON VI
PORTD=0X0F;
DELAY_US(100);
PORTD=0; //CHONG LEM
PORTC=DIG[BCHUC]; //HIEN THI SO BUOC CHUC
PORTD=0X17;
DELAY_US(100);
PORTD=0;
PORTC=0XBF; //HIEN THI DAU GACH PHAN CACH
PORTD=0X1B;
DELAY_US(100);
PORTD=0;
PORTC=DIG[VDVI]; //HIEN THI SO VONG DON VI
PORTD=0X1D;
DELAY_US(100);
PORTD=0;
PORTC=DIG[VCHUC]; //HIEN THI SO VONG CHUC
PORTD=0X1E;
DELAY_US(100);
PORTD=0;
}
HIENTHI()
{
I=0;
SBUOC++;
IF(SBUOC>95){
SBUOC=0;
SVONG++;
IF(SVONG>99){SVONG=0;}
}
HEX_BCD();
WHILE(I<10)
{
HIENTHI1();
I++;
}
}
QUAYTHUAN()
{
PORTA=ROTATE[R_KEY];
HIENTHI();
IF (R_KEY < 7){R_KEY++;}
ELSE R_KEY=0;
}
QUAYNGICH()
{
IF (R_KEY > 0){R_KEY--;}
ELSE R_KEY=7;
PORTA=ROTATE[R_KEY];
HIENTHI();
}
STP()
{
OUTPUT_A(0XFF);
HEX_BCD();
HIENTHI1();
}
VOID MAIN ()
{
SET_TRIS_A(0); // PORTA DIEU KHIEN DONG CO BUOC
SET_TRIS_B(0XFF); // PORTB LA PORT NHAP DU LIEU
SET_TRIS_C(0); // PORTC XUAT MA HIEN THI
SET_TRIS_D(0); // PORTD QUET LED
ENABLE_INTERRUPTS(GLOBAL); //CHO PHEP NGAT TOAN CUC
ENABLE_INTERRUPTS(INT_RB); //CHO PHEP NGAT RB
EXT_INT_EDGE(H_TO_L); //CHO PHEP NGAT CANH XUONG
A=0;
WHILE(1)
{
SWITCH(A)
{
CASE 0 : STP(); //NEU A=0 THI STOP
BREAK;
CASE 1 : QUAYTHUAN(); //NEU A=1 THI QUAY THUAN
BREAK;
CASE 2 : QUAYNGICH(); //NEU A=2 THI QUAY NGHICH
BREAK;
}
}
}

hoangquan_d 19-04-2009 10:09 PM

em đã tim ra lỗi, cam ơn

thanhvanckbk 07-07-2009 04:45 PM

sao mình sử dụng chương trình CCS để viết chương trình cho PIC thì sau khi viết xong lại không thể compile để chuyển thành file .hex được vì nút compile đó bị mờ đi, mình bấm thử F9 cũng không được, xin mọi người chỉ giúp. Đa tạ!

Em_ku 06-09-2009 11:58 AM

hix, các bác ơi. Khó hiểu thật. Em dùng timer0 để tạo thời gian trễ là 1s. Nháy leg hiển thị số. Em nghĩ đã đúng rồi, vì thử các led nháy 1s đúng mà sao khi bỏ vào led bảy đoạn nó lại chạy quá nhanh kô như ý muốn được. Hix vậy là sao đây ạ?? Muốn xử lý thì thế nào ??
code:
#include <16f877a.h>
#fuses HS, NOWDT
#use delay(clock=4000000)
#byte portb=0x06
#byte trisb=0x86
#byte INTCON=0x0b
#bit TMR0IF=INTCON.2
#byte TMR0=0x01
#use fast_IO (b)
void tre1s (int so)
{
int i,j;
TMR0IF=0;
setup_timer_0 (RTCC_INTERNAL|RTCC_DIV_16);
set_timer0 (6);
for (i=0;i<=so;i++)
{
while (TMR0IF==0)
{
}
}
}
void main ()
{
int a,b;
int C[10]= {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90 };
set_tris_b (0x00);
a=0;
while (1)
{
for (a=0;a<=9;a++)
{
tre1s (250);
portb=C[a];
tre1s (250);
}
}
}

nhamdtk4 06-09-2009 03:47 PM

Trích:

Nguyên văn bởi Em_ku (Post 29343)
void tre1s (int so)
{
int i,j;
TMR0IF=0;
setup_timer_0 (RTCC_INTERNAL|RTCC_DIV_16);
set_timer0 (6);
for (i=0;i<=so;i++)
{
while (TMR0IF==0)
{
}
}
}
}

Hàm này của bạn sai rồi nó ko tạo trễ 1s, xem lại đi rồi tìm xem viết kiểu j cho đúng.

Em_ku 06-09-2009 04:04 PM

bác nói rõ hơn một chút được kô ạ?? Còn cái 1s đó kô wan trọng. Theo em nghĩ mình tính toán cũng đúng mà. Thời gian để i tăng lên 1 đơn vị: (255-6+1)*1*16 = 40000. Vậy giá trị số phải là 250. Em wen ở đó kô có dấu bằng xảy ra.
Vấn đề em thắc mắc ở đây. Là cái đoạn sau. Nếu em thay đoạn sau:
void main ()
{
int a=0b00000001;
set_tris_b(0x00);
while (1)
{
portb=a;
tre1s (250);
rotate_left (&a,1);
}
}

thì đèn led ở portb của em nháy từng con với thời gian trễ là 1s. Còn nếu em thay cái đoạn trên thì nó nhảy gì gì đâu ấy à. Em kô hiểu được

Em_ku 09-09-2009 02:56 PM

Kô ai giúp em với!! Hix em chờ lâu quá mà kô thấy. Cũng tìm khắp diễn đàn rồi mà kô thấy có chỗ nào nói về cái này cả

newboystylew 10-09-2009 05:33 PM

mh cũng gốp zui thêm 1 số chưg trìh ccs,các ct này chạy tốt trên protues7.4
http://www.mediafire.com/?xzynn5nmgnz

nhamdtk4 11-09-2009 09:28 PM

Trích:

Nguyên văn bởi Em_ku (Post 29347)
bác nói rõ hơn một chút được kô ạ?? Còn cái 1s đó kô wan trọng. Theo em nghĩ mình tính toán cũng đúng mà. Thời gian để i tăng lên 1 đơn vị: (255-6+1)*1*16 = 40000. Vậy giá trị số phải là 250. Em wen ở đó kô có dấu bằng xảy ra.
Vấn đề em thắc mắc ở đây. Là cái đoạn sau. Nếu em thay đoạn sau:
void main ()
{
int a=0b00000001;
set_tris_b(0x00);
while (1)
{
portb=a;
tre1s (250);
rotate_left (&a,1);
}
}

thì đèn led ở portb của em nháy từng con với thời gian trễ là 1s. Còn nếu em thay cái đoạn trên thì nó nhảy gì gì đâu ấy à. Em kô hiểu được

Tôi thật ko thể hiểu đc sao cái hàm trễ của bạn lại có lúc chạy đúng đc 1s, và cách bạn tính thời gian trễ ở trên là dùng cho ngắt timer ko biết khai báo ngắt của bạn đặt đâu.
Hàm tre1s() của bạn chỉ đơn giản là thực hiện các lệnh trong đó mỗi lệnh tốn khoảng vài us làm sao mà trễ đc đến 1s cơ chứ.


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