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)

picpen 17-09-2008 12:55 PM

Trich:
Code:

#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) câu lệnh này là khai báo sử dụng cổng nối tiếp RS232,chân C6 là chân truyền data,C7 là nhận.tốc độc truyền là 9600 bauld.em thấy nó ko có liên quan gì đến ADC hết.chắc do chương trình mô phỏng rồi!!
Đọc kỹ lại tài liệu thì đúng là 2 vấn đề này chẳng liên quan gì đến nhau ,và chạy mạch thực tế thì cũng ok , vậy mà khi mô phổng bằng Proteus thì lại trục trặc.... cái thằng Proteus này nắm lúc nó giở trứng kỳ quặc quá ,sau khi cài lại proteus chạy thì lại ok ,nó làm mình hú vía giờ thì ổn rùi

leejongfan 23-09-2008 11:16 AM

Cho em hỏi: có cách nào convert tu CCS sang Mikro C ko ah?

cong1810 02-10-2008 10:23 PM

em khai báo chế độ power pwm cho pic18f4431.hoạt động ở chế độ independent.vậy mà khi set_power_pwm3_duty();cho các chân thì CCS C báo là undefined identify cho các chân 1,3,5. còn các chân 0,2,4 thì ok.vậy em phải khai báo thêm cho nó ở chỗ nào.
các anh giúp với ạ!!

cong1810 02-10-2008 10:38 PM

hình như không có cách nào làm theo yêu cầu em muốn được.bởi trong data sheet thì chỉ có 1 thanh ghi duty cycle cho 2 chân 0 và 1 .tức là 2 chân này sẽ xuất xung giống nhau ở chế độ independent!! các huynh check lại dùm đệ xem đúng vậy ko!!?

cong1810 02-10-2008 10:53 PM

các anh ui!! ai có file def_18f4431 .cho em xin với nhé.nếu chưa có thì chắc em phải mần hết 1 ngày quá!! thanks các huynh!!

bean984 16-10-2008 03:24 PM

giúp mình với!!!!
ai rành về counter xin chi mình cách thiết lập timer ở chế độ đếm?nếu có code thì tốt quá!!!
có phải cứ có 1 xung đếm thì timer sẽ ngắt 1 lần?
mình thử viết như thế này nhưng k thấy nó chạy j cả.
Code:

#include "16F877A.h" // PIC16F877A header file
#device 16F877A*=16 ADC=10
#include <defs_16F877A.h>
#fuses HS, NOWDT, PUT, NOPROTECT, NOLVP // for debug mode
#use delay(clock=8000000) // for 4Mhz crystal
#use fast_io(b)

int16 count0;
int8  b0;
///////////////////////////////////////////////////////////
#INT_TIMER0
TIMER0_ISR()
{
  ++count0;
  if (count0==100)
      {
        count0=0;
        b0=b0+1;// dich trai a 1bit
        //portd=170;
      }
  if (b0==2)
      {
        b0=0;
        count0=0;
        //HTGT0=1;
        portb=0;
        //portd=252;
        disable_interrupts(int_timer0);
      }
}
/////////////////////////////////////////////////////////////////////
void main(void)
{
  set_tris_a(255); // Chi co dau vao tuong tu
  set_tris_b(0);
  set_tris_d(0);
  portb=255;
  //portd=255;
  count0=b0=0;
  enable_interrupts(global);
  enable_interrupts(int_timer0);
  setup_TIMER_0(RTCC_EXT_L_TO_H );
  setup_COUNTERS(RTCC_EXT_L_TO_H,RTCC_DIV_2);
  set_TIMER0(1);
  while(true)
  {
     
  }
}

chương trình của mình định thử là nếu đếm đc 200 xung thì tắt hết led ở portB.nhưng khi thử k thấy có hiện tượng j cả.

cong1810 17-10-2008 12:50 AM

Trích:

Nguyên văn bởi bean984 (Post 19630)

Code:



  if (b0==2)
      {
        b0=0;
        count0=0;
        //HTGT0=1;
        portb=0;
        //portd=252;
        disable_interrupts(int_timer0);
      }
}


có lẽ là do đoạn code trên bạn ạ. bạn nhầm tại câu lệnh "disable_interrupts(int_timer0);" có phải bạn muốn xóa cờ ngắt cho lần tiếp theo nhưng câu lệnh trên là xóa bit enable cho ngắt timer0. bạn đọc kĩ lại help CCS C và datasheet của 877a nhé. xem mình có đúng ý bạn ko!! good luck!!

bá vinh 29-10-2008 06:47 PM

chào các bác
các bác cho em hỏi la:khi viết bàng CSS ma mình sài chức năng UART voi máy tinh. ma khi khai báo ngắt của no thi không bao giờ dược cả ,vi khi dó nó sẽ báo là ngắt toàn cục bị cấm trong khi chương trình chính đang thực hiện :
vd:
puts i

ma trong khai báo ngắt
#int_tbe()
{
led=!led;
}

thi không bao giờ led nay chớp tăt nghĩa la nó không bao giờ nhảy vao ngát la so vây.
mình thi sử dụng được hết các chức năng khác nhưng chỉ con ngắt của Uart la không sai dược, bực mình quá.
nhưng mình viết bằng hợp ngữ thi ok.
mong cac bác chỉ giáo .

dientudong 06-11-2008 07:17 PM

các bạn cho mình hỏi về đoạn code này :khai báo hàm if(tmr1if==1) sao ki vay tmr1if là gì vậy.Với intcon là gì vậy ? Cảm ơn các bạn .Mình còn yếu.
//////////////////////////////////khai bao va chuong trinh ngat cho TIMER1
#int_TIMER1
void TIMER1_isr(void)
{
soxung=get_timer0(); //Lay so xung ma Timer0 dem
set_timer1(55535); // Trong 1ms
if(tmr1if==1)
{
intcon=0; //stop ngat
a1=1;
}
}

cong1810 06-11-2008 10:34 PM

có lẽ đó là 1 biến hay đó là bit cờ ngắt của timer 1!! người sử dụng đặt trong file define!!bạn xem trong 2 file mà họ include trong code mẫu!!! có thể từ "if" làm bạn nghĩ là lệnh IF ! thực ra nó là interrupt flag!!
chúc may mắn!

delpiero10 08-11-2008 03:14 PM

Mới học lập trình ccs ai cho e hỏi file defs_16f877A.h và file def_16f877A.h khác nhau thế nào? Ai có file defs_16F877A up lên cho e được kô. Thanks!

bá vinh 09-11-2008 05:47 PM

bác F ơi cho em xin phần mềm css cho dsp đi ,em tìm hoài mà không thấy . con thằng mikroe thì không biết làm sao ma nạp nó không chạy ,chắc là nó có nhiều fuse quá em không biết chon cái nào cả ,bác có thể giúp em được không.
sẵn cho em hỏi luôn là sử dụng chức năng usb của pic18f4550 như thế nào và máy tính khai báo ra sao khi em dùng VB để giao tiếp vời pic.

luongnhut 09-11-2008 07:48 PM

hỏi về dinh thời gian trong ngắt dung timer
 
em sử dụng thạch anh 20MHZ cho 16f877a, em viet chuong trình ngắt timer0 1s, nhưng em kiểm tra thấy nó nhanh hon 1s rất nhiều, bác nào chỉ em cho sai chổ nao với. chương trinh của e như sau:


#include <16f877a.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#byte PORTB = 0x06

int16 count;
int8 a;
//Chuong trinh ngat TMR0
#int_timer0
void interrupt_timer0()
{
set_timer0(251);
++count;
if(count == 1000000) // 1000000*1us = 1000000us = 1s
{
count=0;
rotate_left(&a,1);
}
}
//Chuong trinh chinh
void main(void)
{
set_tris_b(0);
enable_interrupts(int_timer0);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
enable_interrupts(global);

a = 0x01;

while(true)
{
PORTB = a;
}
}

cong1810 09-11-2008 09:22 PM

do bạn set prescale cho timer là 2 nên timer tăng lên sau mỗi 0.4us tức là 0.4*5=2us thì timer ngắt 1 lần chứ ko phải là 1us. bạn nên tham khảo thêm trong phần Help củ PIC C!!
vấn đề thứ 2 là biến count của bạn là biến int 16 bit tức giá trị tối đa chỉ là 2^16=65536!! thì điều kiện If của bạn liệu có đúng ko??
thân!!

picpen 10-11-2008 12:23 AM

trích :
Code:

vấn đề thứ 2 là biến count của bạn là biến int 16 bit tức giá trị tối đa chỉ là 2^16=65536!! thì điều kiện If của bạn liệu có đúng ko??
Thực ra giá trị dương của biến " INT16 " nằm trong khoảng từ : 0 >> 2^15 = 32768
Mọi người chú ý đến phạm vi hoạt động của biến được khai báo nếu không sẽ bị tràn làm sai kết quả


Múi giờ GMT. Hiện tại là 12:45 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