มีเรื่องให้ช่วยหน่อยคับผม T_T

Started by pomcoe, February 12, 2013, 11:47:21 AM

Previous topic - Next topic

pomcoe

ช่วยดูให้ทีนะคับ
ว่าทำไมพอต่อใช้งานจริงแล้วมันสามารถ อินพุต portA ใช้ได้แค่ pinA0,A1,A2,A3  และทำไม Output แสดงผล ออกได้แค่ pin B0 ,Pin B3 อะคับ
ผมลองย้ายไป Pin B2,B4,B5,B6,B7,B8 ดูแล้ว แต่ output ไม่ออกอะคับ

ช่วยแนะนำทีคับ
ผมใช้ PIC เบอร์ 16f88 คับ

นี่เป็นโค็ดนะคับ


#include <16F88.h>         // Standard Header file for the PIC16F877A
#device ADC = 10
#fuses HS,NOWDT,NOPROTECT,NOLVP   

#use delay(clock=10000000)   
#define vbe 0.0048875855327468230694037145650049 // Vref/1023 ;Vref = 5 volt
float ldr1,ldr2,ldr3,ldr4,vldr1,vldr2,vldr3,vldr4;

void main(void)
{
    setup_adc_ports(all_analog);
    setup_adc(adc_clock_internal);
 
    while(TRUE)
{
    set_adc_channel(0);
    delay_us(10);
    ldr1 = read_adc();
    vldr1 = vbe * (float)ldr1;
    if(vldr1>2)
      {
      output_high(PIN_B0);
      }else{output_low(PIN_B0);}
    //_______________________________________________________________

    set_adc_channel(1);
    delay_us(10);
    ldr2 = read_adc();
    vldr2 = vbe * (float)ldr2;
    if(vldr2>2)
    {
    output_high(PIN_B1);
    }else{output_low(PIN_B1);}
   
    //______________________________________________________________
   
    set_adc_channel(2);
    delay_us(10);
    ldr3 = read_adc();
    vldr3 = vbe * (float)ldr3;
    if(vldr3>2)
      {
      output_high(PIN_B2);
      }else{output_low(PIN_B2);}
   //_______________________________________________________________

    set_adc_channel(3);
    delay_us(10);
    ldr4 = read_adc();
    vldr4 = vbe * (float)ldr4;
    if(vldr4>2)
    {
    output_high(PIN_B3);
    }else{output_low(PIN_B3);}
}
}

pomcoe


ozuke

Simulate แล้วก็ปกติดีนิครับ
แล้ววงจรที่ต่อหน่ะต่อยังไงครับ โพสให้ดูหน่อยได้ไหม

ปล.คุณตั้งกระทู้ซะดึกขนาดนี้ แล้วกะให้เขาตอบเลย คุณกะไม่ให้แอ็ดมินกับเพื่อนๆนอนเลยหรอครับ


pomcoe

ผมโพสมาหลายวันแล้วอะคับ

เอ่อตอนนี้แก้ไขในส่วนนี่ได้แล้วนะคับ มันเกิดจากบอร์ดที่สั่งมา มีจัมเปอร์เสียบอยู่ ทำให้ไม่สามารถใช้พอร์ตได้อะคับ

ขอบคุณมากนะคับที่ตอบ

pomcoe

เอ่ออีกเรื่องนึงนะคับ

ช่วยดูโค๊ดทีนะคับ

#include <16F88.h>         // Standard Header file for the PIC16F877A
#device ADC = 10
#fuses HS,NOWDT,NOPROTECT,NOLVP   
#use delay(clock=10000000)   
#define vbe 0.0048875855327468230694037145650049 // Vref/1023 ;Vref = 5 volt
float infa1,vinfa1,infa2,vinfa2,infa3,vinfa3;

void main(void)
{
    setup_adc_ports(all_analog);
    setup_adc(adc_clock_internal);
 
    while(TRUE)
{
//NUM 1
    set_adc_channel(0);
    delay_us(10);
    infa1 = read_adc();
    vinfa1 = vbe * (float)infa1;
   
    if (vinfa1<1){
      delay_ms(1000);
      output_low(PIN_B1);}
      else if((vinfa1>=1.2)&&(vinfa1<=2 ))
      {
      output_high(PIN_B0);
      delay_ms(4000);                                   
      output_low(PIN_B0);}
      else{output_low(PIN_B0);}
  // ------------------------------------------------------------------------   
//NUM2           
    set_adc_channel(1);
    delay_us(10);
    infa2 = read_adc();
    vinfa2 = vbe * (float)infa2;
   
    if (vinfa2<1){
      delay_ms(1000);
      output_low(PIN_B1);}
      else if((vinfa2>=1.2)&&(vinfa2<=2 ))
      {
      output_high(PIN_B1);
      delay_ms(4000);
      output_low(PIN_B1);}
      else{output_low(PIN_B1);}


จาก CODE นี้นะคับ
คือว่าพอจะมีวิธีให้มันทำงานพร้อมกันมั้ยคับ

คือตอนนี้เนี่ยพอรับ Input เข้ามาทั้ง 2 อินพุต Output ที่ B0 ก็ทำงาน
แต่ว่า Outputที่ B1 ยังไม่ทำงานอะคับ มันต้องรอให้ Delay ที่ Output B0 ทำงานเร็จก่อน
Outputที่ B1 ถึงจะทำงานอะคับ

ผมต้องใช้interupt มั้ยคับ
แต่ว่าผม interupt ไม่เป็นอะคับ

olee

อาจจะต้องให้ Interrupt ของ Timer 0 หรือ Timer 1 ครับ
Code การใช้ Interrupt ไม่ยากครับ แต่ว่าต้อง Setup Timer ในตัว CPU ให้ถูกครับ

pomcoe

ทำไม่เป็นอะคับผม

พี่พอจะช่วยได้มั้ยคับ
พอดีต้องส่งอาจารย์อะคับ

:'( :'(

ozuke

แนวคิด

output_low(pin_b0);
output_low(pin_b1);

a=read_adc(0)*0.004888;
if(a>=1.2 && a<=2)
     output_high(pin_b0);

a=read_adc(0)*0.004888;
if(a>=1.2 && a<=2)
     output_high(pin_b1);

delay_ms(4000);
....................


มันอาจจะทำงานไม่ถึงกับเท่ากัน แต่ไกล้เคียง ถ้าอยากทำให้พร้อมกันก็ทำได้ ไม่ถึงกับ Interrupt หรอกครับ