วันศุกร์ที่ 19 มีนาคม พ.ศ. 2553

งานเข้านิดหน่อย


ช่วงนี้งานมันเยอะเหลือเกิน งานไหลมาเทมา ถ้าเปลี่ยนงานเป็นเงินล่ะก็ อิอิ คงรวยน่าดู มีคนถามเรื่อง lcd16x4 เข้ามา ก็เลยจัดไปสักหน่อย อันไหนช่วยกันได้ก็ช่วยกัน ช่วยไม่ได้ก็ตัวใครตัวมัน 555 +++
ขอขอบคุณ Libraly By PCM Programmer

เอ้าแจกโค๊ด

ไพล์หลักครับ
/**
#include <16f877a.h>
#fuses HS, NOWDT, NOPROTECT,NOLVP
#use delay(clock = 20000000)
#include "Flex_LCD416.c"

void main()
{

lcd_init();
printf(lcd_putc, "\f");
delay_ms(500);

while(true)
{
lcd_gotoxy(7,1);
printf(lcd_putc, "TEST");
lcd_gotoxy(5,2);
printf(lcd_putc, "LCD 16x4");
lcd_gotoxy(8,3);
printf(lcd_putc, "By");
lcd_gotoxy(5,4);
printf(lcd_putc, "nont_peet");
delay_ms(1000);
}
}
**/

Libraly Flex_LCD416.c

/**
// Flex_LCD416.c

// These pins are for my Microchip PicDem2-Plus board,
// which I used to test this driver.
// An external 20x4 LCD is connected to these pins.
// Change these pins to match your own board's connections.

#define LCD_DB4 PIN_D3
#define LCD_DB5 PIN_D4
#define LCD_DB6 PIN_D5
#define LCD_DB7 PIN_D6

#define LCD_RS PIN_D0
#define LCD_RW PIN_D1
#define LCD_E PIN_D2

/*
// To prove that the driver can be used with random
// pins, I also tested it with these pins:
#define LCD_DB4 PIN_D4
#define LCD_DB5 PIN_B1
#define LCD_DB6 PIN_C5
#define LCD_DB7 PIN_B5

#define LCD_RS PIN_E2
#define LCD_RW PIN_B2
#define LCD_E PIN_D6
*/

// If you want only a 6-pin interface to your LCD, then
// connect the R/W pin on the LCD to ground, and comment
// out the following line. Doing so will save one PIC
// pin, but at the cost of losing the ability to read from
// the LCD. It also makes the write time a little longer
// because a static delay must be used, instead of polling
// the LCD's busy bit. Normally a 6-pin interface is only
// used if you are running out of PIC pins, and you need
// to use as few as possible for the LCD.
#define USE_RW_PIN 1


// These are the line addresses for most 4x20 LCDs.
#define LCD_LINE_1_ADDRESS 0x00
#define LCD_LINE_2_ADDRESS 0x40
#define LCD_LINE_3_ADDRESS 0x10
#define LCD_LINE_4_ADDRESS 0x50

// These are the line addresses for LCD's which use
// the Hitachi HD66712U controller chip.
/*
#define LCD_LINE_1_ADDRESS 0x00
#define LCD_LINE_2_ADDRESS 0x20
#define LCD_LINE_3_ADDRESS 0x40
#define LCD_LINE_4_ADDRESS 0x60
*/


//========================================

#define lcd_type 2 // 0=5x7, 1=5x10, 2=2 lines(or more)

int8 lcd_line;

int8 const LCD_INIT_STRING[4] =
{
0x20 | (lcd_type << retval_0 =" retval.0" retval_1 =" retval.1" retval_2 =" retval.2" retval_3 =" retval.3" retval =" 0;" retval_0 =" input(LCD_DB4);" retval_1 =" input(LCD_DB5);" retval_2 =" input(LCD_DB6);" retval_3 =" input(LCD_DB7);" high =" lcd_read_nibble();" low =" lcd_read_nibble();">> 4);
lcd_send_nibble(n & 0xf);
}
//----------------------------

void lcd_init(void)
{
int8 i;

lcd_line = 1;

output_low(LCD_RS);

#ifdef USE_RW_PIN
output_low(LCD_RW);
#endif

output_low(LCD_E);

// Some LCDs require 15 ms minimum delay after
// power-up. Others require 30 ms. I'm going
// to set it to 35 ms, so it should work with
// all of them.
delay_ms(35);

for(i=0 ;i < i="0;" address =" LCD_LINE_1_ADDRESS;" address =" LCD_LINE_2_ADDRESS;" address =" LCD_LINE_3_ADDRESS;" address =" LCD_LINE_4_ADDRESS;" address =" LCD_LINE_1_ADDRESS;" lcd_line =" 1;" value =" lcd_read_byte();">

วันอังคารที่ 16 มีนาคม พ.ศ. 2553

วันว่างๆ สบายๆ กับ DS18B20

ซื้อมาดองใว้นานตั้งแต่ก่อนทำโปรเจค บัดนี้ได้เวลาเอาออกมาปัดฝุ่นเสียที แต่ไม่รู้ช่วงนี้เป็นไรขี้เกียจต่อวงจรจริง อาจเป็นเพราะต่อจริงแล้วก็ไม่ได้เอาไปใช้ทำอะไร ศึกษาทดลองเสร็จก็แยกชิ้น กลับเป็นเหมือนเดิม ก็เลยต่อ SIM เอาน่าจะดีกว่าเก็บไฟล์ใว้เอา อยากต่อจริงค่อยว่ากันทีหลัง เอาเข้าเรื่อง ค้นหาวิธีต่อก็เยอะแยะในเน็ตพูดได้ว่าเรา ไม่ต้องศึกษาอะไรมากมายเลย เพราะเค้าทำเป็นตัวอย่างให้เราแล้ว มันจะจริงอย่างที่เค้าพูดไหมเอ้าลงมือต่อ ต่อ LCD ด้วยจะได้แสดงผล ต่อเสร็จเขียนโปรแกรม ใช้ CCS เพราะมี library ให้เราเรียบร้อย ศึกษานิดหน่อยก็เขียนได้แล้ว จบ.... เอ้าเหมือนเดิมแจกโค๊ด

CODE
/**
#include <16f877a.h>

#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)

#include
#include "touch.c"

float temperature;

void main()
{
lcd_init();
lcd_putc("\f");
while (true)
{
byte i, buffer[9];

if (touch_present()) {
touch_write_byte(0xCC);
touch_write_byte (0x44);
delay_ms(200);
touch_present();
touch_write_byte(0xCC);
touch_write_byte (0xBE);

for(i=0; i<9;i++) temperature =" (buffer[1]<<4)(buffer[0]">>4);
}
lcd_gotoxy(1,1);
printf(lcd_putc," NONT_PEET");
lcd_gotoxy(1,2);
printf(lcd_putc," TEMP : %2.1f C", temperature);
}
}
**/

วันพฤหัสบดีที่ 11 มีนาคม พ.ศ. 2553

โปรเจคผ่านแล้ว ว่างจัง

หลังจากที่สอบโปนเจกผ่านแล้ว ก็ว่างๆเลยหาอะไรทำเล่น เห็นมีเครื่องเช็คเพสลำโพงเค้าขายกันแพงจัง ไอ้เราก็เป็นผู้ยากผู้ไร้ เงินทองน้อย ก็เลยหาของมาทำเองลองดูซักตั้ง มันยากกว่าที่คิดอ่ะ สัญญานมันมาทั้งบวกทั้งลบ เริ่มจากใช้ OPAMP ขยายสัญญานจากไมค์ Condenser ต่อซีลงกราวด์หน่อยจะได้ไม่มีสัญญานลบกวนมาก ได้สัญญานมาแล้วก็เข้าไมโครคอนโทรลเลอร์เลย เขัยนโปรแกรมอยู่ซัก 5 นาที ก็ได้เวลาทดสอบ โอ้พระเจ้า ใช้ไม่ได้เลย เลยรื้อโปรแกรมให่อีกรอบ ผ่านไป 10 นาที ลองอีก อิอิ มันทำงานได้แล้ว แต่ก็ต้องปรับแต่งอีกเกือบ ชั่วโมง เอ้าเสร็จแล้ว ถึงเวลาลงอุปกรณ์จริง ก็เอาปริ้นเอนกประสงค์นี่ล่ัะง่ายดี เริ่มจากต่อภาคขยายสัญญานก่อน ตามด้วยต่อวงจร PIC ซึ่งใช้เบอร์ 16F73 ของมีไม่ต้องซื้อ 555 ต่อ REG เรียบร้อย ขั้วถ่าน 9V ก็มี ทำเสร็จเรียบร้อยลงกล่อง เอ้าไม่มีถ่าน 9V ขี้เกียจออกไปซื้อ (โคราชหนาว) ก็เลยถอดเอาจาก มิเตอร์ Fluke อิอิ แก้ขัด ประกอบใส่ถ่านเสร็จ โอ้ใช้ได้ แต่ก็คงไม่ดีเท่าที่เค้าขายล่ะมั้ง ไม่เคยใช้ของที่เค้าขาย อิอิ จบข่าว ผมขอไม่แจกโค๊ดนะครับเดี๋ยวกระทบต่อผู้ที่เค้าขาย
ผลการทดลองกับเครื่องเสียงจริงออกมาแล้ว ครั้งนี้ทดสอบกับของนอกด้วยครับ เริ่มจากเปิด sound test ปรากฏว่า เครื่องที่ทำขึ้นเองสามารถใช้การได้จากหน้าตู้ ในระยะ ประมาณ 15-20 เซนติเมตร ส่วนของนอกเค้าดีกว่ามากประมาณ คือ 5-20 เซนติเมตร แต่เครื่องที่เราทำขึ้นเองก็สามารถใช้งานได้ตรงกับเครื่องของนอก เพียงแค่ระยะต่างกันเท่านั้นเอง สงสัยต้องแก้ไขโปรแกรมนิดหน่อย แล้วก็เปลี่ยนไมค์ด้วย ได้ผลยังไงจะมาเล่าสู่กันฟังนะครับ