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 25-10-2010, 01:28 PM   #1
akatsu
Đệ tử 2 túi
 
Tham gia ngày: Aug 2010
Bài gửi: 27
:
Talking Giúp mình bài tập này với!!!

Mình vừa mới làm quen với PIC đang bị bí chỗ này.

mình dùng 1 chân RB1 làm nút nhấn. Khi bấm 10 lần RB1 thì led gắn ở chân RD1 sáng lên 1 lần.
Chỉ đơn giản như thế thôi. Nhưng mà do gà quá. Các pác giúp dùm e nhá
akatsu vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 26-10-2010, 12:08 AM   #2
venderhak
Nhập môn đệ tử
 
Tham gia ngày: Oct 2009
Bài gửi: 1
:
Trả lời

Bài này khá đơn giản. Mình viết bằng ngôn ngữ ASSEMBLY, mình thực hành trên BOARD PICDEM 2+ 2006 (microchip) . Bạn có thể mô phỏng bằng PROTEUS để thấy trực quan hơn.
Cần chú ý các thanh ghi của mình, mình chọn nút nhấn RA4, LED đơn gắn ở chân RB0 (chip P18f4520), delay 1s , led sáng 1s rồi sẽ tắt.

p=18f4520
#include p18f4520.inc

udata
a res 1
b res 1
c res 1
d res 1

org 0000h
goto start
start
call init

dem10
call an10
decfsz a
goto dem10
bsf PORTB,0
call delay1s
bcf PORTB,0
return

an10
btfsc PORTA,4 ;kiem tra bam nut
goto an10
tha10
btfss PORTA,4
goto tha10
return

delay1s
movlw .4
movwf b
delay1s_1
movlw .250
movwf c
delay
call delayX
decfsz c
goto delay
decfsz b
goto delay1s_1
return

delayX
nop
decfsz d
goto delayX
return

init
movlw .10
movwf a
;chon portb lam port xuat
clrf PORTB
bcf TRISB,0
;chon porta lam input
clrf PORTA
bsf TRISA,4
bsf PORTA,4
return
end

Mong bạn cho ý kiến thêm. Chúc vui.
venderhak vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 26-10-2010, 05:53 PM   #3
akatsu
Đệ tử 2 túi
 
Tham gia ngày: Aug 2010
Bài gửi: 27
:
hì. cám ơn bạn nhiều. bạn có chương trình C không. mình không học ASM nên đọc không hỉu lắm...hì
akatsu vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 26-10-2010, 06:02 PM   #4
akatsu
Đệ tử 2 túi
 
Tham gia ngày: Aug 2010
Bài gửi: 27
:
mình định xây dụng 1 hàm quét phím theo kiểu int8
INT8 QUETPHIM0123()
{
Z = 0 ;
WHILE(BIT_TEST(INPUT_B(),Z))
{

Z++ ;
IF(Z == 2) Z = 0 ;//cái này là để xác định chỉ quét 2 nút nhấn RB0,RB1

}
WHILE(!BIT_TEST(INPUT_B(),Z))
{
}
RETURN Z ;


}
nếu như trong trường hợp bấm nút nào thì nhảy sang chương trình đó.

trong đó RB0 là chương trình bấm 10 lần. nhưng cách viết để đếm chân RB0 lên 10 lần mình không làm đc. Bạn nào cao thủ giúp mình nha
akatsu vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-10-2010, 12:22 AM   #5
pk178
Đệ tử 5 túi
 
Tham gia ngày: Jan 2009
Bài gửi: 100
:
Trích:
Nguyên văn bởi akatsu View Post
Mình vừa mới làm quen với PIC đang bị bí chỗ này.

mình dùng 1 chân RB1 làm nút nhấn. Khi bấm 10 lần RB1 thì led gắn ở chân RD1 sáng lên 1 lần.
Chỉ đơn giản như thế thôi. Nhưng mà do gà quá. Các pác giúp dùm e nhá
Chương trình khá đơn giản, vấn đề là bạn phải đợi khi người dùng bấm xong (ấn xuống rồi nhả ra) thì biến đếm mới được tăng lên 1 đơn vị.

Giả sử phím bấm của bạn nối điện trở treo pull-up, khi đó nếu không bấm thì mức logic tại B1 là 1, nếu bấm thì mức logic tại B1 là 1, đoạn code tăng biến đếm như sau :

Code:
int i = 0; // Biến i sẽ là biến đếm

while(1){

if(input(PIN_B1) == 0)
while(input(PIN_B1) == 0); // Đợi cho người dùng nhả phím bấm
i++;
if(i == 10) output_high(PIN_D1);

}

............
pk178 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-10-2010, 01:17 AM   #6
xtravel
Nhập môn đệ tử
 
Tham gia ngày: Aug 2010
Nơi Cư Ngụ: hcm city
Bài gửi: 7
:
Send a message via Yahoo to xtravel
nếu nut nhấn trên chân RB4-RB7,ngoài cách dùng q0et bit ngõ vào ta có thế dùng ngắt,chuớng trình phục vụ ngắt chỉ làm việc đơn giản là thực hiện i++ nếu i = = 10 thì bật led tương ứng 1s...
xtravel vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-10-2010, 01:53 AM   #7
hcmut.khoamaisi
Đệ tử 4 túi
 
hcmut.khoamaisi's Avatar
 
Tham gia ngày: Dec 2009
Nơi Cư Ngụ: TPHCM
Bài gửi: 79
:
Send a message via Yahoo to hcmut.khoamaisi
cái này theo mình là phải dùng ngắt ngoài thì mới chương trình chính xác!
__________________
My blog: http://autumnneverreturn.blogspot.com/
Đối thủ khó chiến thắng nhất là bản thân !!!
hcmut.khoamaisi vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 28-10-2010, 03:51 PM   #8
akatsu
Đệ tử 2 túi
 
Tham gia ngày: Aug 2010
Bài gửi: 27
:
đúng vậy...phải dùng ngắt ngoài..mình đã thử code và thấy nó chạy loạn lên hết.lúc thì bấm đến 9 đã nhảy.lúc bấm đến 2 đã nhảy. mình dùng Easy KIT
akatsu vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 28-10-2010, 09:16 PM   #9
pk178
Đệ tử 5 túi
 
Tham gia ngày: Jan 2009
Bài gửi: 100
:
Cái việc nó nhảy loạn là do thuật toán chưa tốt, bạn tìm hiểu thêm về các phương pháp chống rung bàn phím nhé.

Mình vẫn bắt phím theo cách trên, chạy ngon lành, ko có vấn đề gì cả (phím bấm của mình chống rung bằng phần cứng rồi )
pk178 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 29-10-2010, 04:56 PM   #10
akatsu
Đệ tử 2 túi
 
Tham gia ngày: Aug 2010
Bài gửi: 27
:
#include <16F877A.h>
#include <def_877a.h>
#device adc=8
#FUSES NOWDT, HS, PUT, PROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
//#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bi ts=8)
#use fast_io(b)
int8 i=0;
void densang();
void reset();
#int_rb
void ngatngoai()
{
if ((RBIF)&&(RBIE))
{
if(RB0==0)
{//while(RB0==0);
i++;
if(i==10)
{
i=0;
densang();
}
}
if(RB1==0)
{
reset();
}
}

}





void main()
{
set_tris_b(0);
set_tris_d(0xff);
enable_interrupts(int_rb);
enable_interrupts(global);
ext_int_edge(H_to_L);

while(true)
{
}

}
void densang()
{
output_high(PIN_D0);
}
void reset()
{
i=0;
output_low(pin_d0);
}


đây là code e mới viết. các cao thủ xem jup e xem có sai sót j k nhá!!!e cám ơn

thay đổi nội dung bởi: akatsu, 29-10-2010 lúc 05:01 PM. Lý do: copy thiếu.xin lỗi
akatsu vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 30-10-2010, 10:06 PM   #11
tdm
Đệ tử 7 túi
 
Tham gia ngày: May 2005
Bài gửi: 258
:
Trích:
Nguyên văn bởi akatsu View Post
#include <16F877A.h>
#include <def_877a.h>
#device adc=8
#FUSES NOWDT, HS, PUT, PROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
//#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bi ts=8)
#use fast_io(b)
int8 i=0;
void densang();
void reset();
#int_rb
void ngatngoai()
{
if ((RBIF)&&(RBIE))
{
if(RB0==0)
{//while(RB0==0);
i++;
if(i==10)
{
i=0;
densang();
}
}
if(RB1==0)
{
reset();
}
}

}
}




void main()
{
set_tris_b(0);
set_tris_d(0xff);
enable_interrupts(int_rb);
enable_interrupts(global);
ext_int_edge(L_to_H);

while(true)
{
}

}
void densang()
{
output_high(PIN_D0);
}
void reset()
{
i=0;
output_low(pin_d0);
}


đây là code e mới viết. các cao thủ xem jup e xem có sai sót j k nhá!!!e cám ơn
enable_interrupts(int_rb);//chỉ ngắt khi các pin rb4,rb5,rb6,rb7 tác động.
set_tris_b(0);//các chân portb là chân xuất dữ liệu.(nên phím không có tác dụng)
set_tris_d(0xff);//các chân portd là chân nhập dữ liệu.
sửa bài này như sau:
Code:
#include <16F877A.h>
#include <def_877a.h>
#device adc=8
#FUSES NOWDT, HS, PUT, PROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
//#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#use fast_io(b)
int8 i=0;
void densang();
void reset();
#int_rb
void ngatngoai()
     {
   if((RBIF)&&(RBIE))
   {
         if(RB4==0)
         {
         delay_ms(10);//chong rung phim
         if(RB4==0)
          {
            i++;
             if(i==10)
              {
               i=0;
                densang();       
               }
          while (RB4==0)//chờ phím nhả
           {
           }
           delay_ms(10);//chong rung phim
          }
         }
         //*******************************
         else if(RB5==0)
         {
         delay_ms(10);//chong rung phim
         if(RB5==0)
           {
           reset();
         while (RB5==0)//chờ nhả phím
          {
          }
          delay_ms(10);//chong rung phim
           }
         }
}  
void main()
{
set_tris_b(0xf0);//rb4...rb7 là pin nhập
set_tris_d(0xfe);//pinD0 là pin xuất dữ liệu
enable_interrupts(int_rb);
enable_interrupts(global);
ext_int_edge(H_to_L);
reset();
while(true)
{
}

}
void densang()
      {
      output_high(PIN_D0);
      }
void reset()
      {
      i=0;
      output_low(pin_d0);
      }
__________________
viết chương trình cho vdk chạy ổn định là cả một vấn đề.

thay đổi nội dung bởi: tdm, 30-10-2010 lúc 10:26 PM.
tdm vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 30-10-2010, 10:38 PM   #12
tdm
Đệ tử 7 túi
 
Tham gia ngày: May 2005
Bài gửi: 258
:
file mô phỏng:
File Kèm Theo
File Type: rar ngat_phim.rar (23.7 KB, 16 lần tải)
__________________
viết chương trình cho vdk chạy ổn định là cả một vấn đề.
tdm vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 31-10-2010, 11:44 AM   #13
akatsu
Đệ tử 2 túi
 
Tham gia ngày: Aug 2010
Bài gửi: 27
:
mình cám ơn..mình đã viết theo cách mới nghĩ ra và mạch chạy thấy cũng ok rùi..hihi.cám ơn bạn tmd nhiều nha...bạn có mail k?cho mình xin đi.có gì mình cùng trao đổi.hi
akatsu 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à 03:17 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