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)

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.

namqn 28-08-2008 10:08 PM

Trích:

Nguyên văn bởi bean984 (Post 18431)
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.

Để tránh cho chân RA4 là ngõ ra của bộ so sánh thứ hai, cần đảm bảo 3 bit thấp nhất của thanh ghi CMCON khác với giá trị "110". Vì RA4 là loại ngõ ra cực máng hở, nhất thiết phải có điện trở kéo lên để xuất mức cao ra chân này.

Các chân RA0 .. RA3 sẽ ở trạng thái analog khi vừa reset PIC, cần thay đổi 3 bit thấp nhất của thanh ghi CMCON một cách thích hợp (xem hình 10-1 trong datasheet) để có thể dùng chúng như chân digital.

Thân,

bean984 29-08-2008 10:42 AM

ý e muốn hỏi là nếu dùng ccs thì sẽ phải làm ntn? (e đã đọc datasheet và cũng đã biết phải thiết lập thanh ghi CMCON như vậy)? e k muốn chèn đoạn mã asm vào trong chương trình.
Code:

#int_RB
void ngat_RB()
{
if((RBIF)&&(RBIE))
  {
      ngatRB=1;
      if(!RB4)
        {
              //ngatRB4=1;
          if(tg==0)
            {
              tg=30;
              goto Thoat;
            }
          if(tg==30)
            {
              tg=60;
              porta=6;             
              goto Thoat;
            }
          if(tg==60)
            {
              tg=90;
              porta=9;
              goto Thoat;
            }
          if(tg==90)
            {
              tg=120;
              porta=1;
              goto Thoat;
            }
        }// Xong RB4
      if(!RB5)
        {
              ngatRB5=1;
        }// Endif(RB5)
  thoat:
  RBIF=0; //Xoa co ngat RB
  } // Ket thuc if co ngat
}// Ket thuc ham void*/

a xem giúp e đoạn code trên xem tại sao e phải ấn 2 lần nút bấm tại RB4 thì nó mới chịu thực hiện ngắt? đoạn code đó chạy cho con 16f877a thì ngon lành nhưng khi đưa qua con 628a thì bị như vậy.
thanks!

cong1810 29-08-2008 11:36 AM

em đang thực hành về LCD 4 bit. sử dụng file lcd.c có sẵn trong thư viện của CCS C.nhưng trong file lcd.c các chân enable RS và RW nó sắp ko theo thứ tự để mỉnh cắm bus cho tiện. em muốn hỏi cách mình thay đổi thứ tự chân E,RW,RS trong file LCD.C. em tìm cả buổi rồi mà ko thấy chỗ nó khai báo.các huynh giúp đệ với!!!!

buiminhtu 29-08-2008 07:17 PM

bác nào có CCSC 3.242 cho em xin voi
thanks

namqn 29-08-2008 07:45 PM

Trích:

Nguyên văn bởi buiminhtu (Post 18482)
bác nào có CCSC 3.242 cho em xin voi
thanks

Bạn đọc kỹ post #1 của luồng này:
http://www.picvietnam.com/forum/showthread.php?t=958

Thân,

popeye_ts22 30-08-2008 12:29 AM

Đo tốc độ phản hồi về Lcd
 
1 Attachment(s)
Chào các bác.Có chút vướng mắc,các bác giúp em với.
Mục đích:Điều khiển động cơ phản hồi tốc độ về LCD
Thực hiện:Điều khiển được động cơ nhưng chưa phản hồi đc.
Em không biết sau mỗi lần gọi ngắt có cần phải để 1 vòng while() để đợi ngắt không.
Em dùng 16F877A,bây giờ điều khiển 1 kênh đã phải cần:TIMER2-PWM,TIMER 0:Đếm xung,TIMER1:Đếm thời gian,dùng để tính toán vận tốc.
Vậy nếu em dùng động cơ thứ 2 phải làm thế nào,có thuật toán nào ko ạ.
Có đoạn code và chương trình mô phỏng,các bác xem cho em:
Code:

#include <16f877a.h>
#include <def_877a.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=8000000)
#include <lcd_lib_4bit.c>
int16 cnt,cnt2,xung,v;
int8 a,b,c;
#int_TIMER0
void  TIMER0_isr(void) //TIMER0 dem xung ve
{
set_timer0(255);
if(tmr0if==1)
 {
 cnt++;
 tmr0if=0;
 }
}
#int_TIMER1          //TIMER1 dem tgian,tinh van toc
void  TIMER1_isr(void)
 {
 set_timer1(5565);
 if(tmr1if==1)
  {
    xung=get_timer0()*4; 
    v=(xung*60)/((100*60*0.001));
    tmr1if=0; 
  }
 }
void Lcd()
{
while(1)
  {
  a=(int)v/100;
  b=(int)(v-a*100)/10;
  c=(int)v%10;
  LCD_putcmd(0xC0);
  LCD_putchar("xung encoder");
  LCD_putcmd(0x80);
  LCD_putchar(a+48);
  LCD_putcmd(0x81);
  LCD_putchar(b+48);
    LCD_putcmd(0x82);
    LCD_putchar(c+48);
  } 
}
void Ngat()
{
  set_timer0(255);
  setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_4);
  enable_interrupts(INT_TIMER0);
  setup_timer_1(T1_INTERNAL|T1_DIV_BY_2);
  set_timer1(5565);
  enable_interrupts(INT_TIMER1);
  enable_interrupts(GLOBAL);
  }
void PWM()
{
  setup_timer_2(T2_DIV_BY_16,255,1);
  setup_ccp1(CCP_PWM);
  setup_ccp2(CCP_PWM);
  set_pwm1_duty(1000);
  set_pwm2_duty(1022); 
}
void main()
{
  set_tris_d(0);
  set_tris_a(0xff);    //Cho tin hieu di vao RA4
  set_tris_c(0);
  LCD_Init();
  PWM();
  Ngat();
  Lcd();
  delay_ms(100);
}


popeye_ts22 31-08-2008 12:55 AM

Em đã sửa lại bài chỉn chu rùi,bác nào giúp đỡ em với.Đo vận tốc về nó cứ hiện 215,em thay đổi giá trị biến trở để thay đổi tốc độ mà hiển thị không thay đổi.
**.Em dùng encoder 100 xung/1 vòng

picpen 01-09-2008 12:32 AM

khúc mắc với RA4 ????
 
Mình vẫn theo dõi chuyên mục này đều đặn.Mình đợi mọi người trả lời câu hỏi của bạn Bean984 vì mình cũng đang thắc mắc như bạn, nhưng chưa thấy ai trả lời nên mình xin hỏi lại và nhờ mọi người trên diễn đàn chỉ giúp :
Làm thế nào để sử dụng chân RA4 như 1 chân I/O bình thường trong khi các chân còn lại của portRA vẫn sử dụng chức nằng đầu vào AD ?? trong ccs phải khai báo như nào ? vì nếu sử dụng câu lênh " set_tris_A(??) " để định thực hiện chức năng I/0 cho RA4 thì các chân còn lại của portRA cũng sẽ bị định dạng chức năng I/0 theo ,khi đó ko thể sử dụng làm cổng vào AD được

************ mong mọi người giúp đỡ .. Thanks ********

lion 01-09-2008 01:00 AM

Trích:

Nguyên văn bởi picpen (Post 18533)
Mình vẫn theo dõi chuyên mục này đều đặn.Mình đợi mọi người trả lời câu hỏi của bạn Bean984 vì mình cũng đang thắc mắc như bạn, nhưng chưa thấy ai trả lời nên mình xin hỏi lại và nhờ mọi người trên diễn đàn chỉ giúp :
Làm thế nào để sử dụng chân RA4 như 1 chân I/O bình thường trong khi các chân còn lại của portRA vẫn sử dụng chức nằng đầu vào AD ?? trong ccs phải khai báo như nào ? vì nếu sử dụng câu lênh " set_tris_A(??) " để định thực hiện chức năng I/0 cho RA4 thì các chân còn lại của portRA cũng sẽ bị định dạng chức năng I/0 theo ,khi đó ko thể sử dụng làm cổng vào AD được

************ mong mọi người giúp đỡ .. Thanks ********

bạn thử lam` như thế này xem :


...................
...................
...................

#bit TRISA4 = 0x85.4

..................
..................
..................

void main(void)
{
TRISA4=0 ;
............
............
............




};

cong1810 01-09-2008 07:23 PM

em cũng đang theo dõi câu trả lời cho bài dk động cơ của bạn popeyee mà chưa thấy sư huynh nào trả lời.nên em hỏi vấn đề của em luôn.
em cũng làm 1 bài tập tương tự.nhưng làm mạch thật.em dùng chính tần số PWM để kiểm tra chương trình đếm xung từ động cơ.nhưng khi percent PWM là 100 hay 0% thì LCD luôn hiện số 175 còn khi có xung thì sai lệch rất lớn 40-50%.đây là đoạn code của em.các huynh chỉ giáo!!!
Code:

#include <16f877a.h>
//#include <def_877a.h>
#fuses NOWDT,NOPROTECT,XT,NOLVP
#use delay(clock=4000000)
#define use_portd_lcd True
#define portb=0x06
#define portd=0x08
#include <lcd.c>
#define interr_per_second 20//khi set_timer1(15535)timer 1 16 bit=>65535-15535=50.000us
#define interr_per_100ms 2//khi set_timer1(15535)
int8 timer1over,value,percent;
int16 so_vong,count,tram,chuc,donvi,ngan;
#int_rtcc
void interrupt_timer0()//dem so vong dong co
{
++count;
}
#int_timer1 // ngat timer 1 khi timer 1 tran
void interrupt_timer1()
{
if (--timer1over==0)
{ timer1over=interr_per_second;
so_vong=(count*255+get_timer0());//100; //voi encoder la 100 xung tính trong 1 s
count=0;
set_timer0(15535);
}
}
#int_ext
void ngatngoai() // tang he so duty cho DC
{
if(percent==0)percent=0;
else
{
percent=percent-5;
value = percent*2;
}
}
void tao_ma_so_vong()
{
ngan=so_vong/1000;
tram=(so_vong-ngan*1000)/100;
chuc=(so_vong-ngan*1000-tram*100)/10;
donvi=so_vong%10;
}
void hienthi_lcd()
{
lcd_gotoxy(1,2);
lcd_putc(ngan+0x30);
lcd_putc(tram+0x30);
lcd_putc(chuc+0x30);
lcd_putc(donvi+0x30);

}
//ham main chinh
main()
{
delay_ms(100); //tao thoi gian tre de khoi tao LCD
lcd_init(); // khoi tao LCd
// cac cong I O
set_tris_a(0xff); //cho port a la port thu, su dung chan RA4
set_tris_b(0x01);
output_b(0x01); //tao muc cao cho ngat ngoai
set_tris_c(0);
// enable cac timer
setup_timer_0(rtcc_div_1|rtcc_ext_h_to_l); // timer 0 lam couter
set_timer0(0); // gia tri dau timer 0
setup_timer_1(t1_internal|t1_div_by_1); // dung inter clock,dinh thoi gian 1 s
set_timer1(15535); // gia tri de ngat xay ra 20lan/ 1 s
// configue cac ngat
enable_interrupts(global); //cho phep ngat
enable_interrupts(int_rtcc); // ngat timer 0
enable_interrupts(int_timer1); // ngat timer 1
enable_interrupts(int_ext); // cho ngat ngoai
ext_int_edge(h_to_l); // ngat ngoai canh xuong
// khoi tao che do PWm
setup_timer_2(t2_div_by_1,199,1); // t2div=1=>f=5khz,period=200
// setup_timer_2(t2_div_by_4,199,1); //t2div=4=>f=1250hz,period=200
// setup_timer_2(t2_div_by_16,199,1); //t2div=16=>f=312hz,period=200
setup_ccp1(CCP_PWM); // xung PWm tren chan CCP1 RC2
// khoi tao cac gia tri bien ban dau
count=0;
so_vong=0;
timer1over=interr_per_second;
value=200; // do phan cung dieu xung muc thap
percent=100; //phan cung dung xung muc thap
// tao mau cho lcd
lcd_gotoxy(1,1);
lcd_putc('s');
lcd_putc('o');
lcd_putc('-');
lcd_putc('v');
lcd_putc('o');
lcd_putc('n');
lcd_putc('g');
lcd_putc('-');
lcd_putc('1');
lcd_putc('s');
lcd_putc(':');
//bat dau vong lap
while(1)
{
set_pwm1_duty(value);
tao_ma_so_vong();
hienthi_lcd();

}
}



Múi giờ GMT. Hiện tại là 05:43 PM.

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