PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   dsPIC - Bộ điều khiển tín hiệu số 16-bit (http://www.picvietnam.com/forum/forumdisplay.php?f=29)
-   -   Giúp em với, dspic cứ bị reset liên tục (http://www.picvietnam.com/forum/showthread.php?t=4105)

bbaacc01 12-05-2009 09:47 PM

Giúp em với, dspic cứ bị reset liên tục
 
Anh chị nào dùng dspic cho mình hỏi với, mình dùng dspic33F J256MC710.

Mình viết thử chuơng trình như đoạn code kèm theo,
chương trình dùng thạch anh nội, nhấp nháy 2 led, một led nháy bởi timer, một led bở ngắt ngoài.
Không hiểu tại sao pic cứ chạy chừng vài phút (1-2 phút) là bị khởi động,
sau khi khởi động thanh ghi RCON từ 0x0000 chuyển thành 0x0093.
Một điều chắc chắn là không phải tại mạch, vì lúc đầu mình có dịch đuợc một file hex, lấy file đó chạy lại thì không bị khởi động.
Mình nghĩ lỗi là do một exception (traps),
Nhưng không hiểu nỗi nguyên nhân cụ thể là cái gì.
Mình có hỏi trên microchip forum, nguời ta cũng bảo có thể là traps, và dùng Trick của ông Calum để tìm nguyên nhân, nhưng mình chẳng biết trick đó ở đâu.

Mong anh chị, bạn bè giúp mình giải quyết vấn đề này



Code:

#include "p33Fxxxx.h"



// Select Internal FRC at POR
_FOSCSEL(FNOSC_FRC);
// Enable Clock Switching and Configure Primary Oscillator in XT mode
_FOSC(FCKSM_CSECMD & OSCIOFNC_OFF & POSCMD_XT);

void __attribute__((interrupt, no_auto_psv)) _INT1Interrupt(void)
{
      LATFbits.LATF5 = 0;//~LATFbits.LATF2;
 
      IFS1bits.INT1IF = 0;    //Clear the INT1 interrupt flag or else
   
}




/****************************************************/

void Init_Timer23( void )
{

  T2CON = 0;              // Timer reset
  T3CON = 0;
  T2CONbits.T32 = 1;

    IFS0bits.T3IF = 0;      // Reset Timer1 interrupt flag
  IPC2bits.T3IP = 6;      // Timer1 Interrupt priority level=4
    IEC0bits.T3IE = 1;      // Enable Timer1 interrupt
  T2CONbits.TCKPS = 0b00;
  T2CONbits.TCS = 0;
    TMR2=  0x0000; 
  TMR3=  0x0000;   
  PR3 = 0X0262;          // Timer1 period register = 1 s
  PR2 = 0x5A00 ;
  T2CONbits.TON = 1;      // Enable Timer1 and start the counter
 
}

/*********************************************************/




/* ISR ROUTINE FOR THE TIMER23 INTERRUPT */

void __attribute__((interrupt,no_auto_psv)) _T3Interrupt( void )
{
 
 
  IFS0bits.T3IF = 0;
  T2CONbits.TON = 0;
 
          LATFbits.LATF2 = ~LATFbits.LATF2;
         

 

  TMR2          = 0;
  TMR3          = 0;
  T2CONbits.TON = 1;
}
/************************************************/


int main (void)
{

      // Configure PLL prescaler, PLL postscaler, PLL divisor
      PLLFBD=41; // M=43
      CLKDIVbits.PLLPOST=0; // N1=2
      CLKDIVbits.PLLPRE=0; // N2=2
     



      // Disable Watch Dog Timer
          RCONbits.SWDTEN=0;

      // Configure the Analog functional pins as digital
          AD1PCFGL=0xFFFF;
          AD1PCFGH=0xFFFF;
       
     
      // Clock switch to incorporate PLL
      __builtin_write_OSCCONH(0x01); // Initiate Clock Switch to

      // FRC with PLL (NOSC=0b001)
      __builtin_write_OSCCONL(0x01); // Start clock switching
      while(OSCCONbits.COSC != 0b001); // Wait for Clock switch to occur
      while(OSCCONbits.LOCK!=1); // Wait for PLL to lock


     
     
     

      Init_Timer23();

      IFS1bits.INT1IF = 0;    /*Reset INT1 interrupt flag */
      IEC1bits.INT1IE = 1;    /*Enable INT1 Interrupt Service Routine */
      TRISF=0x0000;
 

 
      PORTF=0xffff;
   
while (1) {
}

return 0;
}


namqn 14-05-2009 12:59 PM

dsPIC33F dòng này có đến 7, 8 từ cấu hình, mà bạn chỉ thiết lập có 2. Bạn có chắc rằng dsPIC33F không bị reset bởi WDT hay không? Code mà bạn chạy tốt ra sao (chỉ cần thông tin cho phần cấu hình)?

Thân,

namqn 14-05-2009 02:32 PM

Trích:

Nguyên văn bởi bbaacc01 (Post 25710)
Dear Mr namqn
// Disable Watch Dog Timer
RCONbits.SWDTEN=0;

Trong đoạn code của em có cái disable watch dog timer mà

Đoạn code chạy tốt thực ra y hệt đoạn này nhưng em không dùng Timer 2+3, mà dùng một timer 2 rồi đếm nhiều lần để đuợc thời gian chớp tắt led thấy được.
Lúc mới power on thì em thấy RCON =0x0000
Sau khi bị reset thì RCON = 0x0093.

Em đọc trên Microchip forum thấy cũng có nhiều nguời bị cái này,
nghe nói là bị address error, (Em nghĩ nếu là address error thì chắc là cấu hình cho MPLAB bị sai, mà cấu hình đúng lại thì làm như thế nào nhỉ )

RCON = 0x0093 tương ứng với 4 bit EXTR, WDTO, BOR, và POR của thanh ghi RCON được bật. Cả 4 bit này đều tương ứng với một trạng thái reset nào đó, do vậy khó xác định chính xác nguyên nhân reset từ giá trị của thanh ghi này.

Bạn nên đọc kỹ chú ý 2 trong phần mô tả các bit của thanh ghi RCON, trong datasheet của dsPIC33FJ256MC710. Mục chú ý đó nói rằng, nếu bit cấu hình FWDTEN là unprogrammed (= '1') thì WDT luôn luôn được cho phép, bất chấp trạng thái của bit RCONbits.SWDTEN. Tôi cho rằng bạn đang gặp tình huống này.

Thân,

bbaacc01 16-05-2009 11:41 AM

Trích:

Nguyên văn bởi namqn (Post 25711)
Bạn nên đọc kỹ chú ý 2 trong phần mô tả các bit của thanh ghi RCON, trong datasheet của dsPIC33FJ256MC710. Mục chú ý đó nói rằng, nếu bit cấu hình FWDTEN là unprogrammed (= '1') thì WDT luôn luôn được cho phép, bất chấp trạng thái của bit RCONbits.SWDTEN. Tôi cho rằng bạn đang gặp tình huống này.

Thân,


Thank Mr Namqn,
Nhờ hướng dẫn trên mà em đã giải quyết đuợc vấn đề của mình rồi,


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