PDA

View Full Version : mình muốn chạy led nhièu hiệu ứng cùng lúc làm thể nào


vuthien86
19-02-2009, 07:47 PM
mình vẫn dùng con pic 16f84a ,đièu khiển portb 8 chân và porta a chân .
mình có một số thắc măc mà làm mãi không được .
1,mình muỗn ghép 2 port a và b để điều khiển chạy led theo cùng một hiệu ứng ,như vậy mình sẽ có 12 chân điều khiển .
2.mình muốn hỏi có thể đièu khiển cùng một lúc các chân với các hiệu ứng khác nhau ko ?
VD: portb có 8 chan là Rb0->rb7
vậy chia đôi ra từ rb0->rb3 là 1 hiệu ứng ,và 4 chân còn lại 1 hiệu ứng khác mà lại chạy cùng lúc song song nhau ,thời gian trễ khác nhau có dc ko ?

mình đang định làm một cái biển quảng cáo cafe bằng đèn led ,dung pic 16f84a 8 bit
mình muốn dùng 3 chân của portb để đièu khiển chạy viền xung quanh ,các chân còn lại để đièu khiển các chữ trong bên trong bảng ,một bài toán là viền ngoài vẫn chạy bình thường và chữ bên trong vẫn nháy loạn lên cùng một thòi điểm .v.v.
thanks ,rất mong dc chỉ giáo

nguyenquoctoan
19-02-2009, 10:13 PM
nội dung bạn làm đơn giản,bạn làm tới đâu rùi pót lên mọi người góp ý cho, chưa làm mà hỏi e rằng kô ai trả lời đâu...

nguyennam8888
20-02-2009, 10:58 AM
mình vẫn dùng con pic 16f84a ,đièu khiển portb 8 chân và porta a chân .
mình có một số thắc măc mà làm mãi không được .
1,mình muỗn ghép 2 port a và b để điều khiển chạy led theo cùng một hiệu ứng ,như vậy mình sẽ có 12 chân điều khiển .
2.mình muốn hỏi có thể đièu khiển cùng một lúc các chân với các hiệu ứng khác nhau ko ?
VD: portb có 8 chan là Rb0->rb7
vậy chia đôi ra từ rb0->rb3 là 1 hiệu ứng ,và 4 chân còn lại 1 hiệu ứng khác mà lại chạy cùng lúc song song nhau ,thời gian trễ khác nhau có dc ko ?

mình đang định làm một cái biển quảng cáo cafe bằng đèn led ,dung pic 16f84a 8 bit
mình muốn dùng 3 chân của portb để đièu khiển chạy viền xung quanh ,các chân còn lại để đièu khiển các chữ trong bên trong bảng ,một bài toán là viền ngoài vẫn chạy bình thường và chữ bên trong vẫn nháy loạn lên cùng một thòi điểm .v.v.
thanks ,rất mong dc chỉ giáo
theo mình nghĩ bạn làm thế này :
việc hiện thị nội dung các chữ thì bạn chạy bình thường, còn chương trình chạy viền thì bạn viết trong ngắt ấy,đia chỉ ngắt của 16f84 là 04h, mỗi một " nháy loạn "( từ bạn viết) thì minh goi 1 ngắt, nguyen lý của ngắt là nếu chương trình chính đang chạy nếu có một ngắt xảy ra thì nó sẽ dừng lại để thực hiện ngắt sau đó tiếp tục quay trở lại chương trình chính thực hiện tiếp

vuthien86
20-02-2009, 11:49 AM
uh ý mình là thế đó ,mình mới học ccs và pic dc 4 ngày thôi ,có nghe đến ngắt nhưng chưa hiểu lắm ,và mình nghĩ là chắc phải dùng đến ngắt .
bạn có thể chỉ cho mình thêm về ngắt ,có đọc một số tài liệu nhưng ko hiểu lắm ,
cú pháp của nó như thế nào ?
theo như bạn nói ,một chương trình chính đang chạy có ngắt thì sẽ dừng lại để thực hiện trong ngắt ,vậy nếu chương trình chính là nháy chữ bên trong thì mỗi một "nháy" cua chương trình chính mình gọi ngắt ,chương trình chính sẽ dừng lại đê thực hiện ngắt ,
mình có đièu chỉnh đuọc thời gian ngắt ,.v.v. nói chung là bạn có thể cho mình những kiến thức cơ bản nhất vè ngắt .thanks
đi vào cái này mới thấy có nhiều vấn đề học mãi ko hết

nguyennam8888
20-02-2009, 02:52 PM
uh ý mình là thế đó ,mình mới học ccs và pic dc 4 ngày thôi ,có nghe đến ngắt nhưng chưa hiểu lắm ,và mình nghĩ là chắc phải dùng đến ngắt .
bạn có thể chỉ cho mình thêm về ngắt ,có đọc một số tài liệu nhưng ko hiểu lắm ,
cú pháp của nó như thế nào ?
theo như bạn nói ,một chương trình chính đang chạy có ngắt thì sẽ dừng lại để thực hiện trong ngắt ,vậy nếu chương trình chính là nháy chữ bên trong thì mỗi một "nháy" cua chương trình chính mình gọi ngắt ,chương trình chính sẽ dừng lại đê thực hiện ngắt ,
mình có đièu chỉnh đuọc thời gian ngắt ,.v.v. nói chung là bạn có thể cho mình những kiến thức cơ bản nhất vè ngắt .thanks
đi vào cái này mới thấy có nhiều vấn đề học mãi ko hết

các lệnh dùng cho ngắt trong CCs:
enable_interrupts(level);//cho phép ngằt kiểu level
disable_interrupts(level);//cấm ngắt kiểu level
ext_int_edge(edge);// chọn lấy xung cạnh thấp hay cao
level bao gồm:

GLOBAL : ngắt toàn cục
INT_RTCC : tràn TMR0
INT_RB : có thay đổi trạng thái một trong các chân RB4 đến RB7
INT_EXT : ngắt ngoài
INT_AD : chuyển đổi AD đã hoàn tất
INT_TBE : bộ đệm chuyển RS232 trống
INT_RDA : data nhận từ RS232 sẵn sàng
INT_TIMER1 : tràn TMR1
INT_TIMER2 : tràn TMR2
INT_CCP1 : có capture hay compare trên CCP1
INT_CCP2 : có capture hay compare trên CCP2
INT_SSP : có hoạt động SPI hay I2C
INT_PSP : có data vào cổng parallel slave
INT_BUSCOL : xung đột bus
INT_EEPROM : ghi vào eeprom hoàn tất
INT_TIMER0 : tràn TMR0
INT_COMP : kiểm tra bằng nhau comparator

edge bao gồm:

L_TO_H : cạnh lên
H_TO_L : cạnh xuống
vi du ban viết cho ngằt INT_RB ( ngắt khi có thay đổi trạng thái của các chân RB4 ->RB7)
#INT_RB
void chayvien()
{....code....ban viết để điều khiển viền theo ý bạn}
trong main bạn phai viết các lệnh trên dể có thể sử dụng nó ( cho phép nó và nó xày ra khi nào :xung thap hay cao )

vuthien86
20-02-2009, 05:27 PM
thanks mình phải ngâm kíu thêm ,"cho phép nó và nó xày ra khi nào :xung thap hay cao )" ở trong mian ,cái này chuă hiểu lắm ,để mình đọc thêm tài liệu về ngắt đã ,có gì ko hiểu sẽ hỏi bạn tiếp .cảm ơn nhièu

bạn có đoạn code nào sử dụng ngắt cho mình xem làm vi dụ với ,1 chương trình hoàn chỉnh .

nguyenquoctoan
20-02-2009, 10:27 PM
trong hàm main bạn khai báo sử dụng loại ngắt (timer, ngắt ngoài,...)(cho phép ngắt), nhưng khi nào thì xảy ra ngắt...mỗi loại ngắt có một tác động riêng khi dấu hiệu này bị tác động sẽ gây ra ngắt (ví dụ timer ngắt khi bị trào, ngắt ngoài khi thay đổi xung,...)
đoạn code đầy đủ sử dụng ngắt timer đây
//************************************************** ******************
#include <16F877a.h>
#fuses NOWDT,PUT,HS,NOPROTECT
#use delay(clock=4000000)
////#use fast_io(b)
#byte portc=0x07 ///khai bao dia chi portb
#byte portb=0x06
////#define led pin_B0
int16 count;
int8 a;
//Chuong trinh ngat TMR0
#int_timer0
void interrupt_timer0()
{
set_timer0(0);
++count;
if(count==560)
{
count=0;
a=a<<1; // dich trai a 1bit
}
if(a==256)
{
a=1;
count=0;
}
}
//Chuong trinh chinh
main()
{
set_tris_c(0);
set_tris_b(0);
enable_interrupts(global);
enable_interrupts(int_timer0);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
set_timer0(0);
count=0;
a=1;
while(true)
{
portc=a;
portb=0x01010101;
}
}

vuthien86
23-02-2009, 08:58 AM
cảm ơn bạn nhiệt tình quá ,để mình thử làm xem .

vuthien86
23-02-2009, 09:11 AM
INT_TIMER0 : tràn TMR0

INT_TIMER1 : tràn TMR1
INT_TIMER2 : tràn TMR2

ngắt timer khi bị trào là thế nào hả bác
trong code bạn giải tyhichs hộ mình
giá trị (count==560) là gì ,giá trị 560 mình ko hiểu

xuanhiendk2
23-02-2009, 10:27 AM
Đơn giản ví dụ bạn đặt thời gian cho Timer là 1s thì sau đúng 1 s sẽ xảy ra ngắt.

vuthien86
23-02-2009, 10:44 AM
#include <16F877a.h>
#fuses NOWDT,PUT,HS,NOPROTECT
#use delay(clock=4000000)
////#use fast_io(b)
#byte portc=0x07 ///khai bao dia chi portb
#byte portb=0x06
////#define led pin_B0
int16 count;
int8 a;
//Chuong trinh ngat TMR0
#int_timer0
void interrupt_timer0()
{
set_timer0(0);
++count;
if(count==560)
{
count=0;
a=a<<1; // dich trai a 1bit
}
if(a==256)
{
a=1;
count=0;
}
}
//Chuong trinh chinh
main()
{
set_tris_c(0);
set_tris_b(0);
enable_interrupts(global);
enable_interrupts(int_timer0);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
set_timer0(0);
count=0;
a=1;
while(true)
{
portc=a;
portb=0x01010101;
}
}
cái code của bạn mình thử chạy thì ban đầu portc các led chạy sáng chạy nhanh ,cổng b chỉ có một đèn sáng
nhưng mình thử chèn thêm một đoạn code cho cổng b sáng theo ý mình thì portc đèn chạy chậm lại .vậy là sao nhỉ ,

nguyenquoctoan
23-02-2009, 08:39 PM
bạn xem kỹ chương trình, khi gán giá trị timer là số bất kỳ (tùy timer0,1,..giá trị đếm lên khác nhau) sau dòng lệnh set_timer thi timer sẽ đếm đến giá trị 8bit hay 16 bit nó trào sinh ra ngắt nhảy đến ngắt thực thi xong sẽ nhảy về chổ cũ lúc gọi ...

vuthien86
24-02-2009, 09:56 AM
mình hiểu rồi ,thanks các bác .em hoàn thành dc cái biển quảng cáo roài hihi .