ldhung
16-10-2010, 09:42 AM
Chào các bạn !
mình vừa viết 1 chương trình như thế naỳ cho con PIC16F88:
Input A0: tín hiệu PWM có đọ rộng xung từ 1ms đến 2ms (tín hiệu điều khiển servo RC)
Out Put B0,B1...B7: ứng với mỗi độ rông xung em sẽ xuất LED khác nhau.
vi dụ: int dW = 1,1 ;//(đọ rộng xung)
dw = 1,1 em xuất LED B0;
dw = 1,2 em xuất LED B0,B1;.....dw = 1,8 em xuất LED B0,B1,B2,B3,B4,B5,B6,B7;
code em viết như thế này ,nó chỉ chạy đoạn code TEST PIC,em không biết chương trình tính sai chổ nào mà LED không sáng gì cả ! mong các bạn giúp cho. Cám ơn các bạn
#include <16F88.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz)
#FUSES PUT //Power Up Timer
#FUSES MCLR //Master Clear pin enabled
#FUSES BROWNOUT //Reset when brownout detected
#use delay(clock=20000000)
#byte portb=0x06
INT8 i,indata,indatb,templateA;
INT16 TimerL,dx;
double delta;
INT8 ledON[8]={0b00000001,0b00000011,0b00000111,0b00001111,0b00 011111,0b00111111,0b01111111,0b11111111};
//------------------------
void main(){
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
templateA= 0b00000001 ; // input 1 channels
//code TEST PIC
set_tris_b(0);
for(TimerL=1;TimerL<=5; TimerL++)//để biết chăc chắn code đã chạy tốt
{
portb = 0b00000000;
delay_ms(200);
portb = 0b11111111;
delay_ms(200);
}
//code TEST PIC
delta = 125;//=(2000-1000)/8Led
dx = 1000;
portb = 0b00000000;
do
{
timerL=0;
do
{
}
while (! input(pin_A0) );//doc tin hieu low
do
{
TimerL ++;//dem do rong xung
delay_us(1);
//delay_cycles(5);//5*0.2us = 1us
}
while ( input(PIN_A0) );//doc tin hieu high
//TimerL > = 1000 && TimerL <= 2000 có đúng không các bạn ?
for(i =8;i >=0 ;i--)
{
if(TimerL >= dx + (double)delta*i )
{
portb = ledON[i-1];
break;
}
}
}
while (true);
}
mình vừa viết 1 chương trình như thế naỳ cho con PIC16F88:
Input A0: tín hiệu PWM có đọ rộng xung từ 1ms đến 2ms (tín hiệu điều khiển servo RC)
Out Put B0,B1...B7: ứng với mỗi độ rông xung em sẽ xuất LED khác nhau.
vi dụ: int dW = 1,1 ;//(đọ rộng xung)
dw = 1,1 em xuất LED B0;
dw = 1,2 em xuất LED B0,B1;.....dw = 1,8 em xuất LED B0,B1,B2,B3,B4,B5,B6,B7;
code em viết như thế này ,nó chỉ chạy đoạn code TEST PIC,em không biết chương trình tính sai chổ nào mà LED không sáng gì cả ! mong các bạn giúp cho. Cám ơn các bạn
#include <16F88.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz)
#FUSES PUT //Power Up Timer
#FUSES MCLR //Master Clear pin enabled
#FUSES BROWNOUT //Reset when brownout detected
#use delay(clock=20000000)
#byte portb=0x06
INT8 i,indata,indatb,templateA;
INT16 TimerL,dx;
double delta;
INT8 ledON[8]={0b00000001,0b00000011,0b00000111,0b00001111,0b00 011111,0b00111111,0b01111111,0b11111111};
//------------------------
void main(){
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
templateA= 0b00000001 ; // input 1 channels
//code TEST PIC
set_tris_b(0);
for(TimerL=1;TimerL<=5; TimerL++)//để biết chăc chắn code đã chạy tốt
{
portb = 0b00000000;
delay_ms(200);
portb = 0b11111111;
delay_ms(200);
}
//code TEST PIC
delta = 125;//=(2000-1000)/8Led
dx = 1000;
portb = 0b00000000;
do
{
timerL=0;
do
{
}
while (! input(pin_A0) );//doc tin hieu low
do
{
TimerL ++;//dem do rong xung
delay_us(1);
//delay_cycles(5);//5*0.2us = 1us
}
while ( input(PIN_A0) );//doc tin hieu high
//TimerL > = 1000 && TimerL <= 2000 có đúng không các bạn ?
for(i =8;i >=0 ;i--)
{
if(TimerL >= dx + (double)delta*i )
{
portb = ledON[i-1];
break;
}
}
}
while (true);
}