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)

quyendn 17-09-2008 02:01 PM

Em bắt đầu học pic, vào đây hơi trễ. Nên link phần mềm CCS mất rồi.
Vậy có ai cho em link mới nhé.
Cám ơn nhiều.

bengan 19-09-2008 11:52 PM

thanks các bạn nhiều, cái này rất hay.

bogu 30-09-2008 05:39 PM

loạt bài về CCs pic đâu hết tiêu rùi :((

nguyenquoctoan 30-09-2008 06:35 PM

-protues phần mềm mô phỏng ko tin tưởng đâu các bác, theo em nghĩ nó chỉ là mô phỏng ý tưởng và giải thuật chương trình mình viết, còn thực tế thì khác xa
-muốn nạp chương trình vào protues bạn phải có sẵn file hex, trong protues nhấp đúp vào pic chọn đường dẫn file==>ok==>xong, phía dưới bên trái có bảng mô phỏng

nguyenquoctoan 30-09-2008 06:37 PM

-protues phần mềm mô phỏng ko tin tưởng đâu các bác, theo em nghĩ nó chỉ là mô phỏng ý tưởng và giẩi thuật chương trình mình viết, còn thực tế thì khác xa
-muốn nạp chương trình vào protues bạn phải có sẵn file hex, trong protues nhấp đúp vào pic chọn đường dẫn file==>ok==>xong, phía dưới bên trái có bảng mô phỏng

nguyenquoctoan 30-09-2008 06:37 PM

-protues phần mềm mô phỏng ko tin tưởng đâu các bác, theo em nghĩ nó chỉ là mô phỏng ý tưởng và giẩi thuật chương trình mình viết, còn thực tế thì khác xa
-muốn nạp chương trình vào protues bạn phải có sẵn file hex, trong protues nhấp đúp vào pic chọn đường dẫn file==>ok==>xong, phía dưới bên trái có bảng mô phỏng

nguyenquoctoan 30-09-2008 07:17 PM

ccs phiên bản 4.0 cả tài liệu học ccs tiếng việt đây
tài liệu hướng dẫn protues lun
http://www.mediafire.com/?sharekey=3...eb367ee4828c31
các sư huynh dowload đi

nbb3i 04-11-2008 12:54 AM

Trích:

Nguyên văn bởi nguyenquoctoan (Post 19219)
ccs phiên bản 4.0 cả tài liệu học ccs tiếng việt đây
tài liệu hướng dẫn protues lun
http://www.mediafire.com/?sharekey=3...eb367ee4828c31
các sư huynh dowload đi

Link này có file nào đâu?
Mình cũng đang làm đề tài ghi đọc thẻ nhớ MMC dùng PIC 16F877A qua chuẩn SPI. Nhưng ko rõ MMC nó cấu trúc bộ nhớ như thế nào?
Bạn nào có thể hướng dẫn qua giúp mình về chuẩn ghi đọc dữ liệu trên thẻ MMC với? Hoặc có thể nêu ra các bước thực hiện lập trình ghi đọc trên MMC giúp mình với.
Cảm ơn những gợi ý quý báu của các bạn:)!

dientudong 07-11-2008 01:02 AM

hỏi về câu lệnh
 
các bạn cho mình hỏi ý nghĩa của hai câu lenh sau là sao >Chân thành cảm ơn !
lcd_init();
lcd_putc('\f');

dientudong 07-11-2008 01:19 AM

vấn đề Code
 
Cho mình hỏi là sao đoạn code của anh Linh không có lệnh trisc và tại sao ở lệnh LCD_putcmd(0xC3):thì 0xC3 là vị trí thứ 4 của dòng thứ 2

#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)
#include <lcd_lib_4bit.c> // Thu vien ham cho LCD

void main()
{
trisa = 0xFF;
trisb = 0x01;
trisd = 0x00;
LCD_init();
Printf(LCD_putchar," PICVIETNAM tut");
LCD_putcmd(0xC3);
Printf(LCD_putchar," LCD 4bit ");
}

hopeman 07-11-2008 09:03 AM

Trích:

Nguyên văn bởi dientudong (Post 20170)
các bạn cho mình hỏi ý nghĩa của hai câu lenh sau là sao >Chân thành cảm ơn !
lcd_init();
lcd_putc('\f');

cả hai lệnh này đều là lệnh gọi hàm thôi bạn ơi
vd lcd_init() tức là gọi hàm void lcd_init(void){...} đây có lẽ là hàm khởi tạo cho lcd, còn hàm còn lại là hàm đẩy 1 ký tự (char) đi thôi.

hopeman 07-11-2008 09:40 AM

Trích:

Nguyên văn bởi dientudong (Post 20171)
Cho mình hỏi là sao đoạn code của anh Linh không có lệnh trisc và tại sao ở lệnh LCD_putcmd(0xC3):thì 0xC3 là vị trí thứ 4 của dòng thứ 2

#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)
#include <lcd_lib_4bit.c> // Thu vien ham cho LCD

void main()
{
trisa = 0xFF;
trisb = 0x01;
trisd = 0x00;
LCD_init();
Printf(LCD_putchar," PICVIETNAM tut");
LCD_putcmd(0xC3);
Printf(LCD_putchar," LCD 4bit ");
}

bạn nên vào #3 của topic này down file đính kèm về, giải nén và đọc kỹ lại file lcd_lib_4bit.c xem sao nhé.

dientudong 07-11-2008 01:39 PM

lcd_lib_4bit
 
Bạn cho mình hỏi là : khi mình viết một chương trình có dùng LCD thì cứ bê y nguyên code LCD4bit vào ,chỉ việc gắn chân cho phù hợp phải không bạn ?rồi mới viết thêm một số lệnh cho LCD theo bài của mình ?Cảm ơn bạn nhiều .

vuvulinh_8x 08-11-2008 01:05 AM

Trích:

Nguyên văn bởi dientudong (Post 20184)
Bạn cho mình hỏi là : khi mình viết một chương trình có dùng LCD thì cứ bê y nguyên code LCD4bit vào ,chỉ việc gắn chân cho phù hợp phải không bạn ?rồi mới viết thêm một số lệnh cho LCD theo bài của mình ?Cảm ơn bạn nhiều .

Code LCD4bit là một thư viện hàm được xây dựng sẵn tránh phải viết lại nhiều code trong các bài giao tiếp LCD mà thôi. Bạn cũng có thể xây dựng độc lập một hàm riêng ra một file.c nào đó hay trực tiếp ở code của mình. Nếu bạn include file LCD_lib_4bit.c thì phải gắn chân theo định nghĩa của file.

tv-vaa 08-11-2008 12:17 PM

Em tải CCS bản CCS-PCWHD4.065 về máy, cài đặt được nhưng không chạy được. Máy em cài win Vista, các anh có bản nào chạy trên vista không share cho em nhé, crack luôn nhé. Thanks

khucthuydu1 11-11-2008 09:41 PM

Mọi người ơi cho em hỏi, em mới học pic và đang code những bài đầu tiên dùng C với chương trình MPLAB. Em type theo đoạn code nhấp nháy led của anh Linh mà khi compile thấy báo lỗi TRISB và PORTB chưa được khai báo, khi em cho dấu chú thích vào thì compile mới thành công?

Vậy 2 biến TRISB và PORTB có cần khai báo j không?


edit:
Em đã thử bằng cách khác, cho dòng #include<defs_16f877a.h> vào sau dấu // và có khai báo hai biến TRISB, PORTB kiểu int16 thì dịch thành công. Nhưng em vẫn chưa hiểu, muốn khai báo TRISB và PORTB thì phải làm ra sao?
Còn file defs_16f877a.h thì có cần thiết khi mình dùng mạch nạp thật để test bài tutorial đầu tiên này k?

edit1:

Lên mạng kiếm được file def_877a.h rồi thì em cho vào device rồi include vào chương trình. Bỏ dòng khai báo TRISB và PORTB ( tự viết để xem chạy thế nào ) đi thì build success.

badungdtk3 15-03-2009 04:21 PM

Mọi người cho em hỏi:
Em viết thử ct ADC nhưng cứ báo lỗi thế này:
" can't change device type this far in to the code"
và con trỏ nằm ở dòng này: #device *=16 ADC=8
Mong nhận được giúp đỡ sớm! Thanks trước nha.

TRUNGDTD 16-03-2009 02:33 PM

Em mới học ccs,cho em hỏi các bác cái def_877A là cái gì mà em tìm không có,mấy chương trình của các bác có khai báo nhưng có khi dịch được có khi thi không ,nhờ các bác?

badungdtk3 19-03-2009 08:59 PM

1 Attachment(s)
bạn đem về cho nó vào c/program file/picc/devices nhé. Còn trong đó có gì bạn mở ra sẽ biết thôi.

quyenk9a 04-04-2009 05:32 PM

cứu em với
 
Trích:

Nguyên văn bởi FFGmember (Post 5569)
Đã lâu lâu không đóng góp cho PIC Việt Nam gì rồi. Đợt này tự nhiên công việc liên quan đến PIC, yêu cầu đến việc sử dụng SPI, nhào zô luôn cho việc học CCS. Mong mỏi đóng góp chút gì đó cho tất cả mọi ngưòi.


1. Mục tiêu của việc học CCS:
• Sử dụng được CCS programmer
• Ứng dụng được chương trình hiển thị LCD
• Ứng dụng được chương trình kết nối SPI với EEPROM và MMC card. hiển thị các thông số lên LCD .


2. Nguồn tài liệu và công cụ làm việc:
• Theo tutorial của Linhnc308: http://www.picvietnam.com/forum//att...6&d=1157644591
• Chương trình CCS: down load ban CCS3.249.rar. http://www.tailieuvietnam.net/downlo...CCSC_3.249.rar
• Chương trình Proteus. 6.7

////////////////////////
em viết chương trình này sao không mô phỏng bằng proteus được
trả lời giúp em sớm nhé
thanks
#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);}

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

nhamdtk4 11-09-2009 09:29 PM

Bạn thử sửa lại code trên đó thành như này xem sao
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)
 
  int a,b=0;
  int C[10]= {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90 };
#int_rtcc
void rtcc()
{
  if(b++==250)
  {
      a++;
      if(a==10) a=0;
  }

void main ()
{
  setup_timer_0 (RTCC_INTERNAL|RTCC_DIV_16);
  set_timer0 (6);
  enable_interrupts(int_rtcc);
  enable_interrupts(global);
  set_tris_b (0x00);
  a=0;
      while (true)
      {
      //for (a=0;a<=9;a++)
      //{
      //tre1s (250);
      portb=C[a];
      //tre1s (250);
      }
}


Em_ku 17-09-2009 10:00 AM

Trích:

Nguyên văn bởi nhamdtk4 (Post 29534)
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ứ.

Cái này tớ không sử dụng ngắt dùng timer mà đơn giản là chỉ thực hiện cái lệnh đó. Thời gian để thực hiện lệnh này là 1s được tính như sau:
đầu tiên gán cho timer0=6. Giá trị timer tăng sau 1 chu kì lệnh với tỉ lệ chia tần số là 16. Vậy sau bao lâu thì giá trị i tăng lên 1 đơn vị:
t=(255-6+1)*1us*16=4000us. Vậy giá trị của i phải chạy từ 0 đến 250. Như vậy nó tốn thời gian là 4000us*250=1000000us=1s. đó là cách em tính. Nhưng ở đây em không thắc mắc về tính thời gian trễ này. Nếu ta sửa cái led 7 đoạn bằng một led đơn thì nó vẫn đỏ tắt sau thời gian là 1s. Nhưng nếu nó là led 7 đoạn thì nhảy loạn xạ lên.

nhamdtk4 17-09-2009 04:54 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)
{
}
}
}

Mình thử "giải phẫu" cái hàm tre1s() của bạn, cùng theo dõi xem có đúng ko nha:
-RTCC_DIV_16 chưa nhắc tới, khi hàm tre1s() được gọi và đến khi hàm lệnh set_timer0(6) được thực hiện thì timer0 bắt đầu đếm từ 6, mặc kệ timer0 nó đếm thì vòng lặp for(..) vẫn được thực hiện đúng ko.
-Trong khi đang đếm timer0 chưa tràn thì con trỏ CT cứ ở yên trong while(TMR0IF==0) (vì TMR0IF==0 true) vậy sau t=(255-6+1)*1us*16=4000us thì sao, thì timer0 bị tràn và TMR0IF==0 false chứ sao nhỉ, vậy thế thì sao nào.
-Như vậy là khi i==0 thì timer0 đã bị tràn rồi và TMR0IF==1 nhưng chưa thể thoát khỏi tre1s() ngay được vì i còn phải tăng đến khi i==so thì mới thoát khỏi vòng lặp for(..) và cũng thoát khỏi hàm tre1s() luôn.
Đấy như thế thì hàm tre1s() của bạn chỉ trễ được có 4000us + vài trăm us trong vòng for(..) thôi chứ sao đủ 1s được.
Ko biết bạn mô phỏng thế nào chứ mình thấy khi thay đoạn code khác vào thì nó vẫn trễ như thế (vì vấn đề là ở hàm trễ);

letrongdtk4 23-09-2009 10:11 PM

Trích:

Nguyên văn bởi Em_ku
Cái này tớ không sử dụng ngắt dùng timer mà đơn giản là chỉ thực hiện cái lệnh đó. Thời gian để thực hiện lệnh này là 1s được tính như sau:
đầu tiên gán cho timer0=6. Giá trị timer tăng sau 1 chu kì lệnh với tỉ lệ chia tần số là 16. Vậy sau bao lâu thì giá trị i tăng lên 1 đơn vị:
t=(255-6+1)*1us*16=4000us. Vậy giá trị của i phải chạy từ 0 đến 250. Như vậy nó tốn thời gian là 4000us*250=1000000us=1s. đó là cách em tính. Nhưng ở đây em không thắc mắc về tính thời gian trễ này. Nếu ta sửa cái led 7 đoạn bằng một led đơn thì nó vẫn đỏ tắt sau thời gian là 1s. Nhưng nếu nó là led 7 đoạn thì nhảy loạn xạ lên.

Mình lại thấy cách tính của bạn cũng gần như chính là cách dùng ngắt của Timer
vì khi bạn dùng Set_timer0(X) thì thời gian để 1 lần Timer của bạn tràn là :
T = 4.(256 - X) / Tấn số thạch anh
Cụ thể ở đây của bạn : X = 6 và Tần số thạch anh là : 4MHz
-> T = 4.(256 -6) / 4000000 = 250uS . Vậy để trễ 1s bạn cần tràn Timer 4000 lần
Nhưng bạn dùng chế độ RTCC_DIV_16 nên Timer tràn 250 lần là bạn có 1s

Vì thế bạn chỉ cần sửa chương trình lại như sau là ngon lành :
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)

INT8 I=0;
int8 a,b;
int8 C[10]= {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90 };

#INT_TIMER0
VOID TRAN_TIMER0()
  {
  I ++;
  SET_TIMER0(6);
  }



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 ()
{
enable_interrupts(GLOBAL);
enable_interrupts(INT_TIMER0);
set_tris_b (0x00);
a=0;
while (1)
{
for (a=0;a<=9;a++)
{
//tre1s(250);
portb=C[a];
tre1s(250);
}
}
}



:beer:

letrongdtk4 23-09-2009 10:26 PM

Mình vừa viết lại chương trình . Vẫn là dùng Timer bạn xem thế nào ???
http://www.mediafire.com/download.php?mtgyjhjniij
Mà bài toán này mục đích của bạn chỉ là hiển thị led 7 thanh thôi hay có ý định gì tiếp theo không ? :D


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

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam