Pic drive motor

กระทู้คำถาม
สวัสดีครับ  ผม เป็นคนทำงานแล้ว สนใจ microcontroller pic  เลยซื้อ หนังสือมาอ่าน กะทำของเล่นนิดหน่อย

ทีนี้ ก็หัดเขียน โปรแกรม ccs c เพื่อควบคุมการทำงาน  และใช้ proteus ในการ simmulate การทำงานก่อนทีจะทำ hardware
การเขียน โปรแกรม ไม่มี error หรือ warning ใดๆ  พอมาถึงตอน sim ปรากฎว่า input ที่ pic ไม่ยอมเปลี่ยน status  ครับ
ครั้งแรก เปิดวงจร (ขับมอเตอร์) ดูดี เพราะยังให้ input เป็น 0000 ผมป้อน input ด้วย sw1 - sw4 ที่ขา RB0-RB3
เมื่อผมป้อน input เพื่อให้ มอเตอร์ทำงาน ก็ทำงานได้ด้วยดี ปัญหาคือเมื่อผม off sw  ไม่ว่าตัวไหน input ที่ป้อนให้ขา RB ทุกขาไม่เปลี่ยน
ต้อง stop การ simmulate แล้วกดใหม่ให้มอเตอร์ หมุนทิศทางตรงข้ามก็ทำงานได้ แต่พอ off sw input ก็ไม่เปลี่ยนตาม ไม่ทราบว่าเป็นที่อะไร
ระหว่าง proteus หรือ โปรแกรมของผม

รูปนี้  ตอน on sw ทำงานครับ ให้มอเตอร์หมุนไปด้านหน้า  สังเกตุที่ จุดสีแดงที่ขา RB0 และ RB2



รูปนี้ ตอน off sw เพื่อให้ มอเตอร์หยุดหมุน แต่ input ที่ขา RB0 และ RB2 ไม่เปลี่ยนทำให้ output คือ มอเตอร์ยังทำงานอยู่
สังเกตุที่ จุดสีแดงที่ขา RB0 และ RB2 ยังทำงานอยู่  ถ้าให้ถูกต้อง ต้องเป็นสีเทา เมื่อ off sw


ผมได้ทดลองให้มอเตอร์หมุนในทิศทางต่างๆ ได้แต่ต้อง stop start เริ่มใหม่ในแต่ละครั้ง

คำถามคือ ผมพลาดตรงไหนหรือป่าว ระหว่าง proteus หรือ code ccs

code ของผมครับ ผิดพลาดประการใดโปรดแนะนำด้วยครับ
/********************** Includes ***/
#include <16F877A.h>                // header file for PIC16F877A
#fuses HS,NOWDT,NOPROTECT,NOLVP     // Configuration word
#use delay(clock=1000000)         // Change OSC here (default 20MHz)

/****************************************************** Main Function*/
void main () {

  set_tris_b(0x0F);                //set port RB output and input
  
    while (TRUE){
    if ( input_state(PIN_B0) == 0 && input_state(PIN_B1) == 0 && input_state(PIN_B2) == 0 && input_state(PIN_B3) == 0){
               output_low(PIN_B4);    //Motor  Stop
               output_low(PIN_B5);
               output_low(PIN_B6);    //Motor  Stop
               output_low(PIN_B7);
     }
     if ( input_state(PIN_B0) == 1  && input_state(PIN_B1) == 0 && input_state(PIN_B2) == 0 && input_state(PIN_B3) == 0){
              
             output_high(PIN_B4);     // Motor R Forward = Left
             output_low(PIN_B5);
             output_low(PIN_B6);    
             output_low(PIN_B7);
          
     }
     if ( input_state(PIN_B0) == 0  && input_state(PIN_B1) == 0 && input_state(PIN_B2) == 1  && input_state(PIN_B3) == 0){
              output_low(PIN_B4);    
              output_low(PIN_B5);
              output_high(PIN_B6);  // Mortor L Forward = Rigth
              output_low(PIN_B7);
            
     }
     if ( input_state(PIN_B0) == 0  && input_state(PIN_B1) == 0 && input_state(PIN_B2) == 0  && input_state(PIN_B3) == 1){
              output_low(PIN_B4);    
              output_low(PIN_B5);
              output_low(PIN_B6);  //Mortor L Back
              output_high(PIN_B7);
            
      }
      if ( input_state(PIN_B0) == 0  && input_state(PIN_B1) == 1 && input_state(PIN_B2) == 0  && input_state(PIN_B3) == 0){
              output_low(PIN_B4);    
              output_high(PIN_B5);
              output_low(PIN_B6);  //Mortor R Back
              output_low(PIN_B7);
            
      }
      if ( input_state(PIN_B0) == 1  && input_state(PIN_B1) == 0 && input_state(PIN_B2) == 1  && input_state(PIN_B3) == 0){
              output_high(PIN_B4);  // Mortor R Forward
              output_low(PIN_B5);
              output_high(PIN_B6);  // Mortor L Forward
              output_low(PIN_B7);
            
      }
      if ( input_state(PIN_B0) == 0  && input_state(PIN_B1) == 1 && input_state(PIN_B2) == 0  && input_state(PIN_B3) == 1){
              output_high(PIN_B4);  // Mortor R Back
              output_low(PIN_B5);
              output_high(PIN_B6);  // Mortor L Back
              output_low(PIN_B7);
            
      }
    
    }

}
แสดงความคิดเห็น
โปรดศึกษาและยอมรับนโยบายข้อมูลส่วนบุคคลก่อนเริ่มใช้งาน อ่านเพิ่มเติมได้ที่นี่