PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Cơ bản về vi điều khiển và PIC

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Tìm Kiếm Bài Trong Ngày Ðánh Dấu Ðã Ðọc Vi điều khiển

Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 29-03-2010, 02:07 PM   #1
steve7680768
Nhập môn đệ tử
 
Tham gia ngày: Mar 2010
Bài gửi: 1
:
Vấn đề vẫn tiếp tục với hệ thống của tôi ... Tôi đã sử dụng mã này ... Bây giờ những gì tôi cần phải làm ...?
__________________
STEVE
steve7680768 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 16-05-2010, 06:13 PM   #2
tungbka
Đệ tử 1 túi
 
Tham gia ngày: Jul 2009
Bài gửi: 11
:
Interrupts disabled during call to prevent re-entrancy: (@MUL1616)

Em đang viết chương trình nhận dữ liệu từ máy tính xuống để điều khiển cái động cơ. Nhưng sau khi biên dịch thì xuất hiện cảnh báo sau:
Interrupts disabled during call to prevent re-entrancy: (@MUL1616).
Em có tham khảo các nguồn thì được biết là do trong hàm ngắt và ngoài hàm ngắt em sử dụng lặp lại 1 hàm hay 1 biến gì đó, nhưng em tìm mãi không thấy sai chỗ nào. Mong các pro chỉ giúp. Em cám ơn nhìu.
Chương trình của em như sau:
(Sorry vì em không biết đưa code vào trong ô code ^^!)

Code:
#include <16f877a.h>
#include <def_877a.h>
#include <stdlib.h>
#fuses  NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT 
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8) 
#include <lcd_lib_4bit.c>
/*#define enter RA2
#define s_t   RA3
#define f_r   RA5
#define up    RE0
#define down  RE1
*/
void ht(int16 a);
//void ht1(int16 a);
void init();
void pid();
void nhapheso();
//void up_down();
int16 count, tocdo, C, temp, temp1, k, tocdodat ;
signed int16 e2=0;
signed int16 e1=0;
int16 e_sum;
int16 e_del;
int16 duty;
float Kp=0;
float Ki=0;
float Kd=0;
int flag=0;
float u, T=0.01;

unsigned char text[30], text2[5] ;
unsigned char a1[5], dem=0, i=0, j=0,i1;

#INT_RDA
void Receive_isr() 
{
text[dem]=getc();
if(text[dem]=='@') //kiem tra dieu kien ket thuc
   {
   flag =1;    //ket thuc nhan, bat co bao
   dem=0;
   }
else dem++;
}
#INT_EXT
void ngatR0()  {
        count++;//set_timer0(0);
      }
#int_timer1
void Timer11_isr() {                // Ham duoc goi khi TImer1 tran (65535->0)
                                   // Chu ky trich mau 0.01
    
      set_timer1(53036);
      tocdo= 30*(count + get_timer0());
     // printf("%ld\t",tocdo);
      count = 0;
      set_timer0(0);

   
    }
void main(){
init();
lcd_putcmd(0x01);
while(true){
                //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
      pid();
if(RC1==0) set_PWM1_duty(duty);
if(RC1==1) set_PWM1_duty(1023 - duty);  
lcd_putcmd(0x80);
ht(tocdo);
printf("n%4Lu",tocdo);


//lcd_putchar("hi");


}
}
void init()
{
   lcd_init();
   nhapheso();
   disable_interrupts(int_rda);
   disable_interrupts(global);
   setup_timer_0 (RTCC_DIV_1|RTCC_EXT_L_TO_H);  // Timer0 is Counter
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_4);
   setup_ccp1(CCP_PWM);
   setup_timer_2(T2_DIV_BY_4, 255, 1);//4*4*256*1/20000000=204.8us=4.8khz
   set_timer0(0);
   set_timer1(53036);
   enable_interrupts(INT_RTCC);
   enable_interrupts(int_timer1);
   enable_interrupts(int_ext);
   ext_int_edge(L_TO_H);
   enable_interrupts(GLOBAL);
   lcd_putcmd(0x80);
   count=0;
   trisc=0;
   trisd=0;
   trisa=255;
   trisb=1;
   RC1=0;
   if(C==1) RC1=1;
   If(C==0) RC1=0;
   }
void pid(){
   e2 = tocdodat - tocdo;
   e_sum += e2;
//   e_del = e2 - e1;
//   e1 = e2;
   u = u + Kp*e2 + Ki*e_sum*T;
   if (u>24){
   u=24;
   e_sum -=e2;
   }
   if (u<0){
   u = 0;
   e_sum -=e2;
   }
  duty = u*1023/24;
}
void ht(long a) {
     int nghin,tram,chuc,dvi;
     nghin=a/1000;
     tram=(a%1000)/100;
     chuc=(a%100)/10;
     dvi=(a%10);
     lcd_putchar(nghin+48);
     lcd_putchar(tram+48);
     lcd_putchar(chuc+48);
     lcd_putchar(dvi+48);
}
void nhapheso(){
   lcd_putchar("nhap tu PC");
   enable_interrupts(int_rda);
   enable_interrupts(GLOBAL);
while(!flag) ;
if(flag){

              //if ((strchr(text,'T')) && (strrchr(text, '@')))
         
                text2[0] = text[0];
                text2[1] = text[1];
                text2[2] = text[2];
                text2[3] = text[3];
                text2[4] = text[4];
                tocdodat = atol(text2);
               
                //----------------------------------------
                  while (text[i] != 'P')
                    i++;
                  while (text[j] != 'I')
                    j++;
                  i1 = i;
                  temp = j - i;                  
                  for (i = 0; i < temp; i++)
                    a1[i] = text[i1 + i + 1];
                    
                  Kp = atof(a1);
                 
                  printf("P%f",Kp);
                   delay_ms(100);   
                  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
                  i = j;
                  while (text[j] != 'D')
                    j++;
                  i1 = i;
                  temp = j - i;                  
                  for (i = 0; i < temp; i++)
                    a1[i] = text[i1 + i + 1];
                    
                  Ki = atof(a1);
                  printf("I%f",Ki);
                     delay_ms(100);
                  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
                  i = j;
                  while (text[j] != 'C')
                    j++;
                  i1 = i;
                  temp = j - i;                  
                  for (i = 0; i < temp; i++)
                    a1[i] = text[i1 + i + 1];
                    
                  Kd = atof(a1);
                  printf("D%f",Kd);
                     delay_ms(100);
                  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
                  i = j;
                  while (text[j] != '@')
                    j++;
                  i1 = i;
                  temp = j - i;                  
                  for (i = 0; i < temp; i++)
                    a1[i] = text[i1 + i + 1];
                    
                  C = atol(a1);
                  printf("C%Lu",C);
                  flag=0;
                  i=0; j=0;
                  dem=0;
 
                  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
                                                
          } 

}

thay đổi nội dung bởi: namqn, 16-05-2010 lúc 08:02 PM.
tungbka vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 16-05-2010, 08:03 PM   #3
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi tungbka View Post
...
(Sorry vì em không biết đưa code vào trong ô code ^^!)
...
Bạn đọc hướng dẫn ở đây:
http://www.picvietnam.com/forum/showthread.php?t=2610

Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 08-05-2012, 11:36 PM   #4
sputnhic11
Nhập môn đệ tử
 
Tham gia ngày: May 2012
Bài gửi: 6
:
Thiết lập I/O của dspic30f4013

Em đang làm cái đồ án dùng chip dspic30f4013, bài lập trình thì ngon rùi nhưng phần khai báo vào ra để lắp nút ấn mà em chịu. Em định cho nút ấn ở port F thui vì các port khác em dùng rùi. em gửi đoạn code mong các bác chỉ giúp khai báo ở chỗ nào nhé:


/************************************************** *****************************
; timer1.c la chuong trinh viet bang C de chay tren mot dsPIC *
; Chuong trinh thuc hien viec sau: *
; Su dung Time 1 de tao xung nhip 20ms va thoi gian duty Cryle *
************************************************** ******************************
| __________
| | | |
| | | |
|____| |________________________________________|
<--1,5ms-->
<----------------------20ms------------------------->
; Tac gia : Luu Tuan Khanh *

; Don vi : Uneti *

; Ten tap tin : ltchuan.c *

; Ngay : 23/5/2011 *

; Phien ban : 0.01 *

; Nhung tap tin can thiet khac: p30F4013.gld, p30f4013.h *

; Cong cu duoc dung: MPLAB X IDE beta6.00.01 *
; C30 3.25 * *

------------------------------------------------------------------------------*/
#include <p30fxxxx.h>
#include <timer.h>
/************************************************** ****************************/
//output SERVO
#define LAT_SERVO1 _LATB0
#define LAT_SERVO2 _LATB1
#define LAT_SERVO3 _LATB2
#define LAT_SERVO4 _LATB3
#define LAT_SERVO5 _LATB4
#define LAT_SERVO6 _LATB5

#define LAT_SERVO7 _LATB6
#define LAT_SERVO8 _LATB7
#define LAT_SERVO9 _LATB8
#define LAT_SERVO10 _LATC13
#define LAT_SERVO11 _LATC14
#define LAT_SERVO12 _LATD9
#define congtac1 _TRISF0
#define congtac2 _TRISF1
#define den _LATB9

/*********************Bat dau khai bao bien*************************/
unsigned long counter_servo = 1;
unsigned int speed_servo[13];
//--------------------Ket thuc khai bao bien------------------------//
void config_servo(void);
void timer1_init(void);
int goc(float goc);

void __attribute__((interrupt, no_auto_psv)) _T1Interrupt(void){
IFS0bits.T1IF = 0; //truoc khi ra ngoai thi thi xoa bit _T1IF
T1CONbits.TON = 1;
//timer for 1us*20000=20ms
//1ms=1000 thuc te xxx min
//test 0.5ms - 2.4ms tuong ung voi 1-180do //Do thuc te
if(++counter_servo > 2010) counter_servo = 0;
if(counter_servo >= speed_servo[1] + 62) // MAX 240
LAT_SERVO1=0; // MIN 60
else
LAT_SERVO1=1; // MIN 60
if(counter_servo >= speed_servo[2] + 62) // MAX 240
LAT_SERVO2=0; // MIN 60
else
LAT_SERVO2=1;
if(counter_servo >= speed_servo[3] + 62) // MAX 240
LAT_SERVO3=0; // MIN 60
else
LAT_SERVO3=1;
if(counter_servo >= speed_servo[4] + 62) // MAX 240
LAT_SERVO4=0; // MIN 60
else
LAT_SERVO4=1;
if(counter_servo >= speed_servo[5] + 62) // MAX 240
LAT_SERVO5=0; // MIN 60
else
LAT_SERVO5=1;
if(counter_servo >= speed_servo[6] + 62) // MAX 240
LAT_SERVO6=0; // MIN 60
else
LAT_SERVO6=1;
if(counter_servo >= speed_servo[7] + 62) // MAX 240
LAT_SERVO7=0; // MIN 60
else
LAT_SERVO7=1; // MIN 60
if(counter_servo >= speed_servo[8] + 62) // MAX 240
LAT_SERVO8=0; // MIN 60
else
LAT_SERVO8=1;
if(counter_servo >= speed_servo[9] + 62) // MAX 240
LAT_SERVO9=0; // MIN 60
else
LAT_SERVO9=1;
if(counter_servo >= speed_servo[10] + 62) // MAX 240
LAT_SERVO10=0; // MIN 60
else
LAT_SERVO10=1;
if(counter_servo >= speed_servo[11] + 62) // MAX 240
LAT_SERVO11=0; // MIN 60
else
LAT_SERVO11=1;
if(counter_servo >= speed_servo[12] + 62) // MAX 240
LAT_SERVO12=0; // MIN 60
else
LAT_SERVO12=1;
}

void config_servo(void){
ADPCFG = 0xffff;
TRISB = 0x00;
TRISC = 0x00;
TRISD = 0x00;
TRISF = 0x00;

LATB = 0x00;
LATC = 0x00;
LATD = 0x00;
LATF = 0x00;

}
void timer1_init(void)
{
config_servo();
T1CON = 0; // Timer reset
T1CONbits.TSIDL = 0; //hoat dong ngay ca o che do ngu
T1CONbits.TGATE = 0; //Gated time accumulation enabled(TCS must be set to ‘0’ when TGATE = 1. Reads as ‘0’ if TCS = 1)
//T1CONbits.TSYNC = 0; //bit nay duoc bo qua khi bit TCS = 0; chi quan tam khi TCS = 1;
IFS0bits.T1IF = 0; // Reset Timer1 interrupt flag
IPC0bits.T1IP = 0b111; // Timer1 Interrupt priority level=7 // muc uu tien 7//quan trong
IEC0bits.T1IE = 1; // Enable Timer1 interrupt

T1CONbits.TCKPS = 0b00; // Bo chia tan so 1 : 1

TMR1 = 0x0000;
PR1 = 295 ; // Ngat khi dem tran 10us
//PR1 = 29491 ; // ngat khi dem tran 1ms
// T = (1/Fosc)s ma Fosc = (XTFREQ * PLL) /4
// PR1 = 29.4912 * 1 * 1 cycle (33.9084201388888888888888ns) = 1 us
T1CONbits.TCS = 0; // Timer1 Clock= Internal // Internal clock (FOSC/4)
T1CONbits.TON = 1; // Enable Timer1 and start the counter
}
int goc(float goc){
float goc1 = 0;
unsigned int goc2 = 0;
if(goc == 0) return 0;
else{
goc1 = 18 * goc;
goc1 = goc1/18;
goc2 = (int) goc1;
};
return goc2;
}
sputnhic11 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 11-05-2012, 01:21 PM   #5
soxxxcool
Nhập môn đệ tử
 
soxxxcool's Avatar
 
Tham gia ngày: Nov 2010
Bài gửi: 2
:
Trích:
Nguyên văn bởi sputnhic11 View Post
Em đang làm cái đồ án dùng chip dspic30f4013, bài lập trình thì ngon rùi nhưng phần khai báo vào ra để lắp nút ấn mà em chịu. Em định cho nút ấn ở port F thui vì các port khác em dùng rùi. em gửi đoạn code mong các bác chỉ giúp khai báo ở chỗ nào nhé:


/************************************************** *****************************
; timer1.c la chuong trinh viet bang C de chay tren mot dsPIC *
; Chuong trinh thuc hien viec sau: *
; Su dung Time 1 de tao xung nhip 20ms va thoi gian duty Cryle *
************************************************** ******************************
| __________
| | | |
| | | |
|____| |________________________________________|
<--1,5ms-->
<----------------------20ms------------------------->
; Tac gia : Luu Tuan Khanh *

; Don vi : Uneti *

; Ten tap tin : ltchuan.c *

; Ngay : 23/5/2011 *

; Phien ban : 0.01 *

; Nhung tap tin can thiet khac: p30F4013.gld, p30f4013.h *

; Cong cu duoc dung: MPLAB X IDE beta6.00.01 *
; C30 3.25 * *

------------------------------------------------------------------------------*/
#include <p30fxxxx.h>
#include <timer.h>
/************************************************** ****************************/
//output SERVO
#define LAT_SERVO1 _LATB0
#define LAT_SERVO2 _LATB1
#define LAT_SERVO3 _LATB2
#define LAT_SERVO4 _LATB3
#define LAT_SERVO5 _LATB4
#define LAT_SERVO6 _LATB5

#define LAT_SERVO7 _LATB6
#define LAT_SERVO8 _LATB7
#define LAT_SERVO9 _LATB8
#define LAT_SERVO10 _LATC13
#define LAT_SERVO11 _LATC14
#define LAT_SERVO12 _LATD9
#define congtac1 _TRISF0
#define congtac2 _TRISF1
#define den _LATB9

/*********************Bat dau khai bao bien*************************/
unsigned long counter_servo = 1;
unsigned int speed_servo[13];
//--------------------Ket thuc khai bao bien------------------------//
void config_servo(void);
void timer1_init(void);
int goc(float goc);

void __attribute__((interrupt, no_auto_psv)) _T1Interrupt(void){
IFS0bits.T1IF = 0; //truoc khi ra ngoai thi thi xoa bit _T1IF
T1CONbits.TON = 1;
//timer for 1us*20000=20ms
//1ms=1000 thuc te xxx min
//test 0.5ms - 2.4ms tuong ung voi 1-180do //Do thuc te
if(++counter_servo > 2010) counter_servo = 0;
if(counter_servo >= speed_servo[1] + 62) // MAX 240
LAT_SERVO1=0; // MIN 60
else
LAT_SERVO1=1; // MIN 60
if(counter_servo >= speed_servo[2] + 62) // MAX 240
LAT_SERVO2=0; // MIN 60
else
LAT_SERVO2=1;
if(counter_servo >= speed_servo[3] + 62) // MAX 240
LAT_SERVO3=0; // MIN 60
else
LAT_SERVO3=1;
if(counter_servo >= speed_servo[4] + 62) // MAX 240
LAT_SERVO4=0; // MIN 60
else
LAT_SERVO4=1;
if(counter_servo >= speed_servo[5] + 62) // MAX 240
LAT_SERVO5=0; // MIN 60
else
LAT_SERVO5=1;
if(counter_servo >= speed_servo[6] + 62) // MAX 240
LAT_SERVO6=0; // MIN 60
else
LAT_SERVO6=1;
if(counter_servo >= speed_servo[7] + 62) // MAX 240
LAT_SERVO7=0; // MIN 60
else
LAT_SERVO7=1; // MIN 60
if(counter_servo >= speed_servo[8] + 62) // MAX 240
LAT_SERVO8=0; // MIN 60
else
LAT_SERVO8=1;
if(counter_servo >= speed_servo[9] + 62) // MAX 240
LAT_SERVO9=0; // MIN 60
else
LAT_SERVO9=1;
if(counter_servo >= speed_servo[10] + 62) // MAX 240
LAT_SERVO10=0; // MIN 60
else
LAT_SERVO10=1;
if(counter_servo >= speed_servo[11] + 62) // MAX 240
LAT_SERVO11=0; // MIN 60
else
LAT_SERVO11=1;
if(counter_servo >= speed_servo[12] + 62) // MAX 240
LAT_SERVO12=0; // MIN 60
else
LAT_SERVO12=1;
}

void config_servo(void){
ADPCFG = 0xffff;
TRISB = 0x00;
TRISC = 0x00;
TRISD = 0x00;
TRISF = 0x00;

LATB = 0x00;
LATC = 0x00;
LATD = 0x00;
LATF = 0x00;

}
void timer1_init(void)
{
config_servo();
T1CON = 0; // Timer reset
T1CONbits.TSIDL = 0; //hoat dong ngay ca o che do ngu
T1CONbits.TGATE = 0; //Gated time accumulation enabled(TCS must be set to ‘0’ when TGATE = 1. Reads as ‘0’ if TCS = 1)
//T1CONbits.TSYNC = 0; //bit nay duoc bo qua khi bit TCS = 0; chi quan tam khi TCS = 1;
IFS0bits.T1IF = 0; // Reset Timer1 interrupt flag
IPC0bits.T1IP = 0b111; // Timer1 Interrupt priority level=7 // muc uu tien 7//quan trong
IEC0bits.T1IE = 1; // Enable Timer1 interrupt

T1CONbits.TCKPS = 0b00; // Bo chia tan so 1 : 1

TMR1 = 0x0000;
PR1 = 295 ; // Ngat khi dem tran 10us
//PR1 = 29491 ; // ngat khi dem tran 1ms
// T = (1/Fosc)s ma Fosc = (XTFREQ * PLL) /4
// PR1 = 29.4912 * 1 * 1 cycle (33.9084201388888888888888ns) = 1 us
T1CONbits.TCS = 0; // Timer1 Clock= Internal // Internal clock (FOSC/4)
T1CONbits.TON = 1; // Enable Timer1 and start the counter
}
int goc(float goc){
float goc1 = 0;
unsigned int goc2 = 0;
if(goc == 0) return 0;
else{
goc1 = 18 * goc;
goc1 = goc1/18;
goc2 = (int) goc1;
};
return goc2;
}

Hi bạn,bạn muốn dùng port F để làm nút nhấn thì theo ý kiến của mình bạn nên set Port F là "TRISF = 0xff" và cấu hình port F là digital (nếu port này có chân nào là Analog,mình chưa đoc datasheet nên ko rõ).
Chúc bạn thành công !
__________________
www.titans.com.vn
Where technology begins !
soxxxcool vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 22-09-2015, 09:11 AM   #6
teemo
Nhập môn đệ tử
 
Tham gia ngày: Nov 2014
Bài gửi: 9
:
Unhappy

Trích:
Nguyên văn bởi tungbka View Post
Em đang viết chương trình nhận dữ liệu từ máy tính xuống để điều khiển cái động cơ. Nhưng sau khi biên dịch thì xuất hiện cảnh báo sau:
Interrupts disabled during call to prevent re-entrancy: (@MUL1616).
Em có tham khảo các nguồn thì được biết là do trong hàm ngắt và ngoài hàm ngắt em sử dụng lặp lại 1 hàm hay 1 biến gì đó, nhưng em tìm mãi không thấy sai chỗ nào. Mong các pro chỉ giúp. Em cám ơn nhìu.
Chương trình của em như sau:
(Sorry vì em không biết đưa code vào trong ô code ^^!)

Code:
#include <16f877a.h>
#include <def_877a.h>
#include <stdlib.h>
#fuses  NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT 
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8) 
#include <lcd_lib_4bit.c>
/*#define enter RA2
#define s_t   RA3
#define f_r   RA5
#define up    RE0
#define down  RE1
*/
void ht(int16 a);
//void ht1(int16 a);
void init();
void pid();
void nhapheso();
//void up_down();
int16 count, tocdo, C, temp, temp1, k, tocdodat ;
signed int16 e2=0;
signed int16 e1=0;
int16 e_sum;
int16 e_del;
int16 duty;
float Kp=0;
float Ki=0;
float Kd=0;
int flag=0;
float u, T=0.01;

unsigned char text[30], text2[5] ;
unsigned char a1[5], dem=0, i=0, j=0,i1;

#INT_RDA
void Receive_isr() 
{
text[dem]=getc();
if(text[dem]=='@') //kiem tra dieu kien ket thuc
   {
   flag =1;    //ket thuc nhan, bat co bao
   dem=0;
   }
else dem++;
}
#INT_EXT
void ngatR0()  {
        count++;//set_timer0(0);
      }
#int_timer1
void Timer11_isr() {                // Ham duoc goi khi TImer1 tran (65535->0)
                                   // Chu ky trich mau 0.01
    
      set_timer1(53036);
      tocdo= 30*(count + get_timer0());
     // printf("%ld\t",tocdo);
      count = 0;
      set_timer0(0);

   
    }
void main(){
init();
lcd_putcmd(0x01);
while(true){
                //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
      pid();
if(RC1==0) set_PWM1_duty(duty);
if(RC1==1) set_PWM1_duty(1023 - duty);  
lcd_putcmd(0x80);
ht(tocdo);
printf("n%4Lu",tocdo);


//lcd_putchar("hi");


}
}
void init()
{
   lcd_init();
   nhapheso();
   disable_interrupts(int_rda);
   disable_interrupts(global);
   setup_timer_0 (RTCC_DIV_1|RTCC_EXT_L_TO_H);  // Timer0 is Counter
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_4);
   setup_ccp1(CCP_PWM);
   setup_timer_2(T2_DIV_BY_4, 255, 1);//4*4*256*1/20000000=204.8us=4.8khz
   set_timer0(0);
   set_timer1(53036);
   enable_interrupts(INT_RTCC);
   enable_interrupts(int_timer1);
   enable_interrupts(int_ext);
   ext_int_edge(L_TO_H);
   enable_interrupts(GLOBAL);
   lcd_putcmd(0x80);
   count=0;
   trisc=0;
   trisd=0;
   trisa=255;
   trisb=1;
   RC1=0;
   if(C==1) RC1=1;
   If(C==0) RC1=0;
   }
void pid(){
   e2 = tocdodat - tocdo;
   e_sum += e2;
//   e_del = e2 - e1;
//   e1 = e2;
   u = u + Kp*e2 + Ki*e_sum*T;
   if (u>24){
   u=24;
   e_sum -=e2;
   }
   if (u<0){
   u = 0;
   e_sum -=e2;
   }
  duty = u*1023/24;
}
void ht(long a) {
     int nghin,tram,chuc,dvi;
     nghin=a/1000;
     tram=(a%1000)/100;
     chuc=(a%100)/10;
     dvi=(a%10);
     lcd_putchar(nghin+48);
     lcd_putchar(tram+48);
     lcd_putchar(chuc+48);
     lcd_putchar(dvi+48);
}
void nhapheso(){
   lcd_putchar("nhap tu PC");
   enable_interrupts(int_rda);
   enable_interrupts(GLOBAL);
while(!flag) ;
if(flag){

              //if ((strchr(text,'T')) && (strrchr(text, '@')))
         
                text2[0] = text[0];
                text2[1] = text[1];
                text2[2] = text[2];
                text2[3] = text[3];
                text2[4] = text[4];
                tocdodat = atol(text2);
               
                //----------------------------------------
                  while (text[i] != 'P')
                    i++;
                  while (text[j] != 'I')
                    j++;
                  i1 = i;
                  temp = j - i;                  
                  for (i = 0; i < temp; i++)
                    a1[i] = text[i1 + i + 1];
                    
                  Kp = atof(a1);
                 
                  printf("P%f",Kp);
                   delay_ms(100);   
                  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
                  i = j;
                  while (text[j] != 'D')
                    j++;
                  i1 = i;
                  temp = j - i;                  
                  for (i = 0; i < temp; i++)
                    a1[i] = text[i1 + i + 1];
                    
                  Ki = atof(a1);
                  printf("I%f",Ki);
                     delay_ms(100);
                  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
                  i = j;
                  while (text[j] != 'C')
                    j++;
                  i1 = i;
                  temp = j - i;                  
                  for (i = 0; i < temp; i++)
                    a1[i] = text[i1 + i + 1];
                    
                  Kd = atof(a1);
                  printf("D%f",Kd);
                     delay_ms(100);
                  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
                  i = j;
                  while (text[j] != '@')
                    j++;
                  i1 = i;
                  temp = j - i;                  
                  for (i = 0; i < temp; i++)
                    a1[i] = text[i1 + i + 1];
                    
                  C = atol(a1);
                  printf("C%Lu",C);
                  flag=0;
                  i=0; j=0;
                  dem=0;
 
                  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
                                                
          } 

}
Không ai trả lời vấn đề này sao???
teemo vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 08-12-2010, 12:36 AM   #7
nhanconan030789
Đệ tử 3 túi
 
Tham gia ngày: Mar 2009
Bài gửi: 49
:
em mới học pic nên còn gà mờ lắm!các anh đừng cười em!ông thầy dạy bài timer0 bảo là có thể dùng xung bên ngoài từ chân T0CKI nhưng em da thử rồi mà không biết làm cách nào để định nghĩa cái chan RA4 đó là xung vào hết!!anh chị nào làm ơn giúp em với,em acmr ơn rất nhiều!!
#include<htc.h>
void init_timer0()
{
T0CS=1;
T0SE=0;
PSA=1;
TMR0=253;
T0IF=0;
T0IE=1;
PEIE=1;
GIE=1;
}
void interrrupt_timer0()
{
if (T0IF==1)
{
T0IF=0;
TMR0=253;
RD0^=1;
}
}
void main()
{
TRISA4=1;
TRISD0=0;
init_timer0();
while(1);

}
nhanconan030789 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 09-12-2010, 10:00 PM   #8
nhoczin
Đệ tử 3 túi
 
Tham gia ngày: Jul 2008
Bài gửi: 57
:
Trích:
Nguyên văn bởi nhanconan030789 View Post
em mới học pic nên còn gà mờ lắm!các anh đừng cười em!ông thầy dạy bài timer0 bảo là có thể dùng xung bên ngoài từ chân T0CKI nhưng em da thử rồi mà không biết làm cách nào để định nghĩa cái chan RA4 đó là xung vào hết!!anh chị nào làm ơn giúp em với,em acmr ơn rất nhiều!!
#include<htc.h>
void init_timer0()
{
T0CS=1;
T0SE=0;
PSA=1;
TMR0=253;
T0IF=0;
T0IE=1;
PEIE=1;
GIE=1;
}
void interrrupt_timer0()
{
if (T0IF==1)
{
T0IF=0;
TMR0=253;
RD0^=1;
}
}
void main()
{
TRISA4=1;
TRISD0=0;
init_timer0();
while(1);

}
Mình ko rành HTPIC tuy nhiên theo mình biết chương trình của bạn sẽ không chạy được vì đọc cái code kia ko thấy chỗ nào chú thích cho chương trình ngắt cả. Mình thấy nếu sử dụng chương trình con phục vụ ngắt thì nó phải có 1 kí hiệu gì đó vd #INT.... chẳng hạn, còn chỉ viết thế kia thì trình dịch sẽ hiểu đấy là 1 chương trình con bình thường ( có thể đấy là nguyên nhân ? )>>> với chương trình con bình thường không thấy bạn gọi hàm interrupt_timer0 ở chỗ nào >>> ko chạy được (suy đoán thế, nếu sai thì góp ý nhé).
nhoczin vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 12-12-2010, 06:20 PM   #9
toandinh1990
Nhập môn đệ tử
 
Tham gia ngày: Sep 2010
Bài gửi: 2
:
Các cao thủ ơi giúp mình với,chả là mình đang làm mạch trái tim bằng PIC tặng Noel này cho nàng, gặp một lỗi rất oái ăm là code dài quá quá bank 0 đi,ko biết cách nào để chuyển sang bank1 được(chuyển dc thì chạy ở bank 0 lại ko đúng hix...)
ai bít giúp mình sớm sớm nhé sắp tới noel rùi mà hjj
lỗi mình up lên đây nè.sr vì ko bít up ảnh lên diễn đàn .thankssss mọi người nhé
http://www.mediafire.com/?lysl6dic6whmb5m
toandinh1990 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 03-05-2012, 12:09 AM   #10
soxxxcool
Nhập môn đệ tử
 
soxxxcool's Avatar
 
Tham gia ngày: Nov 2010
Bài gửi: 2
:
Trích:
Nguyên văn bởi nhanconan030789 View Post
em mới học pic nên còn gà mờ lắm!các anh đừng cười em!ông thầy dạy bài timer0 bảo là có thể dùng xung bên ngoài từ chân T0CKI nhưng em da thử rồi mà không biết làm cách nào để định nghĩa cái chan RA4 đó là xung vào hết!!anh chị nào làm ơn giúp em với,em acmr ơn rất nhiều!!
#include<htc.h>
void init_timer0()
{
T0CS=1;
T0SE=0;
PSA=1;
TMR0=253;
T0IF=0;
T0IE=1;
PEIE=1;
GIE=1;
}
void interrrupt_timer0()
{
if (T0IF==1)
{
T0IF=0;
TMR0=253;
RD0^=1;
}
}
void main()
{
TRISA4=1;
TRISD0=0;
init_timer0();
while(1);

}
nếu bạn viết bằng HTPIC thì bạn thiếu dòng "void interrupt" phía trên hàm "void interrrupt_timer0()". interrrupt_timer0() chỉ là hàm con của bạn thôi,bạn nên có 1 dòng "void interrupt" để MBLAB hiểu là bạn muốn thông báo là bạn muốn sử dụng ngắt timer 0. Mình nghĩ bạn nên sửa đoạn ngắt timer lai như thế này:

void interrupt
void interrrupt_timer0()
{
if (T0IF==1)
{
T0IF=0;
TMR0=253;
RD0^=1;
}
}

Chúc bạn thành công.
__________________
www.titans.com.vn
Where technology begins !
soxxxcool vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 13-12-2010, 10:50 AM   #11
TheHouse
Đệ tử 1 túi
 
Tham gia ngày: Feb 2010
Bài gửi: 13
:
Code của mình cũng không chạy, & có chút thắc mắc về set_tris_b() khác với PORTB = () như thế nào. Khi mình cùng đưa dữ liệu vào port B, thì 2 cách làm này lại cho ra dữ liệu khác nhau. Trong đó, có 1 cái phụ thuộc vào điện trở treo bên trong PIC, còn cái kia thì không. Mình chưa rõ cách dùng chính xác 2 hàm này như thế nào và trong trường hợp nào. Mong được giải đáp.



TheHouse vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 13-12-2010, 12:55 PM   #12
caovanhuong
Đệ tử 2 túi
 
caovanhuong's Avatar
 
Tham gia ngày: Jul 2009
Bài gửi: 40
:
Trích:
Nguyên văn bởi TheHouse View Post
Code của mình cũng không chạy, & có chút thắc mắc về set_tris_b() khác với PORTB = () như thế nào. Khi mình cùng đưa dữ liệu vào port B, thì 2 cách làm này lại cho ra dữ liệu khác nhau. Trong đó, có 1 cái phụ thuộc vào điện trở treo bên trong PIC, còn cái kia thì không. Mình chưa rõ cách dùng chính xác 2 hàm này như thế nào và trong trường hợp nào. Mong được giải đáp.



2 hàm này là hoàn tòn khác nhau
set_tris_b(); hàm này dùng để set portb là hàm xuất dữ liệu hay nhận dữ liệu. nếu bạn set là xuất dữ liệu thì khi nối led vào và xuất dữ liệu ra thì led sẽ sáng, còn bạn set là nhận dữ liệu thì khi xuất dữ liệu ra portb nó sẽ không sáng.
portb=; hàm này là hàm chỉ có chức năng xuất dữ liệu ra ngoài. vd bạn viết portb=0xff;
=> từ B0 tới B7 giá trị các cổng là 1
cái hàm set_tris_b(value); nó tương đương với hàm trisb=value;
VD như hình đầu tiên bạn thay trisb=0x00 = set_tris_b(0) thì kết quả cũng giống như nhau. nhưng khi sử dụng hàm set_tris_b thì phải khai báo thêm hàm #use fast_io(b); nữa
__________________
Cao Văn Hưởng
SĐT: 01672754113
Email: caovanhuong@webdien.com
Nhận thiết kế mạch điện tử, PCB (Orcad)


thay đổi nội dung bởi: caovanhuong, 13-12-2010 lúc 01:00 PM.
caovanhuong vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 19-12-2010, 08:13 PM   #13
ilusmmf
Nhập môn đệ tử
 
Tham gia ngày: Nov 2010
Bài gửi: 3
:
vấn đề với mạch máy tính đơn giản

Em hiện đang học về kinh tế, không biết nhiều về điện tử, nhưng vì thấy thích nên có tham khảo quyển Newnes.Advanced.PIC.Microcontroller.Projects.in C và làm được mấy cái mạch dịch led đơn giản. Sau đó theo hướng dẫn của sách trên, em làm mạch máy tính đơn giản. Mô phỏng trên proteus đã chạy nhưng khi làm mạch thật thì chỉ hiện lên 16 ô màu đen ở dòng trên của LCD 16x2 chỉnh biến trở thì thấy độ sáng tối có thay đổi(em mô phỏng trong protues là lcd 16x1 nhưng ko mua được nên ẵm con 16x2 về). Em mượn cái VOM về test thử thì thấy các chân 17,18,23,24,25,26 của PIC tương ứng với các mức logic như mô phỏng trong protues, lcd tương ứng từ 1-14 là 010100_0000_0101 cũng giống trong protues, chân 15 em nối trở 330 nối nguồn, chân 16 nối đất(em mắc y chang con 16x1). em sắp thi học kì, định qua thi rồi tiếp tục làm tiếp, nhưng mạch không ra cứ ấm ức không tập trung ôn bài được rất rất mong các tiền bối chỉ giáo giúp em , em rất rất cảm ơn.
File Kèm Theo
File Type: zip New Folder.zip (23.9 KB, 24 lần tải)
ilusmmf vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 21-01-2011, 02:26 PM   #14
vinhuct
Nhập môn đệ tử
 
Tham gia ngày: Dec 2010
Bài gửi: 4
:
Xin các bác giúp Em tìm lỗi

Em viết chương trính CCS C cho PIC8F4431. Đoạn code va mạch trong file đính kèm.Em muốn hiện cả 2 khối như kiểu đèn tín hiệu giao thông, xanh rồi dến đỏ ở 2 pha đường khác nhau. Nhưng khi mô phỏng thì nó chỉ hiện lần lượt xanh rồi đến đỏ ở từng pha mà không hiện đồng thời cả 2 pha. Mong các Bác sửa giúp.
#include <18F4431.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)

int dvi1,truc1,dvi2,truc2,dvi3,truc3,dvi4,truc4;
int billy[]={0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7C,0x7,0x7F,0x6F };
int16 i,j,a,c,m,n,o,e ;

void doi()
{
truc1=a/10;
dvi1=a%10;
truc2=c/10;
dvi2=c%10;
truc3=m/10;
dvi3=m%10;
truc4=n/10;
dvi4=n%10;
}
void hien1()
{
for(i=0;i<450;i++)
{
if(input(pin_E2))
{
output_D(0b11111110);

output_B(billy[dvi1]);
delay_us(100);

output_D(0b11111101);

output_B(billy[truc1]);
delay_us(100);
}
else output_B(billy[0]);
delay_us(100);
}}
void hien2()
{
for(i=0;i<450;i++)
{
if(input(pin_E2))
{
output_D(0b111111011);

output_B(billy[dvi2]);
delay_us(100);

output_D(0b111110111);

output_B(billy[truc2]);
delay_us(100);
}
else output_B(billy[0]);
delay_us(100);
}}
void hien3()
{
for(i=0;i<450;i++)
{
if(input(pin_E2))
{
output_D(0b11101111);

output_B(billy[dvi3]);
delay_us(100);

output_D(0b11011111);

output_B(billy[truc3]);
delay_us(100);
}
else output_B(billy[0]);
delay_us(100);
}}
void hien4()
{
for(i=0;i<450;i++)
{
if(input(pin_E2))
{
output_D(0b10111111);

output_B(billy[dvi4]);
delay_us(100);

output_D(0b01111111);

output_B(billy[truc4]);
delay_us(100);
}
else output_B(billy[0]);
delay_us(100);
}}


void hien12()
{


for(j=0;j<11;j++)
{
a=10-j;
doi();
hien1();
if(a==0)
break;
}


for(j=0;j<4;j++)
{
c=3-j;
doi();
hien2();
if(c==0)
break;
}

}
void hien34()

{


for(j=0;j<9;j++)
{
m=8-j;
doi();
hien3();
if(m==0)
break;
}


for(j=0;j<6;j++)
{
n=5-j;
doi();
hien4();
if(n==0)
break;
}

}
void main()
{
set_tris_E(0x00001100);
set_tris_B(0x00);
set_tris_D(0x00);
set_tris_C(0x00);
while(1)
{

hien12();
hien34();
}

}
vinhuct vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 22-01-2011, 12:09 AM   #15
Trevn001
Nhập môn đệ tử
 
Tham gia ngày: Jan 2011
Bài gửi: 1
:
Chào cả nha` mình mới mò PIC được khoảng 1 tuần nay đang có 1 số vấn đề nhờ giải đáp:

1. Mình dùng PIC16F887 mạch nạp PICKIT2 và CCS, mô phỏng bằng PROTUES 7.6
2. Thạch anh 20Mhz và tụ 33pF
3. Đây là code của mình

#include <16f877.h>
#include <def_877a.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=200000)
void main()
{
// Thiet lap che do cho PORTC
While(1)
{
trisc = 0x00; // Tat ca PORTCdeu la cong xuat du lieu
portc=0xff;
}
}



và đây là các vấn đề của mình

1. Trong Protues mình có đo được xung của thạch anh không. mình dung ocylo đo không được chỉ là 1 đường thẳng dài vô tận
2. KHi mình nạp file HEX có 1 cái warning : some configing words not in hex file...
nạp vẫn báo success. cái này liệu có ảnh hưởng gì không.
3. Vấn đề to nhất là mình cắm trên board nó không chạy gì cả. Mình dùng đồng hồ đo chân ra đều 0.8 V là cao. đã thay board khác vẫn khoong được. thay thạch anh, tụ khác vẫn
thế. các chân mình đã dung đông hồ kiểm tra xem co bị hở không rồi.
4. các anh chị em nào ở BKHN có thể chỉ điểm hộ mình được không. Mình rất cần người làm trực tiếp để học.


// mình hỏi có j ngớ ngẫn bỏ qua cho. mình dân cơ khí.
Trevn001 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời

Ðiều Chỉnh
Xếp Bài

Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


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


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam