พฤษภาคม 20, 2019, 04:39:15 am *
ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน
ส่งอีเมล์ยืนยันการใช้งาน?

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น
   หน้าแรก   ช่วยเหลือ เข้าสู่ระบบ สมัครสมาชิก  
หน้า: [1]   ลงล่าง
  พิมพ์  
ผู้เขียน หัวข้อ: [HELP] ขอ code ภาษา ซี อัลตร้าโซนิค หน่อยครับ  (อ่าน 7225 ครั้ง)
0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้
xploitor
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 5


| |
« เมื่อ: กุมภาพันธ์ 12, 2013, 12:56:38 pm »

ทำโปรเจ็คอยู่ เรียนแบบงงๆ พูดจริงๆ คือ อ. เค้าสอนแต่เนื้อหา แล้วก็โยนโปรเจ็คมาให้เลย

ไม่รู้จะเริ่มตรงไหน

ขอบเขตมีอยู่ว่า ให้ใช้ sdcc ในการคอมไพล์ mcu ที่ใช้ p89v51rd2

แสดงผลผ่านหน้าจอ lcd 16x2 โดยที่กด sw1 ให้ล็อคค่า ณ ตอนนั้นที่วัดได้ และกดซ้ำอีกที ให้ reset (ไปวัดใหม่)

วงจร ที่ต่อใช้ตามของ Inex TPE51 ครับ



จับต้น ชนปลายไม่ถูกเลย
บันทึกการเข้า
วิสิทธิ์ แผ้วกระโทก
Global Moderator
Sr. Member
*****
ออฟไลน์ ออฟไลน์

กระทู้: 307



| |
« ตอบ #1 เมื่อ: กุมภาพันธ์ 12, 2013, 01:05:59 pm »

เดี๋ยวรอท่านอื่นมาเสริมนะครับ

ส่วนตัวผม ขอออกความเห็นว่า

เริ่มจากโหลดดาต้าชีทของอัลตราโซนิค เบอร์นั้นมาก่อน แล้วก็อ่านๆๆๆๆ ดูข้อมูลของ output / input signal ที่อุปกรณ์ตัวนั้นต้องการ

กลับมาที่ไมโครฯ ของเรา พยายามสร้างโค๊ดให้กำเนิดสัญญาณตามที่อุปกรณ์ชิ้นนั้นต้องการ และคอยรับสัญาณที่ส่งกลับมาจากอุปกรณ์นั้นๆ

ในกรณีที่เราไปโหลดโค๊ดมาจากที่อื่น เราต้องมีความเข้าใจภาษานั้นๆ ที่โหลดมา ถ้าพื้นฐานไม่พอที่จะอ่านโค๊ดเค้าได้ หาความรู้เพิ่มเติม

ยังไม่ได้อีก ให้นำสิ่งที่สงสัยมาโพสถาม เป็นส่วนๆ ไป

 wink
บันทึกการเข้า

xploitor
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 5


| |
« ตอบ #2 เมื่อ: กุมภาพันธ์ 12, 2013, 01:17:24 pm »

เดี๋ยวรอท่านอื่นมาเสริมนะครับ

ส่วนตัวผม ขอออกความเห็นว่า

เริ่มจากโหลดดาต้าชีทของอัลตราโซนิค เบอร์นั้นมาก่อน แล้วก็อ่านๆๆๆๆ ดูข้อมูลของ output / input signal ที่อุปกรณ์ตัวนั้นต้องการ

กลับมาที่ไมโครฯ ของเรา พยายามสร้างโค๊ดให้กำเนิดสัญญาณตามที่อุปกรณ์ชิ้นนั้นต้องการ และคอยรับสัญาณที่ส่งกลับมาจากอุปกรณ์นั้นๆ

ในกรณีที่เราไปโหลดโค๊ดมาจากที่อื่น เราต้องมีความเข้าใจภาษานั้นๆ ที่โหลดมา ถ้าพื้นฐานไม่พอที่จะอ่านโค๊ดเค้าได้ หาความรู้เพิ่มเติม

ยังไม่ได้อีก ให้นำสิ่งที่สงสัยมาโพสถาม เป็นส่วนๆ ไป

 wink

ขอบคุณครับ ผมพอมีพื้นฐานภาษา ซีมาบ้างครับ เรียนอยู่ 2 เทอม โดยๆหลักๆเข้าใจพวกคำสั่งพื่นฐาน แต่ติดที่ตัวแปลบางอย่างเช่น P2 = (P2 & 0xF0)|((command>>4) & 0x0F);  << อยากรู้ว่า 0xF0 ตรงนี้หมายถึงอะไร ที่อ่านมาคร่าวๆ คือ เป็นการอ้างถึงตำแหน่ง(มั้ง) ... แล้วผมจะทราบว่าตำแหน่งอื่นใช้ค่าอะไร ได้อย่างไรครับ


ตัวอย่างนะครับ code นี้คอมไพล์ผ่าน แต่ว่า หน้าจอนิ่งสนิท ไม่มีอะไรซักตัว

Code:
#include <8051.h>
#include "lcd2.h"

main( )
{
    LCD_init();
    LCD_row1(); LCD_puts("Hello LCD");
    LCD_row2(); LCD_puts("< Line 2: OK >");
    while (1);
}

lcd2.h
Code:
/*
 * Filename : lcd.h
 * Hardware : Controller  -> P89V51RD2
 *            XTAL        -> 18.432 MHz
 *            Mode        -> 6 Clock/MC
 * I/O      : RS          -> P2.5
 *            Enable      -> P2.4
 *            Data4567    -> P2.0,P2.1,P2.2,P2.3
 * Compiler : SDCC            
 * Author   : sci-3d@hotmail.com
 * Date : 01/08/06
 */

 #define LCD_en P2_4
 #define LCD_rs P2_5
 #define LCD_DELAY 1535 /* Delay for 1 ms */
 #define LCD_clear() LCD_command(0x1) /* Clear display LCD */
 #define LCD_origin() LCD_command(0x2) /* Set to origin LCD */
 #define LCD_row1() LCD_command(0x80) /* Begin at Line 1 */
 #define LCD_row2() LCD_command(0xC0)   /* Begin at Line 2 */
 
/***************************************************
 * Prototype(s)                                    *
 ***************************************************/
void LCD_delay(unsigned char ms);
void LCD_enable();
void LCD_command(unsigned char command);
void LCD_putc(unsigned char ascii);
void LCD_puts(unsigned char *lcd_string);
void LCD_init();

/***************************************************
 * Sources                                         *
 ***************************************************/
void LCD_delay(unsigned char ms)
{
unsigned char n;
unsigned int i;
for (n=0; n<ms; n++)
{
for (i=0; i<LCD_DELAY; i++); /* For 1 ms */
}
    
}

void LCD_enable()
{
    LCD_en = 0; /* Clear bit P2.4 */
    LCD_delay(1);
    LCD_en = 1; /* Set bit P2.4 */
}

void LCD_command(unsigned char command)
{
    LCD_rs = 0; /* Clear bit P2.5 */
    P2 = (P2 & 0xF0)|((command>>4) & 0x0F); //ตรงนี้คืออะไรครับ 1
    LCD_enable();
    P2 = (P2 & 0xF0)|(command & 0x0F); //ตรงนี้คืออะไรครับ 2
    LCD_enable();
    LCD_delay(1);
}

void LCD_putc(unsigned char ascii)
{
    LCD_rs = 1; /* Set bit P2.5 */
    P2 = (P2 & 0xF0)|((ascii>>4) & 0x0F);
    LCD_enable();
    P2 = (P2 & 0xF0)|(ascii & 0x0F);
    LCD_enable();
    LCD_delay(1);
}

void LCD_puts(unsigned char *lcd_string)
{
while (*lcd_string)
{
LCD_putc(*lcd_string++);
}
}

void LCD_init()
{
    LCD_en = 1; /* Set bit P2.4 */
    LCD_rs = 0; /* Clear bit P2.5 */  
    LCD_command(0x33); //ตรงนี้คืออะไรครับ 3
    LCD_command(0x32); //ตรงนี้คืออะไรครับ 4
    LCD_command(0x28); //ตรงนี้คืออะไรครับ  5
    LCD_command(0x0C); //ตรงนี้คืออะไรครับ 6
    LCD_command(0x06); //ตรงนี้คืออะไรครับ 7
    LCD_command(0x01); /* Clear */
    LCD_delay(256);
}
บันทึกการเข้า
ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 8272


ShadowWares


| |
« ตอบ #3 เมื่อ: กุมภาพันธ์ 12, 2013, 01:56:55 pm »

จาก Comments ใน lcd2.h
Code: (c)
 P2 = (P2 & 0xF0)|((command>>4) & 0x0F); //ตรงนี้คืออะไรครับ 1

Code: (c)
P2 = (P2 & 0xF0)|(command & 0x0F); //ตรงนี้คืออะไรครับ 2

การ & ด้วย 0x0F เป็นการทำให้ 4 บนเป็นลอจิก 0 ส่วน 4 บิตล่างให้คงค่าเดิมไว้
ส่วนนี้มันบอกว่า LCD ต่อแบบ 4-bit Interfacing และขา D<7:4> ต่ออยู่กับ P2.<3:0> ซึ่งมันไม่สอดคล้องกับวงจรของคุณ



ส่วนนี้
Code: (c)
    LCD_command(0x33); //ตรงนี้คืออะไรครับ 3
    LCD_command(0x32); //ตรงนี้คืออะไรครับ 4
    LCD_command(0x28); //ตรงนี้คืออะไรครับ  5
    LCD_command(0x0C); //ตรงนี้คืออะไรครับ 6
    LCD_command(0x06); //ตรงนี้คืออะไรครับ 7

คุณจะต้องอ่าน Datasheet ของ LCD เขาได้อธิบายไว้อย่างดีแล้ว
บันทึกการเข้า

By SDW: Do No Wrong Is Do Nothing
          If you want to increase your success rate, double your failure rate
xploitor
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 5


| |
« ตอบ #4 เมื่อ: กุมภาพันธ์ 12, 2013, 02:06:59 pm »

แล้วผมต้องแก้ยังไงอะครับ
บันทึกการเข้า
ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 8272


ShadowWares


| |
« ตอบ #5 เมื่อ: กุมภาพันธ์ 12, 2013, 03:47:54 pm »

ถ้าประโยคนี้
อ้างถึง
ส่วนนี้มันบอกว่า LCD ต่อแบบ 4-bit Interfacing และขา D<7:4> ต่ออยู่กับ P2.<3:0> ซึ่งมันไม่สอดคล้องกับวงจรของคุณ
ยังไม่ช่วยเพิ่มความเข้าใจของคุณ หรือไม่ได้ช่วยให้คุณฉุกคิดถึงความสัมพันธ์ระหว่าง Hardware และ Software
คงต้องแก้โดยการไปหาหนังสือมาอ่านครับ
หนังสือเกี่ยวกับไมโครคอนโทรลเลอร์มีวางขายอยู่มากมาย เลือกเล่มที่ตรงกับงานคุณมา 1-2 เล่ม แล้วอ่านมันอย่างตั้งใจ (ถ้าไม่อยากอ่านจากหนังสือก็อ่านจากเว็บที่เขาสอนก็ได้เช่นกัน)
ถ้าไม่เข้าใจการทำงานของ Hardware และ Software งานของคุณอาจจะเสร็จช้าลงไปอีกหลายเท่าตัว หรือถ้าโชคไม่ดีอาจจะเสร็จไม่ทันเวลาก็เป็นไปได้
บันทึกการเข้า

By SDW: Do No Wrong Is Do Nothing
          If you want to increase your success rate, double your failure rate
xploitor
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 5


| |
« ตอบ #6 เมื่อ: กุมภาพันธ์ 12, 2013, 04:43:30 pm »

มีชื่อหนังสือแนะนำมั้ยครับ ... ขอบคุณครับ
บันทึกการเข้า
ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 8272


ShadowWares


| |
« ตอบ #7 เมื่อ: กุมภาพันธ์ 12, 2013, 05:42:44 pm »

ไม่มีแนะนำครับ ต้องขออภัย
ส่วนตัวผมอ่านทาง Internet เร็วกว่า และตรงจุดกว่า (แต่อาจจะไม่เหมาะสำหรับผู้เริ่มต้น)
บันทึกการเข้า

By SDW: Do No Wrong Is Do Nothing
          If you want to increase your success rate, double your failure rate
xploitor
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 5


| |
« ตอบ #8 เมื่อ: กุมภาพันธ์ 12, 2013, 06:44:01 pm »

พี่ครับ ผมหา datasheet ของ lcd ไม่เจอ (เจอ แต่ไม่รู้จะถูกรึป่าว) รบกวนพี่ช่วยแปะลิ้ง ให้หน่อยครับ ขอบคุณมากๆครับ
บันทึกการเข้า
หน้า: [1]   ขึ้นบน
  พิมพ์  
 
กระโดดไป: