PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Các ngôn ngữ lập trình khác (CCS C, HT PIC,...)

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Tìm Kiếm Bài Trong Ngày Ðánh Dấu Ðã Ðọc Vi điều khiển

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 18-10-2010, 04:42 PM   #1
Meichan
Nhập môn đệ tử
 
Tham gia ngày: Jul 2010
Bài gửi: 5
:
Điều khiển LED sử dụng ADC của PIC12F675, HI TECH C

Công ty cho mình 3 con PIC12F675 để thưc tập, mình làm cháy mấy 2 rồi. Còn mỗi 1 con, ko dám cho chay nữa.
Ai đó trên diễn đàn test hộ code này hộ mình xem đã đúng chưa với. Thanks

---------------------------------
Yêu cầu
Sử dụng PIC12F675.
Đầu vào là GP1, xoay biến trở.
Đầu ra là GP0, nối với led.
Điều khiển độ sáng của led GPIO0 theo giá trị của biến trở GPIO1.
----------------------------------
File Kèm Theo
File Type: rar Adc_control.rar (1.0 KB, 101 lần tải)
Meichan vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 18-10-2010, 04:46 PM   #2
Meichan
Nhập môn đệ tử
 
Tham gia ngày: Jul 2010
Bài gửi: 5
:
Code:
----------------------------------------------------------------

#include <pic.h>
#ifndef _XTAL_FREQ
#define _XTAL_FREQ 4000000
#endif

__CONFIG(UNPROTECT & BORDIS & MCLRDIS & PWRTEN & WDTDIS & INTIO);

__IDLOC(0100);

#define VDD 5000

void ioport_adc() {
GPIO0 = 0; //output value
TRIS0 = 0; //output pin
ANS0 = 0; //digital pin

TRIS1 = 1; //input pin
ANS1 = 1; //analog input pin

ADON = 1; //ADコンバータを電源オンする
ADFM = 1; //AD変換結果データは右詰めるにする

ADCS0 = 1; //AD 変更クロックをFosc/8にする
ADCS1 = 0;
ADCS2 = 0;

CHS0 = 1; // AN1ピンの電圧をAD交換する
CHS1 = 0;

_delay(1000);

ADIF = 0; //割り込みフラグ。ピットを0にする

ADIE = 1; // PIE1レジスタに関連する割り込みを使
PEIE = 1;
GIE = 0; //we don't want interrupt
}

unsigned short adc_read () {
GODONE = 1;
_delay(1000);
while (GODONE);
return (ADRESH*256 + ADRESL); //return 8 MSB of the result
}

void putch(unsigned char tx_byte) {
unsigned char i;
GPIO0 =0;

_delay(1000);

for(i=0; i<8; i++) {
_delay(200);
GPIO0 = (tx_byte&0x01);

tx_byte>>=1;
tx_byte |= 0x80;
}
}

void adc_control () {

unsigned short volts;

ADIE = 1;
PEIE = 1;

while (1) {
ioport_adc();

_delay(200);
_delay(200);
_delay(200);

volts = (long)adc_read()*(VDD/255);
putch(volts);
}

}

void main(void) {
OSCCAL = _READ_OSCCAL_DATA();

ioport_adc();

while (1){
adc_control();

}
}
Meichan vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 19-10-2010, 10:59 AM   #3
nhanh0112
Đệ tử 4 túi
 
Tham gia ngày: May 2007
Bài gửi: 81
:
Tui hay viết bằng CCS nên ko hiểu đoạn code của bạn cho lắm :P. Nhưng có điều ở đây là: thường thì code sai thì cũng đâu có gây chết chip nhỉ?! Theo tui nghĩ chip của bạn chết nguyên nhân là do cấp nguồn sai hoặc bị quá nguồn thôi.
Gửi bạn 1 cái sơ đồ tương tự để tham khảo.
nhanh0112 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 19-10-2010, 11:46 AM   #4
Meichan
Nhập môn đệ tử
 
Tham gia ngày: Jul 2010
Bài gửi: 5
:
@nhanh0112
Hì, mình làm mạch vui lắm bạn ạ.

Lần đầu thì mắc ngược con điôt, vậy là điện 12V chạy qua. Xì luôn.

Lần thứ 2 thì đến giờ vẫn chưa biết lý do là vi sao nó chết. Chỉ có điều dùng PICKIT2 V2.61 thì ko tìm thấy device.

Còn 1 em cuối cùng.

Meichan vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 19-10-2010, 11:49 AM   #5
Meichan
Nhập môn đệ tử
 
Tham gia ngày: Jul 2010
Bài gửi: 5
:
Code mình sửa lại rồi. Nhưng chẳng hiểu sao LED nó cứ chập chờn nhỉ ?! Đau mắt quá.
Ai đó giải thích cho mình vì sao LED nó cứ nháy liên tục được ko ?!

__________________________________________________ _

#include <pic.h>
#ifndef _XTAL_FREQ
#define _XTAL_FREQ 4000000
#endif

__CONFIG(UNPROTECT & BORDIS & MCLRDIS & PWRTEN & WDTDIS & INTIO);

__IDLOC(0100);

#define VDD 5000

void ioport_adc() {
GPIO0 = 0; //output value
TRIS0 = 0; //output pin
ANS0 = 0; //digital pin

TRIS1 = 1; //input pin
ANS1 = 1; //analog input pin

ADON = 1; //ADコンバータを電源オンする
ADFM = 1; //AD変換結果データは右詰めるにする

ADCS0 = 1; //AD 変更クロックをFosc/8にする
ADCS1 = 0;
ADCS2 = 0;

CHS0 = 1; // AN1ピンの電圧をAD交換する
CHS1 = 0;

//_delay(1000);

ADIF = 0; //割り込みフラグ。ピットを0にする

ADIE = 1; // PIE1レジスタに関連する割り込みを使
PEIE = 1;
GIE = 0; //we don't want interrupt
}

unsigned short context;

unsigned short adc_read () {
if (!GODONE) {
GODONE = 1;
context = (ADRESH*256 + ADRESL);
}
return context; //return 8 MSB of the result
}

void delay_option (unsigned char counter) {
unsigned char tempt;
tempt = counter/10;
do {
_delay(10);
} while(--tempt);
}

void main(void) {
OSCCAL = _READ_OSCCAL_DATA();

ioport_adc();
unsigned short ad_value;
unsigned short light_time;
while (1){
ioport_adc();
ad_value = (adc_read()*VDD)/1023;
light_time = ((ad_value*2000)/VDD);
GPIO0 = 0;
delay_option(light_time);
GPIO0 = 1;
delay_option(2000-light_time);
}
}
Meichan vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời

Ðiều Chỉnh
Xếp Bà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à 05:18 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