Pages: 1 [2]   Go Down
Print
Author Topic: ใช้วงจรอะไรเพิ่มแรงดัง จาก 0.5v เป็น5v เข้า mcu ค&#  (Read 37150 times)
0 Members and 5 Guests are viewing this topic.
Elec_noob
Jr. Member
**
Offline Offline

Posts: 16



« Reply #15 on: February 08, 2013, 05:23:36 PM »

จากรูปที่คุณให้มา



- มี 8 Input (1-8)  กับอีก 2 Output (A,B)
- มี Input ร่วมกัน 3 ตัวคือ 1,2,3 + 9,0,R
- Output สัญญาณเป็น Active High ดูจากการต่อไดโอด
- จุดที่ใช้ตรวจจับสัญญาณ (Tab ออกมา) คือ จุด 8 Input (จุดเขียว) และ 2 จุด Output (จุดแดง)
- เนื่องจากวงจรไมโครเดิม มีระดับสัญญาณ 5 V ออกมาทาง Output A,B ผ่านไดโอด (คาดว่าเป็น 1N4148) ระดับแรงดันคร่อมไดโอด 0.6V ดังนั้นแรงดันที่วัดได้ควรจะเป็น 5-0.6  = 4.2V ที่จุด Input ทั้ง 8 แต่เนื่องจากการ scankey แรงดันที่วัดได้จะมีลักษณะเป็น pulse
- ดังนั้นจึงเป็นระดับสัญญาณที่น่าจะตรวจสอบได้ด้วยไมรโครเช่นกัน
- ค่าที่อ่านได้จาก Input 4-8 จุดใดเป็น High ก็ต่อเมื่อ จุด A เป็น High เท่านั้น
- ส่วนการอ่านค่าที่จุด 1,2,3 (bit ใด bit หนึ่ง Active) เมื่อ จุด A เป็น High, B เป็น Low
- และค่าจะเป็น 9,0,R (bit ใด bit หนึ่ง Active) เมื่อ จุด B เป็น High, A เป็น Low




มีตัวอย่างโปรแกรมมั้ยครับ ไม่ค่อยเข้าใจวิธีการอ่านค่าครับ
Logged
MicroX
Global Moderator
Full Member
*****
Offline Offline

Posts: 103


Senior


Email
« Reply #16 on: February 08, 2013, 06:15:45 PM »

การแสกนคีย์เป็นความรู้พื้นฐานของไมโครนะครับ คุณน่าจะผ่านตามาบ้างแล้ว

ลองดูที่ไปพรางๆ ก่อน

http://highlyliquid.com/hl2012/blog/52

search Keyword: pic scan keypad
แล้วไปที่ ค้นรูป จะดูได้ง่ายกว่า
การแสกนคีย์มีหลายแบบ ให้คุณเข้าใจถึงหลักการณ์ครับ แล้วคุณจะค่อยๆมองออกเอง

ลองค้นไปพรางๆ ก่อนต้องกลับบ้านแล้วครับ
วันจันทร์ค่อยคุยกันใหม่


« Last Edit: February 08, 2013, 06:25:07 PM by MicroX » Logged
Elec_noob
Jr. Member
**
Offline Offline

Posts: 16



« Reply #17 on: February 09, 2013, 07:06:20 PM »

การเขียนโปรแกรม scan key เข้าใจ แต่การเขียนเพื่อดึงสัญญาณแบบนี้ไม่เข้าใจ

ต้องใช้การ interrupt หรือป่าว
Logged
MicroX
Global Moderator
Full Member
*****
Offline Offline

Posts: 103


Senior


Email
« Reply #18 on: February 11, 2013, 01:54:35 PM »

- เนื่องจากวงจรไมโครเดิม มีระดับสัญญาณ 5 V  ดังนั้นจึงเป็นระดับสัญญาณที่น่าจะตรวจสอบได้ด้วยไมรโครเช่นกัน
- ในขั้นแรกคุณเขียนโปรแกรมวนลูปอ่านค่าคีย์ธรรมดาเสียก่อน โดยสนใจที่ Input 1 ก็ได้ แล้วให้ Output ต่อกับ
LED สักดวง  และเมื่อ Input 1มีค่า = "1" ก็ให้ LED ติด  แล้วลองกดที่ปุ่ม 1 ดู หาก LED ติดก็แสดงว่าผ่าน MCU สามารถอ่านโลจิก 1 ได้
- ต่อมาก็อ่าน Input เข้ามาทั้ง 8 ตัว โดยใช้ portb ก็ได้ โดยการตรวจสอบว่า bit ใดเป็น 1 หรือไม่ ถ้ามี คุณก็ไปตรวตสอบที่ output A และ B ส่วนจะเป็น bit ใดก็ให้ตรวจสอบจากค่าที่อ่านเข้ามา
   หาก A เป็น 1 ค่าคีย์ก็อยู่ในกลุ่ม 1-9
   หาก B เป็น 1 ค่าคีย์ก็อยู่ในกลุ่ม 9,0,R

- การใช้ interrupt ผมคิดว่าไม่จำเป็น เพราะงานของคุณ ตรวจสอบสนใจการ scan key เพียงอย่างเดียว
นอกเสียจากคุณไปทำงานที่สำคัญอย่างอื่นอีก
Logged
x-robot
Jr. Member
**
Offline Offline

Posts: 18


Email
« Reply #19 on: February 11, 2013, 10:07:32 PM »

การแสกนคีย์แบบมีไดโอด ต่างกับการแสกนคีย์แบบไม่มีไดโอดอย่างไรครับ


ปกติเคยเห็นแต่แบบนี้

ขอบคุณครับ
Logged
MicroX
Global Moderator
Full Member
*****
Offline Offline

Posts: 103


Senior


Email
« Reply #20 on: February 14, 2013, 04:13:57 PM »


key แบบนี้สามารถกดได้หลายคีย์พร้อมกันครับ โดยไม่ทำให้พอร์ตเสียหาย


ส่วน key แบบนี้ อ่านคีย์ได้ครั้งละปุ่มครับ กดมากกว่า 1 ปุ่มไม่ได้จะทำให้พอร์ตช๊อตและเสียหายได้
การป้องกันก็คือต่อ R ไว้ที่พอร์ตที่เป็นเอาต์พุตครับ
 
Logged
Elec_noob
Jr. Member
**
Offline Offline

Posts: 16



« Reply #21 on: March 07, 2013, 04:21:00 PM »

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

Code:
#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
#include <lcd_3_pins.c> //74HC595

// 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);
   lcd_init();                // initialize the LCD
   printf(lcd_putc,"\fLoading...");
   printf("Loading...\n\r");
   delay_ms(12500);
   kreset=1;
   while(true){
         if(!blink){
            if(!input(PIN_B0)){
               if(!input(PIN_A0))
                  {printf(lcd_putc,"1");printf("KEY---1\n\r");kbuff[kindex++]=1;}
               else if(!input(PIN_A1))
                  {printf(lcd_putc,"9");printf("KEY---9\n\r");kbuff[kindex++]=9;}
            }
            else if(!input(PIN_B1)){
               if(!input(PIN_A0))
                  {printf(lcd_putc,"2");printf("KEY---2\n\r");kbuff[kindex++]=2;}
               else if(!input(PIN_A1))
                  {printf(lcd_putc,"8");printf("KEY---8\n\r");kbuff[kindex++]=8;}
            }
            else if(!input(PIN_B2)){
               if(!input(PIN_A0))
                  {printf(lcd_putc,"3");printf("KEY---3\n\r");kbuff[kindex++]=3;}
               else if(!input(PIN_A1))
                  {printf(lcd_putc,"\fReset!");printf("KEY---Reset\n\r");kreset=1;}
            }
            else if(!input(PIN_B3) && !input(PIN_A0))
               {printf(lcd_putc,"4");printf("KEY---4\n\r");kbuff[kindex++]=4;}
            else if(!input(PIN_B4) && !input(PIN_A0))
               {printf(lcd_putc,"5");printf("KEY---5\n\r");kbuff[kindex++]=5;}
            else if(!input(PIN_B5) && !input(PIN_A0))
               {printf(lcd_putc,"6");printf("KEY---6\n\r");kbuff[kindex++]=6;}
            else if(!input(PIN_B6) && !input(PIN_A0))
               {printf(lcd_putc,"7");printf("KEY---7\n\r");kbuff[kindex++]=7;}
            else if(!input(PIN_B7) && !input(PIN_A0))
               {printf(lcd_putc,"8");printf("KEY---8\n\r");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){
            printf(lcd_putc,"\nSelect [%d%d]",kbuff[0],kbuff[1]);
            printf("\n\rSelect [%d%d] \n\r",kbuff[0],kbuff[1]);
            blink=1;
            kindex=0;
         }
         if(kreset){
            printf(lcd_putc,"\fStart:");
            printf("Start:\n\r");
            output_high(PIN_D3);
            delay_ms(1000);
            output_low(PIN_D3);
            kreset=0;
            kindex=0;
            blink=0;
         }
         if(blink){
            printf(lcd_putc,"\nGet item   ");
            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);
     }
}
Logged
MicroX
Global Moderator
Full Member
*****
Offline Offline

Posts: 103


Senior


Email
« Reply #22 on: March 08, 2013, 07:27:33 AM »

ที่ว่ารับได้บ้างไม่ได้บ้าง แสดงว่ามีได้ใช่ไหมครับ
แล้วที่ได้ นั้นถูกต้องตามที่กดหรือเปล่าครับ

แล้วจาก http://www.thaimicrotron.com/webboard2/index.php/topic,1031.msg2787.html#msg2787
เป็นเรื่องเดียวกันหรือเปล่าครับ

เพราะถ้าค่าที่รับได้แล้วถูก แสดงว่ามาถูกทางแล้ว
ส่วนที่รับไม่ได้ หรือ มาสองครั้งติดกัน ก็ต้องไล่หากันอีกที

ข้อมูลที่ให้มาก็ไม่ได้อธิบายว่าเป็นมาอย่างไร pin ไหนต่อจุดไหน
เพราะผมไม่มี HW อยู่ ต้องในจิตนาการครับ



เช่นคุณใช้ pin ใดเป็น Input บ้าง ต้องมาไล่โค๊ดเอาเอง
แล้วตัวอย่างค่าที่ได้เมื่อกดปุ่มอะไร อ่านได้ค่าอะไรออกมา ประมาณนี้ครับ
เริ่มแรกก็ต้อง compile ก่อน เพื่อดูว่ามันฟ้องอะไรบ้าง ก็คอมไพล์ไม่ผ่าน
เพราะ lcd_3_pins.c  ก็ไม่มีครับ

แล้วโค๊ด ที่เป็นลักษณะ if-else if-else ค่อนข้างทำความเข้าใจยากครับ
comment ก็ไม่ได้เขียนไว้ ว่าช่วงในทำอะไรบ้าง

ในในโค๊ดเห็นมีตัวแปรที่ใช้เป็น flag เช่น kreset blink จุดประสงค์ไว้ทำอะไรครับ
แล้วการสแกน input พร้อมทั้งมีการแสดงผลบน LCD ไปด้วย อาจทำให้ไปรับ Input ใหม่ไม่ทัน
เพราะ LCD จะทำงานค่อนค่างช้า ข้อมูลส่วนนั้นก็จะหายครับ



Logged
Elec_noob
Jr. Member
**
Offline Offline

Posts: 16



« Reply #23 on: March 08, 2013, 12:31:35 PM »

Quote
ที่ว่ารับได้บ้างไม่ได้บ้าง แสดงว่ามีได้ใช่ไหมครับ
แล้วที่ได้ นั้นถูกต้องตามที่กดหรือเปล่าครับ
ค่าที่ได้ถูกต้องครับ

Quote
แล้วจาก http://www.thaimicrotron.com/webboard2/index.php/topic,1031.msg2787.html#msg2787
เป็นเรื่องเดียวกันหรือเปล่าครับ
กระทู้นี้ คือก่อนที่จะต่อวงจรเพิ่มครับ ตอนนี้กลับด้านแล้วครับ

Quote
ข้อมูลที่ให้มาก็ไม่ได้อธิบายว่าเป็นมาอย่างไร pin ไหนต่อจุดไหน
เพราะผมไม่มี HW อยู่ ต้องในจิตนาการครับ
เช่นคุณใช้ pin ใดเป็น Input บ้าง ต้องมาไล่โค๊ดเอาเอง
แล้วตัวอย่างค่าที่ได้เมื่อกดปุ่มอะไร อ่านได้ค่าอะไรออกมา ประมาณนี้ครับ
เริ่มแรกก็ต้อง compile ก่อน เพื่อดูว่ามันฟ้องอะไรบ้าง ก็คอมไพล์ไม่ผ่าน
เพราะ lcd_3_pins.c  ก็ไม่มีครับ

อันนี่ผมต้องขอโทษที่ให้ข้อมูลไม่หมด และที่ไม่ได้ให้มาเพราะผมคิดว่ามันไม่จำเป็น และcodeที่เขียนเป็นcode ง่ายๆ และส่วน  lcd_3_pins.c ก็สามารถตัดได้เพราะก่อนหน้านี้ก็ไม่ได้ใส่ ก็ทำงานได้
เหมือนตอนที่ใส่มา

Quote
แล้วโค๊ด ที่เป็นลักษณะ if-else if-else ค่อนข้างทำความเข้าใจยากครับ
comment ก็ไม่ได้เขียนไว้ ว่าช่วงในทำอะไรบ้าง
ครับผมก็ไม่ค่อยเก่งในการเขียนเท่าไหรผมจึงได้สอบถามว่าพอจะที่วิธีอื่นอีกหรือป่าวครับ

ตัวอย่าง code

Code:
if(!input(PIN_B3) && !input(PIN_A0))
               {printf("KEY---4\n\r");kbuff[kindex++]=4;}
ถ้า b3และa0 เป็น 0 (b3 ก็คือเลข 4ครับ a0 ก็คือ สัญญาณจาก A)
ให้แสดงค่า "KEY---4" และเก็บค่าใน kbuff[kindex++] ส่วน index ก็จะขึ้นอยู้กับครั้งที่กด ถ้าครั้งแรก index=0 ถ้าครั้งที่ 2  index=1


Quote
ในในโค๊ดเห็นมีตัวแปรที่ใช้เป็น flag เช่น kreset blink จุดประสงค์ไว้ทำอะไรครับ
แล้วการสแกน input พร้อมทั้งมีการแสดงผลบน LCD ไปด้วย อาจทำให้ไปรับ Input ใหม่ไม่ทัน
เพราะ LCD จะทำงานค่อนค่างช้า ข้อมูลส่วนนั้นก็จะหายครับ

ผมต้องการรับค่ามา 2 ตัวเลข แล้วจึงสั่งให้ relay ทำงาน
และที่บอกว่า สแกน input พร้อมทั้งมีการแสดงผลบน LCD ไปด้วย อาจทำให้ไปรับ Input ใหม่ไม่ทัน อันนี้ไม่เกี่ยวแน่นอนครับ
เพราะมันสามารถรับเค่า เบิ้ลได้ทั้งที่กดไปครั้งเดียว


ผมอาจจะอธิบายไม่ค่อยเก่งก็ขออภัยด้วยครับ
รูปที่แนบมาอาจจะวาดไม่ครบครับ ไม่ได้ใส่ c และแก้ ค่า r ครับ แต่ทั้งหมดต่อตามนี้ครับ


* 8-3-2556 12-27-21.png (40.74 KB, 1441x1070 - viewed 2107 times.)
« Last Edit: March 08, 2013, 12:44:50 PM by Elec_noob » Logged
gundam
Global Moderator
Hero Member
*****
Offline Offline

Posts: 292



« Reply #24 on: March 12, 2013, 06:54:48 AM »


เห็นด้วยกับคุณ MicroX ที่ว่าโค๊ดที่ให้มาควรให้มาให้ครบ
เพราะพวกเราไม่ได้มี HW เหมือนกับคุณ  เพราะต้องใช้โปรแกรม simulate
อย่างเช่น proteus โหลด hex ไฟล์เข้ามา เพื่อทดสอบ
เก่งแค่ไหน การเขียนโปแกรมแบบแห้ง ทำได้ลำบากครับ ยิ่งพวกผมทำงานแล้ว
นานๆ เขียนโปรแกรมที ที่พอจะช่วยได้ ก็แนะนำจากประสบการณ์เก่าๆ ทั้งนั้นครับ
เหตุที่ compile ไม่ผ่านก็เพราะ คุณใช้ทำสั่ง lcd_putc ไว้มากมาย
ไม่เช่นนั้นต้องมานั่ง comment บรรทัดที่มี lcd_putc ออกให้หมด
คุณลองลบบรรทัด #include <lcd_3_pins.c> ออกดูสิครับ




Logged
Elec_noob
Jr. Member
**
Offline Offline

Posts: 16



« Reply #25 on: March 12, 2013, 08:54:37 AM »


เห็นด้วยกับคุณ MicroX ที่ว่าโค๊ดที่ให้มาควรให้มาให้ครบ
เพราะพวกเราไม่ได้มี HW เหมือนกับคุณ  เพราะต้องใช้โปรแกรม simulate
อย่างเช่น proteus โหลด hex ไฟล์เข้ามา เพื่อทดสอบ
เก่งแค่ไหน การเขียนโปแกรมแบบแห้ง ทำได้ลำบากครับ ยิ่งพวกผมทำงานแล้ว
นานๆ เขียนโปรแกรมที ที่พอจะช่วยได้ ก็แนะนำจากประสบการณ์เก่าๆ ทั้งนั้นครับ
เหตุที่ compile ไม่ผ่านก็เพราะ คุณใช้ทำสั่ง lcd_putc ไว้มากมาย
ไม่เช่นนั้นต้องมานั่ง comment บรรทัดที่มี lcd_putc ออกให้หมด
คุณลองลบบรรทัด #include <lcd_3_pins.c> ออกดูสิครับ



ผมได้อธิบายไปแล้วว่าสามารถลบออกไปได้ ครับ
ผลที่ได้ไม่ต่างกัน

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

« Last Edit: March 12, 2013, 09:00:36 AM by Elec_noob » Logged
x-robot
Jr. Member
**
Offline Offline

Posts: 18


Email
« Reply #26 on: March 12, 2013, 07:24:21 PM »

ผมดูจากช่วงหลังๆ ของโปรแกรมมีการใช้
delay_ms(1000);
.
.
.
delay_ms(5000);

การหน่วงเวลานานๆ อาจไปรับค่าคีย์ใหม่ไม่ทัน หรือเปล่าครับ



Logged
Elec_noob
Jr. Member
**
Offline Offline

Posts: 16



« Reply #27 on: March 12, 2013, 11:54:06 PM »

ผมดูจากช่วงหลังๆ ของโปรแกรมมีการใช้
delay_ms(1000);
.
.
.
delay_ms(5000);

การหน่วงเวลานานๆ อาจไปรับค่าคีย์ใหม่ไม่ทัน หรือเปล่าครับ





เป็นช่วงที่รับข้อมูลครบแล้ว จึงสั่งให้ relay ทำงานครับ
Logged
Pages: 1 [2]   Go Up
Print
 
Jump to: