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

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

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

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


Code: [Select]
#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);}
 }
}

ไม่มีใครตอบเลยอะ

*

Offline ozuke

  • *****
  • 118
    • View Profile
    • MCU & Computer Programing Learning by Wittawat Sompong
Simulate แล้วก็ปกติดีนิครับ
แล้ววงจรที่ต่อหน่ะต่อยังไงครับ โพสให้ดูหน่อยได้ไหม

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

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

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

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

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

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

Code: [Select]
#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 ไม่เป็นอะคับ

*

Offline olee

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

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

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

 :'( :'(

*

Offline ozuke

  • *****
  • 118
    • View Profile
    • MCU & Computer Programing Learning by Wittawat Sompong
แนวคิด

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 หรอกครับ