สวัสดีครับ ผม เป็นคนทำงานแล้ว สนใจ 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);
}
}
}
Pic drive motor
ทีนี้ ก็หัดเขียน โปรแกรม 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);
}
}
}