PDA

View Full Version : cứu tôi với


dientudong
01-01-2009, 05:08 PM
sao bài mình gởi bên kia không ai thèm trả lời giúp vậy ! Vấn đề của mình là khi nhấn nút thì led hoạt động chớp tắt < nhưng sao mình chưa nhấn mà nó đã chớp tắt.Cảm ơn các bạn !

kimhuynguyen
01-01-2009, 08:42 PM
#include "C:\Program Files\PICC\Examples\led.h"

#byte portB =0x06
#byte portA =0x05
#bit RA0 =portA.0
#use delay(clock=20000000)

void main()
{
// Thiet lap che do cho PORTB
set_tris_b(0x00); // Tat ca PORTB deu la cong xuat du lieu
PORTB = 0x00; // Tat het cac LED
set_tris_a(0xff);
if(RA0=1)
{
While(1)
{


PORTB = 0xff; // Cho các LED sáng
delay_ms(500); // T?o th?i gian tr? 250ms
portB = 0x00;
delay_ms(500);

}
}
}


Ở ngay dòng lệnh "if (RA0=1)" là lệnh gán cho RA0 bằng 1 chứ không phải so sánh RA0 có bằng 1 hay không. Có thể thay "if (RA0)" là đủ.

vdtk3
01-01-2009, 09:12 PM
" if (RA0 = 1) "thay bang (if RA0 == 1) .

love_ac
01-01-2009, 09:17 PM
@dientudong:lần sau bạn nên chụp sơ đồ kết nối của bạn(vì hình như bạn vẽ bằng orcad sẽ có ít người không dùng thì sẽ không giúp được bạn--nếu gặp câu khó mà anh Nam định giúp mà anh không thấy hình thì bạn ...)
@kimhuynguyen:nếu lệnh if đó như thế thì trình dịch có báo lỗi không nhỉ (đây có thể bạn đó gõ lên nhầm chăng) .
Giả sử bạn đó gõ nhầm,mình không xem được sơ đồ nguyên lý nên mình đoán nếu chân RA0 luôn nối lên nguồn thì chương trình này luôn nháy là phải rồi.

namqn
01-01-2009, 11:02 PM
Với phát biểu if (RA0 = 1), biểu thức điều kiện luôn luôn mang giá trị TRUE.

Thân,

kimhuynguyen
02-01-2009, 07:51 AM
@love_ac:if(RA0=1) là một phát biểu (statement) đúng cú pháp nên trình dịch sẽ không báo lỗi. Đây là một lỗi rất thường gặp.
@vdtk3: thay if(RA0=1) bằng if(RA0) là đủ

dientudong
02-01-2009, 03:57 PM
#include "C:\Program Files\PICC\Examples\led.h"
#byte PORTA =0x05
#byte PORTB =0x06
#bit RA0 =0x05.0
#bit RB0 =0x06.0
#use delay(clock=20000000)

void main()
{
//set_tris_a(0xff);
if(RA0)
{
While(1)
{
// Thiet lap che do cho PORTB
set_tris_b(0x00);
RB0 = 1;
delay_ms(500);
RB0 = 0;
delay_ms(500);

}
}
}
các bạn cho mình hỏi là set_tris_a(0xff);sao mình thấy dòng lệnh này không có ảnh hưởng gì cả.

dientudong
02-01-2009, 04:00 PM
có bạn nào biết ở đâu có mở lớp dạy học PIC không. Cảm ơn các bạn !

dientudong
02-01-2009, 04:01 PM
Mình ở quận Phú Nhuận ,TpHCM

kimhuynguyen
02-01-2009, 04:31 PM
Bạn liên hệ thử:

Công ty TNHH Thương mại và Giao nhận R&P
http://dientu.rpc.vn/

kimhuynguyen
02-01-2009, 04:42 PM
các bạn cho mình hỏi là set_tris_a(0xff);sao mình thấy dòng lệnh này không có ảnh hưởng gì cả.
Dòng lệnh này chỉ có tác dụng khi dùng với:
#use fast_io(A)

Mặc định, trình biên dịch sẽ tự động thay đổi direction register trong mỗi thao tác I/O.

nếu sử dụng #use fast_io(A) với set_tris_a(0xff), sẽ tiết kiệm được thời gian và bộ nhớ hơn.

dientudong
03-01-2009, 03:52 AM
#include "C:\Program Files\PICC\Examples\led.h"
#byte PORTA =0x05
#byte PORTB =0x06
#bit RA0 =0x05.0
#bit RB0 =0x06.0
#use delay(clock=20000000)

void main()
{

//set_tris_a(0xff);//dong lenh nay chi co tac dung khi su dung use fast_io(A)
if(RA0)//luu y la neu vong if de ngoai vong while thi se khong hoat dong
{
While(1)
{

// Thiet lap che do cho PORTB
set_tris_b(0x00);
RB0 = 1;
delay_ms(500);
RB0 = 0;
delay_ms(500);

}
}
}
các bạn cho mình hỏi sao :để vòng if ngoài vòng while thì nhấn nút mạch không hoạt động,còn để vòng while ngoài vòng if thì hoạt động bình thường.

kimhuynguyen
03-01-2009, 07:52 AM
@dientudong:
nội dung chương trình bạn nên để trong thẻ "[c ode] và [/c ode]"
tránh làm mất thời gian của mod namqn phải chỉnh sửa lại.
(Chú ý là chữ code viết liền với nhau)

về câu hỏi ở trên, bạn ngồi suy luận 1 chút có lẽ là ra ngay.

ranhcon
03-01-2009, 11:14 AM
trong vòng lặp while bạn nên cho câu lệnh để cho nó thoát khỏi vòng lặp (ko nháy led nữa) khi nhấn 1 nút khác hoặc nhấn chính nút đấy 1 lần nữa, mình hay dùng lệnh goto label

dientudong
03-01-2009, 11:33 AM
mình thấy nó vẫn vậy mà bạn có cần thêm gôt label khong

dientudong
03-01-2009, 11:54 AM
à mình hiểu rồi,phải đặt lệnh goto label trong một hàm i f

dientudong
03-01-2009, 12:44 PM
Các bạn à , mình muốn dùng 1 nút nhấn , nhấn lần 1 thì thực hiện cộng việc 1,nhấn lần 2 thì thực hiện công việc 2, nhấn lần 3 thì thực hiện công việc 3.Mình chưa biết giải thuật thế nào .Mong các bạn chỉ bảo.

hung_nguyen
03-01-2009, 07:00 PM
nhưng sau khi nhất lần 3 thì chip có cần reset lại không? bạn có thể dùng hỏi vòng để kiểm tra trạng thái trên một chân nào đó được nối tới nút nhấn của bạn, khi có một thay đổi trạng thái tức là nút được nhấn thì bạn dùng một biết đếm (count chẳng hạn) tăng lên một. Sau đó dùng if kiểm tra nếu count=1 thì thực hiện công việc 1, count=2 thực hiện công việc 2...

dientudong
04-01-2009, 08:15 PM
Bạn à mình thấy lệnh set_tris_b(0x00) đâu có liên quan gì tới #use fast_io(b).Mình làm nhiều ví dụ và thấy vậy.Bạn có thể cho mình thấy ví dụ nào liên quan không .

dientudong
05-01-2009, 05:17 AM
#include "C:\Program Files\PICC\Examples\hienthiso.h"
#include "C:\Program Files\PICC\Drivers\LCD.C"
#use delay(clock=20000000)
#byte portD=0x08
#byte portB=0x06
#bit RB0=0x06.0
#use fast_io(b)
#use fast_io(d)
int8 mode,i,j;
#INT_EXT

void ext_isr()
{

mode++;
delay_ms(1);
if(mode==3)
{
mode=0;
}
}
void program1();
void program2();
void main()
{
mode=0;
set_tris_b(0b00000001);
portB=0x00;
set_tris_d(0);
portD=0x00;

enable_interrupts(int_ext);
ext_int_edge(H_TO_L);
enable_interrupts(GLOBAL);


while(1)
{

switch(mode)
{
case 1:program1();break;
case 2:program2();break;
}
}
}
void program1()
{
if(mode==1)
{
lcd_putc('\f');
for(i=0;i<5;i++)
{
lcd_init();
lcd_gotoxy(1,1);
lcd_putc("NGUYEN VAN THANH");
delay_ms(20);
lcd_gotoxy(1,1);
lcd_putc('\f');
delay_ms(20);

}
}
}

void program2()
{
if(mode==2)
{
lcd_putc('\f');
for(j=0;j<5;j++)
{
lcd_init();
lcd_gotoxy(1,1);
lcd_putc("HOANG THI HOAI MY");
delay_ms(20);
lcd_gotoxy(1,1);
lcd_putc('\f');
delay_ms(20);
}

}
}
Các bạn cho mình hỏi : mình dùng 1 nút nhấn(chân RB0) ,khi nhấn lần 1 thì thực hiện chương trình 1,nhấn lần 2 thì thực hiện chương trình 2,mình dùng ngắt RB0.Mình không biết là phần khai báo ngắt có vấn đề gì không ? Mong các bạn chỉ giúp !MÌnh làm cả đêm rồi mà không chạy được.

kimhuynguyen
05-01-2009, 07:48 AM
Bạn à mình thấy lệnh set_tris_b(0x00) đâu có liên quan gì tới #use fast_io(b).Mình làm nhiều ví dụ và thấy vậy.Bạn có thể cho mình thấy ví dụ nào liên quan không .

Những khai báo này là dẫn hướng cho trình biên dịch. Bạn có thể sẽ không "cảm nhận" được sự khác biệt.

Tham khảo chi tiết thêm phần Help của CCS.

dientudong
05-01-2009, 10:11 AM
còn vấn đề #20 ở trên của mình thì sao,các bạn chỉ giúp mình với

nguyenquoctoan
05-01-2009, 10:40 AM
-set_tris_b(0x00) là lấy port b là ngõ ra, giả sử khi đọc encoder hoặc đọc adc ngõ vào kô set làm ngõ vào sao mà chạy,...(theo em là như vậy kô biết các bác như nào)
- #20 ổ chổ nào đâu kô thấy ở đâu hít

dientudong
05-01-2009, 10:43 AM
file lcd.rar của mình và code ở trên đó mà

dientudong
05-01-2009, 10:48 AM
ý của mình là không có lệnh #use fast_io(b) thi lenh set_tris_b(0x00) van co hieu luc

nguyenquoctoan
05-01-2009, 11:13 AM
- trong filelcd.rar có hình mô phỏng ah
- #use fast_io(b) khi trong chương trình dùng các lệng như output_low(),...nó chỉ set chỉ với lệnh, nhanh hơn so với khi không dùng chỉ thị này (trích tài liệu ccs)
- trong hàm main() bạn phải dùng hàm set_tris_x() chỉ rõ chân vào ra
-- có nghĩa là sao, bạn có thể bỏ kô ảnh hưởng tới chương trình, nhưng phải có dòng lệnh set_tris_x() để chỉ rõ chân vào ra cho pic hỉu, kô có thì chương trình kô chạy

dientudong
05-01-2009, 11:22 AM
bạn giúp mình xem code cho mạch trong file lcd.rar.xem có vấn đề gì không

nguyenquoctoan
05-01-2009, 11:26 AM
trong file lcd.rar kô có code chỉ có hình mô phỏng bằng protues, bạn xem lại,...

dientudong
05-01-2009, 11:29 AM
code mình post cùng chỗ với file lcd.rar đó mà

nguyenquoctoan
05-01-2009, 11:41 AM
code của bạn chưa chạy hay sao, bạn đã nạp và mô phỏng chưa, ở đây mình kô có điều kiện để test thử trực tiếp,

dientudong
05-01-2009, 11:43 AM
nó chưa chạy được bạn à

dientudong
05-01-2009, 11:44 AM
lcd không hiển thị

longtu
05-01-2009, 02:24 PM
Nếu lenh If nam ngoai While-->lenh if se thuc hien 1 lan duy nhất, sau dó thuc hien doan chuong trinh chop tat
Nếu lenh If nam trong While-->sẽ kiểm tra lenh if truoc khi thuc hien doan chuong trinh chop tat

chú y: While(1): vong lap vo tan, tuong tu nhu la:

main:
...//chuong trinh ung dung o day
goto main;

Than,

dientudong
05-01-2009, 05:41 PM
tôi đang thắc vấn đề ở #20 của đề tài này

nguyenquoctoan
05-01-2009, 07:39 PM
#include "C:\Program Files\PICC\Examples\hienthiso.h"
#include "C:\Program Files\PICC\Drivers\LCD.C"
#use delay(clock=20000000)
#byte portD=0x08
#byte portB=0x06
#bit RB0=0x06.0
#use fast_io(b)
#use fast_io(d)
int8 mode,i,j;
#INT_EXT

void ext_isr()
{

mode++;
delay_ms(1);
if(mode==3)
{
mode=0;
}
}
void program1();
void program2();
void main()
{
mode=0;
set_tris_b(0b00000001);
portB=0x00;
set_tris_d(0);
portD=0x00;

enable_interrupts(int_ext);
ext_int_edge(H_TO_L);
enable_interrupts(GLOBAL);


while(1)
{

switch(mode)
{
case 1:program1();break;
case 2:program2();break;
}
}
}
void program1()
{
if(mode==1)
{
lcd_putc('\f');
for(i=0;i<5;i++)
{
lcd_init();
lcd_gotoxy(1,1);
lcd_putc("NGUYEN VAN THANH");
delay_ms(20);
lcd_gotoxy(1,1);
lcd_putc('\f');
delay_ms(20);

}
}
}

void program2()
{
if(mode==2)
{
lcd_putc('\f');
for(j=0;j<5;j++)
{
lcd_init();
lcd_gotoxy(1,1);
lcd_putc("HOANG THI HOAI MY");
delay_ms(20);
lcd_gotoxy(1,1);
lcd_putc('\f');
delay_ms(20);
}

}
}

đây là đoạn code #20 ở chổ nào đâu,...?