KA52
30-06-2008, 11:48 PM
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)
#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,0x0 f};
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--;
}
}
}
}
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)
#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,0x0 f};
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--;
}
}
}
}