PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ bản về vi điều khiển và PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=8)
-   -   lỗi viết chương trình CCS (http://www.picvietnam.com/forum/showthread.php?t=3352)

nms48 23-12-2008 05:49 PM

lỗi viết chương trình CCS
 
mình viết chương trình này nhưng nó bảo lỗi như thế này: có ai biết sửa lỗi này kô.help me
"Interrupts disabled during call to prevent re-entrancy: (kich)"
Code:

#include <18f4520.h>
#DEVICE ADC=10
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, STOP=1)
int16  U=0,I=0;

// ngat ngoai
#int_EXT
void kich(int16 a=0)  //a goc kich
{
  set_timer0(a);
}

//ngat timer0
#int_timer0
void timer0_isr()
{
  set_timer1(15534);    //10ms thi tran
  output_high(pin_D0);
  delay_us(10);
  output_low(pin_D0);
}
#int_timer1
void timer1_isr()
{
  output_high(pin_D0);
  delay_us(10);
  output_low(pin_D0);
}
//doc ADC
void doc_ADC()
{
  set_ADC_channel(0);
  delay_us(10);
  ap=read_ADC();

  set_ADC_channel(1);
  delay_us(10);
  dong=read_ADC();
}


// chuong trinh chinh
void main()
{
  setup_ADC(All_Analog);
  setup_ADC(ADC_CLOCK_INTERNAL);
  enable_interrupts(int_EXT);
  EXT_int_edge(L_TO_H);
  setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  enable_interrupts(int_timer0);
  setup_timer_1(T1_INTERNAL|T1_DIV_by_1);
  enable_interrupts(int_timer1);
  enable_interrupts(global);
while(1)
 {
    doc_ADC();
    kich(ap);
    U=U*220/512;
    I=I*200/1024;
    printf("%lu %lu \n\r",U,I);
 }
 }


nguyenquoctoan 23-12-2008 07:38 PM

lỗi này mình cũng thường gặp, nhưng ở dạng cảnh báo và chương trình vẫn chạy bình thường, do sắp xếp các chuơng trình con chưa hợp lý, đặc biệt là sử dụng ngắt, bạn hãy sắp xếp lại thử coi.

nms48 23-12-2008 11:35 PM

em cũng thấy nó cảnh báo chứ kô phải là lỗi.nhung tại em sợ nó chạy kô đúng.hôm nay em mới làm cháy con pic18 nên chưa đi mua mới để nạp chaỵ thử.cam ơn anh nhiều,để ngày mai em mua pic thử lại đã

bien_van_khat 24-12-2008 02:48 PM

http://www.picvietnam.com/forum/show...rant#post14652

Bạn tham khảo thêm ở đây về re-entrant

Nhớ dùng công cụ search trước khi hỏi!

lion 24-12-2008 09:53 PM

Trích:

Nguyên văn bởi nms48 (Post 21641)
mình viết chương trình này nhưng nó bảo lỗi như thế này: có ai biết sửa lỗi này kô.help me
"Interrupts disabled during call to prevent re-entrancy: (kich)"
Code:

#include <18f4520.h>
#DEVICE ADC=10
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, STOP=1)
int16  U=0,I=0;

// ngat ngoai
#int_EXT
void kich(int16 a=0)  //a goc kich
{
  set_timer0(a);
}

//ngat timer0
#int_timer0
void timer0_isr()
{
  set_timer1(15534);    //10ms thi tran
  output_high(pin_D0);
  delay_us(10);
  output_low(pin_D0);
}
#int_timer1
void timer1_isr()
{
  output_high(pin_D0);
  delay_us(10);
  output_low(pin_D0);
}
//doc ADC
void doc_ADC()
{
  set_ADC_channel(0);
  delay_us(10);
  ap=read_ADC();

  set_ADC_channel(1);
  delay_us(10);
  dong=read_ADC();
}


// chuong trinh chinh
void main()
{
  setup_ADC(All_Analog);
  setup_ADC(ADC_CLOCK_INTERNAL);
  enable_interrupts(int_EXT);
  EXT_int_edge(L_TO_H);
  setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  enable_interrupts(int_timer0);
  setup_timer_1(T1_INTERNAL|T1_DIV_by_1);
  enable_interrupts(int_timer1);
  enable_interrupts(global);
while(1)
 {
    doc_ADC();
    kich(ap);
    U=U*220/512;
    I=I*200/1024;
    printf("%lu %lu \n\r",U,I);
 }
 }




trước khi thoát khỏi chương trình con ngắt bạn phải xoá cờ ngắt đi đã . Nếu không đảm bảo chương trình sẽ không trở về được chương trình chính khi ngắt xảy ra

bien_van_khat 25-12-2008 09:16 AM

Trích:

Nguyên văn bởi lion (Post 21669)
trước khi thoát khỏi chương trình con ngắt bạn phải xoá cờ ngắt đi đã . Nếu không đảm bảo chương trình sẽ không trở về được chương trình chính khi ngắt xảy ra

Công việc này là bắt buộc nếu bạn xài Assembler, HTPIC C, C18, C30, nhưng với CCS thì không cần thiết, và không nên. CCS tự sinh mã để xóa cờ ngắt tương ứng khi vào ngắt.

vmt.dttt 02-02-2009 07:23 AM

1 Attachment(s)
Trích:

Nguyên văn bởi lion (Post 21669)
trước khi thoát khỏi chương trình con ngắt bạn phải xoá cờ ngắt đi đã . Nếu không đảm bảo chương trình sẽ không trở về được chương trình chính khi ngắt xảy ra

Hjjj.. Anh Hoàng hay dùng MPLAP nên xài CCS vẫn chưa quen...
...
E khai báo thêm "ap" + "dong" trong chương trình trên, nó chạy bình thường ạ.../

dientudong 02-02-2009 11:32 AM

bạn nói khai báo thêm "ap" va "dong".vậy còn U và I để làm gì

vmt.dttt 03-02-2009 08:33 AM

Trích:

Nguyên văn bởi dientudong (Post 22346)
bạn nói khai báo thêm "ap" va "dong".vậy còn U và I để làm gì

Hjj... cái quan trọng là người ta khai báo U, I những người ta có sử dụng các biến này đâu..

ap=read_ADC();
dong=read_ADC();
.....

bạn xem lại code của họ nhé

tranhuyky 11-03-2009 09:49 PM

Trích:

Nguyên văn bởi tranvankien_bk (Post 23456)
em dang lam thuc hanh ve ngat RB4:7 nhung khong biet cach xoa co ngat
bac nao biet chi dum em voi .vi chuong trinh viet ra no khong thoat ra khoi ngat

Bạn thử xem link này có giúp ích được gì không nhe.
http://www.picvietnam.com/forum/show...ed=1#post23159

sonduy1 04-08-2009 04:06 PM

bác coi giup e doạn chương trình này cái.
 
Trích:

Nguyên văn bởi nguyenquoctoan (Post 21644)
lỗi này mình cũng thường gặp, nhưng ở dạng cảnh báo và chương trình vẫn chạy bình thường, do sắp xếp các chuơng trình con chưa hợp lý, đặc biệt là sử dụng ngắt, bạn hãy sắp xếp lại thử coi.

Code:

#INT_TIMER0
void ngat_timer0()
{  int  dem;
    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
    set_timer0(15536);  //mac dinh gia tri ban dau cho TMR0
    dem=0;
    dem++;
    if(dem==20)          //20*50000=1s
    {  dem=0;
      sec++;
    }
    if(sec==60)
    {  sec=0;
      min++;
    }
    if(min==60)
    {  min=0;
      h++;
    }
    if(h==24)
    {  h=0;
    }
    enable_interrupts(int_timer0);
    enable_interrupts(global);
}


//quet led
//khao bao TMR1
#INT_TIMER1
  void ngat_timer1()
  {  int  time=0,count=0;
      setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
      set_timer1(24280); 
      time==0;
      count==0;
      time++;                //  timer 1 tràn sau ==> 500 000 us = 0.5s
      if(time==2)            //  2* 500 000 =1s
          {
          count++;
          if(count==1)
          {  portb=bang_ma[n1];
              output_low(pin_d0);
          }
          if(count==2)
          {  portb=bang_ma[n2];
              output_low(pin_d1);
          }
          if(count==3)
          {  portb=bang_ma[n3];
              output_low(pin_d3);
          }
          if(count==4)
          {  portb=bang_ma[n4];
              output_low(pin_d4);
          }
            count=0;
          }       
    enable_interrupts(int_timer1);       
    enable_interrupts(global);
  }
 




void main(void)
 {  trisb=0x00;
    portb=0xff;
    output_high(pin_d0);
    output_high(pin_d1);
    output_high(pin_d2);
    output_high(pin_d3);

    n1=n2=1;
    n3=4;
    n4=5;
  setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
    set_timer0(15536);  //mac dinh gia tri ban dau cho TMR0
    /////////////////////////////////////
    ////////////////////////////////////
   
   
    while(1)
    {
    n1=h/10;
    n2=h%10;
    n3=min/10;
    n4=min%10;
.......//ko biet làm sao để hiển thị led 7 doạn và clock
}
}


ngoducbinh1987 24-08-2009 11:57 PM

tui xem qua thi co nhan xet
o phan ngat timer0 ban chua xoa bit tran cua timer0 0xb2
khong can setup_timer0 lai, chi fai dat lai gia tri thoi gian thui
con hien led 7doan thi ban dung ma tran hang cung duoc,cho nhanh

thienlong 25-08-2009 11:32 AM

mach thu phat hong ngoai
 
em dang dinh lam mach thu phat hong ngoai de dk dong co. Bac nao co kinh nghiem ve cai nay hoac co tai lieu thi gui cho em xin...


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