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 03-03-2008, 03:13 PM   #1
anh_gioi
Đệ tử 6 túi
 
Tham gia ngày: Oct 2006
Bài gửi: 147
:
Angry hỏi cách hiển thị adc của 16F877A lên LCD 1602

Trích:
#include <16F877.h>
#include"F:\nghiencuu2007\picc\DEFS_16F877a.h"
#fuses HS,NOWDT,NOPROTECT,NOLVP
#device 16F877*=16 ADC=8
#use delay(clock=8M,oscillator)
#use fast_io(b)
#use fast_io(d)
#byte portb = 0x06
#byte portd = 0x08

#define RS RD0
#define RW RD1
#define E RD2
#define lcd portb

//tao ham lenh ghi
void commwrite(){
//lcd=x;
RS = 0;
RW = 0;
E = 1;
E = 0;
delay_ms(50);
}
//tao ham gui du lieu
void datawrite(){
//lcd=x;
RS = 1;
RW = 0;
E = 1;
E = 0;
delay_ms(100);
}

int8 adc;
void main()
{


delay_ms(100); //tao ham tre de khoi dong LCD
lcd = 0x38;
commwrite();
LCD = 0x0c; //bat hien thi,tat con tro
commwrite();
lcd = 0x01;
commwrite();
lcd=0x06;
commwrite();
LCD = 0x85; //xuong dau dong
commwrite();


setup_adc(adc_clock_internal);
setup_adc_ports(ALL_ANALOG );
set_tris_b(0);
set_tris_d(0);
//output_b(0x00);
//output_d(0x00);
while(true)
{
set_adc_channel(0);
delay_ms(10);
adc=read_adc();
//lcd=adc;
printf(datawrite,adc);
delay_ms(10);
xin mọi người cho bít mình lỗi gì mà không hiển thị được
thank!!
anh_gioi vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 03-03-2008, 05:38 PM   #2
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Bạn đọc tài liệu hướng dẫn của CCS C để biết printf() sẽ ghi ra đâu và trong trường hợp muốn ghi ra LCD thì phải làm thế nào.

Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 03-03-2008, 10:51 PM   #3
anh_gioi
Đệ tử 6 túi
 
Tham gia ngày: Oct 2006
Bài gửi: 147
:
thay đổi cách ghi lên LCD

Trích:

#include <16F877.h>
#include"F:\nghiencuu2007\picc\DEFS_16F877a.h"
#fuses HS,NOWDT,NOPROTECT,NOLVP
#device 16F877*=16 ADC=8
#use delay(clock=8M,oscillator)
#use fast_io(b)
#use fast_io(d)
#byte portb = 0x06
#byte portd = 0x08

#define RS RD0
#define RW RD1
#define E RD2
#define lcd portb

//tao ham lenh ghi
void commwrite(){

RS = 0;
RW = 0;
E = 1;
E = 0;
delay_ms(50);
}
//tao ham gui du lieu
void datawrite(){

RS = 1;
RW = 0;
E = 1;
E = 0;
delay_ms(100);
}

int8 adc;
void main()
{

delay_ms(100); //tao ham tre de khoi dong LCD
lcd = 0x38;
commwrite();
LCD = 0x0c; //bat hien thi,tat con tro
commwrite();
lcd = 0x01;
commwrite();
lcd=0x06;
commwrite();
LCD = 0x85; //xuong dau dong
commwrite();


setup_adc(adc_clock_internal);
setup_adc_ports(ALL_ANALOG );
set_tris_b(0);
set_tris_d(0);

while(true)
{
set_adc_channel(0);
delay_ms(10);
adc=read_adc();
lcd=adc;
datawrite();
em đã thay đổi 1 chút rồi
anh xem hộ em với !
thank anh nhìu !!!
anh_gioi vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 03-03-2008, 11:44 PM   #4
david
Đệ tử 4 túi
 
david's Avatar
 
Tham gia ngày: Aug 2006
Bài gửi: 81
:
Với MikroC bạn chỉ mất 10 phút để làm việc với cái LCD !
david vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 04-03-2008, 12:06 AM   #5
anh_gioi
Đệ tử 6 túi
 
Tham gia ngày: Oct 2006
Bài gửi: 147
:
nếu nói vậy thì...pó tay.com
anh_gioi vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 04-03-2008, 03:06 AM   #6
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Viết như bạn đã sửa thì không ổn. Ví dụ, bạn đọc được giá trị 0x20 vào biến adc, sau đó bạn lại xuất trực tiếp giá trị của abc ra LCD, bộ điều khiển LCD sẽ hiểu là bạn muốn xuất 1 ký tự có mã hexadecimal là 0x20, nghĩa là ký tự khoảng trắng. Giả sử hàm ghi dữ liệu của bạn chạy tốt, bạn sẽ thấy có 1 khoảng trắng xuất hiện trên LCD (và thường là bạn không thấy gì, vì nó là khoảng trắng), dẫn đến bạn có thể kết luận là không xuất được gì ra LCD.

Đề nghị bạn làm như sau:
- Chỉ xuất một ký tự gì đó, 'A' chẳng hạn, ra LCD, để khẳng định bạn có thể ghi dữ liệu ra LCD (điều này cũng có nghĩa là các thao tác ghi lệnh trước đó đã thành công). Nếu bạn không xuất ký tự ra LCD được, bạn thử thực hiện quá trình reset mềm (tôi có viết đâu đó trên diễn đàn này, và cả bên www.dientuvietnam.net về quy trình này, 3 lần ghi lệnh 0x33, sau mỗi lần đều có delay, rồi mới thiết lập chế độ, ...)

- Đọc vào một giá trị ADC đã biết, và chuyển nó thành chuỗi ký tự tương ứng (tôi tin là CCS C có hàm chuyển đổi này, đó là itoa()), sau đó xuất ra LCD.

- Khi đã khẳng định được việc đọc từ module ADC và xuất ký tự ra LCD chạy tốt, bạn có thể ghép chúng lại để thực hiện công việc của bạn.

Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263

thay đổi nội dung bởi: namqn, 04-03-2008 lúc 07:36 AM.
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 04-03-2008, 07:29 AM   #7
david
Đệ tử 4 túi
 
david's Avatar
 
Tham gia ngày: Aug 2006
Bài gửi: 81
:
@anh_gioi:đúng như bác Nam nói,bạn đọc giá trị ở ADC sau đó ghi thẳng lên LCD là không ổn
bạn có thể làm thế này nhá: giả sử bạn có giả trị: adc = 1204
bạn lấy adc/1000 = 1----> 1+48 = 49 xuất giá trị 49 lên LCD bạn có số 1
lấy (adc/100)%10 =2----> 2+48=50 xuất giá trị 50 lên LCD ở vị trí tiếp theo bạn có số 2
.....
david vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 04-03-2008, 01:48 PM   #8
bien_van_khat
...Damned...
 
bien_van_khat's Avatar
 
Tham gia ngày: Apr 2006
Nơi Cư Ngụ: Hồ Chí Minh
Bài gửi: 522
:
Trong ANSI C cũng như CCS C, printf là một hàm định dạng chuỗi rất mạnh. Với CCS C mặc định chuỗi được định dạng sẽ xuất ra UART. Nhưng bạn có thể sử dụng printf để đẩy dữ liệu ra rất nhiều loại IO khác.

VD:
Code:
printf(io_putc, "format string", param....);
gọi như trên, printf sẽ định dạng chuỗi với các tham số. Sau đó chuỗi đã định dạng sẽ được xuất ra io dùng hàm io_putc theo từng ký tự (io_putc sẽ tuần tự đc gọi với tham số là mỗi ký tự trong chuỗi).

Vậy để dùng printf của CCS bạn phải viết io_putc theo mẫu
Code:
void io_putc(char c){
// write data to io
// wait for io operation to be completed
}
Nói dong dài, tóm lại bạn muốn xuất chuỗi ký tự, xuất số nguyên, số hex.... ra LCD, nếu dùng printf bạn ko cần tính toán gì hết, chỉ gọi và gọi. Còn cụ thể bạn xem help và code LCD mẫu của CCS.
__________________
- Xin đọc trước khi post bài

Xin đặt code trong thẻ [ code ] [ /code ]
bien_van_khat vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 19-03-2008, 11:43 PM   #9
anh_gioi
Đệ tử 6 túi
 
Tham gia ngày: Oct 2006
Bài gửi: 147
:
Pwm-adc

Trích:
//#include "C:\Documents and Settings\anh gioi\Desktop\adc\adc.h"
#include <16F877.h>
#include"F:\nghiencuu2007\picc\DEFS_16F877a.h"
#fuses HS,NOWDT,NOPROTECT,NOLVP
#device 16F877*=16 ADC=8
#use delay(clock=8M,oscillator)
#use fast_io(b)
#use fast_io(d)
#use fast_io(a)
#byte porta = 0x05
#byte portb = 0x06
#byte portd = 0x08






int8 adc1,adc2,adc3;
void main()
{


setup_adc(adc_clock_internal);
setup_adc_ports(ALL_ANALOG );
set_tris_b(0);
set_tris_d(0x02);
set_tris_a(0xff);


setup_timer_2 ( T2_DIV_BY_4, 0xc0, 2);
setup_ccp1(ccp_pwm);
setup_ccp2(ccp_pwm);






while(true)
{
if(input(pin_d1)==0)
{
set_adc_channel(0);
delay_ms(10);
adc1=read_adc();
//huong tien dong co 2,3 lam viec
if((adc1>=100)&(adc1<=156))
{
output_b(0x00); //tat dong co
set_pwm1_duty(0);
set_pwm2_duty(0);
}
else if((adc1>=50)&(adc1<100))//min tien2,3
{
output_b(0x01);
set_pwm2_duty(112);
}
else if(adc1<50) //max tien 2,3
{
output_b(0x02);
set_pwm2_duty(255);
}
// huong lui dong co 2,3 lam viec
else if((adc1>156)&(adc1<=210))//min
{
output_b(0x04);
set_pwm1_duty(112);
}
else if((adc1>210)&(adc1<=255))//max
{
output_b(0x08);
set_pwm1_duty(255);
}


//dong co 1,3 lv
set_adc_channel(1);
delay_ms(10);
adc2=read_adc();
//huong tien dong co 1,2
if((adc2>=100)&(adc2<=156))
{
output_b(0x00); //tat dong co
set_pwm1_duty(0);
set_pwm2_duty(0);
}
else if((adc2>=50)&(adc2<100))
{
output_b(0x10);
set_pwm2_duty(112);

}
else if(adc2<50)
{
output_b(0x20);
set_pwm2_duty(255);

}
// huong lui dong co 1,3
else if((adc2>156)&(adc2<=210))
{
output_b(0x40);
set_pwm1_duty(112);
}
else if((adc2>210)&(adc2<=255))
{
output_b(0x80);
set_pwm1_duty(255);

}


set_adc_channel(2);
delay_ms(10);
adc3=read_adc();
//huong tien dong co 1,2 lam viec
if((adc3>=100)&(adc3<=156))
{
output_b(0x00); //tat dong co
set_pwm1_duty(0);
set_pwm2_duty(0);
}
else if((adc3>=50)&(adc3<100))//min tien1,3
{
output_b(0x14);

}
else if(adc3<50) //max tien 2,3
{
output_b(0x28);

}
// huong lui dong co 2,3 lam viec
else if((adc3>156)&(adc3<=210))//min
{
output_b(0x41);

}
else if((adc3>210)&(adc3<=255))//max
{
output_b(0x82);

}
}

else
if(input(pin_d1)==1)


{
output_b(0x00); //tat dong co
set_pwm1_duty(0);
set_pwm2_duty(0);
delay_ms(800);
//tien 1
output_b(0x01);
set_pwm2_duty(112);
set_pwm1_duty(0);
delay_ms(800);

//lui 1
output_b(0x04);
set_pwm1_duty(112);
set_pwm2_duty(0);
delay_ms(1600);
//
output_b(0x01);
set_pwm2_duty(112);
set_pwm1_duty(0);
delay_ms(800);
//tien 2
output_b(0x10);
set_pwm2_duty(112);
set_pwm1_duty(0);
delay_ms(800);
//lui 2
output_b(0x40);
set_pwm1_duty(112);
set_pwm2_duty(0);
delay_ms(1600);
//
output_b(0x10);
set_pwm2_duty(112);
set_pwm1_duty(0);
delay_ms(800);
//tien 3
output_b(0x14);
set_pwm1_duty(0);
set_pwm2_duty(0);
delay_ms(800);
//lui 3
output_b(0x41);
set_pwm1_duty(0);
set_pwm2_duty(0);
delay_ms(1600);
//
output_b(0x14);
set_pwm1_duty(0);
set_pwm2_duty(0);
delay_ms(800);

}

}
}



cho em hỏi :
tại sao ma code của em phần trên điều chỉnh pwm bằng ADC rất yếu so với ko điều chỉnh bằng ADC.
em cho chạy trên mạch thật để điều chỉnh động cơ thì nó chạy yếu lắm so với lập trình cjay tư dộng(ko dùng ADC)????
anh_gioi vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 20-03-2008, 07:01 PM   #10
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Bạn nên kiểm tra tầm giá trị ADC mà bạn thực sự đọc về, rồi mới điều chỉnh code theo đó. Với cách viết của bạn, bạn đang giả thiết tầm giá trị ADC là từ 0 đến 255. Tuy nhiên, nếu thực tế bạn chỉ có được tầm giá trị từ 3 đến 100 chẳng hạn, thì bạn có thể hiểu vì sao điều chỉnh hết thang mà động cơ của bạn vẫn chạy như rùa.

Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 20-03-2008, 07:51 PM   #11
anh_gioi
Đệ tử 6 túi
 
Tham gia ngày: Oct 2006
Bài gửi: 147
:
Trích:
Nguyên văn bởi namqn View Post
Bạn nên kiểm tra tầm giá trị ADC mà bạn thực sự đọc về, rồi mới điều chỉnh code theo đó. Với cách viết của bạn, bạn đang giả thiết tầm giá trị ADC là từ 0 đến 255. Tuy nhiên, nếu thực tế bạn chỉ có được tầm giá trị từ 3 đến 100 chẳng hạn, thì bạn có thể hiểu vì sao điều chỉnh hết thang mà động cơ của bạn vẫn chạy như rùa.

Thân,
em có thể kiểm tra bằng mắt thường: trong mã code em thiết lập 2 giá tri độ rộng của xung.khi điều chỉnh em cũng thấy có sự thay đổi như vậy.như vậy thì ADC chắc ko có vấn đề gì chứ...???
anh_gioi vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 20-03-2008, 08:21 PM   #12
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi anh_gioi View Post
em có thể kiểm tra bằng mắt thường: trong mã code em thiết lập 2 giá tri độ rộng của xung.khi điều chỉnh em cũng thấy có sự thay đổi như vậy.như vậy thì ADC chắc ko có vấn đề gì chứ...???
Vậy vấn đề ở đây là phần cứng của bạn chứ không phải phần mềm. Phần mềm đã thực hiện đúng những gì bạn yêu cầu nó thực hiện.

Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn 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à 06:33 PM.


Đượ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