PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Các ngôn ngữ lập trình khác (CCS C, HT PIC,...) (http://www.picvietnam.com/forum/forumdisplay.php?f=12)
-   -   CCS C cho PIC/dsPIC phiên bản 4.xxx (http://www.picvietnam.com/forum/showthread.php?t=2296)

bean984 04-07-2008 03:33 PM

cho mình hỏi về cái timer0?????
mình đang gặp một lỗi khi sử dụng timer0. hiện tượng mình gặp phải là lần đầu tiên khi cắm điện vào bo thử để chạy test timer0 thì cái timer0 chạy không đúng(cụ thể là thời gian ngắt nó bị chậm rất nhiều). nhưng những lần tiếp theo đó(k ngắt nguồn điện) thì nó lại chạy đúng.và nếu cứ ngắt nguồn điện thì lại bị hiện tượng này.
ai biết nguyên nhân của lỗi này xin chỉ giúp mình với.
cảm ơn!

Duykiban 11-07-2008 11:41 PM

Cho mình hỏi mình dùng CCSC 3.249 viết cho Pic 16F877A mà bộ nhớ Rom chỉ khoảng 70% là trình dịch báo out of rom! tại sao thế nhỉ?

vandungevn 12-07-2008 09:06 AM

RTCC_INTERNAL // Chọn xung kích bên trong
T1_EXTERNAL // chọn xung kích bên ngoài theo đường TOCK
RTCC_EXT_L_TO_H // Xung kicks từ LOW -> High ( sườn "+" )
RTCC_EXT_H_TO_L // Xung kicks từ Hight -> Low ( sườn "-" )


ps_state là một trong những constant sau:

RTCC_DIV_2 // chọn cái tỉ số chia này có nghĩa j , có fai cứ 2 xung thì nó tăng bộ đếm lên 1
RTCC_DIV_4
RTCC_DIV_8
RTCC_DIV_16
RTCC_DIV_32
RTCC_DIV_64
RTCC_DIV_128

chia tần số đầu vào xung kích, đúng như bạn nói,

chúc bạn thành công

vandungevn 12-07-2008 09:17 AM

có các thắc mắc gì các bạn vào trong nay tham khảo thêm nhé, có đủ các cách lập trình cho 16F877A http://www.picvietnam.com/forum/showthread.php?t=357.
http://www.picvietnam.com/forum/forumdisplay.php?f=12

Chúc thành công.

tungtuantu 12-07-2008 05:06 PM

bác cho em xin bản mới mà lập trình dc DsPIC đó, e down vài bản rồi đều không hỗ trợ dspic, nhân tiện cho em hỏi, bác nào lập trình cái này cho dspic thì có thấy khác hơn so với pic thường ko ah, thàng này so với thằng C30 có hơn ko ah

ngtdung.nguyen 13-07-2008 04:54 PM

Em dùng Wizard của CCS 4.065, tạo chương trình xuất xung PWM cho PIC6F877A như sau:
(mục đích là tần số điều xung= 10kHz, 2 xung độ rộng 30% và 80%)

#include "F:\TRANNING-PIC\PWM.H"

void main()
{
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_4,124,1); //tần số PWM = 10kHz
setup_ccp1(CCP_PWM);
setup_ccp2(CCP_PWM);
set_tris_c(0x00);
set_pwm1_duty(150); // độ rộng xung 30%
set_pwm2_duty(400); // độ rộng xung 80%
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);

while (1);
}

Mô phỏng bằng Proteus 7.2 cho thấy xung ra bị sai, cả về tần số và độ rộng xung
(xin lỗi các bác em chưa biết cách post hình lên)

Khi cài lại duty cycle, thì mô phỏng cho thấy xung ra đúng:

set_pwm1_duty(37);
set_pwm2_duty(100);


2 trường hợp này sai lệch nhau ở hệ số nhân 4 là hệ số chia tần đưa vào timer2.
Em đọc Data sheet thấy trường hợp 1 do CCS tự tính giá trị value là hợp với miêu tả về PWM. Tuy nhiên mô phỏng thấy sai.

Em có mạch chạy PIC tuy nhiên không có Oscilocope nên không biết thực tế ra sao.
Em không biết đây là do CCS sai hay do Proteus mô phỏng sai.

Mong các bác giải đáp giúp em với. Em xin cám ơn.

tungtuantu 21-07-2008 11:59 PM

em rât mong bác nào có tàiliệu hướng dẫn dùng CCS cho DsPIC cả anh lẫn việt cũng được, post lên cho anh em với, bác nào chỉ bảo luôn dùng phiên bản nào đầy đủ của CCS để lập trình cho DSPIC với

picpen 22-07-2008 12:57 AM

a ha. ccs ko sai và protues cũng chẳng có vấn đề gì đâu, mà vấn đề nằm ở hai thông số : period ( 124 ) và giá trị value(400) trong lệnh set_pwmx_duty(value)
thứ nhất : 2 giá trị period và value phải nằm trong khoảng : 0..255
thứ hai : khi bạn điều xung như trên thì giá trị : value luôn phải < period ( nếu value = period thì tần số bạn thu được sẽ =0 , nếu value > period thì xung ra là trùm xung ko như bạn tính toán )
Bạn đọc kỹ lại về cấu tạo và hoạt động của bộ tham 2 cũng như khối PWM
***** chúc thành công ********

dungnt7 26-07-2008 08:17 PM

Trích:

Nguyên văn bởi picpen (Post 17601)
a ha. ccs ko sai và protues cũng chẳng có vấn đề gì đâu, mà vấn đề nằm ở hai thông số : period ( 124 ) và giá trị value(400) trong lệnh set_pwmx_duty(value)
thứ nhất : 2 giá trị period và value phải nằm trong khoảng : 0..255
thứ hai : khi bạn điều xung như trên thì giá trị : value luôn phải < period ( nếu value = period thì tần số bạn thu được sẽ =0 , nếu value > period thì xung ra là trùm xung ko như bạn tính toán )
Bạn đọc kỹ lại về cấu tạo và hoạt động của bộ tham 2 cũng như khối PWM
***** chúc thành công ********

Theo mình biết thì giá trị value được biểu diễn bằng 10bit, giá trị lớn nhất của value là 1024.

Value không phải lúc nào cũng nhỏ hơn period, theo datasheet thì (pwm_duty/pwm_period)=(value/(4*(tmr2+1))).

Đoạn chương trình sau xuất xung PWM 50%, f=5Khz, ở chân CCP1
void main()
{
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_4,249,1);
setup_ccp1(CCP_PWM);
set_pwm1_duty(512);
set_tris_c(0x00);
}


Vấn đề của bạn ngtdung.nguyen mình cũng chưa hiểu vì sao bị như vậy.

cong1810 11-08-2008 06:01 PM

Trích:

Nguyên văn bởi ngtdung.nguyen (Post 17405)
Em dùng Wizard của CCS 4.065, tạo chương trình xuất xung PWM cho PIC6F877A như sau:
(mục đích là tần số điều xung= 10kHz, 2 xung độ rộng 30% và 80%)

#include "F:\TRANNING-PIC\PWM.H"

void main()
{
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_4,124,1); //tần số PWM = 10kHz
setup_ccp1(CCP_PWM);
setup_ccp2(CCP_PWM);
set_tris_c(0x00);
set_pwm1_duty(150); // độ rộng xung 30%
set_pwm2_duty(400); // độ rộng xung 80%
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);

while (1);
}

Mô phỏng bằng Proteus 7.2 cho thấy xung ra bị sai, cả về tần số và độ rộng xung
(xin lỗi các bác em chưa biết cách post hình lên)

Khi cài lại duty cycle, thì mô phỏng cho thấy xung ra đúng:

set_pwm1_duty(37);
set_pwm2_duty(100);


2 trường hợp này sai lệch nhau ở hệ số nhân 4 là hệ số chia tần đưa vào timer2.
Em đọc Data sheet thấy trường hợp 1 do CCS tự tính giá trị value là hợp với miêu tả về PWM. Tuy nhiên mô phỏng thấy sai.

Em có mạch chạy PIC tuy nhiên không có Oscilocope nên không biết thực tế ra sao.
Em không biết đây là do CCS sai hay do Proteus mô phỏng sai.

Mong các bác giải đáp giúp em với. Em xin cám ơn.


mình cũng mới tìm hiểu về PIC và PWM!
vần đề của bạn là ở chỗ duty(150) và 400. đó là 150 là 1 số int còn 400 là số long int.cái này được đề cập trong VDu PWM của CCS c.nếu là duty là số int thì công thức tính: value=4*duty/clock*t2div.
nếu là số long int thì value=duty/clock*t2div.
thân!!

cong1810 11-08-2008 06:07 PM

các bác cho em hỏi.em viết 1 đoạn code PWM nhỏ và mô phỏng.
lúc để value là hằng số thì mô phỏng đúng.
còn để value là biến số thì mô phỏng ko chạy gì hết.em mất cả buổi mà ko biết tại sao?
các sư huynh chỉ giáo!!em dùng 1 phím nhấn để tăng duty!!

Code:

#include<16f877a.h>
#fuses XT,NOPROTECT,NOLVP,NOWDT
#use delay(clock=4000000)
#byte portb=0x06
int8 value=0,period=200,percent=0;
#int_RB
void inter_RB()
{
if(percent==100)
  {
  percent=100;
  }
else
  {
  percent=percent+5;
  }
}
main()
{
set_tris_c(0x00);
set_tris_b(0b00010000);
portb=0x00;
enable_interrupts(INT_RB);
enable_interrupts(global);
ext_int_edge(l_to_h);
setup_CCP1(CCP_PWM);
setup_timer_2(t2_div_by_1,199,1);

while(1)
{
 value=percent*period/100;
  set_pwm1_duty(value);
}
}


vietkhanh 12-08-2008 07:09 PM

1 Attachment(s)
cho em hỏi tí các anh sao khi em viết chương trình nào mà có dùng thư viện LCD của CCS thì đều bị lỗi khi biên dịch ạ,có hình đính kèm.

cong1810 13-08-2008 12:48 AM

vấn đề là ở file chính.còn file lcd.c hoàn toàn đúng.

picpen 13-08-2008 05:00 PM

Cong1810 ! Mình nghĩ biểu thức bạn dùng để tính giá trị value ko ổn ," value=percent*period/100; " , 3 biến value,percent,period bạn đều định nghĩa dạng INT8 ,vậy khi chương trình thực hiện biểu thức nó sẽ làm phép nhân trước " percent*period " ,giá trị của phép nhân này có thể lớn hơn 8 bit ( thường phải lưu vào biến 16 bit) ,nếu giá trị này lưu vào biến 8 bit nó có thể bị tràn và dẫn tới kết quả tính toán bị sai .
Mình thấy đoạn khai báo chương trình chính của bạn sai cú pháp : phải là , VOID main() ( thiếu VOID nha )

namqn 13-08-2008 06:11 PM

Với C (kiểu dữ liệu của CCS C), bạn có thể viết tổng quát như sau:
Code:

        value = (int16 (percent*period))/100;
Trong trường hợp cụ thể mà bạn dùng để thử xem nút nhấn có thay đổi được duty cycle hay không, period = 200, do đó có thể viết gọn lại là:
Code:

        value = percent*2;
sẽ không xảy ra tràn số đối với value.

Thân,

cong1810 14-08-2008 11:35 AM

Trích:

Nguyên văn bởi picpen (Post 18127)
Cong1810 ! Mình nghĩ biểu thức bạn dùng để tính giá trị value ko ổn ," value=percent*period/100; " , 3 biến value,percent,period bạn đều định nghĩa dạng INT8 ,vậy khi chương trình thực hiện biểu thức nó sẽ làm phép nhân trước " percent*period " ,giá trị của phép nhân này có thể lớn hơn 8 bit ( thường phải lưu vào biến 16 bit) ,nếu giá trị này lưu vào biến 8 bit nó có thể bị tràn và dẫn tới kết quả tính toán bị sai .
Mình thấy đoạn khai báo chương trình chính của bạn sai cú pháp : phải là , VOID main() ( thiếu VOID nha )

ừ nhỉ.mình ko để ý đến việc này.
cái void main.mình thấy ko có void nó vẫn hoạt động bình thường mà!!
nhưng mà mình sửa như bạn và anh namqn nói.mô phỏng vẫn ko chạy.
nhưng khi đổi sang ngắt ngoài thì ok!!
vậy tại sao vậy nhỉ!!

picpen 16-08-2008 10:48 PM

Số thực với LCD & Led7seg....
 
Khi mới học lập trình thì những bài toán giao tiếp với LCD và led 7 thanh là rất cơ bản và đơn giản.
Vậy mà đã học được 1 thời gian rùi nay mình lại bị mắc một bài toán : " Hiển thị giá trị số thực lên LCD và Led 7 thanh "
Nhờ các bá cao thủ trên diễn đàn chỉ giáo, ko biết làm thế nào để xác định giá trị trong một biến là số thực hay số nguyên ??? Rồi lại còn phải tách phần nguyên và phần thập phân nữa chứ ....... hóc búa quá .** Mong được mọi người chỉ giáo ...thank ****

picpen 17-08-2008 12:07 AM

trả lời cong810
 
Cong810 ! mình đã load bài của bạn về và chỉnh sửa 1 chút xíu, và giờ thì nó chạy ngon lành rùi, bạn bị mắc một lỗi rất nhỏ lên khó phát hiện ra khi chỉnh sửa.
Khi chương trình nhảy đến trình phục vụ ngắt Rb,nó sẽ thực hiện các câu lệnh trong đó,bạn dùng chân Rb4 để thực hiện phục vụ ngắt,nếu trong trình phục vụ ngắt bạn kiểm tra xem Rb4 có =1 ko, nếu =1 thì thực hiện việc thay đổi giá trị biến " percent " ,nếu ko thoát khỏi trình phục vụ ngắt ,như vậy chương trình sẽ chạy ngon lành
đây là chương trình mình đã sử và cho chạy mo fong được rồi

Code:

...#include<16f877a.h>
#fuses XT,NOPROTECT,NOLVP,NOWDT
#use delay(clock=4000000)
#byte portb=0x06
int8 value=0,period=200,percent=0;
#int_RB
void inter_RB()
{
if( rb4 =1)      // phai kiem tra Rb4 nhe
  { 
      if(percent==100)percent=100;
       
      else percent=percent+5;
  }   
}
main()
{
set_tris_c(0x00);
set_tris_b(0b00010000);
portb=0x00;
enable_interrupts(INT_RB);
enable_interrupts(global);
ext_int_edge(l_to_h);
setup_CCP1(CCP_PWM);
setup_timer_2(t2_div_by_1,199,1);

while(1)
{
 value=percent*period/100;
  set_pwm1_duty(value);
}
}


picpen 19-08-2008 01:29 PM

có ai biết thì giúp mình giải quyết vấn đề : Hiển thị giá trị số thực lên LCD và led 7 thanh với *********** thank ***********

picpen 20-08-2008 11:39 PM

Mòn mỏi đợi chờ ,ý kiến góp ý ,gợi ý giúp đỡ chỉ giáo của anh em trong gia đình pic mà ko có ai quan tâm giúp đỡ hic ... hic ... Chắc câu hỏi của mình chuối quá hay thiếu " I ỐT " ko biết nữa..hic ...hic

namqn 21-08-2008 12:01 AM

Trích:

Nguyên văn bởi picpen (Post 18229)
có ai biết thì giúp mình giải quyết vấn đề : Hiển thị giá trị số thực lên LCD và led 7 thanh với *********** thank ***********

Bạn đã đọc tài liệu hướng dẫn của CCS C chưa? Tôi không dùng CCS C, nhưng đọc qua tài liệu hướng dẫn của CCS C thì nhận thấy những điểm sau:

- Hàm printf có thể in số thực (float), có định dạng
- Hàm printf có thể xuất kết quả đến một hàm khác, thay vì ra stdout

Vậy có thể dùng hàm printf() để in số thực (float) của bạn đến một hàm nào đó, mà hàm đó sẽ xuất kết quả này lên LCD/LED 7 thanh.

Thân,

phamminhtuan 21-08-2008 12:52 AM

Trích:

Nguyên văn bởi picpen (Post 18229)
có ai biết thì giúp mình giải quyết vấn đề : Hiển thị giá trị số thực lên LCD và led 7 thanh với *********** thank ***********

Bạn có thể sử dụng như sau cho LCD, dùng thư viện lcd.c của CCS luôn, nếu cần xuất cho led 7 thanh hay cái gì đó thì bạn viết lại 1 hàm giống như hàm lcd_putc() của thư viện này cũng được.
PHP Code:

float fvar 1.2345;
printf(lcd_putc"Float: %f"fvar); 

Nếu muốn in ra LED 7 thanh thì bạn có thể viết 1 hàm chuyển đổi ascii sang mã 7 thanh lưu trong 1 vùng RAM, tham số truyền vào là kí tự ascii, chương trình của bạn sẽ hiển thị vùng RAM đó ra LED 7 thanh, hàm này viết cấu trúc giống như lcd_putc là ok
Hàm lcd_putc như thế này
PHP Code:

void lcd_putcchar c) {
   switch (
c) {
     case 
'\f'   lcd_send_byte(0,1);
                   
delay_ms(2);
                                           break;
     case 
'\n'   lcd_gotoxy(1,2);        break;
     case 
'\b'   lcd_send_byte(0,0x10);  break;
     default     : 
lcd_send_byte(1,c);     break;
   }


có thể sửa lại giống thế này
PHP Code:

unsigned char ptr 0;
unsigned char buffer[10]; //vùng RAM chứa mã LED 7 đoạn để xuất ra, ở đây là 10 LED
void led7segchar c) {
    
unsigned num;
    
num 0x30;
    
buffer[ptr] = table_led7doan[num];
    
ptr++;
    if(
ptr>=10ptr 0;
}
//với table_led7doan[] là bảng const chứa mã 7 đoạn từ 0-9
//Bạn muốn in từ vị trí nào thì cho ptr bằng giá trị đó


//Bạn sử dụng hàm printf như sau
printf(led7seg"Float: %f",fvar);
//đảm bảo chạy 100% 


kebitmat_f 21-08-2008 09:23 AM

Mình thấy khi lập trình ccs khai báo clock=20MHz, nhưng mô phỏng bằng proteus, mục processor clock frequency =4Mhz. 1 cái nữa là thiết kế mạch dao động chọn thạch anh là 20Mhz. Như thế chương trình sẽ chạy theo 4Mhz hay 20Mhz? Tóm lại nó sẽ chạy theo ccs,proteus hay mạch cứng thạch anh? rối quá.... Mong bà kon chỉ bảo sớm.

kebitmat_f 21-08-2008 09:32 AM

Cho mình hỏi thêm 1 cái nữa : khi sử dụng thạch anh 4Mhz thì chu kì thực thi 1 lệnh của vi điều khiển là 1micros. khi sử dụng thạch anh 20Mhz thì chu kì sẽ khác. Vì trong cái tutor của Nguyễn Trung Chính ở bài " Pic6f877a từ dễ tới khó" có đề cập đến vấn đề này. Sử dụng hàm tạo trễ: thời gian trễ = số chu kì lệnh*thời gian 1 lệnh .Như vậy có điều gì khác khi gọi hàm delay_ms(100) ứng với chọn thạch anh 4Mhz và 20Mhz?

phamminhtuan 21-08-2008 11:49 AM

Trích:

Nguyên văn bởi kebitmat_f (Post 18289)
Mình thấy khi lập trình ccs khai báo clock=20MHz, nhưng mô phỏng bằng proteus, mục processor clock frequency =4Mhz. 1 cái nữa là thiết kế mạch dao động chọn thạch anh là 20Mhz. Như thế chương trình sẽ chạy theo 4Mhz hay 20Mhz? Tóm lại nó sẽ chạy theo ccs,proteus hay mạch cứng thạch anh? rối quá.... Mong bà kon chỉ bảo sớm.

Khai báo #use delay(clock=xxMhz) là chỉ dẫn để CCS tạo ra mã delay đúng với tần số thạch anh mà mình sử dụng, ví dụ bạn sử dụng thạch anh 4Mhz, thì khai báo #use delay(clock=4Mhz), như thế thì cái hàm delay_ms(100) mới delay đúng 100ms, còn nếu bạn khai báo 4Mhz, nhưng sử dụng thạch anh 20Mhz thì dĩ nhiên hàm delay đó sẽ không còn đúng nữa, lúc này thay vì 100ms thì nó chỉ còn 100/5 = 20ms thôi, ngoài ra nếu bạn sử dụng UART cũng không đúng, vì clock bạn khai báo sai mà.

Thế nên, bạn cứ ép buộc nó chạy thì nó vẫn chạy, không theo ý bạn thôi, muốn nó chạy đúng thì phần cứng ra làm sao, khai báo trong phần mềm như vậy

kebitmat_f 21-08-2008 05:33 PM

Thanks nhiều nha. Mình hiểu rồi

nguyentanxuyen 21-08-2008 06:57 PM

mình rất cần phần mềm để viết chương trình nap cho PIC. bạn chia sẽ cho mình với. thanks

namqn 21-08-2008 07:09 PM

Trích:

Nguyên văn bởi nguyentanxuyen (Post 18304)
mình rất cần phần mềm để viết chương trình nap cho PIC. bạn chia sẽ cho mình với. thanks

Những thông tin liên quan đến PIC dành cho người mới học:
http://www.picvietnam.com/forum//showthread.php?t=4

Thân,

picpen 22-08-2008 10:24 PM

Cám ơn bác Nam và bác PhạmMinhTuan nhiều !! đúng là em lười biếng quá ,trong tài liệu về css có nói tới hàm printf(), em thấy hàm này rất mạnh và ngắn ngọn, cách use nó trong ccs giống hệt khi use nó trong tubo c ( c căn bản ) hi ..hi..
Từ giờ em phải chịu khó đọc thật nhiều tài liệu mới được, không cái gì cũng đem hỏi các bác thế này thì " quê" quá hic..hic
Như 2 bác chỉ thì em đã hiển thị được số thực lên LCD một cách ngon lành rùi ..... Nhưng vấn đề về led 7 thanh thì em chưa rõ nắm .theo em suy luận thì thế này nhé : giả sử ta có 1 biến giá trị là " VALUE " chẳng hạn , nếu giá trị này là số nguyên thì em biết cách hiển thị rồi ,nhưng nếu nó là số thực thì theo em đầu tiên ta phải tách các chữ số ( bcd) trong giá trị đó ra thành các số như: số hàng trăm,chục,đơn vị..( các số phần nguyên),sau đó xác định các chữ số phần thập phân rồi xác định dấu chấm nằm ở đâu . sau đó ta mới xuất các giá trị đó ra cổng kết nối với led 7 thanh ........
Dù đã cố gấng đọc ct của bác Phamminhtuan em vẫn chưa hiểu sao lại dùng hàm printf() xuất ra led 7 thanh
printf(led7seg, "Float: %f",fvar);???????
**** Cám ơn bác ,mong bác chỉ rõ hơn ********** Thank ********

phamminhtuan 22-08-2008 11:56 PM

Trích:

Nguyên văn bởi picpen (Post 18332)
Cám ơn bác Nam và bác PhạmMinhTuan nhiều !! đúng là em lười biếng quá ,trong tài liệu về css có nói tới hàm printf(), em thấy hàm này rất mạnh và ngắn ngọn, cách use nó trong ccs giống hệt khi use nó trong tubo c ( c căn bản ) hi ..hi..
Từ giờ em phải chịu khó đọc thật nhiều tài liệu mới được, không cái gì cũng đem hỏi các bác thế này thì " quê" quá hic..hic
Như 2 bác chỉ thì em đã hiển thị được số thực lên LCD một cách ngon lành rùi ..... Nhưng vấn đề về led 7 thanh thì em chưa rõ nắm .theo em suy luận thì thế này nhé : giả sử ta có 1 biến giá trị là " VALUE " chẳng hạn , nếu giá trị này là số nguyên thì em biết cách hiển thị rồi ,nhưng nếu nó là số thực thì theo em đầu tiên ta phải tách các chữ số ( bcd) trong giá trị đó ra thành các số như: số hàng trăm,chục,đơn vị..( các số phần nguyên),sau đó xác định các chữ số phần thập phân rồi xác định dấu chấm nằm ở đâu . sau đó ta mới xuất các giá trị đó ra cổng kết nối với led 7 thanh ........
Dù đã cố gấng đọc ct của bác Phamminhtuan em vẫn chưa hiểu sao lại dùng hàm printf() xuất ra led 7 thanh
printf(led7seg, "Float: %f",fvar);???????
**** Cám ơn bác ,mong bác chỉ rõ hơn ********** Thank ********

Có lẽ cũng là bạn bên dientuvietnam.net: http://dientuvietnam.net/forums/show...68&postcount=6
Mình đã viết rõ trong luồng này rồi, cái bảng table_led7doan[] định nghĩa const với 20 giá trị là mã 7 đoạn từ 0-9 và mã 7 đoạn từ 0-9 có dấu chấm,

luanktd 23-08-2008 03:06 AM

Mình muốn hỏi các bác.Mình có viết một chương trình sau với PIC8F4431 nhưng khi dịch ra chạy thì chạy không đươc
Code:

#include<18f4431.h>
#fuses NOWDT,NOLVP,PUT,XT
#byte PORTB=0xF81
#byte TRISB=0xF93
void main()
{
 While(1)
  {
  TRISB=0x00;
  PORTB=0x0F;
  }
}

Các chân ở portB đều là 0V hết.Mong các bác chỉ giáo

picpen 23-08-2008 07:07 PM

Chương trình của bạn thiếu hàm khai báo sử dụng tần số thạch anh cho pic :
#use delay(clock= x ) , x là tần số thạch anh mà bạn dùng cho pic ,nó có thể là 4Mhz ,10,12 hoặc 20Mhz tùy bạn chọn.

namqn 23-08-2008 07:47 PM

Trích:

Nguyên văn bởi luanktd (Post 18342)
Mình muốn hỏi các bác.Mình có viết một chương trình sau với PIC8F4431 nhưng khi dịch ra chạy thì chạy không đươc
Code:

#include<18f4431.h>
#fuses NOWDT,NOLVP,PUT,XT
#byte PORTB=0xF81
#byte TRISB=0xF93
void main()
{
 While(1)
  {
  TRISB=0x00;
  PORTB=0x0F;
  }
}

Các chân ở portB đều là 0V hết.Mong các bác chỉ giáo

Bạn chạy thử bằng mô phỏng hay mạch thật? Nếu thử bằng mạch thật thì tần số thạch anh được sử dụng là bao nhiêu?

PIC18F4431 có 7 từ cấu hình, trong đó tối thiểu các từ cấu hình 1 đến 4 cần được thiết lập giá trị ban đầu. Bạn chỉ thiết lập có vài cụm cấu hình trong số đó. Tôi đã gặp nhiều trường hợp PIC18F không chạy trong mạch thật, chỉ vì thiết lập thiếu các từ cấu hình.

Khi viết code cho PIC18, tôi luôn thiết lập đầy đủ các từ cấu hình. Ví dụ dưới đây viết cho MPLAB C18, dùng cho các PIC18 như PIC18Fx320:
Code:

//Configuration bits
#pragma config OSC = INTIO1
#pragma config FSCM = OFF
#pragma config IESO = OFF
#pragma config PWRT = OFF
#pragma config BOR = ON
#pragma config BORV = 27
#pragma config WDT = OFF
#pragma config WDTPS = 32768
#pragma config MCLRE = ON
#pragma config PBAD = DIG
#pragma config CCP2MX = C1
#pragma config STVR = ON
#pragma config LVP = OFF
#pragma config DEBUG = OFF
#pragma config CP0 = OFF
#pragma config CP1 = OFF
#pragma config CP2 = OFF
#pragma config CP3 = OFF
#pragma config CPB = OFF
#pragma config CPD = OFF
#pragma config WRT0 = OFF
#pragma config WRT1 = OFF
#pragma config WRT2 = OFF
#pragma config WRT3 = OFF
#pragma config WRTB = OFF
#pragma config WRTC = OFF
#pragma config WRTD = OFF
#pragma config EBTR0 = OFF
#pragma config EBTR1 = OFF
#pragma config EBTR2 = OFF
#pragma config EBTR3 = OFF
#pragma config EBTRB = OFF

Thân,

popeye_ts22 26-08-2008 11:55 PM

Em đọc về ADC rùi gửi lên LCD mà sao chẳng thấy hiển thị đúng ADC mà toàn ra giá trị lung tung các bác ạ.Em bỏ chân biến trở ra mà màn hình vẫn cứ hiện giá trị lung tung.Em biết đấy không phải là ADC nhưng không hiểu vì sao.Các bác giúp thằng em với..
Code:

#include <16f877a.h>
#include <def_877a.h>
#device 16F877*=16 ADC=10
#use delay(clock=8000000)
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#include <lcd_lib_4bit.c>

unsigned int  a,b,c,d,adc;
long value;
char *text;
void main()
{
  set_tris_d(0);
  setup_adc_ports( AN0_AN1_AN3 );
  setup_adc(ADC_CLOCK_INTERNAL);
  set_adc_channel( 0 );
  delay_ms(100);
  text="V";
  while(1)
  {
  adc=read_adc();
  //value=(adc*5000)/1023;
 
  value = (long)adc * 5000; // covert adc reading to milivolts
  value = value / 1023; // 0..1023 -> 0-5000mV
  a=value/1000;
  b=(value-(a*1000))/100;
  c=(value-(a*1000)-(b*100))/10;
  d=(value-(a*1000)-(b*100)-(c*10));
  LCD_Init();
  LCD_putcmd(0x80);
  LCD_putchar(48+a);
  LCD_putcmd(0x81);
  LCD_putchar(48+b);
  LCD_putcmd(0x82);
  LCD_putchar(48+c);
  LCD_putcmd(0x83);
  LCD_putchar(48+d);
  LCD_putcmd(0x84);
  LCD_putchar(text);
  delay_ms(100);
  }
}


popeye_ts22 27-08-2008 12:23 AM

Em còn 1 số câu hỏi nữa tiện thể các bác trả lời luôn cho em:
- Có set đc 1 chân khác của PIC làm chân PWM không ạ.
- Khi Timer2 hoạt động PWM thì còn mình còn dùng làm Timer để đếm thời gian được không.Nếu điều khiển 2 động cơ cùng 1 lúc thì bắt buộc phải dùng đến Timer0,timer1 để đếm xung về,và như thế là hết các bộ timer,counter phải ko ạ.
- ADC có 8 kênh,nếu em dùng cả 8 kênh thì Vref=Vdd.Vậy thì ADC sẽ rất dễ bị nhiễu đúng không ạ.Có cách nào khắc phục được không ạ.
- Trong CCS mình chỉ cần chọn ALL ANALOG là chip mặc định Vref=Vdd có phải ko ạ.

namqn 27-08-2008 02:09 AM

Trích:

Nguyên văn bởi popeye_ts22 (Post 18394)
Em còn 1 số câu hỏi nữa tiện thể các bác trả lời luôn cho em:
- Có set đc 1 chân khác của PIC làm chân PWM không ạ.
- Khi Timer2 hoạt động PWM thì còn mình còn dùng làm Timer để đếm thời gian được không.Nếu điều khiển 2 động cơ cùng 1 lúc thì bắt buộc phải dùng đến Timer0,timer1 để đếm xung về,và như thế là hết các bộ timer,counter phải ko ạ.
- ADC có 8 kênh,nếu em dùng cả 8 kênh thì Vref=Vdd.Vậy thì ADC sẽ rất dễ bị nhiễu đúng không ạ.Có cách nào khắc phục được không ạ.
- Trong CCS mình chỉ cần chọn ALL ANALOG là chip mặc định Vref=Vdd có phải ko ạ.

1. Bạn có thể dùng một chân I/O thông thường để tạo PWM bằng phần mềm (một số đặc điểm về loại tín hiệu PWM này tôi đã từng đề cập trên diễn đàn).

2. Khi Timer2 được dùng cho chức năng PWM của module CCP thì nó vẫn là timer, nếu khéo léo thì chúng ta vẫn dùng được nó như một bộ đếm thời gian. Nếu điều khiển 2 động cơ cùng lúc thì còn tùy vào trường hợp cụ thể, khả năng vận dụng của người thiết kế, không nhất thiết phải dùng hết 3 timer.

3. Nếu thiết kế kém hiệu quả thì một kênh ADC cũng nhiễu, nếu thiết kế tốt thì 8 kênh vẫn chạy tốt.

4. Tôi không dùng CCS C, nhường câu trả lời cho các bạn dùng CCS C.

Thân,

picpen 27-08-2008 12:18 PM

Đầu vào ADC rất nhạy và cũng rất rễ nhiễu nếu thiết kế phần cứng không tốt
Bác Nam ơi ,bác có thể cho em và mọi người biết: một số biện pháp và chú ý khi thiết kế phần cứng cho bộ chuyển đổi ADC của pic chứ ??
Em cũng đang làm việc với 8 đầu vào ADC của pic6f877a ,8 đầu vào này đc nối với 8 cảm biến,em dùng 1 lá 103 mắc từ mỗi cổng ADC nối xuống mass để lọc nhiễu tần số cao ...... nhưng kết quả cũng ko tốt nắm. vì các cổng tín hiệu vẫn bị nhiễu lẫn nhau : cứ có 1 đầu vào thay đổi thì các đầu vào còn lại it nhiều bị nhiễu ,ảnh hưởng và thay đổi theo

** Mong mọi người giúp đỡ vấn đề trên ****** Thanks ...........

namqn 27-08-2008 08:12 PM

Trích:

Nguyên văn bởi picpen (Post 18406)
Đầu vào ADC rất nhạy và cũng rất rễ nhiễu nếu thiết kế phần cứng không tốt
Bác Nam ơi ,bác có thể cho em và mọi người biết: một số biện pháp và chú ý khi thiết kế phần cứng cho bộ chuyển đổi ADC của pic chứ ??
Em cũng đang làm việc với 8 đầu vào ADC của pic6f877a ,8 đầu vào này đc nối với 8 cảm biến,em dùng 1 lá 103 mắc từ mỗi cổng ADC nối xuống mass để lọc nhiễu tần số cao ...... nhưng kết quả cũng ko tốt nắm. vì các cổng tín hiệu vẫn bị nhiễu lẫn nhau : cứ có 1 đầu vào thay đổi thì các đầu vào còn lại it nhiều bị nhiễu ,ảnh hưởng và thay đổi theo

** Mong mọi người giúp đỡ vấn đề trên ****** Thanks ...........

Có nhiều vấn đề liên quan đến câu hỏi của bạn mà hiện giờ tôi cũng chưa có thời gian tìm lại các tài liệu. Bạn có thể xem qua phần "Common Design Mistakes" trong tài liệu "ABCs of ADCs" của National Semiconductor (link download dưới đây), để từ đó tránh được một số lỗi thiết kế thường gặp. Điều này đôi khi có thể giúp bạn có được một thiết kế đủ tốt, chứ chưa cần đến những kỹ thuật phức tạp khác.

http://www.national.com/appinfo/adc/...Cs_of_ADCs.pdf

Thân,

picpen 27-08-2008 11:08 PM

Cám ơn bác Nam nhiều !!!!

bean984 28-08-2008 11:51 AM

mình đang tìm hiểu con 16f628a. đang làm với 16f877a bg chuyển qua tìm hiểu con này. loay hoay mãi vẫn không điều khiển được chân RA4. mình cũng đã thử kéo con trở 1k lên VDD nhưng cũng k đc. xin hỏi làm sao để set chân RA4 thành chân I/O? con này còn có chân nào đặc biệt không?
cảm ơn mọi người.


Múi giờ GMT. Hiện tại là 10:18 AM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam