หัวข้อ: เขียน Mikro ให้เป็นแบบ Main Program แล้ว เขียน Sub Program ได้หรือเปล่าครับ เริ่มหัวข้อโดย: yanyongs ที่ กุมภาพันธ์ 01, 2012, 04:54:22 pm คือผมเคยเขียน Program ในเครื่อง CNC
จะมีโครงสร้างการทำงานที่ ซ้อนกันอยู่ได้เช่น - เขียน Program num1 เป็น Main Program - แล้วเขียน Program num 2 ,3,4... เป็น sub program (โปรแกรมส์ ย่อย) -แล้วเวลาจะใช้งาน ก็เขียน Program Main ไปดึงมาใช้ ประมาณนี้ครับ เพราะความต้องการใช้งานผมคือ คำสั่งเดิม ๆ ที่เคยใช้ จะได้ไม่ต้อง Copy มาใน Program ต่อ ๆ ไป ไม่ทราบว่า MCU สามารถทำอย่างงี้ได้ใหมครับ ท่านอาจารย์ทั้งหลาย >:( โปรดชี้แนะด้วยครับ หัวข้อ: Re: เขียน Mikro ให้เป็นแบบ Main Program แล้ว เขียน Sub Program ได้หรือเปล่าครับ เริ่มหัวข้อโดย: kiano♥ ที่ กุมภาพันธ์ 01, 2012, 05:39:38 pm ทำได้ครับ
หัวข้อ: Re: เขียน Mikro ให้เป็นแบบ Main Program แล้ว เขียน Sub Program ได้หรือเปล่าครับ เริ่มหัวข้อโดย: yanyongs ที่ กุมภาพันธ์ 02, 2012, 07:38:23 am ขอตัวอย่างได้ใหมครับ อาจารย์ kiano หรือ concept อะไรก็ได้แล้วแต่จะกรุณาครับผม lv! หัวข้อ: Re: เขียน Mikro ให้เป็นแบบ Main Program แล้ว เขียน Sub Program ได้หรือเปล่าครับ เริ่มหัวข้อโดย: kiano♥ ที่ กุมภาพันธ์ 02, 2012, 08:51:10 am ยกตัวอย่างง่ายๆ และเห็นภาพชัดเจนเลยก็คือ delay หรือหน่วงเวลา
สร้างฟังก์ชั่นนี้ขึ้นมา แล้วสามารถเรียกใช้ได้ จากฟ้งก์ชั่นเมน หรือทุกๆฟังก์ชั่น void timer(int milisecond){ // ประกาศฟังก์ชั่นใช้ร่วมกัน ชื่อ timer while(milisecond>0){ // ตรวจสอบค่าของตัวแปร milisecond ถ้ามีค่ามากกว่า 0 ให้วนลูป milisecond--; // ลดค่าตัวแปร milisecond ลง 1 ค่า delay_ms(1); // หน่วงเวลา 1 มิลลิวินาที } } จากฟังก์ชั่นเมน หรือฟังก์ชั่นย่อยอื่นๆ เวลาจะเรียกใช้งานฟังก์ชั่น timer ให้ใช้คำสั่งดังนี้ main(void){ ...... ...... timer(ใส่ค่าตัวเลขที่ต้องการหน่วงเวลาหน่วยเป็นมิลลิวินาที); ...... ...... } หัวข้อ: Re: เขียน Mikro ให้เป็นแบบ Main Program แล้ว เขียน Sub Program ได้หรือเปล่าครับ เริ่มหัวข้อโดย: yanyongs ที่ กุมภาพันธ์ 03, 2012, 08:46:00 am ยกตัวอย่างง่ายๆ และเห็นภาพชัดเจนเลยก็คือ delay หรือหน่วงเวลา ขอบคุณ น้า Kiano ที่อื้อเฟื้อครับสร้างฟังก์ชั่นนี้ขึ้นมา แล้วสามารถเรียกใช้ได้ จากฟ้งก์ชั่นเมน หรือทุกๆฟังก์ชั่น void timer(int milisecond){ // ประกาศฟังก์ชั่นใช้ร่วมกัน ชื่อ timer while(milisecond>0){ // ตรวจสอบค่าของตัวแปร milisecond ถ้ามีค่ามากกว่า 0 ให้วนลูป milisecond--; // ลดค่าตัวแปร milisecond ลง 1 ค่า delay_ms(1); // หน่วงเวลา 1 มิลลิวินาที } } จากฟังก์ชั่นเมน หรือฟังก์ชั่นย่อยอื่นๆ เวลาจะเรียกใช้งานฟังก์ชั่น timer ให้ใช้คำสั่งดังนี้ main(void){ ...... ...... timer(ใส่ค่าตัวเลขที่ต้องการหน่วงเวลาหน่วยเป็นมิลลิวินาที); ...... ...... } แล้วจำพวก IC Memmory ใช้งานอย่างไรครับ เช่นถ้าว่าเราเขียน Program งานใว้ 3 Program และเก็บใน IC memmory ถ้าต้องการ Program ใดๆ มาทำงาน ก็ ให้ MCU เรียกมาใช้ได้เลย อย่างนี้หละครับ ต้องทำอย่างไรครับ :D หัวข้อ: Re: เขียน Mikro ให้เป็นแบบ Main Program แล้ว เขียน Sub Program ได้หรือเปล่าครับ เริ่มหัวข้อโดย: JUB ที่ กุมภาพันธ์ 03, 2012, 04:27:49 pm จุดประสงค์ต้องการทำอะไรครับ...?
หัวข้อ: Re: เขียน Mikro ให้เป็นแบบ Main Program แล้ว เขียน Sub Program ได้หรือเปล่าครับ เริ่มหัวข้อโดย: yanyongs ที่ กุมภาพันธ์ 06, 2012, 02:25:53 pm จุดประสงค์ต้องการทำอะไรครับ...? ขอบคุณครับที่น้าให้ความสนใจเข้ามาดูสิ่งที่ผมต้องการใช้งานคือ สมมุติว่า ตอนนี้ผมให้ Program ที่ 1 ทำงานในการคำนวนและปรับแรงดันให้กับ คันเร่งไฟฟ้ารถยนต์ ฯลฯ แต่อีกวัน ผมไม่ต้องการใช้งาน แต่จะให้วงจรเดิมนี้ใช้ Program ที่ 2 ทำการ ตรวจสอบความร้อนเครื่องยนต์ ฯลฯ แทน ประมาณนี้ครับผม หัวข้อ: Re: เขียน Mikro ให้เป็นแบบ Main Program แล้ว เขียน Sub Program ได้หรือเปล่าครับ เริ่มหัวข้อโดย: JUB ที่ กุมภาพันธ์ 06, 2012, 03:05:49 pm เดี๋ยวนี้ microcontroller มี flash มากกว่าเมื่อก่อนเยอะครับราคาโครตถูกเลย 64k นี่อยู่หลักร้อยครับ
คุณไม่จำเป็นต้องใช้ program memory ภายนอกเลย ง่ายๆถ้าจะให้ใช้หลายๆโปรแกรมก็กำกนดจุด vector ของแต่ล่ะโปรแกรมแล้วตรวจสอบจาก jumper selector ภายนอกหรืออะไรก็แล้วแต่ เมื่อเริ่มการทำงาน mcu จะมาตรวจสอบ jumper ว่าเลือกโปรแกรมอะไรไว้แล้วกระโดดไปทำงานนั้นๆ ได้ มันมีวิธีที่ง่ายกว่านี้อีกลองไปศึกาดูเองครับ หัวข้อ: Re: เขียน Mikro ให้เป็นแบบ Main Program แล้ว เขียน Sub Program ได้หรือเปล่าครับ เริ่มหัวข้อโดย: yanyongs ที่ กุมภาพันธ์ 07, 2012, 08:23:24 am ยังไงก็ขอบพระคุณครับสำหรับคำแนะนำ ต้องบอกก่อนครับว่า ผมเพิ่งหัดเล่น MCU
อาจจะถามแปลก ๆ lv! ที่จริงผมมีตัวอย่างอยากจะใส่ภาพ แต่ หา Icon ใส่ภาพไม่เจอครับ เลย Copy มาไม่ครบ แต่อยากใช้งานคล้าย ๆ ตัวอย่างครับ ต้นฉบับ http://file2.uploadfile.biz/i/ENEMMEIMEZMMEW เงื่อนไขการทำงานหรือลักษณะการทำงานของพัดลม 1. เมื่อเสียบปลั๊กหรือจ่ายเพาเวอร์ ให้รอรับการกด KEY ON/Speed (กด KEY อื่นไม่มีผล) 2. เมื่อกด KEY On/Speed แล้ว (RA0 = 0) ให้พัดลมทำงานตาม speed ล่าสุดก่อนปิดเครื่อง 3. เมื่อกด KEY On/Speed อีกครั้งให้เปลี่ยนเป็น Speed ถัดไป 4. การวนของ Speed Low Med Hi 5. หากกดปุ่ม Swing (RB3 = 0) กำหนดให้พัดลมส่าย โดยการทำงานของปุ่ม Swing จะทำงานคล้ายการ ทำงานของ Toggle Switch (กดแล้วทำงาน กดอีกครั้งให้หยุดทำงาน) 6. เมื่อกดปุ่ม Timer (RA1 = 0) กำหนดให้ Mode ตั้งเวลาทำงาน 7. การทำงานของการตั้งเวลา 30 min 1 Hr 2 Hr 8. เมื่อครบเวลาตามที่ตั้งไว้ให้พัดลมหยุดทำงาน 9. หากกดปุ่ม OFF (RA2 = 0) ให้พัดลมหยุดทำงาน 10. ทุกครั้งที่มีการกดปุ่มให้มีเสียงดัง ปิ๊บ 1 ครั้ง หัวข้อ: Re: เขียน Mikro ให้เป็นแบบ Main Program แล้ว เขียน Sub Program ได้หรือเปล่าครับ เริ่มหัวข้อโดย: yanyongs ที่ กุมภาพันธ์ 07, 2012, 08:33:13 am และการเขียน EEPROM แล้วดึงมาใช้งาน มีขั้นตอนอย่างไรครับ
รบกวนขอตัวอย่างการเขียน และการนำมาใช้ ด้วยนะครับน้า ขอบพระคุณที่ กรุณาครับ :-[ หัวข้อ: Re: เขียน Mikro ให้เป็นแบบ Main Program แล้ว เขียน Sub Program ได้หรือเปล่าครับ เริ่มหัวข้อโดย: JUB ที่ กุมภาพันธ์ 07, 2012, 10:40:37 am /*
File name :eep.c Program :pic16 internal eeprom Author :Somlak Mangnimit Date :17/12/2011 */ /* -------------------- Library Call -------------------- WriteEEP(); ReadEEP(); -------------------- Exp. -------------------- WriteEEP(address,data); k = ReadEEP(address); */ #ifndef _EEP_C_ #define _EEP_C_ // write internal eeprom // void WriteEEP(unsigned char addr,unsigned char data){ EEADR = addr; EEDATA = data; EECON1bits.EEPGD = 0; //eep section EECON1bits.WREN = 1; //write enable EECON2 = 0x55; EECON2 = 0xAA; EECON1bits.WR = 1; while(EECON1bits.WR); EECON1bits.WREN = 0; //write disable } // read internal eeprom // unsigned char ReadEEP(unsigned char addr){ unsigned char data; EEADR = addr; EECON1bits.EEPGD = 0; //eep section EECON1bits.RD = 1; //read enable data = EEDATA; EECON1bits.RD = 0; //read disable return data; } #endif หัวข้อ: Re: เขียน Mikro ให้เป็นแบบ Main Program แล้ว เขียน Sub Program ได้หรือเปล่าครับ เริ่มหัวข้อโดย: JUB ที่ กุมภาพันธ์ 07, 2012, 11:15:03 am ยังไงก็ขอบพระคุณครับสำหรับคำแนะนำ ต้องบอกก่อนครับว่า ผมเพิ่งหัดเล่น MCU อาจจะถามแปลก ๆ lv! ที่จริงผมมีตัวอย่างอยากจะใส่ภาพ แต่ หา Icon ใส่ภาพไม่เจอครับ เลย Copy มาไม่ครบ แต่อยากใช้งานคล้าย ๆ ตัวอย่างครับ ต้นฉบับ http://file2.uploadfile.biz/i/ENEMMEIMEZMMEW เงื่อนไขการทำงานหรือลักษณะการทำงานของพัดลม 1. เมื่อเสียบปลั๊กหรือจ่ายเพาเวอร์ ให้รอรับการกด KEY ON/Speed (กด KEY อื่นไม่มีผล) 2. เมื่อกด KEY On/Speed แล้ว (RA0 = 0) ให้พัดลมทำงานตาม speed ล่าสุดก่อนปิดเครื่อง 3. เมื่อกด KEY On/Speed อีกครั้งให้เปลี่ยนเป็น Speed ถัดไป 4. การวนของ Speed Low Med Hi 5. หากกดปุ่ม Swing (RB3 = 0) กำหนดให้พัดลมส่าย โดยการทำงานของปุ่ม Swing จะทำงานคล้ายการ ทำงานของ Toggle Switch (กดแล้วทำงาน กดอีกครั้งให้หยุดทำงาน) 6. เมื่อกดปุ่ม Timer (RA1 = 0) กำหนดให้ Mode ตั้งเวลาทำงาน 7. การทำงานของการตั้งเวลา 30 min 1 Hr 2 Hr 8. เมื่อครบเวลาตามที่ตั้งไว้ให้พัดลมหยุดทำงาน 9. หากกดปุ่ม OFF (RA2 = 0) ให้พัดลมหยุดทำงาน 10. ทุกครั้งที่มีการกดปุ่มให้มีเสียงดัง ปิ๊บ 1 ครั้ง เขามี source code ให้แล้วนิครับ น่าจะเป็น CCS เอาไปใช้ได้เลย หัวข้อ: Re: เขียน Mikro ให้เป็นแบบ Main Program แล้ว เขียน Sub Program ได้หรือเปล่าครับ เริ่มหัวข้อโดย: yanyongs ที่ กุมภาพันธ์ 08, 2012, 08:13:29 am ขอบพระคุณ อย่างแรงครับน้า
**** CCS ผมยังไม่อยากไปลองเพราะว่า Mikro C ก็เพิ่งจะเริ่มครับน้า เดียวสับสนเวลาเขียน sleep!! และถ้าจะรบกวนน้าอีกที แปลงตัวอย่าง เป็น Mikro C พอจะอุปการะ ได้ใหมครับ thank2 **** แล้วถ้าผมจะลองใช้ CCS gen, Code แล้วลองกับ Proteus ได้เหมือน Mikro C หรือเปล่าครับ หัวข้อ: Re: เขียน Mikro ให้เป็นแบบ Main Program แล้ว เขียน Sub Program ได้หรือเปล่าครับ เริ่มหัวข้อโดย: JUB ที่ กุมภาพันธ์ 08, 2012, 08:34:12 am อ้างถึง CCS ผมยังไม่อยากไปลองเพราะว่า Mikro C ก็เพิ่งจะเริ่มครับน้าเดียวสับสนเวลาเขียน บ้านเราเขาใช้ CCS กันเยอะนะจะบอกให้เยอะกว่า Mikro C ด้วยซ้ำ;Dอ้างถึง และถ้าจะรบกวนน้าอีกที แปลงตัวอย่าง เป็น Mikro C พอจะอุปการะ ได้ใหมครับ ขอบคุณ ยังไม่ค่อยว่างเลยครับเดี๋ยวลองดูให้ล่ะกันอ้างถึง แล้วถ้าผมจะลองใช้ CCS gen, Code แล้วลองกับ Proteus ได้เหมือน Mikro C หรือเปล่าครับ เหมือนกันหัวข้อ: Re: เขียน Mikro ให้เป็นแบบ Main Program แล้ว เขียน Sub Program ได้หรือเปล่าครับ เริ่มหัวข้อโดย: yanyongs ที่ กุมภาพันธ์ 16, 2012, 08:12:28 am ผมต่อวงรทำงานในรถยนต์
ใช้ PORTB.F0 เป็น interrupt เพื่อสลับสถานะการทำงานจาก 1 ไป 2 +มีปํญหาคือ -เวลาเปลี่ยนเกียร์ Auto จาก // P (จอด) ไปที่ D (ขับ) interrupt ทำใมถึงทำงาน ทั้งที่ไม่ได้ต่อสัญญานจากเกียร์ -ถ้ากด ลดกระจกไฟฟ้าลง บางปุ่มของ สวิทย์ จะมีผลกับ interrupt รบกวนขอคำชี้แนะด้วยครับ undecided2 ** // 16F877 , PORT ,RB1 ,RB2 ,RB3 ,RB4, RB7 NOT USE /////// UPDATE 23/11/2011 ////////////// /////// UPDATE 10/12/2011 ////////////// /////// UPDATE 31/12/2011 ////////////// /////// UPDATE 27/01/2012 ////////////// /////// UPDATE 31/01/2012 ////////////// /////// UPDATE 4/02/2012 sat ////////////// /////// UPDATE 11/02/2012 sat ////////////// /* SWITCHING VERSION CONTROL */ #define tick1 PORTB.F2 //LM358-1 Tip31-1 #define push_sw PORTB.F4 //LM358-1 Tip31-2 SWITCHING SELECTOR #define reg2 PORTB.F1 //Tip31-3 750W GAS #define beep1 PORTC.F2 //BC548 BUZZER 12V #define Dis PORTC.F3 //DISPLAY CONTROL char y=0,t1=1,le,i4=1; char timming_cut=15,timming_cut2,lled; char *B="PE RUN",*G="G RUN-T OFF",*BG="G RUN-T ON"; //////////////////////////////////////////////////////////////////////////////// void push_sw1() { push_sw=1; delay_ms(200); push_sw=0;delay_ms(22); } void beep0() { beep1=1; delay_ms(10); beep1=0; delay_ms(5); } void beep4() // { beep1=1; delay_ms(200); beep1=0; delay_ms(5); } //////////////////////////////////////////////////////////////////////////////// void beep() { int x=0; Dis=0; for(x=0;x<3;x++) { beep1=1; delay_ms(80); beep1=0; delay_ms(80); Dis=1; } } ///////////////////////// void interrupt() { i4++; beep1=1; if(i4>2){i4=1;} delay_ms(500); beep1=0; INTCON.INTF= 0; } ///////////////////// void delay_1sec() { delay_ms(1000); } void led_read()//ตรวจสอบการกระพริบของ LED จากข้างนอก { unsigned long int ls1,ls2,ls3,ls4, ls5,ls6,lsp; ls1=Adc_Read(4); // LED ON/OFF delay_ms(333); ls2=Adc_Read(4); // LED ON/OFF delay_ms(333); ls3=Adc_Read(4); // LED ON/OFF delay_ms(333); ls4=Adc_Read(4); // LED ON/OFF lsp=ls1+ls2+ls3+ls4; if(lsp<=10){ le=0;} else if(lsp>=4000){le=1;} else {le=2;} } void swit_to_pet() { led_read(); if(le==1){ push_sw1();} else if(le==2){ push_sw1(); push_sw1();} else{beep1=1;delay_ms(50);beep1=0;} } void cut_system() { if(t1>=3&&t1<timming_cut)//15 min { lled=Adc_Read(4); { if(lled==0){tick1=1;} else{tick1=0;} } Lcd_Cmd(LCD_Clear);Lcd_Out(2,1,G); delay_1sec(); } else if(t1==timming_cut-1){Lcd_Cmd(LCD_Clear);Lcd_Out(2,3,B); tick1=1;beep4(); } else{ beep0(); tick1=1; Lcd_Cmd(LCD_Clear); Lcd_Out(2,5,B); delay_1sec(); } } void Engin_check() { unsigned long int Engine; Engine=Adc_Read(2); if (Engine>=511)// 2.5 v { delay_1sec(); Lcd_Cmd(LCD_Clear); Lcd_Out(1,4,"ENGINE HEAT"); tick1=1; delay_1sec(); delay_1sec(); beep(); t1=1; } else{beep1=0;} } void power_on() { tick1=1; Dis=1; Lcd_Init(&PORTD); Lcd_Cmd(LCD_Clear); Lcd_Cmd(lcd_cursor_off); Lcd_Out(2,5,"POWER ON"); beep(); delay_ms(500); beep1=1; delay_ms(400); beep1=0; } void main() {////block Main TRISA=0XFF; TRISB=0x01; TRISC=0X00; TRISD=0X00; TRISE=0X07; PORTB=0X00; PORTC=0X00; PORTD=0X00; PORTE=0X00; power_on(); swit_to_pet(); Lcd_Out(1,4,"AUTO READY"); delay_1sec(); INTCON.INTF=0; // Clear Interrupt flag before use INTCON.INTE=1; // Enable interrupt from INT/RB0 Pin // INTCON.T0IF=0;// Clear Interrupt flag before use // INTCON.T0IE=1;// Enable interrupt from TMR0 Pin INTCON.GIE=1; // Enable Global interrupt while(1) { { while(i4==2) { tick1=1; Lcd_Cmd(LCD_Clear); Lcd_Out(1,1,"AUTO SWITCH RUN"); Lcd_Out(2,3,"T ON"); delay_1sec(); Engin_check(); } timming_cut2=timming_cut+1; y++; Engin_check(); cut_system();// LOOP 3 SEC if(y==60){t1++;} { if(y<=50) { reg2=1;} // if Y < 50 SEC ON Supply Voltege else if(y>60){y=0;} // Wait for Y > 60 SEC OFF Supply Voltege else{reg2=0;} } if(t1==timming_cut) {t1++; tick1=1;beep4(); push_sw1(); } if(t1==2) {t1++; beep4(); push_sw1(); beep4(); push_sw1(); } if(t1==timming_cut2) {t1=1; } } } } หัวข้อ: Re: เขียน Mikro ให้เป็นแบบ Main Program แล้ว เขียน Sub Program ได้หรือเปล่าครับ เริ่มหัวข้อโดย: yanyongs ที่ กุมภาพันธ์ 16, 2012, 09:59:22 am /////////////////////////
void interrupt() { i4++; beep1=1; if(i4>2){i4=1;} delay_ms(500); beep1=0; INTCON.INTF= 0; } ///////////////////// ถ้าต้องการเขียนเพื่อตรวจสอบว่า การ interrupt แบบ กดสวิทย์แช่ 3 sec จึงจะทำงาน เขียนอย่างไรครับ หัวข้อ: Re: เขียน Mikro ให้เป็นแบบ Main Program แล้ว เขียน Sub Program ได้หรือเปล่าครับ เริ่มหัวข้อโดย: kiano♥ ที่ กุมภาพันธ์ 16, 2012, 11:59:07 am กดสวิทช์แช่ไว้ 3 วินาทีแล้วจึงไปทำงานโปรเซสที่ต้องการ
if (กดสวิทช์){ i=0; while(กดสวิทช์){ i++; delay_ms(100); // หรือใช้การนับจาก Timer Module แล้ว Interrupt ก็ได้ if(i>=30) goto โปรเซสที่ต้องการให้ทำงาน; // 30 = 3000/100 } } |