รบกวนสอบถามเรื่องการเขียนโปรแกรมครับ

Started by Elec_noob, March 12, 2013, 04:52:06 PM

Previous topic - Next topic

Elec_noob

รบกวนสอบถามเรื่องการเขียนโปรแกรมจากรูป ผมจะใช้ pic 18f4550 รับค่าการก็key ของmcu ตัวอื่นผมจะต้องเขียนอย่างไรครับ ผมลองเขียนแล้วสามารถรับค่าได้บ้าง ไม่ได้บ้าง


code CCS C ครับ
#include <18F4550.h>
//#DEVICE ICD=TRUE
#include <stdlib.h>
#fuses HSPLL,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL2,CPUDIV1,VREGEN,NOWDT
#use delay(clock=48000000)
#use rs232(uart1, baud=9600, stream=CH1,BITS = 8, STOP = 1, PARITY = N, ERRORS)
#use    fast_io(A)
#define LCD_E     PIN_A3
#define LCD_CLK   PIN_A4
#define LCD_DIN   PIN_A5

// global variables
BYTE blink = 0;
BYTE kreset = 0;
int kbuff[3];
int kindex = 0;

void main(void) {
   delay_ms(100);
   SETUP_ADC_PORTS(NO_ANALOGS);
   set_tris_a(0x03);       // Set Pin A0-A1 as input
   set_tris_b(0xFF);       // Set Pin B0-B7 as input
   output_drive(PIN_D2);   // Set Pin D2 as output
   output_drive(PIN_D3);   // Set Pin D3 as output
   output_low(PIN_D2);
   output_low(PIN_D3);
   printf("Loading...\n\r");
   delay_ms(12500);
   kreset=1;
   while(true){
         if(!blink){
            if(!input(PIN_B0)){
               if(!input(PIN_A0))
                  {kbuff[kindex++]=1;}
               else if(!input(PIN_A1))
                  {kbuff[kindex++]=9;}
            }
            else if(!input(PIN_B1)){
               if(!input(PIN_A0))
                  {kbuff[kindex++]=2;}
               else if(!input(PIN_A1))
                  {kbuff[kindex++]=8;}
            }
            else if(!input(PIN_B2)){
               if(!input(PIN_A0))
                  {kbuff[kindex++]=3;}
               else if(!input(PIN_A1))
                  {kreset=1;}
            }
            else if(!input(PIN_B3) && !input(PIN_A0))
               {kbuff[kindex++]=4;}
            else if(!input(PIN_B4) && !input(PIN_A0))
               {kbuff[kindex++]=5;}
            else if(!input(PIN_B5) && !input(PIN_A0))
               {kbuff[kindex++]=6;}
            else if(!input(PIN_B6) && !input(PIN_A0))
               {kbuff[kindex++]=7;}
            else if(!input(PIN_B7) && !input(PIN_A0))
               {kbuff[kindex++]=8;}
         }
         if(kindex==1 && (kbuff[0]==9 || kbuff[0]==0))
            {kindex=0;kreset=1;}
         if(kindex==2 && (kbuff[1]==5 || kbuff[1]==9 || kbuff[1]==0))
            {kindex=0;kreset=1;}
         else if(kindex==2){
            blink=1;
            kindex=0;
         }
         if(kreset){
            printf("Start:\n\r");
            output_high(PIN_D3);
            delay_ms(1000);
            output_low(PIN_D3);
            kreset=0;
            kindex=0;
            blink=0;
         }
         if(blink){
            printf("Get item\n\r");
            output_high(PIN_D2);
            delay_ms(1000);
            output_low(PIN_D2);
            kindex=0;
            blink=0;
            kreset=1;
            delay_ms(5000);
         }
         delay_ms(20);
     }
}

vittaya_m

คุณให้รายละเอียดมาน้อยไปหน่อยครับว่าคุณจะทำอะไร  ทำไม MCU ติดต่อกับ MCU ไม่ใช้ UART
ทำไมถึงใช้การ tab key แล้วโค๊ดไม่ใส่คอมเมนต์เลย ยิ่งมี if-else เยอะๆ แบบนี้ดูแล้วมึนครับ

ดูเหมือนรูปเอามาจาเวบนี้
http://highlyliquid.com/hl2012/blog/52
ที่นั้นก็อธิบายไว้ละเอียดดีนี่ครับ

สังเกตว่าการอ่านค่าคีย์เข้ามาไม่มีการจับเวลาแล้วอ่านซ้ำใหม่ (debounce) อย่างนี้คีย์อาจเบิ้ลได้นะครับ
อาจเป็นเพราะคุณใช้ค่า delay รวมๆ ในหนึ่งรอบกว่า 600ms เลยอาจจะทำให้กลับไปอ่านข้อมูลไม่ทันหรือเปล่าครับ
ลองลดค่า delay ลงบ้าง แล้วลองรันใหม่ดูครับ

Elec_noob

Quote from: vittaya_m on March 12, 2013, 06:59:14 PM
คุณให้รายละเอียดมาน้อยไปหน่อยครับว่าคุณจะทำอะไร  ทำไม MCU ติดต่อกับ MCU ไม่ใช้ UART
ทำไมถึงใช้การ tab key แล้วโค๊ดไม่ใส่คอมเมนต์เลย ยิ่งมี if-else เยอะๆ แบบนี้ดูแล้วมึนครับ

ดูเหมือนรูปเอามาจาเวบนี้
http://highlyliquid.com/hl2012/blog/52
ที่นั้นก็อธิบายไว้ละเอียดดีนี่ครับ

สังเกตว่าการอ่านค่าคีย์เข้ามาไม่มีการจับเวลาแล้วอ่านซ้ำใหม่ (debounce) อย่างนี้คีย์อาจเบิ้ลได้นะครับ
อาจเป็นเพราะคุณใช้ค่า delay รวมๆ ในหนึ่งรอบกว่า 600ms เลยอาจจะทำให้กลับไปอ่านข้อมูลไม่ทันหรือเปล่าครับ
ลองลดค่า delay ลงบ้าง แล้วลองรันใหม่ดูครับ
ผมต้องการจะโมตู้ vending machine ครับ ผมจึงต้องใช้วิธี tab key



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


course-mcu

แนะนำ ถ้ามีเวลา นะครับ

http://www.es.co.th/seminar_PIC16F887.asp?aet=28_03_2013&p=0&op=1

จะช่วยให้คุณ มีแนวคิดเขียนโปรแกรม ได้ดีขึ้นนะครับ   

เหลือที่ไม่กี่ที่แล้วนะครับ
ถ้าติดปัญหาในการเขียน สามารถ ถามได้โดยตรง คุณจะเข้าใจเร็วกว่านะครับ