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)
-   -   Delay = timer???? (http://www.picvietnam.com/forum/showthread.php?t=2550)

KA52 30-06-2008 11:48 PM

Delay = timer????
 
Làm sao để e thay thế delay = timer vậy??
VD:
output_a(0xff);
delay_ms(1000);
output_a(0x00);
delay_ms(1000);
e muốn thay delay = timer để sau khi xuất porta = 0xff thì làm việc khác, sau khi timer đủ 1s thì quay lại tiếp tục xuất porta = 0x00. E định xài ngắt nhưng với hơn chục delay thì ngắt sao đủ đây!!!???

cho e hỏi thêm chương trình này. cứ sau vài phút là pic của e đơ lun, ko nhận đc & truyền đc dữ liệu. Ko bít sao nữa, phải reset lại mới chạy đc. Pác nào xem giúp e lỗi ở đâu với ?? E định để khoảng 5~10 phút reset pic 1 lần nhưng cái WDT e ko bít cấu hình thời gian dài như vậy?
Trong datasheet ghi Watchdog Timer Time-out Period = 33ms với 1:1, vậy e set 1:128 cũng đc có 5s, ko bít e có hiểu sai ko nữa. (e xài 20Mhz)

Code:

#include "D:\Document\Working Files\CAN\usart\main.h"
//#include <18F4580.h>
#fuses HS,NOPROTECT,NOLVP,NOWDT
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, parity=N, bits=8)

#include <can-18F4580.c>

#define data_id_a        0x201 
#define data_id_b        0x202
#define data_id_c        0x203
#define data_id_d        0x204
#define data_id_e        0x205

#define data_id_m        0x301
#define data_id_n        0x302
#define data_id_o        0x303
#define data_id_p        0x304
#define data_id_q        0x305
#define data_id_r        0x306
#define data_id_s        0x307
#define data_id_t        0x308
#define data_id_u        0x309
#define data_id_v        0x30a
///////////////////////////////////////////////////////////////////
char t;
int dem;
#byte porta  = 0xf80
#INT_RDA
void rda_isr()
{
  t=getc(); 
  dem=3;
  putc(t);
}
///////////////////////////////////////////////////////////////////
void main()
{
  int mang[16]={0,1,2,3,4,5,6,7,8,9,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f};
  int *pointer,led,i;
  int data1,data2,data3,data4,data5,data3a,data4a;
  int data6,data7,data8,data9;
  int data10,data11,data12,data13;
  set_tris_a(0x00);
  set_tris_d(0xff);
  pointer=&mang[0];
  can_init();
  ENABLE_INTERRUPTS(GLOBAL);
  ENABLE_INTERRUPTS(INT_RDA);
  i=16;
  while(1)
  {
      output_a(t);
      dem=0;
     
/*      if(t==0X01)
      {
        if ((can_tbe()) && (dem==1))
        { 
            led=*pointer;
            can_putd(SET_LED_ID_A,&led , 1, 1, 1, 0);     
            delay_ms(250);
            dem--;
        }
        pointer++;
        i--;     
        if(i==0)
        {
            i=16;
            pointer=&mang[0];
        }     
      }*/
///////////////////////////////////////////////////////////////////     
      if (t==0x01)              //quay thuan
      {
        if ((can_tbe()) && (dem>0))
        {
            data1=0x01;
            can_putd(data_id_a,&data1 , 1, 1, 1, 0);
            delay_ms(250);
            dem--;
        }       
      } 
      else if (t==0x02)          //quay nghich
      {
        if ((can_tbe()) && (dem>0))
        {
            data2=0x02;
            can_putd(data_id_b,&data2 , 1, 1, 1, 0);
            delay_ms(250);
            dem--;
        }
      }     
      else if (t==0x03)          //inc
      {
        if ((can_tbe()) && (dem>0))
        {
            data3=0x03;
            can_putd(data_id_c,&data3 , 1, 1, 1, 0);
            delay_ms(250);
            dem--;
        }
      }
      else if (t==0x04)          //dec
      {
        if ((can_tbe()) && (dem>0))
        {
            data4=0x04;
            can_putd(data_id_d,&data4 , 1, 1, 1, 0);
            delay_ms(250);
            dem--;
        }
      }
      else if (t==0x05)          //stop dong co buoc
      {
        if ((can_tbe()) && (dem>0))
        {
            data5=0x05;
            can_putd(data_id_e,&data5 , 1, 1, 1, 0);
            delay_ms(250);
            dem--;
        }
      }
///////////////////////////////////////////////////////////////////     
      else if (t==0x06)          //b1
      {
        if ((can_tbe()) && (dem>0))
        {
            data6=0x06;
            can_putd(data_id_m,&data6 , 1, 1, 1, 0);
            delay_ms(250);
            dem--;
        }
      }
      else if (t==0x07)          //b2
      {
        if ((can_tbe()) && (dem>0))
        {
            data7=0x07;
            can_putd(data_id_n,&data7 , 1, 1, 1, 0);
            delay_ms(250);
            dem--;
        }
      }
      else if (t==0x08)          //b3
      {
        if ((can_tbe()) && (dem>0))
        {
            data8=0x08;
            can_putd(data_id_o,&data8 , 1, 1, 1, 0);
            delay_ms(250);
            dem--;
        }
      }     
      else if (t==0x09)          //b4
      {
        if ((can_tbe()) && (dem>0))
        {
            data9=0x09;
            can_putd(data_id_p,&data9 , 1, 1, 1, 0);
            delay_ms(250);
            dem--;
        }
      }
      else if (t==0x0a)          //b5
      {
        if ((can_tbe()) && (dem>0))
        {
            data10=0x0a;
            can_putd(data_id_q,&data10 , 1, 1, 1, 0);
            delay_ms(250);
            dem--;
        }
      }
      else if (t==0x0b)          //b6
      {
        if ((can_tbe()) && (dem>0))
        {
            data11=0x0b;
            can_putd(data_id_r,&data11 , 1, 1, 1, 0);
            delay_ms(250);
            dem--;
        }
      }
      else if (t==0x0c)          //tu dong
      {
        if ((can_tbe()) && (dem>0))
        {
            data12=0x0c;
            can_putd(data_id_s,&data12 , 1, 1, 1, 0);
            delay_ms(250);
            dem--;
        }
      }
      else if (t==0x0d)          //stop dog nap chai
      {
        if ((can_tbe()) && (dem>0))
        {
            data13=0x0d;
            can_putd(data_id_t,&data13 , 1, 1, 1, 0);
            delay_ms(250);
            dem--;
        }
      }     
  }
}


david 01-07-2008 08:17 AM

1 Attachment(s)
dùng ngắt timer như bạn nói ko có gi khó cả,bạn đếm xem mấy lần ngắt timer0 thì sẽ được 1s, rồi lúc đấy thực hiện.
Gửi cho bạn cái chương trình tính toán độ trễ timer

KA52 01-07-2008 08:46 AM

vấn đề là trong khi chờ delay 1s thì pic của e lại xuất ra port khác với delay 1s nữa, mà e làm 4~5 cái như vậy, vậy vửa delay cái này, vửa delay cái khác chỉ với 3 timer sao đủ??
Cái PIC timer cal e có rùi nhưng cái này hình như cho pic16, e lại xài pic18 nên tính ko đúng rùi.
Còn WDT với thời gian 5~10 phút, pác nào biết giúp e với???

kinhaxac 01-07-2008 12:24 PM

bác david có ví dụ j về ngắt timer0 hoặc các ngắt khác không post lên cho em tham khảo với , em đang chưa biết viết một chuong trình dùng ngắt timer như thế nào (dùng ccs)
thanks

phamminhtuan 01-07-2008 08:03 PM

Trích:

Nguyên văn bởi KA52 (Post 17190)
vấn đề là trong khi chờ delay 1s thì pic của e lại xuất ra port khác với delay 1s nữa, mà e làm 4~5 cái như vậy, vậy vửa delay cái này, vửa delay cái khác chỉ với 3 timer sao đủ??
Cái PIC timer cal e có rùi nhưng cái này hình như cho pic16, e lại xài pic18 nên tính ko đúng rùi.
Còn WDT với thời gian 5~10 phút, pác nào biết giúp e với???

Bác thử nghiên cứu cái RTOS đơn giản của CCS C xem sao, làm vài cái task thì cứ khoảng đúng thời gian như bác định là mỗi task tự thực hiện nhiệm vụ của nó mà không lo gì cả. Ở trong file Help của CCS có nói hết, ngoài ra còn có mấy file ví dụ của nó nữa.:rolleyes:

còn cách tính delay, các bạn vào site của Microchip, có rất nhiều example trong đó.

http://www.microchipc.com/sourcecode/

namqn 01-07-2008 09:34 PM

Bạn có thể dựa vào sườn chương trình sau để viết, tôi không dùng CCS C nên không viết cụ thể cho CCS C, bạn sẽ phải tự viết cho đúng cú pháp.
Code:

//Khai báo các biến số đếm và cờ từ 1 đến n

main() {
        // Vòng lặp chính
        while (1) {
                //Thực hiện công việc gì đó
                if (cờ 1 == 1) {
                        //Thực hiện công việc tương ứng
                        cờ 1 = 0;
                }
                if (cờ 2 == 1) {
                        //Thực hiện công việc tương ứng
                        cờ 2 = 0;
                }
                //Tương tự cho những công việc khác
        }
}

//Trình xử lý ngắt timer 1 chẳng hạn
ngat_timer1() {
        //Tăng số đếm 1
        if (số đếm 1 == ngưỡng 1) {
                số đếm 1 = 0;
                // Bật cờ 1;
        }
        //Tăng số đếm 2
        if (số đếm 2 == ngưỡng 2) {
                số đếm 2 = 0;
                // Bật cờ 2;
        }
        //Tưong tự cho các cờ khác
}

Chỉ cần thiết lập ngắt timer sao cho nó xảy ra ở một tần suất đủ nhanh để bạn có thể đặt thời gian trễ cho các công việc khác một cách thuận lợi. Ví dụ, timer ngắt mỗi 10 ms, nếu bạn không có công việc nào cần làm trễ ít hơn 100 ms. Như vậy, các số đếm tương ứng với các thời gian làm trễ 1 giây, 2 giây chẳng hạn, sẽ là 100 và 200.

Cách làm này dùng hơi nhiều RAM, nhưng không phải là vấn đề lớn với PIC18, đặc biệt nếu bạn chỉ có vài tác vụ đến vài chục tác vụ.

Thân,


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