PDA

View Full Version : Thảo luận về ARM LPC 2138/2148


Pages : [1] 2

emdaikho
19-04-08, 09:44
Mình đang cần tìm hiểu về 2 con này,đặc biết là con 2148.Mọi người ai có kinh nghiệm hoặc tài liệu gì cùng nhau vào đây chia sẽ nhá,con này mình thấy ở VN có ít tài liệu nói về nó quá

-------------------------------------------------------------------------------
Hoanglongu: Mình SET Thread này lên mức Ưu tiên ,cho anh em nào thích ARM dễ theo dõi .
To hbaocr: Mong bạn BẢO cố gắng phát huy nữa nghen , các bài viết của bạn rất có ích.>:D<

dda_tdh1
19-04-08, 22:13
Mình cũng đang tìm hiểu về con LPC 2129 mà khó quá!! Hic

hbaocr
20-04-08, 00:08
Nói chung thì cách sử dụng các loại ARM LPC series 2000 ò Phillips thì cũng na ná giống nhau, tên các thanh ghi như nhau(thậm chí đa số những thanh ghi giống nhau đó có địa chỉ thanh ghi giống nhau luôn).Nó chĩ khác nhau ở một số điểm thôi hà! Đơn cử tôi đưa ra 1 ví dụ nhỏ: như LPC2148 và LPC2212.Trong Khi LPC2148 chỉ có 64 pin có support giao tiếp USB,có bộ counter đếm xung ngoài(hi có thể dùng để đọc encoder (giong module CPP của PIC hay chế độ đếm sự kiện của 8051) nhưng LPC2148 không support giao tếp RAM ngoại ( cố nhiên nếu bạn muốn giao tiếp bô nhớ ngoài như RAM or EPPROM thì bạn vẫn làm được bằng cách tự viết soft lấy,tự định địa chỉ lấy).Trong khi đó LPC2214 có tới 144 chân khồng có bộ counter đếm xung ngaòi sẵn mà muon đọc xung thì phải tự viết soft lấy,bù lại support giao tiếp RAM ngoại(nói cho dễ hiểu chức năng này sử dụng giống như Port0 và Port2 khi giao tiếp RAM or ROM ngoài của 8051 vậy)...v.v.Nhìn chung về cơ bản thì nó giống nhau,chỉ khác nhau nhưng cái râu ria không hà (hi nhưng kô để ý dễ chết lắm ý ẹ)
Sau đây là bài giới thiệu chung về VDK đa năng LPC2000 của phillips(nói đa năng vì cái gì nó cũng tham lam thầu hết trong 1 chú chip từ RTC(real time clock) cho tới ADC,đến TCPIP,CAN,I2C,SPI,UART,USB (LPC2214 ko co),.....
Sau đây là bài giới thiệu về LPC2214 (như đã nói ở trên mấy chú khac cũng rứa ah) chỉ khác 1 chút,chỉnh sửa lại 1 chút cho phù hợp.Bài viết này có tham khảo bài viết của anh Bùi Trung Hiếu (khvt site) admin www.deeforum.net
A. Giới thiệu chung:
1. Khái quát: (general description trang 15 usermanual)
LPC2214 là vi điều khiển 32bit hỗ trợ thời gian thực và trace nhúng xây dựng trên cấu trúc của ARM7TDMI-S. LPC2214 có 256kB bộ nhớ Flash tốc độ cao, vùng nhớ nội mở rộng tới 128 bit địa chỉ, cấu hình cho phép thực thi các chỉ lệnh 32bit chỉ trong 1 chu kì xung nhịp. Để tiện cho những ứng dụng nhỏ, LPC2214 hỗ trợ tập lệnh 16bit thu gọn (Thumb) Với chế độ thu gọn này, kích thước tập lệnh chỉ còn 70% so với tập lệnh 32bit làm cùng chức năng.
Đóng gói 144 chân, sử dụng năng lượng ít, timer 32bit, 8 kênh ADC, 9 nguồn ngắt ngoài, LPC2214 thích hợp cho những ứng dụng công nghiệp, hóa học, nghiên cứu điều khiển, và cả thương mại.
Hỗ trợ cấu trúc JTAP, ISP, ICP cho phép mở rộng các ứng dụng nhúng.
2. Các tính năng cơ bản:( features trang 15 usermanual)
Vi điều khiển ARM7TDMI-S 32bit, có hỗ trợ tập lệnh 16bit, đóng gói 144chân (pin)
16kB SRAM trong chip.
256kB bộ nhớ Flash có thể lập trình (chu kì ghi/xóa ít nhất 10.000 lần)
Bus mở rộng 8/16/32 bit.
ISP/IAP, thời gian ghi/xóa 1 dòng <512bytes> mất 1ms, thời gian để ghi/xóa cả flash<256kB> mất 0.4s.
Hỗ trợ chạy mô phỏng thời gian thực ngay trên ứng dụng nhúng <EmbeddedICE-RT>
8 kênh ADC 10bit với thời gian chuyển đổi 2.44ms.
2 Timer 32bit <với 4 kênh capture và compare>, 6kênh PWM, đồng hồ thời gian thực và Watchdog.
Giao diện nối tiếp gồm 2 kênh UART <16C550>, I2C tốc độ cao <400kbits/s>, 2 kênh SPI.
Xung nhịp CPU tối đa 60MHz có sẵn nhờ vòng khóa pha trên chip có thể lập trình được(PLL).
Vector ngắt có địa chỉ truy cập và các mức ưu tiên.
Đến 144 chân xuất/nhập đa dụng ở mức 5V. Có tới 12 ngắt ngoài độc lập nhau<chức năng EIN và CAP>
Dao động trên chip với tần số từ 1MHz đến 30MHz.
2 chế độ tiết kiệm nguồn: Idle và Power Down
Đưa vi điều khiển vào lại chế độ hoạt động bình thường từ Power Down nhờ ngắt ngoài.
Chức năng sử dụng tối ưu nguồn bằng cách cho phép/không cho phép từng ngoại vi riêng lẻ.
2 chế độ nguồn:
o 1.65V-1.95V <1.8V+/-8.3%>
o 3.0V-3.6V <3.3V+/-10%>
3. Ứng dụng:
+Điều khiển trong công nghiệp.
+Hệ thống y tế.
+Cổng thông tin, truyền thông đa phương tiện.
+Mục đích học thuật, nghiên cứu ứng dụng.
+Đa dụng.
4. Sơ qua về cấu trúc LPC2214:
LPC2214 là nhân xử lý ARM7TDMI-S hỗ trợ giao tiếp bus AMBA<advanced microcontroller bus architecture>Ngoại vi AHB cho phép kết nối tới 2GB data. Mỗi vùng nhớ AHB có 16kB, AVB cũng có cấu tạo tương tự.
Sự kết nối các mảng địa chỉ của LPC2214 được khối chân kết nối<Pin Connection block> điều khiển. Khối này có thể lập trình bằng phần mềm.
5. ARM7TDMI-S processor:
o Kiến trúc tập lệnh RISC 32 bit, chu kì dòng chảy lệnh có 3 tác vụ, hỗ trợ định dạng Thumb.
o Hỗ trợ 2 tập lệnh cho 32bit và 16bit<Thumb>
6. Hệ thống bộ nhớ Flash trên chip:
Hỗ trợ 256kB flash trên chip, có thể lập trình ISP, IAP, hỗ trợ giao tiếp JTAG, nâng cao tính linh hoạt cho các chương trình của người dùng.
7. Hệ thống bộ nhớ SRAM trên chip:
Hỗ trợ 16kB SRAM, truy xuất theo byte, word, double word.
SRAM sử dụng điều khiển phối hợp bộ đệm phản hồi để ngăn CPU vào tình trạng đứng máy khi truy cập dữ liệu ngược. Bộ đệm phản hồi luôn giữ giá trị cuối của phần mềm vào SRAM. Dữ liệu này chỉ được ghi vào SRAM khi phần mềm yêu cầu quá trình ghi nhận khác. Nếu quá trình Reset xảy ra, thanh ghi SRAM sẽ không phản ánh đúng giá trị ghi vào SRAM ngay trước khi Reset hệ thống. Muốn truy cập đúng dữ liệu, phần mềm cần đưa ra đúng mã nhận dạng. Vì thế, trước khi vào chế độ Idle hay Power-down, giá trị này được ghi vào bộ nhớ đệm<dummy> để sau khi Reset, sẽ truy cập đúng giá trị mong muốn.

hbaocr
20-04-08, 00:28
Hi chắc bạn đã quen với Keil C khi lập trình cho 8051 rui nhỉ,thế thì chú này bạn cũng dùng Keil ARM viết C code cho VDK này.
Ví dụ cụ thể mình sẽ post tiếp sau.
Còn đây là mạch nạp cho ARM 7 LPC 2214 qua cổng nối tiếp , nói là mạch nạp cho sang chứ thực chất đó chỉ là con tranistor va 1 con max232 thui hà! Nạp onboard (In system programming)! Sử dụng chương trình nạp flash.isp.utility.lpc2000 (search google) hoặc vào trang web của NXP mà tim ha!
http://i177.photobucket.com/albums/w237/hbaocr/machnap.jpg

hbaocr
20-04-08, 01:15
sau đây là sơ đố khối và các chân của LPC2214
wa (buồn ngủ we) mai em pót tiep.
http://groups.google.com/group/dd04kstn/web/pin_ARM7+LPC2214.pdf

hoanglongu
20-04-08, 11:48
sau đây là sơ đố khối và các chân của LPC2214
wa (buồn ngủ we) mai em pót tiep.
http://groups.google.com/group/dd04kstn/web/pin_ARM7+LPC2214.pdf

BÀi của bác rất hữu ích, cố gắng phát huy nữa nghen.

Sau khi giới thiệu xong về Cấu tạo ,Sơ đồ ,cách lập trình ,thì bác BẢO Up luôn cho anh em vài cái Sample CODE để mọi người tham khảo ,dễ ứng dụng hơn .=P~

hbaocr
20-04-08, 14:39
Sử dụng các thanh ghi xuất nhập đa dụng: (GPIO):
giống như các loại VDK khác ,LPC2000 mỗi pin của LPC có nhiều chức năng(1->4 chức năng) và ở defaut sau khi reset đa số các chân có chức năng xuất nhập đa dụng đều được chọn chức năng là GPIO (general purpose input output) trừ chân có chức năng AIN0->5 ,..vv...Để sử dụng các chức nag khác của PIN đó ngoài chức năng GPIO port ta có thể chọn thong wa thanh ghi PINSEL0->3 (sẽ giới thiệu ở bài sau).
(nói riêng LPC2214 có 4 port 0,1,2,3 ) Port2 và 3 có thể dùng để truy xuất RAM ngoại , với P2 là Data(bit0->31) , P3: Address)

Đa số các chân mặc định là GPIO sau khi reset.Khi sử dụng chức năng này ta có thể xuất nhập dữ liệu số , để điều khiển các ngoại vi như động cơ, led,hay button….
Các thanh ghi:
Slow GPIO register

STT Loại Mô tả
1 IODIR0 va IODIR1 Chọn hướng xuất nhập cho từng PIN của PORT0 và PORT1 ứng với từng bit : nbit=1 output pin, nbit=0 input Pin

2 IOCLR0 và IOCLR1 Đưa Pin tuong ưng với bit =1 trong thanh ghi này xuống mức thấp khi đã thiết lập là Output pin
3 IOSET0 và IOSET1 Đưa Pin tuong ưng với bit =1 trong thanh ghi này lên mức cao khi đã thiết lập là Output pin
4 IOPIN0 và IOPIN1 Xuất /nhập nguyên 1 word ra PORT0 or PORT1


Tương tự đối với Fast GPIO:

STT Loại Mô tả
1 FIODIR0 và IODIR1 Chọn hướng xuất nhập cho từng PIN của PORT0 và PORT1 ứng với từng bit : nbit=1 output pin, nbit=0 input Pin
2 FIOCLR0 và FIOCLR1 Đưa Pin tuong ưng với bit =1 trong thanh ghi này xuống mức thấp khi đã thiết lập là Output pin
3 FIOSET0 và FIOSET1 Đưa Pin tuong ưng với bit =1 trong thanh ghi này lên mức cao khi đã thiết lập là Output pin
4 FIOPIN0 và FIOPIN1 Xuất /nhập nguyên 1 word ra PORT0 or PORT1

hbaocr
20-04-08, 14:43
chương trình xuất nhập pOrt cháy led chơi nè

#include "LPC214x.H" // LPC2148 MPU Register

/* pototype section */
void delay(unsigned long int); // Delay Time Function

int main(void)
{
// xxxx xxxx xxxx xxxx xxxx xxxx xxxx 1xxx
IODIR0 = 0x00000008; // Set GPIO-1[24] = Output
IOSET0 = 0x00000008; // Set GPIO-1[24] Output Pin(OFF LED)

// Loop Test Output GPIO1.24
while(1) // Loop Continue
{
IOCLR0 = 0x00000008; // Clear Output GPIO1[24] Pin (ON LED)
delay(6000000); // Display Delay

IOSET0 = 0x00000008; // Set Output GPIO1[24] Pin (OFF LED)
delay(6000000); // Display Delay
}
}

/***********************/
/* Delay Time Function */
/* 1-4294967296 */
/***********************/
void delay(unsigned long int count1)
{
while(count1 > 0) {count1--;} // Loop Decrease Counter
}

emdaikho
20-04-08, 23:42
nếu tiện mọi người vui lòng để lại Nick Yahoo trên bài viet để anh em thảo luận nha :-) đang tìm cái ***** cho Keil để code cho arm mà kiếm hoài ko ra,bác nào help em voi
email: dinhkhanh1987@yahoo.com

hbaocr
21-04-08, 16:24
he he, để ***** lên diễn đàn không tiện đâu bạn ơi!Bạn cứ sài bản dùng thử đi nó chạy OK mả.Chúng ta mới học có cần viết ứng dụng gì dung lượng lớn quá đâu!
hbaocr@yahoo.com

hbaocr
22-04-08, 11:03
hihi, còn đây là chương trình viết để hiện thi LCD

#include "LPC214x.H" // LPC2148 MPU Register
#define RS 25
#define RW 26
#define EN 27
#define BUSYBIT 31
#define LCDPORT 28
void delay(unsigned long count1) ;
int readpinport1(unsigned int portpin);
int outpinport1(unsigned int portpin,unsigned int val);
void WAIT_LCD(void);
void write_nibble(unsigned int pos,unsigned char val);
void WR_LCD( unsigned char TXT,unsigned int RSbit);//RSbit=0 cmd,=1 data
void INT_LCD(void);
void SET_POS(unsigned int pos);
void CLR_LCD (void);
void HOME_LCD (void);
void WR_STR(unsigned char *str);
/* end pototype section */
int main(void)
{
unsigned char *hienthi;
//int set up pin configure GIPO port
IODIR1|= 15<<LCDPORT;//set output pin at LCD data bus
IODIR1|=1<<RS; //set output
IODIR1|=1<<RW; //set output
IODIR1|=1<<EN; //set output
//
hienthi="WELLCOME LPC2148";
INT_LCD();
CLR_LCD();
HOME_LCD();
WR_STR(hienthi) ;
while(1);

}
// cac function
//-------------delay-------------------------
void delay(unsigned long count1)
{
while(count1 > 0) {count1--;} // Loop Decrease Counter
}


//-------------read pin function-------------
int readpinport1(unsigned int portpin)
{
unsigned long p;
IODIR1&=~(1<<portpin); //set input
p=IO1PIN; //doc trang thai port 0
p=(p&(1<<portpin))>>portpin;// kiem tra bit p0.5
return (p) ;
}
//----------------write pin------------------
//out
int outpinport1(unsigned int portpin,unsigned int val)
{
// IODIR1|=1<<portpin; //set output
if (val)
IOSET1|=1<<portpin;
else
IOCLR1|=1<<portpin;
return (1) ;
}
//---------------write Nibble byte-----------------
void write_nibble(unsigned int pos,unsigned char val)
{
unsigned long p;
//IODIR1|=15<<pos;//set output pin
p=IO1PIN;
p=(p|15<<pos);
p&= (val<<pos)|(~(15<<pos));
//k=(val<<pos)|(~(15<<pos));
//v= p&k;
IO1PIN=p;

//p&=(~(15<<pos))|(val<<pos) ;
//IO1PIN=p;
}
//----------WAIT_LCD function----------------------
void WAIT_LCD(void)
{
delay(100000);
/*outpinport1(BUSYBIT,1);
outpinport1(RW,1);
outpinport1(EN,1);
outpinport1(RS,0);
while(readpinport1(BUSYBIT));
outpinport1(EN,0);
outpinport1(RW,0);*/
}
//----------write LCD Nibble Mode------------------
void WR_LCD( unsigned char TXT,unsigned int RSbit)
{
unsigned int temp;
outpinport1(RS,RSbit);
outpinport1(RW,0);
//write 4 bit high
outpinport1(EN,1);
temp=(TXT&0xF0)>>4;
write_nibble(LCDPORT,temp);
outpinport1(EN,0);
//delay(10000);
//write 4 bit low
outpinport1(EN,1);
temp=TXT&0x0F;
write_nibble(LCDPORT,temp);
outpinport1(EN,0);
WAIT_LCD();

}
//---------------INT LCD Function----------------
void INT_LCD(void)
{
//function set 8 col 2 row, 5x7 dot format,NIBBLE MODE
WR_LCD(0x28,0);
// Dislay ON/OFF CURSOR Shift
// dislay ON, Cursor Underline on, cursor blink off
WR_LCD(0x0E,0);
// increment (dich fai) , Dislay Shift Off
WR_LCD(0x06,0);
}
//-------------CLR LCD fuction---------------------
void CLR_LCD (void)
{
WR_LCD(0x01,0);
}
//------------Home LCD function---------------------
void HOME_LCD (void)
{
WR_LCD(0x02,0);
}
//-------- Set Pos function----------------------------
void SET_POS(unsigned int pos)
{
if (pos<=15)
WR_LCD(0x80+pos-1,0);
else
WR_LCD(0x80+pos+0x40-17,0);
}
//--------Write String to LCD------------------------
void WR_STR(unsigned char *str)
{
while (*str != '\0')
{
WR_LCD(*str,1);
++str;
}
}

hbaocr
23-04-08, 16:52
// Connect P0.3 to LED For Test ON / OFF
// P0.5 to SWITCH
// P0.7 to led to display when Switch press on
#include "LPC214x.H" // LPC2148 MPU Register

/* pototype section */
int main(void)
{ unsigned long int p;
// xxxx xxxx xxxx xxxx xxxx xxxx 1xxx 1xxx
IODIR0 = 0x00000088; // P0.3 and p0.7 output
IOCLR0 = 0x00000008; //P0.3 on
IOSET0 = 0x00000080; //p0.7 off
while(1)
{

p=IO0PIN; //doc trang thai port 0
p=(p&(1<<5))>>5;// kiem tra bit p0.5
if(p==0)
IOCLR0|=1<<7 ;//neu nhan sw
else
IOSET0|=1<<7;
}
}

hbaocr
24-04-08, 20:28
Sử dụng bộ ADC
Hi , hôm nay mình viết tiếp về cách sử dụng bộ ADC10 bit tốc độ chuyển đổi khoảng 2.44us/sample.Vai hôm nữa rãnh mình sẽ pót tiếp ví dụ sử dụng bộ ADC

Khác với LPC2148 (có 2 bộ ADC mỗi bộ có 8 kênh làm việc độc lập) ,LPC2214 có 8 kênh ADC chỉ có thể cho phep từng kênh một khi hoạt động.
Các đặc điểm chính:
ARM LPC của Philipps 10 bit và thời gian chuyển đối có thể đạt tới 2.44us
Tầm đo từ 0->3V
Xung CLK có thể đạt tới 4.5Mhz
Các thanh ghi chức năng cơ bản:

STT Tên Mô tả
1 ADCR Chọn chế độ hoạt động cho ADC trước khi ADC bắt đầu chuyển đổi
2 ADDR Chứa kết quả chuyển đổi ADC

Các bit cụ thể trong thanh ghi
Thanh ghi ADCR

Bit Tên Mô tả
7:0 SEL Chọn kênh cho ADC
15:8 CLKDIV Chia xung PCLK/( CLKDIV+1) làm xung CLK cho ADC
16 BURST START =000 khi BURST=1 nếu không thì ADC không hoạt động
19:17 CLKS Chọn xung số xung CLK ứng với số bit chuyển đổi
000 11 clock/10bit chuyển đổi
001 10 clock/9bit chuyển đổi
010 9 clock/8bit chuyển đổi
011 8 clock/7bit chuyển đổi
100 7 clock/6bit chuyển đổi
101 6 clock/5bit chuyển đổi
110 5 clock/4bit chuyển đổi
111 4 clock/3bit chuyển đổi

21 PDN =1: ADC done
=0 : ADC không hoạt động
23:22 TEST1:0 những bit này được sử dụng để chọn ở chế độ test hoạt động 00=normal operation, 01=digital test mode, 10=DACest mode, and 11=simple conversion test mode.
26:24 START
000 Không start
001 Bắt đầu chuyển đổi
010 Bắt đầu chuyển đổi khi có tác động cạnh bit 27 on
P0.16/EINT0/MAT0.2/CAP0.2
011 Bắt đầu chuyển đổi khi có tác động cạnh bit 27 on
P0.22/CAP0.0/MAT0.0
100 Bắt đầu chuyển đổi khi có tác động cạnh bit 27 on
MAT0.1
101 Bắt đầu chuyển đổi khi có tác động cạnh bit 27 on
MAT0.3
110 Bắt đầu chuyển đổi khi có tác động cạnh bit 27 on
MAT1.0
111 Bắt đầu chuyển đổi khi có tác động cạnh bit 27 on
MAT1.1

27 EDGE Chọn tác động cạnh lên hay canh xuống ở mỗi tác
động trên:=0 cạnh lên ;=1 canh xuống

Thanh ghi ADDR

Bit Tên Mô tả
5:0 Luôn luôn được đọc là zero(dự trữ)
15:6 V/V3A Chứa Data chuyển đổi dùng đọc kết quả chuyển đổi
23:16 Những bit này luôn được đọc là zero
26:24 CHN Chứa số thứ tự của kênh ADC vừa hoàn thành chuyển đổi
29:27 Những bit này luôn được đọc là zero
30 OVERUN Bit này 1 trong BURST mode khi mà có nhiều hơn 1 kết quả
ADC chuyển đổi hoàn thành và ghi chồng lên kết quả trước
đó gây mất dữ liệu lần chuyển đổi trước
31 DONE Báo hiệu hoàn thành 1 lần chuyển đổi bit này tự động xóa khi
đọc ADDR

dinhkhanh06
27-04-08, 16:46
em sữa đổi cái chương trình hiển thị led fía trên cho 2138,khi chạy trên Keil mô phỏng thì thấy Pin đã nhấp nháy,nhưng sao khi đưa file hẽ vào Proteus thì lại báo lỗi,
các bac cho em hỏi mô fỏng Proteus con 2138 thì có cần cấp xung hoặc nguồn gì không ạ
thanks các bác

hbaocr
27-04-08, 18:02
xin lỗi mấy bác nghen,nhà bi cúp nét,vài bữa nữa có tiền đóng net, em lai post tiếp.

hbaocr
06-05-08, 20:32
// Used GPIO3.28 = AIN7 (ADC7:AD1.0) Measure Voltage
// Display Result on UART0(9600,N,8,1)

#include <LPC22xx.H> // LPC2214 MPU Register
#include <stdio.h> // For Used Function printf

void init_serial0 (void); // Used Initial UART0 From "Serial0.c"

unsigned int val; // ADC Result (HEX)
float volt; // ADC Result Volt

int main(void)
{
init_serial0(); // Initial UART0 = 9600,N,8,1
printf("\nET-JR ARM7 LPC2214 --> TEST ADC-7(P3.28)\n"); // Call prinff Function

//Initial ADC7 (GPIO-3.28) By Set PINSEL2[5:4=11]
PINSEL2 |= 0x00000030; // Select ADC7 Pin Connect P3.28

// Initial ADC7 (ADCR=0x01210080)
ADCR &= 0x00000000; // Clear All Bit Control
ADCR |= 0x00000080; // Select ADC = AIN7
ADCR |= 0x00000600; // ADC Clock = VBP(PCLK) / 7
ADCR |= 0x00010000; // Busrt = 1 = Conversion Continue
ADCR &= 0xFFF1FFFF; // CLKS = 000 = 10Bit : 11 Cycle Clock Conversion
ADCR |= 0x00200000; // PDN = 1 = Active ADC Module
ADCR &= 0xFF3FFFFF; // TEST[1:0] = 00 = Normal Mode
ADCR &= 0xF7FFFFFF; // EDGE = 0 = Conversion on Falling Edge
ADCR |= 0x01000000; // START = 001 = Start Conversion Now

// Start Test Read ADC8 and Display on UART0 //
while(1) // Loop Continue
{
do // Loop Read ADC7
{
val = ADDR; // Read ADC Data Register
}
while ((val & 0x80000000) == 0); // Wait ADC Conversion Complete
val = (val >> 6) & 0x03FF; // Shift ADC Result to Integer
volt = val * 3.3 / 1023.0; // Volt = ADC Result x [3.3V / 1024]
printf("\rADC7 Result = %1.3f Volt.",volt); // Display 3-Digit Result(0-3.3V)
}
}
/************************************************** **/

#include <LPC22xx.H> // LPC2214 definitions

#define CR 0x0D

/******************************/
/* Initial UART0 = 9600,N,8,1 */
/* VPB(pclk) = 29.4912 MHz */
/******************************/
void init_serial0 (void)
{
PINSEL0 &= 0xFFFFFFF0; // Reset P0.0,P0.1 Pin Config
PINSEL0 |= 0x00000001; // Select P0.0 = TxD(UART0)
PINSEL0 |= 0x00000004; // Select P0.1 = RxD(UART0)

U0LCR &= 0xFC; // Reset Word Select(1:0)
U0LCR |= 0x03; // Data Bit = 8 Bit
U0LCR &= 0xFB; // Stop Bit = 1 Bit
U0LCR &= 0xF7; // Parity = Disable
U0LCR &= 0xBF; // Disable Break Control
U0LCR |= 0x80; // Enable Programming of Divisor Latches

// U0DLM:U0DLL = 29.4912MHz / [16 x Baud]
// = 29.4912MHz / [16 x 9600]
// = 192 = 0x00C0
U0DLM = 0x00; // Program Divisor Latch(192) for 9600 Baud
U0DLL = 0xC0;

U0LCR &= 0x7F; // Disable Programming of Divisor Latches

U0FCR |= 0x01; // FIF0 Enable
U0FCR |= 0x02; // RX FIFO Reset
U0FCR |= 0x04; // TX FIFO Reset
U0FCR &= 0x3F;
}

/****************************/
/* Write Character To UART0 */
/****************************/
int putchar (int ch)
{
if (ch == '\n')
{
while (!(U0LSR & 0x20)); // Wait TXD Buffer Empty
U0THR = CR; // Write CR
}
while (!(U0LSR & 0x20)); // Wait TXD Buffer Empty
return (U0THR = ch); // Write Character
}

/*****************************/
/* Read Character From UART0 */
/*****************************/
int getchar (void)
{
while (!(U0LSR & 0x01)); // Wait RXD Receive Data Ready
return (U0RBR); // Get Receice Data & Return
}

dinhkhanh06
06-05-08, 23:46
Bravo bác Bảo,thành viên nhiệt tình nhất,những bài viết của Bác thực sự rất hữu ích cho anh em,ai vào đọc nhớ thanks nha,bác ý mà nản ko post nữa thì.... hiii

anh_tran
08-05-08, 18:37
mình cũng đang tìm hiểu mấy con ARM này mong anh em giúp đỡ.
ko_198800@yahoo.com

hbaocr
12-05-08, 06:57
hi đây là function để read adc dùng cho LPC2148. viết function cho ba con de su dung :))
unsigned long int read_adc1(unsigned int num_adc1)
{ //ADC Clock = VBP(PCLK) / 7
//Busrt = 1 = Conversion Continue
//CLKS = 000 = 10Bit : 11 Cycle Clock Conversion
//PDN = 1 = Active ADC Module
//EDGE = 0 = Conversion on Falling Edge
//START = 001 = Start Conversion Now
unsigned int val;
unsigned long int temp;
AD1CR = 0x00210600 |(1<<num_adc1);

AD1CR |= 0x01000000; //Bat dau chuyen doi
do
switch(num_adc1)
{
case 0 :
{
val = AD1DR0; // Read A/D Data Register and clear DONE bit
break;
}
case 1 :
{
val = AD1DR1; // Read A/D Data Register and clear DONE bit
break;
}
case 2 :
{
val = AD1DR2; // Read A/D Data Register and clear DONE bit
break;
}
case 3 :
{
val = AD1DR3; // Read A/D Data Register and clear DONE bit
break;
}
case 4 :
{
val = AD1DR4; // Read A/D Data Register and clear DONE bit
break;
}
case 5 :
{
val = AD1DR5; // Read A/D Data Register and clear DONE bit
break;
}
case 6 :
{
val = AD1DR6; // Read A/D Data Register and clear DONE bit
break;
}
default:
val= AD1DR7;
}
while ((val & 0x80000000) == 0); // Wait ADC Conversion Complete and clear DONE bit
val = (val >> 6) & 0x03FF;
temp=val;

//temp=temp*3.3/1023/100.0;
return (temp);

}

hoanglongu
13-05-08, 21:51
hi đây là function để read adc dùng cho LPC2148. viết function cho ba con de su dung :))
unsigned long int read_adc1(unsigned int num_adc1)
{ //ADC Clock = VBP(PCLK) / 7
//Busrt = 1 = Conversion Continue
//CLKS = 000 = 10Bit : 11 Cycle Clock Conversion
//PDN = 1 = Active ADC Module
//EDGE = 0 = Conversion on Falling Edge
//START = 001 = Start Conversion Now
unsigned int val;
unsigned long int temp;
AD1CR = 0x00210600 |(1<<num_adc1);

AD1CR |= 0x01000000; //Bat dau chuyen doi
do
switch(num_adc1)
{
case 0 :
{
val = AD1DR0; // Read A/D Data Register and clear DONE bit
break;
}
case 1 :
{
val = AD1DR1; // Read A/D Data Register and clear DONE bit
break;
}
case 2 :
{
val = AD1DR2; // Read A/D Data Register and clear DONE bit
break;
}
case 3 :
{
val = AD1DR3; // Read A/D Data Register and clear DONE bit
break;
}
case 4 :
{
val = AD1DR4; // Read A/D Data Register and clear DONE bit
break;
}
case 5 :
{
val = AD1DR5; // Read A/D Data Register and clear DONE bit
break;
}
case 6 :
{
val = AD1DR6; // Read A/D Data Register and clear DONE bit
break;
}
default:
val= AD1DR7;
}
while ((val & 0x80000000) == 0); // Wait ADC Conversion Complete and clear DONE bit
val = (val >> 6) & 0x03FF;
temp=val;

//temp=temp*3.3/1023/100.0;
return (temp);

}


Bác Bảo cố lên , UP nhiều nữa hen , các chương trình của Bác rất có ích đó cho ai yêu thích ARM
Chắc em theo bác BẢO chơi ARM luôn quá ,thấy bác vừa có Hardware + Soft + CODE nhiều như vậy .Chắc học theo bác thì lên nhanh về ARM lắm nhỉ.Hi hi

Không biết bác có đồng ý không nhỉ?:|

dinhkhanh06
14-05-08, 17:14
Bác Bảo có kinh nghiệm gì về sử dụng TCP/IP ko share cho anh em với :-)

hbaocr
15-05-08, 12:01
hehe xin lỗi nghen,tui dân tự động nên cũng không rành lắm về thứ này.TCP/IP trên 2148 hay 2378 mới coi sơ sơ trên usermanual.chưa làm lần nào!bên Khoa CNTT có 2378 (BÁch khoa và bên Tự Nhiên) bạn wa đó hỏi thử.

hbaocr
24-06-08, 12:33
He he, chao cac bác ,xin lôi vi tới hôm nay mới pót tiếp bài được.Em mới thi xong ma!=D> cầu trời wa hết năm cuối mà rớt chắc chít wa:-SS! Hôm nay em mạo mụi pót tiep các sử dụng timer trong LPC2000
=D>

Đăc Điểm:
Bộ timer 32 bit có thể lập trình chia lại tầm được.
Hỗ trợ tới 4 kênh Capture (bắt giữ) cho mỗi timerkhiến ta có thể “bắt giữ” giá trị của thanh ghi Timer khi có sự thay đổi của tín hiệu ngõ vào mỗi kênh.Mỗi Capture có khả năng gây ra 1 sự kiện ngắt nếu được cho phép
Hỗ trợ 4 thanh ghi Match 32 bit :với công dụng(tùy người thiết lập)
-Gây ra ngắt khi xảy ra sự kiện Match (thanh ghi tích lũy của timer= Match)
-Dừng timer ngắt khi xảy ra sự kiện Match
-Reset Timer
Hỗ trợ 4 ngõ ra bên ngoài ứng với thanh ghi Match: có thể tùy thiết lập với công dụng sau khi xảy ra Match
-Xuống thấp
-Lên cao
-Đổi trạng thái
-Không làm gì cả
Chức năng:

Định Khoảng thời gian cho mỗi sự kiện
Đo độ rộng xung
Tạo bộ định thời.

Mô tả chức năng các PIN
CAPX.Y
X=0,1
Y=0..3
loại Input
mô tả : Sự thay đổi của tín hiệu trên mỗi Capture Pin sẽ được thiết lập sẽ nạp giá trị của thanh ghi counter Timer vào thanh ghi Capture (CRY) ứng với chỉ số Y của PIN CAPX.Y và có thể gây ra ngắt nếu được phép.Khi có nhiều hơn 1 Pin được chọn là ngõ vào CAPTURE cho cùng 1 nguồn CAPTURE thì Pin nào có chỉ số thấp hơn hoạt động
 CAP0.0 (3 pin) :P0.2 ;P0.22;P0.30
 CAP0.1(2 pin) :P0.4;P0.27
 CAP0.2(3 Pin) :P0.6;P0.16;P0.28
 CAP0.3(1 pin) :P0.29
 CAP1.0(1 pin): P0.10
 CAP1.1(1 pin):P0.11
 CAP1.2(2 pin):P0.17;P0.19
 CAP1.3(2 pin):P0.18;P0.21
MATX.Y
X=0,1
Y=0..3
X:ứng với số Timer
Y:ứng với từng thanh ghi MAT
thuộc loại OutPut
Mô tả: Khi xảy ra sự kiện match các chân này sẽ được tác động nếu được cho phép (có thẻ lên cao,xuống thấp,đảo trạng thái,hay không làm gì cả).Nếu có 2 pin được chọn liên kết với 1 nguồn Match thì cả 2 Pin cùng hoạt động song song
 MAT0.0(2pin):P0.3 ,P0.22
 MAT0.1(2pin):P0.5;P0.27
 MAT0.2(2Pin):P0.16;P0.28
 MAT0.3(1Pin):P0.29
 MAT1.0(1 Pin): P0.12
 MAT1.1(1Pin):P0.13
 MAT1.2(2 Pin):P0.17;P0.19
 MAT1.3 (2 Pin):P0.18;P0.20

hbaocr
24-06-08, 12:42
Mô tả chức năng các Thanh ghi TIMERx:
Tên Mô Tả
IR Thanh ghi điều khiển ngắt.Nó có thể được đọc để xác định nguồn ngắt nào được phục vụ
TCR Thanh ghi điều khiển Timer.Được dùng để thiết lập cho TIMER
TC Thanh ghi tích luỹ 32 bit,tăng lên 1 sau PR+1 chu kỳ PCLK.Được kiểm soát bởi TCR
PR Chi tần cho timer.Khi PC=PR thì chu kì PCLK tiếp theo sẽ xóa PC và tăng TC lên 1
PC Được tăng từ 0 cho đến PR sau mỗi PCLK
MCR Thanh ghi điều khiển Match.Được dùng để cho phép ngắt hay reset TC khi có sự kiện MATCH
MR0..3 Thanh ghi MATCH. MRx có thể được cho phép bởi MCR để thực hiện các chức năng sau:reset TC/dừng TC va PC/gây ra ngắt mỗi khi có sự “khớp nhau” giữa TC và MRx.(MRx=TC)
CCR Thanh ghi điều khiển sự kiện bắt dữ (CAPTURE).Kiểm soát cạnh lên/xuống ờ CAP pin thì xảy ra sự kiện nạp giá trị của TC vào CRY ứng với pin CAPX.Y
CR0..3 CRY được nạp giá trị của TC khi có sự kiện capture
EMR Thanh ghi điều khiển các PIN MATn.0..3 liên hệ với sự kiện MATCH

manh_th
25-06-08, 16:36
A, E cho hỏi hiện tại chổ nào bán mấy chu LPC 2138/2148 vậy, thấy hay quá định tìm hiểu mà không biết mua ở đâu?
thank!

hbaocr
26-06-08, 07:42
bên nhúng việt có bán đó bạn ơi 33$ 1 board STAMP LPC2148

manh_th
26-06-08, 10:03
đó là bên nào vậy bạn, có địa chỉ không vậy, mà mình muốn mua chíp thôi.

hbaocr
26-06-08, 19:16
http://www.nhungviet.com/index.php?option=com_virtuemart&page=shop.browse&category_id=24&Itemid=2
đây nè,nó có bán LPC2148,LPC2378 và evalution board

trongnghia85
26-06-08, 22:07
Bác nào biết mua evalution board LPC2148 ở hà nội ko ?

hbaocr
27-06-08, 00:57
Bác nào biết mua evalution board LPC2148 ở hà nội ko ?
Em đang có 5 con LPC2378 ,nếu bác nào có nhu cầu mua thì liên hệ dt: 0985332557
Bác trongnghia85 có thi NXP contest hả?Bác lấy 5 chip LPC2000 để bán sao????Sao ko để mà làm!


tiep đây là 1 chương trình
http://f1.grp.yahoofs.com/v1/EMtjSIp2jABbnwXDAwA-eQSmOUZMQbd4VRFX8Dlx52MUUxF26g2Z0bAbbGCUmwxq9jQsYl BKi5GJPGDudR7VU1hsOidg/baudcalc.zip
đây la chuong trinh tinh toán để nap gia vao cac thanh ghi control UART của LPC2000 để có tốc độ baud fu hop thiet ke

hunter_pro
29-06-08, 09:33
Em đang có ý định dùng ARM LPC2148(phillip) để điều khiển GLCD 128x64 (KS0108) nhưng chưa biết phải làm thế nào .Bác nào biết chỉ giáo giúp em ( Có code luôn thì tốt quá) . Thanks!

trongnghia85
29-06-08, 16:26
Bác trongnghia85 có thi NXP contest hả?Bác lấy 5 chip LPC2000 để bán sao????Sao ko để mà làm!


tiep đây là 1 chương trình
http://f1.grp.yahoofs.com/v1/EMtjSIp2jABbnwXDAwA-eQSmOUZMQbd4VRFX8Dlx52MUUxF26g2Z0bAbbGCUmwxq9jQsYl BKi5GJPGDudR7VU1hsOidg/baudcalc.zip
đây la chuong trinh tinh toán để nap gia vao cac thanh ghi control UART của LPC2000 để có tốc độ baud fu hop thiet ke

Mình vẫn tiếp tục làm dự án NXP đấy chứ ,nhưng mình thấy ứng dụng của mình chỉ cần con LPC2148 thôi là đủ ,loại LPC2378 nhiều chân quá vừa khó thiết kế mạch vừa khó hàn do vậy mình mới để lại cho các bạn có nhu cầu dùng .

Crusader20s
04-07-08, 14:49
Mình vẫn tiếp tục làm dự án NXP đấy chứ ,nhưng mình thấy ứng dụng của mình chỉ cần con LPC2148 thôi là đủ ,loại LPC2378 nhiều chân quá vừa khó thiết kế mạch vừa khó hàn do vậy mình mới để lại cho các bạn có nhu cầu dùng .

Chào bạn Trọng Nghĩa.
Công Ty NXP chúng tôi rất hoan nghênh khi bạn tham gia cuộc thi Thiết kế MCU. Đề tài "ỨNG DỤNG CÔNG NGHỆ GPS TRONG VIỆC CHẾ TẠO THIẾT BỊ ĐỊNH VỊ PHỤC VỤ TÀU THUYỀN ĐÁNH BẮT XA BỜ" được các chuyên gia của chúng tôi đánh giá rất cao. Hi vọng bạn có thể hoàn thành dự án để tranh tài với các đội trong khu vực vào tháng 9/2008. Về việc ứng dụng của bạn cảm thấy không cần thiết sử dụng LPC2378, bạn có thể liện hệ đơn vị phân phối chip để đổi lại LPC2148 (công ty Vijatech). chúng tôi hi vọng có thể giúp bạn hoàn thành sản phẩm một cách tốt nhất. Chân trọng cám ơn.

tuansoibk
24-07-08, 10:17
Mình có làm 1 hàm Delay_uS đơn giản có thể delay khá chính xác từ 100us trở lên, nếu thời gian chờ là ms thì sai số rất nhỏ, hàm này có thể xài trong các ứng dụng không cần delay cực kỳ chính xác, ví dụ như dùng cho LCD chẳng hạn. Hàm này hoạt động ở xung CCLK = 60MHz. Mình đã test thử, khi delay 5ms thì sai số là 0.00027ms.

void Delay_uS (DWORD uS);
{
DWORD i = uS * 12;
while (i--);
}

Khi muốn delay 5ms thì gọi hàm Delay_uS (5000);

tuansoibk
24-07-08, 10:22
Chà, mình thấy từ ngày anh Crusader20s post bài, cái thread này vắng vẻ ghê gớm luôn, anh em vào thảo luận cho nó sôi nổi đê. Anh hbaocr post tiếp bài lên để mọi người tiếp tục tham khảo đi.

trongnghia85
24-07-08, 20:07
Tui thấy cái thread này buồn buồn thế nào ấy ,cái dòng này ít dùng nên khi động vào gặp rất nhiều khó khăn thế mà post bài hỏi thì chả thấy ai chả lời cả.Buồn...........!:-?

tuansoibk
24-07-08, 20:43
Tui thấy cái thread này buồn buồn thế nào ấy ,cái dòng này ít dùng nên khi động vào gặp rất nhiều khó khăn thế mà post bài hỏi thì chả thấy ai chả lời cả.Buồn...........!:-?

Bác phải post câu hỏi để mọi người nghiên cứu trả lời chứ. Em cũng đang tham gia cuộc thi NXP đây, cũng gặp ko ít khó khăn. Hic, hiếm lắm mới có 1 nơi bàn luận và trao đổi như thế này.

hbaocr
25-07-08, 07:31
hic,mình cũng đang Busy lắm đang đau đầu với con 2148....code viet debug bằng JLINK trên Eclipse codesourcesery toolchain tự động reset JTAG hoài ah thứ 6 này là deadline phải release cho sếp rồi!đáng nghiên cứu cái BIG BUG đó!hic các bác thông cảm!Đề tài NXP của em còn làm chưa xong nữa nè!sory các bác nhiều!mà các bác cũng phải pót bài lên share kiến thức cho anh em!
Chứ em thấy way đi quẩn lại chỉ có bác Nghĩa(trọng nghĩa --hunter_pro) hỏi!hic nếu em biết thì em trả lời!nếu không thì ngu luôn chẳng biết sao nữa!

mọi người tham ja cùng đóng góp chứ!chứ để 1 mình em pót bài thế này nhiều khi cũng chán!

Bác Nghĩa đề tài ứng dụng GPS trong đánh bắt cá xa bờ của bác tới đâu rồi! còn cái vụ GLCD KIs108 với LPC2138 em đã pót vd lên trên hethongnhung.com rồi mà!sao bác không chia sẽ kinh nghiệm với anh em!

so sorry các pác!vài hôm nữa em rãnh sẽ pót tiếp bài về cách sử dụng SPI và điều khiển GLCD PCF8833

tuansoibk
25-07-08, 09:16
Em thì mới chỉ là 1 newbie thôi, từ lúc tìm hiểu con 8051 tới giờ được nửa năm nên cũng chưa biết gì nhiều, chủ yếu là học hỏi kinh nghiệm thôi. Thấy bác Bảo nói thể, em đọc lại trên này thấy chưa có ai post phần PWM và code (cả timer và PWM) nên em mạo muội post lên, đây là phần cơ bản thôi (vì em còn gà mà!) bác nào có ý kiến gì thì góp ý cho em với nhé.

Bộ tạo xung PWM được thiết kế dựa trên bộ Timer/Counter, hoạt động theo xung PCLK. Nguyên tắc hoạt động dựa trên các Match events của 7 match register. Có 2 loại xung:
- Single Edge: tất cả các xung đều được set lên 1 ngay khi bắt đầu 1 xung PWM, xung được set về 0 khi giá trị của timer counter bằng với giá trị của 1 trong các Match register 1-6. Có thể có tối đa 6 xung Single Edge đồng thời, tất cả các xung đều có cùng tần số được điểu khiển bởi Match register 0 (khi giá trị của timer counter bằng giá trị trong Match register 0 thì kết thúc 1 xung PWM và bắt đầu 1 xung mới).
- Double Edge: các xung được set bằng 0 khi bắt đầu 1 xung PWM, được set lên 1 bằng 1 Match register và set về 0 bằng 1 Match register khác. Các xung double edge cũng có tần số được điều khiển bởi Match register 0.

Bảng các kênh PWM:
Kênh Single Edge Double Edge
Set by Reset by Set by Reset by
1 Match 0 Match 1 - -
2 Match 0 Match 2 Match 1 Match 2
3 Match 0 Match 3 Match 2 Match 3
4 Match 0 Match 4 Match 3 Match 4
5 Match 0 Match 5 Match 4 Match 5
6 Match 0 Match 6 Match 5 Match 6

Ta có thể thấy có tối đa 3 xung double edge đồng thời (kênh 2, 4 & 6) có thể được điều khiển độc lập bằng 7 Match register.

Các thanh ghi điều khiển PWM:

• PWM Interrupt Register (PWMIR):
Khi xảy ra ngắt do 1 kênh PWM (xảy ra match trên các Match registers) thì bit tương ứng trong PWMIR sẽ được set lên 1. Sau khi xảy ra ngắt phải ghi 1 vào bit đó để xóa cờ ngắt (tương tự T0IR & T1IR).

Bit Ký hiệu Ý nghĩa Giá trị sau Reset
0 PWM0_Int cờ ngắt PWM kênh 0 0
1 PWM1_Int cờ ngắt PWM kênh 1 0
2 PWM2_Int cờ ngắt PWM kênh 2 0
3 PWM3_Int cờ ngắt PWM kênh 3 0
7:4 - Reserved n/a
8 PWM4_Int cờ ngắt PWM kênh 4 0
9 PWM5_Int cờ ngắt PWM kênh 5 0
10 PWM6_Int cờ ngắt PWM kênh 6 0
15:11 - Reserved n/a

• PWM Timer Control Register (PWMTCR):
Bit Ký hiệu Ý nghĩa Giá trị sau Reset
0 Counter Enable 0: disable Counter,1: enable Counter 0

1 Counter Reset khi bit này bằng 1, TC và PC được Reset. 0
tình trạng Reset được giứ nguyên tới khi
bit Counter Enable = 0.
2 - Reserved n/a
3 PWM Enable 0: disable PWM, 1: enable PWM 0

7:4 - Reserved n/a

• PWM Timer Counter (PWMTC):
Tương tự T0TC & T1TC.

• PWM Prescale Register (PWMPR):
Tương tự T0PR & T1PR.

• PWM Prescale Counter (PWMPC):
Tương tự T0PC & T1PC.

• PWM Match Register (PWMMR0-6):
Tương tự các Match register của Timer, khi xảy ra match trên các thanh ghi PWMMR0-6 ta có thể cho dừng timer, reset hoặc yêu cầu ngắt.

• PWM Match Control Register (PWMMCR):
Bit Ký hiệu Ý nghĩa Giá trị sau Reset
0 PWMMR0I 1: ngắt khi PWMTC = PWMMR0 (match 0) 0
1 PWMMR0R 1: reset timer khi match 0 0
2 PWMMR0S 1: dừng timer khi match 0 0
20:3 tương tự cho PWMMR1-6 0
31:21 - Reserved n/a

• PWM Control Register (PWMPCR):
Kích hoạt và chọn loại xung trên các kênh PWM.

Bit Ký hiệu Ý nghĩa Giá trị sau Reset
1:0 - Reserved n/a
2 PWMSEL2 0: xung PWM2 là xung single edge 0
----------- 1: xung PWM2 là xung double edge
6:3 tương tự cho các xung PWM3-6 0
8:7 - Reserved n/a
9 PWMENA1 0: disable PWM1 0
----------- 1: enable PWM1
14:10 tương tự cho PWM6-2 0
15 - Reserved n/a

• PWM Latch Enable Register (PWMLER):
Khi ghi lên các thanh ghi PWMMR0-6, dữ liệu được lưu giữ trong các shadow register. Khi xảy ra match 0 (bắt đầu 1 xung PWM), dữ liệu đó chỉ được ghi lên các thanh ghi PWMMR0-6 khi các bit tương ứng trong PWMLER được set bằng 1, xung PWM mới sẽ hoạt động dựa trên các giá trị mới. Nếu xảy ra việc chuyển giá trị từ các shadow register sang các match register thì các bit tương ứng trong PWMLER sẽ được xóa tự động.

Bit Ký hiệu Ý nghĩa Giá trị sau Reset
6:0 các bit tương ứng cho PWMMR0-6 0
7 - Reserved n/a


Đây là code em viết trên Realview, chương trình dùng để tạo 1 xung 500Hz từ 3 nguồn: PWM1, PWM3 và MAT0.0 (xung trên PWM1 va MAT0.0 co duty cycle là 50%, CCLK =60MHz, PCLK = 15MHz)

#include "LPC214x.h"

int main (void)
{
PINSEL0 = 0x8A;
// P0.0: PWM1, P0.1: PWM3, P0.3: MAT0.0
T0EMR = 0x30;
T0MCR = 2;
T0MR0 = 14999;
// dao gia tri tren chan MAT0.0
PWMPCR = (1 << 3) | (1 << 9) | (1 << 11);
// PWM1: single edge, PWM3: double edge, enable PWM1 & PWM3
PWMMCR = 2;
PWMMR0 = 29999;
PWMMR1 = 14999;
PWMMR2 = 4999;
PWMMR3 = 9999;
T0TCR = 1;
// enable timer 0
PWMTCR = 9;
// enable counter va PWM
while (1);
}


Bác Bảo chỉ em cách đưa bài viết vô 1 cái khung kéo lên kéo xuống được như của bác với (đưa vào cái khung có chữ code ấy), viết thế này dài quá, lại bị mất cái khoảng trắng nên hơi khó chịu.

Crusader20s
25-07-08, 09:58
Chú Bảo này siêng như vậy mai mốt anh đề cử chú làm helpdesk manager luôn quá. hehe Anh em tích cực lên nào.

hbaocr
25-07-08, 11:56
Bác Bảo chỉ em cách đưa bài viết vô 1 cái khung kéo lên kéo xuống được như của bác với (đưa vào cái khung có chữ code ấy), viết thế này dài quá, lại bị mất cái khoảng trắng nên hơi khó chịu.


hi dễ thôi , bạn làm y chang như QUOTE nhưng thay QUOTE bằng CODE thôi!
cheer!

hbaocr
25-07-08, 12:07
hi vọng là nó giúp các bác nhiều!

trongnghia85
26-07-08, 11:46
Tui thấy với con LPC2138 có 2 chân P0.3 và P0.14 để hỗ trợ ngắt ngoài EINT1 ,tui muốn sự dụng đồng thời cả 2 chân ngắt trên ,nhưng khi vào chương trình ngắt thì làm sao phân biệt được ngắt được tạo ra là do chân P0.3 hay P0.14 vậy.Hy vọng post bài vào đây có người trả lời dùm ,hihihiiiiii:)):)):)):))

trongnghia85
26-07-08, 11:53
Tui thấy hơi lạ cuộc thi của NXP có đến hơn 50 đội tham gia mà chẳng thấy ai thắc mắc hay gặp khó khăn post bài lên hỏi gì cả,toàn thấy tui hỏi thui ,chắc các bác đều nắm chắc dòng vi điều khiển này rồi hay sao ấy .Tui thì mới làm quen kiến thức gần như Zero động vào đâu cũng khó khăn , do vậy các bác thông cảm giúp đỡ dùm .

minhtuan04
26-07-08, 14:15
Tui thấy hơi lạ cuộc thi của NXP có đến hơn 50 đội tham gia mà chẳng thấy ai thắc mắc hay gặp khó khăn post bài lên hỏi gì cả,toàn thấy tui hỏi thui ,chắc các bác đều nắm chắc dòng vi điều khiển này rồi hay sao ấy .Tui thì mới làm quen kiến thức gần như Zero động vào đâu cũng khó khăn , do vậy các bác thông cảm giúp đỡ dùm .

Không phải là ai cũng biết hết rồi, mà học thằng này chú tâm vào cái datasheet, các ví dụ, và nắm vững C/C++. Mấy thứ đó có hỏi cũng không bằng ngồi đọc sách và ..gõ. Người ta chỉ hỏi khi làm đúng như trong sách nhưng kết quả khác đi, với những bộ thí nghiệm chuẩn và các ví dụ hiện tại của Keil C thì hầu như mình chẳng gặp rắc rối gì trong làm quen với nó cả.

Hôm trước mình kiếm datasheet của LPC2148 cũng khá vất vả, search nó ra cái gì đâu không, nên hôm nay post lên cho anh em ai có nhu cầu và chưa kiếm ra sử dụng.

hbaocr
26-07-08, 14:57
Không phải là ai cũng biết hết rồi, mà học thằng này chú tâm vào cái datasheet, các ví dụ, và nắm vững C/C++. Mấy thứ đó có hỏi cũng không bằng ngồi đọc sách và ..gõ. Người ta chỉ hỏi khi làm đúng như trong sách nhưng kết quả khác đi, với những bộ thí nghiệm chuẩn và các ví dụ hiện tại của Keil C thì hầu như mình chẳng gặp rắc rối gì trong làm quen với nó cả.
.

wow,hi bác TUẤn nói thiệt chí lý

tuansoibk
26-07-08, 19:57
Tui thấy với con LPC2138 có 2 chân P0.3 và P0.14 để hỗ trợ ngắt ngoài EINT1 ,tui muốn sự dụng đồng thời cả 2 chân ngắt trên ,nhưng khi vào chương trình ngắt thì làm sao phân biệt được ngắt được tạo ra là do chân P0.3 hay P0.14 vậy.Hy vọng post bài vào đây có người trả lời dùm ,hihihiiiiii:)):)):)):))

Khi vào chương trình ngắt, disable cái ngắt đi, rồi cấu hình 2 chân đó thành input rồi tuỳ vào điều kiện ngắt (mức cao, mức thấp, cạnh lên, cạnh xuống) đọc IOPIN0 là biết thội, lúc ra khỏi hàm ngắt thì cấu hình lại thành EINT1, xoá cờ ngắt thêm lần nữa rồi enable cái ngắt lại.

tuansoibk
26-07-08, 19:59
Hôm trước mình kiếm datasheet của LPC2148 cũng khá vất vả, search nó ra cái gì đâu không, nên hôm nay post lên cho anh em ai có nhu cầu và chưa kiếm ra sử dụng.

Mình cũng dịch trong cái User Manual đó ra rồi, cũng tạm xài thôi (1 số thứ căn bản), bạn nào cần thì mình up lên.

minhtuan04
26-07-08, 21:54
Mình cũng dịch trong cái User Manual đó ra rồi, cũng tạm xài thôi (1 số thứ căn bản), bạn nào cần thì mình up lên.

Quá hay đó bạn, Up cái đó cho mấy newbie đỡ vất vả :D, mình cũa là newbie mà hà hà:)

tuansoibk
27-07-08, 00:24
Đây là phần mình mới dịch được, các bạn lấy xem thử nhé, có gì sai sót thì chỉ giúp luôn nhé :D

tuansoibk
28-07-08, 18:44
Có bạn nào tự làm mạch với con LPC2148 này chưa?? Nhóm mình đang làm theo 1 số mạch trên mạng nhưng sao nạp bằng JTAG hay cổng COM vẫn chưa được, có bạn nào làm được rồi thì cho mình tham khảo với.

minhtuan04
28-07-08, 18:54
Có bạn nào tự làm mạch với con LPC2148 này chưa?? Nhóm mình đang làm theo 1 số mạch trên mạng nhưng sao nạp bằng JTAG hay cổng COM vẫn chưa được, có bạn nào làm được rồi thì cho mình tham khảo với.

Hình như nhạp JTAG, còn nạp qua cổng com phải có bootloader, bạn liên hệ nick yahoo này xem anhvu984, người này cũng đang làm mạch nạp cho LPC2148

platinum
31-07-08, 07:36
Cái file LPC 2148 gửi kèm của bác tuansoibk sao ko down được thế

tuansoibk
31-07-08, 12:03
Cái file LPC 2148 gửi kèm của bác tuansoibk sao ko down được thế

Để mình đưa lên lại, đưa vào file rar cho chắc:
http://www.mediafire.com/?1i4c1nudxgy

platinum
01-08-08, 07:59
Em dùng uV3 bản Evaluation đã ***** nhưng mà vẫn ko thể nào Debug được code mà lớn hơn 16K, bác nào có bản Full thì share cho anh em với. chứ ko debug rồi simulator được thì chán lắm.

tuansoibk
01-08-08, 12:58
Em dùng uV3 bản Evaluation đã ***** nhưng mà vẫn ko thể nào Debug được code mà lớn hơn 16K, bác nào có bản Full thì share cho anh em với. chứ ko debug rồi simulator được thì chán lắm.

Mình xài bản uV3 v3.22a ko ***** thì xài được 32k, bạn muốn xài thì lên trang của Keil down về. Mình đã ***** thử bản này, ko còn hiện lên code limit nữa nhưng code dịch ra thì tầm bậy hết (trước ***** chạy khác, sau ***** chạy khác) ặc ặc. Có ai xài chương trình nào viết được code tương đối lớn ko, chia sẻ cho anh em với.

g-style
02-08-08, 10:52
bạn nào biết vd ngắn ngọn hơn về timer không? Tui muốn cứ 1s thì turn on/off. Làm theo VD mà không chạy.
(mục đích cuối cùng của tui là tạo ra xung 100Khz)

g-style
02-08-08, 14:04
bác nào có vd về timer không? = Keil Arm đó.

tuansoibk
02-08-08, 19:14
bạn nào biết vd ngắn ngọn hơn về timer không? Tui muốn cứ 1s thì turn on/off. Làm theo VD mà không chạy.
(mục đích cuối cùng của tui là tạo ra xung 100Khz)

đây là ví dụ mình viết bằng Keil để tạo ra 3 xung 100kHz từ 3 chân P0.0 dùng PWM1, chân P0.1 dùng timer tự viết, chân P0.3 dùng MAT0.0. Bạn lấy về tham khảo nhé, cái này hoạt động ở tần số PCLK = 15MHz, nếu bạn dùng tần số khác thì các giá trị trong các thanh ghi phải thay đổi lại (các Match Register: T0MR0, PWMMR0, PWMMR1).
http://www.mediafire.com/?my9jzh0npfk

tuansoibk
03-08-08, 19:11
Có ai biết xài WinRAM ko? chỉ mình với, làm theo hướng dẫn trên mạng rồi mà khi tạo project -> dịch lại bị :

Assembling (ARM-only): crt0.S
arm-elf-gcc -c -mcpu=arm7tdmi-s -mthumb-interwork -I. -x assembler-with-cpp -DROM_RUN -Wa,-adhlns=crt0.lst,-gdwarf-2 crt0.S -o crt0.o
arm-elf-gcc: CreateProcess: No such file or directory
make.exe: *** [crt0.o] Error 1


hoặc:

> "make.exe" all
make.exe: *** No rule to make target `all'. Stop.

> Process Exit Code: 2
> Time Taken: 00:00


Help!!!

TamGiang
03-08-08, 20:43
Muốn có key của bản KeilARM, bạn mail cho tôi theo địa chỉ nqdinhx, yahoo.com.

Hiện tại chúng tôi có viết một số luồng thảo luận bên arm.vn. Chỉ mới bắt đầu thôi, bằng một số công cụ mô phỏng. Bạn nào quan tâm thì qua đó xem thử.

Chúc vui vẻ.

platinum
06-08-08, 15:52
Em đang mắc một vấn đề với việc điều chế xung. Mặc dù trong chương trình em đã viết giá trị cho PWMLER nhưng khi debug simulator thì giá trị này ko hề được nạp vào. Bác nào giải quyết được thì giúp em với đây là code:
#include <LPC214X.H>
int main (void)
{
PINSEL0 = 0x8A;
// P0.0: PWM1, P0.1: PWM3, P0.3: MAT0.0
T0EMR = 0x30;
T0MCR = 2;
T0MR0 = 14999;
// dao gia tri tren chan MAT0.0
PWMPCR = (1 << 3) | (1 << 9) | (1 << 11);
// PWM1: single edge, PWM3: double edge, enable PWM1 & PWM3
PWMMCR = 2;
PWMMR0 = 29999;
PWMMR1 = 14999;
PWMMR2 = 9;
PWMMR3 = 99;
T0TCR = 1;
// enable timer 0
PWMTCR = 9;
// enable counter va PWM
PWMLER = 0x4;
while (1){
if(PWMTC == 10)
PWMMR3 = PWMMR3 + 10;
}
}
Đây là ảnh simulator:
http://i47.photobucket.com/albums/f190/tranvantoan_ptit/pwm.jpg

tuansoibk
07-08-08, 12:39
Bạn viết sai 1 chỗ rồi:

PWMLER = 0x4;
while (1){
if(PWMTC == 10)
PWMMR3 = PWMMR3 + 10;
}

Nếu bạn muốn thay đổi duty cycle của xung PWM3 bằng cách thay đổi giá trị của PWMMR3 thì phải sửa đoạn trên thành như vậy:

while (1)
{
if(PWMTC == 10)
{
PWMMR3 = PWMMR3 + 10;
PWMLER = 0x08;
}
}

Khi bạn muốn thay đổi giá trị của 1 thanh ghi PWMMR0-6 thì bạn phải set các bit tương ứng trong thanh ghi PWMLER lên 1 (bit tương ứng của PWMMR3 là bit số 3, nếu muốn thay đổi PWMMR3 phải set PWMLER là 0x08 chứ ko phải là 0x04), ở xung kế tiếp giá trị mới được sử dụng và các bit trong PWMLER được xoá 1 cách tự động, có nghĩa là mỗi lần thay đổi các thanh ghi PWMMR0-6 thì lại phải set lại giá trị của PWMLER. Bạn có thể dùng cái Logic Analyzer có trong debug của Keil để kiểm tra kết quả :D

platinum
07-08-08, 13:50
Cảm ơn bác tuansoiBk nhiều nhiều. Tối qua ngồi đọc lại em cũng đã tìm ra chỗ sai của mình và viết lại được. À tiện thể cho em hỏi luôn. Bây giờ em muốn nó cứ phát 1 xung xong thì dừng một thời gian do mình chọn trước. Sau đó mới phát xung tiếp theo với độ rộng xung thay đổi nhưng cycle ko thay đổi thì theo bác phải làm thế nào.

platinum
07-08-08, 13:52
À hôm trước em lỡ xin ***** nhầm chỗ. bị phạt thẻ đỏ mà tại sao em muốn xóa bài đó đi mà ko được. Phạt thế có bị làm sao ko nhỉ .:d

tuansoibk
07-08-08, 20:09
Mình nghĩ ra 1 cách này: bây giờ PWM3 (double edge, dùng PWMMR0, PWMMR2, PWMMR3), set cho timer của PWM reset, dừng lại và gây ra ngắt mỗi khi Match 0, trong hàm ngắt của PWM thì disable bộ PWM đi, lại khởi động Timer0 theo cái thời gian mà mình muốn dừng phát xung. Set cho Timer0 cũng reset, dừng lại và gây ra ngắt luôn. Trong hàm ngắt của Timer0 thì mình lại disable Timer0 đi, khởi động lại PWM theo các giá trị mới...Tức là PWM sẽ phát xung, còn thời gian ko phát xung thì điều khiển bằng Timer0. Mình nghĩ vậy thôi, bạn làm thử xem sao nhé, không biết có được ko đây :D :D

platinum
07-08-08, 20:16
nghe cũng có vẻ có lí, để em thử làm xem nào.

nguyenspk
11-08-08, 23:57
Cho mình hỏi: Mình có 1 RC Servo chạy với f=50hz và 1 DC f=20Khz, vậy PWM của ARM7 LPC2148 có thể đồng thời điều khiển tốc độ chúng được ko? Mong diễn đàn tư vấn giúp!!!

platinum
12-08-08, 00:06
Theo mình nghĩ thì không bởi lẽ PWM chỉ thực hiện điều chế độ rộng xung thôi. còn tần số của 6 ngõ ra LPC2148 đều được xác định bởi PWMMR0. Do đó có lẽ là ko thể đưa ra được 2 tần số đồng thời đâu. Mình nghĩ vậy nếu sai thì mọi người góp ý nha.

nguyenspk
12-08-08, 16:26
Mình thấy PWM con LPC2148 chỉ có 1 Timer/Counter phục vụ. Như vậy nó chỉ có thể đồng thời điều xung trên nhiều chân với cùng tần số. Với lại mình cũng chưa biết mục đích nào khác của việc phân chia chế độ Single Edge và Double Edge, ngoài việc 2 chế độ này cho ra những xung lệch pha nhau. Mình cũng mới tìm hiểu, mong mọi người góp ý. Phải chăng do
là mình chưa hiểu rõ, hay PWM của LPC2148 có hạn chế!?

bovita
12-08-08, 17:16
cho em hỏi chip ARM có gì mạnh hơn mấy con AVR hay PIC hay 8051 mà mình phải xài nó. Sao không xài 8051 hay PIC cho nhanh.

trongnghia85
14-08-08, 11:08
Cho mình hỏi thế này là sao ,có cách gì khắc phục không ,theo mình nghĩ phải có licence mới khắc phục được thì phải ?

RS232.axf: error: L6047U: The code in this image is 16716 bytes - this version of the linker will not create images that large

platinum
14-08-08, 12:27
Có thể nguyên nhân là do bạn đã dùng bản keil Eluvation nó sẽ giới hạn size code less than 16K nên nó không thể debug được code lớn hơn 16K bạn có thể dùng bản mới 3.22a nó cho phép debug tới 32K hoặc là xin ...... mà nhập vào

trongnghia85
14-08-08, 19:00
Mình thiết lập đoạn code sau đây để dùng UART0 với Baud=2400 , sao khi truyền lên máy tính xem thì bị lỗi font vậy ,trước đây mình dùng các dòng khác như 89 hay PIC thì vẫn truyền lên OK mà ! Các bác giúp xem thiết lập tốc độ baud như vậy đã đúng là 2400 chưa ,cảm ơn!

PINSEL0 &= 0xFFFFFFF0; // Reset P0.0,P0.1 Pin Config
PINSEL0 |= 0x00000001; // Select P0.0 = TxD(UART0)
PINSEL0 |= 0x00000004; // Select P0.1 = RxD(UART0)

U0LCR &= 0xFC; // Reset Word Select(1:0)
U0LCR |= 0x03; // Data Bit = 8 Bit
U0LCR &= 0xFB; // Stop Bit = 1 Bit
U0LCR &= 0xF7; // Parity = Disable
U0LCR &= 0xBF; // Disable Break Control
U0LCR |= 0x80; // Enable Programming of Divisor Latches

// U0DLM:U0DLL = 15.00 MHz / [16 x Baud]
// = 15.00 MHz / [16 x 2400]
// = 390.6 = 391 = 0187H
U0DLM = 0x01; // Program Divisor Latch(391) for 2400 Baud
U0DLL = 0x87;

U0LCR &= 0x7F; // Disable Programming of Divisor Latches

U0FCR |= 0x01; // FIF0 Enable
U0FCR |= 0x02; // RX FIFO Reset
U0FCR |= 0x04; // TX FIFO Reset
U0FCR &= 0x3F;

hbaocr
18-08-08, 11:06
hic , pac oi;thach anh trong mach pac dung bao nhieu vay!sao de tinh toan trong code vay 15MHZ vay

hbaocr
18-08-08, 11:32
cho em hỏi chip ARM có gì mạnh hơn mấy con AVR hay PIC hay 8051 mà mình phải xài nó. Sao không xài 8051 hay PIC cho nhanh
hi;rõ ràng là có sự khác biệt chứ ARM là dòng uC 32 bit sử dụng cấu truc ARM ; còn PIC16;8051;avr(atmega8,16,128...) là dòng uC 8bit.hơn nữa tốc độ xử lý của nó nhanh 60Mhz và bộ nhớ flash lớn,như con lpc2378 mình đang sử dụng có tích hợp săn RTC,KB interrupt (như port B của PIC) ,TCP/IP,USB,SPI,SSP,PWM,ADC 10bits 2.44us,DAC 10 bit,timer...., thích hợp với những ứng dụng phức tạp;với những tính toán phức tạp như số thực...Hiện nay ở việt nam có bán rộng rãi ARM7 của atmel (SAM7);ngòai ra còn có ARM7 của NXP(LPC2000 xem ở nhungviet.com);...Hi trong bạn có thể thấy người ta dùng ARM trong điện thoại di động;mp3;...hoặc những thiết bị khác!
bạn có thể xem tổng quan về LPC2000 ở đầu thread này
http://dientuvietnam.net/forums/showthread.php?t=12936

trongnghia85
19-08-08, 00:02
hic , pac oi;thach anh trong mach pac dung bao nhieu vay!sao de tinh toan trong code vay 15MHZ vay

X-TAL =12 Mhz
M(Multiply)=5
P(Divide)=2
CPU Clock =M*X-TAL=60Mhz
VPB Clock =CPU CLock/4 (Cai nay thay thiet lap trong file Startup.s)
=15Mhz

Tui tính vậy không đúng sao bác ???

platinum
19-08-08, 12:18
Em nghĩ bác trongnghia85 tính như vậy đúng rồi mà

hbaocr
19-08-08, 16:43
hi;cái thông số của bạn set không sai nhưng độ sai số của nó lớn
UART baudrate 2397.70
Relative error -0.10%

thử bộ thông số này xem
UART baudrate 2400.15
Relative error 0.01%
các số này là số thập phân nghen hổng phải số HEX đâu
UDL 217
UDLM 0
UDLL 217
DivAddVal 4
MulVal 5

good luck

trch
20-08-08, 17:44
cam on cac ban nhieu minh cung dang can tai lieu ve arm.cho minhhoi la khi minh khai bao thanh ghi I/O trong khi viet chuong trinhhien thi lcd thi lcd ko co tin hieu gi het.con neu bo dong khai bao nay thi lcd hoat dong binh thuong.

hbaocr
20-08-08, 20:20
cam on cac ban nhieu minh cung dang can tai lieu ve arm.cho minhhoi la khi minh khai bao thanh ghi I/O trong khi viet chuong trinhhien thi lcd thi lcd ko co tin hieu gi het.con neu bo dong khai bao nay thi lcd hoat dong binh thuong.
bạn có thể post đoan code đó lên ko?chứ nói kô như vậy biết đường nào!

trongnghia85
21-08-08, 15:12
hi;cái thông số của bạn set không sai nhưng độ sai số của nó lớn
UART baudrate 2397.70
Relative error -0.10%

thử bộ thông số này xem
UART baudrate 2400.15
Relative error 0.01%
các số này là số thập phân nghen hổng phải số HEX đâu
UDL 217
UDLM 0
UDLL 217
DivAddVal 4
MulVal 5

good luck

Mình đã tìm ra nguyên nhân tại sao bị lỗi rồi đó là do mình sử dụng 2 bộ UART cùng lúc ,mình sử dụng nó như sau :
Bộ UART1 đọc dữ liệu từ một thiết bị khác sau đó xử lý dữ liệu đọc được rồi gửi qua UART0 .Nếu như cắt kết nối UART1 đi thì truyền UART0 ngon lành (truyền 1 đoạn kí tự linh tinh lên thôi) nhưng khi kết nối cả 2 thì UART1 vẫn nhận ngon còn UART0 thì truyền lên bị lỗi Font(Mình sợ có lỗi khi xử lý dữ liệu đọc từ UART1 nên chỉ truyền qua UART0 1 xâu linh tinh thôi ) Hơi vô lý làm sao mà không dùng được cùng lúc 2 bộ UART chứ.Bác nào chỉ giúp cách khắc phục với.

trch
21-08-08, 17:05
anh bảo,cho em hỏi trong chương trình hiển thị lcd 16*2 của anh thi có đoạn code này
#define RS 25

cho em hỏi có phải dùng dể khai báo chân của arm ko.mà là P0.25 hay p1.25 vậy.em cảm on anh nhiều.em cũng mới tìm hiểu về arm thôi.còn câu hỏi của anh thi hôm khác em post code lên anh xem dùm nha.

hbaocr
21-08-08, 21:58
anh bảo,cho em hỏi trong chương trình hiển thị lcd 16*2 của anh thi có đoạn code này
#define RS 25

cho em hỏi có phải dùng dể khai báo chân của arm ko.mà là P0.25 hay p1.25 vậy.em cảm on anh nhiều.em cũng mới tìm hiểu về arm thôi.còn câu hỏi của anh thi hôm khác em post code lên anh xem dùm nha.
#define RS 25 tức là dùng P1.25
#define RW 26 tức là dùng P1.26
#define EN 27 tức là dùng P1.27
#define BUSYBIT 31 tức là dùng P1.31
#define LCDPORT 28 tức là vị trí bắt đầu của của LCD Nibble port
D4 ứng với P1.28
D5 ứng với P1.29
D6 ứng với P1.30
D7 ứng với P1.31 hay Busy bit

trch
22-08-08, 19:50
nhưng ma chỉ
#define cs 25
thi ko thể biết nó là Port 0 hay Port 1 dc.Vì có p0.25 và p1.25 mà.

platinum
22-08-08, 20:08
việc định nghĩa chân ra là Port0 hoặc 1 còn phụ thuôc vào việc bạn nạp giá trị cho thanh ghi IOSET0(or1) IOCLR0(or1), IODIR0(or1) bạn nha. Anh bảo ko nói kĩ nên có thể bạn chưa hiểu bạn nên đọc tiếp phần dưới ấy sẽ thấy

IODIR1|= 15<<LCDPORT;//set output pin at LCD data bus
IODIR1|=1<<RS; //set output
IODIR1|=1<<RW; //set output
IODIR1|=1<<EN; //set output

viết như vậy có nghĩa là Port 1 đấy.
Hi vọng mình nói vậy bạn đã hiểu.

trch
22-08-08, 20:22
cảm ơn bạn nhieu nha.mình hiểu rồi.nhung mà nếu chuong trình dung ca p0.25 và p1.25 thi phai khai bao khac pai ko?

platinum
22-08-08, 20:29
Đúng thế. việc khai báo chân nào IN OUT phụ thuộc vào bạn nhập giá trị cho các thanh ghi IODIR như thế nào bít tương ứng trong thanh ghi đó bằng 1 thì là In và 0 là Out. Bạn muốn tìm hiểu thì có thể mail cho mình mình sẽ gửi tài liệu 2148 cho, hoặc bạn có thể vào trang của Philip có manual đấy.
Yahoo: tranvantoan_vk

hbaocr
24-08-08, 20:29
có thể khai báo nhiều ngắt cùng lúc; về nguyên tắc thì ngắt có độ ưu tien cao hơn sẽ được phục vụ trước (nếu có 2 ngắt cùng lúc xảy ra).Ví dụ bạn có thể dùng ngắt Timer và ngắt SPI.

hbaocr
25-08-08, 14:21
@boycdt04
bac Bao oi.doan code doc phim nhan e thu roi,bac co the viet cach khac duoc ko? viet theo cach nay khi ta nhan giu phim thi led tat,neu tha phim thi led sang,em muon khi nhan phim thi led sang nhan tiep cai nua thi led tat.bac co code thi up len cho anh em hoc hoi nhe.thanks
hi;bạn chỉ cần them 1 cái cờ on_of để lưu trang thai thui! Đại loại là như vầy nè

#include "LPC214x.H" // LPC2148 MPU Register

/* pototype section */
int main(void)
{ unsigned long int p;
int on_flag;
// xxxx xxxx xxxx xxxx xxxx xxxx 1xxx 1xxx
IODIR0 = 0x00000088; // P0.3 and p0.7 output
IOCLR0 = 0x00000008; //P0.3 on
IOSET0 = 0x00000080; //p0.7 off
on_flag=0;
while(1)
{

p=IO0PIN; //doc trang thai port 0
p=(p&(1<<5))>>5;// kiem tra bit p0.5
if(p==0)//neu nhan sw
{
if(on_flag==0)
{
IOCLR0|=1<<7 ;
on_flag=1;
}
else
{
on_flag=0;
IOSET0|=1<<7;
}

}
}
}

tuansoibk
27-08-08, 19:19
hiện tại mình đang viết code cho con 2148 trên Keil Real View, tình hình là khi viết tới 20k code thì cái linker bị limit mất, bó tay luôn. Bác nào biết xài các phần mềm khác như WinARM, ImageCraft hay HiTOP gì đó thì giúp mình với, có cách nào chuyển sang dịch bằng các chương trình khác mà vẫn xài được cái file Startup.s của thằng Keil ko?? (Hic, gần tới hạn nộp rồi mà giờ lại bị vầy! :-()

TamGiang
27-08-08, 21:30
To: Huỳnh Bảo.
Dùng cờ cũng hay đấy, nhưng C có cách viết "nén code" mà.

#define in ...
#define out ...

......
if ( <có nhấn nút > )
(IOPIN0 & in )? (IOCLR0 |= out) : (IOSET0 |= out );

----------------------------
To: TuansoiBK
Vì lần trước chưa tìm được chổ để up lên.
Bây giờ bạn vào đây (http://www.arm.vn/index.php?option=com_fireboard&Itemid=55&func=view&id=15&catid=8&limit=6&limitstart=12) để tải RVMDK và Proteus:

http://www.arm.vn/index.php?option=com_fireboard&Itemid=55&func=view&id=15&catid=8&limit=6&limitstart=12.

hbaocr
28-08-08, 09:44
hiện tại mình đang viết code cho con 2148 trên Keil Real View, tình hình là khi viết tới 20k code thì cái linker bị limit mất, bó tay luôn. Bác nào biết xài các phần mềm khác như WinARM, ImageCraft hay HiTOP gì đó thì giúp mình với, có cách nào chuyển sang dịch bằng các chương trình khác mà vẫn xài được cái file Startup.s của thằng Keil ko?? (Hic, gần tới hạn nộp rồi mà giờ lại bị vầy! :-()
bạn có thể dùng version cũ của keil Keil_RealView_V300a có support cả (armcc trình dịch cũ của keil) và realview luôn đó!còn **** của nó thì có đầy trên mạng.

còn về startup code thì tùy thuộc vào mỗi complier nó có syntax khác nhau;nhưng tựu chung thì nội dung vẫn như nhau cũng setup stack;set PLL;set MAM;set mode xử lý ngắt gi khi ngắt xảy ra....Có lẽ bạn phải map giống y chang của keil sang thay đổi syntax các lệnh ASM cho phù hợp với trình dịch đó thui!
Còn nếu bạn sử dụng GNU nói chung thì startup code,make file;linker file có sẵn trên mạng rồi!
CÁch khác là bạn có thể chạy GNU trên keil;bằng cách sau khi cài keil vào cài tiếp gccARM331 rồi vào trong Environment trong tab folder/extension chọn lại GNU complier!thêm prefix cho phù hợp hình như là arm-uclibc- .Khi cài keil các phien bản cũ nó có trong thư mục KEIL folder GNU nó chứa startup code và linker file để chạy GNU ten keil!

cheer
@tuansoibk: bác dân công nghệ thông tin BK dân điện tử vậy! Có j nhận đồng môn hen:))!

hbaocr
28-08-08, 10:53
Keil_RealView_V300;hic mạng rùa quá nãy giờ mới upxong; share cho các bác nè
http://ifile.it/2sraq7x

trch
29-08-08, 19:40
anh bảo ơi làm ơn chỉ em cách down voi. em ngu cái vấn đề này lắm.cảm ơn anh nhiều.

trch
29-08-08, 20:20
em down được rồi.cảm ơn anh nhiều.

platinum
30-08-08, 01:47
Các bác ơi. tình hình là em đang cần giải quyết gấp 1 vấn đề đó là. Em đang dùng LPC2148 để phát xung, nhưng dòng ra của 2148 nhỏ quá (~10mA), mà trong khi đó em cần dòng ra cỡ 300-500mA, và xung ra ko bị méo nhiều. Em phát xung ở tần số ~5KHz. Bác nào có cao kiến j, mong được chỉ giáo. Chỉ dùm em nên dùng có IC gì và mắc mạch như thế nào. em đang cần gấp lắm. Thanks các bác trước.!

tuansoibk
30-08-08, 15:33
thanks bác hbaocr, em là dân cntt, he, mới bắt đầu làm quen với mấy con vdk này thôi :D, mong được các bác chỉ giáo nhiều.
em mới năm 2, bác là khoa nào, năm mấy?

platinum
30-08-08, 15:35
Ai đó giúp em vấn đề trên với !

hbaocr
03-09-08, 16:16
hi;hitex đă có version mới nè; anh em vô down về nghen

http://www.hitex.co.uk/arm/lpc2000book/

TamGiang
07-09-08, 21:47
Các bác ơi. tình hình là em đang cần giải quyết gấp 1 vấn đề đó là. Em đang dùng LPC2148 để phát xung, nhưng dòng ra của 2148 nhỏ quá (~10mA), mà trong khi đó em cần dòng ra cỡ 300-500mA, và xung ra ko bị méo nhiều. Em phát xung ở tần số ~5KHz. Bác nào có cao kiến j, mong được chỉ giáo. Chỉ dùm em nên dùng có IC gì và mắc mạch như thế nào. em đang cần gấp lắm. Thanks các bác trước.!

Bác cần dòng khoảng 500mA, nhưng áp như thế nào?
Có thể dùng Transistor, chắc ăn hơn để có dòng lớn nữa thì dùng Darlington. Muốn có cách ly thì thêm Opto.
Thường với chân của các cổng logic cũng như chân IO của uC, dòng vào lớn hơn dòng ra cực đại, do đó nên để tích cực mức 0 để có dòng ra lớn hơn.

platinum
10-09-08, 23:12
xung của em có độ rộng là 1us, độ lớn là 3,3V. Bây giờ em muốn khuếch đại nó lên cỡ 12V. Để xung ko bị méo bác bảo em nên dùng IC gì. em không hiểu ý bác "Thường với chân của các cổng logic cũng như chân IO của uC, dòng vào lớn hơn dòng ra cực đại, do đó nên để tích cực mức 0 để có dòng ra lớn hơn." nghĩa là sao. Bác hướng dẫn giùm em nha.

tallht
12-09-08, 10:41
Mấy bác cho em xin link down keil uv3 đi! Thanks

platinum
12-09-08, 12:25
www.keil.com

hbaocr
12-09-08, 17:07
Mấy bác cho em xin link down keil uv3 đi! Thanks
hĩ ;up rui ma
http://ifile.it/2sraq7x

trongnghia85
13-09-08, 00:36
Bác nào đã dùng I2C của LPC chỉ giúp mình với ,mình thử dùng đoạn code sau giao tiếp với PCF8574 nhưng không thấy chạy .Debug đến đoạn
while((I2C0STAT)!= 0x18){;;} là chương trình dừng ,có lẽ chưa nhận được ack từ slave PCF8574 ????

void write_PCF8574(unsigned char Addr,unsigned char Data) // Write Output PCF8574A
{
I2C0CONCLR = 0x6C; // Reset all I2C Status
I2C0CONSET |= 0x40; // Enable I2C Interface
I2C0CONSET |= 0x20; // Send Start Condition

// Wait I2C Status Return
while((I2C0STAT)!= 0x08){;;} // Wait Start Condition Complete
I2C0DAT = Addr; // Send PCF8574A+[Read/Write]
I2C0CONCLR = 0x28; // Clear Start Bit + Interrupt Flag

// Wait I2C Status Return
while((I2C0STAT)!= 0x18){;;} // Wait Slave Address+W, ACK
I2C0DAT = Data; // Send Output Data to PCF8574A
I2C0CONCLR = 0x0C; // Clear Acknowledge Bit + Interrupt Flag

// Wait I2C Status Return
while((I2C0STAT)!= 0x28){;;} // Wait Slave Address+W, ACK
I2C0CONSET |= 0x10; // Send Stop Condition
I2C0CONCLR = 0x0C; // Clear Acknowledge Bit + Interrupt Flag
}

lacduong2007
18-09-08, 11:04
Duong hoan toan moi voi ARM va LPC 2148.
minh moi mua LPC2148 ve dinh doc ARM choi.,...hong biet lam the nao de chay va tét...dung Keil thi lam the nao..Cac ban co the giup Duong tu dau toi cuoi de dung Keil chay LPC 2148 hong?
Minh da co mdk323a Uvision3 Keil setup...cai vao may roi...roi lam the nao nua? minh co LPC 2148 va co UsB to DB9 adapter nua..Cac ban co the giup dum hong?
Cam on nhieu

vancongtran
19-09-08, 22:50
Chào các bạn!
Cho mình hỏi về chế độ fast mode plus(1MHZ) i2c là sao? Và làm sao để khai báo chế độ đó trong con pca9633?Thanks.

dinhviethai
25-09-08, 19:30
Em đang tìm hiểu về timer trong 2148 ,bác nào biết về timer trong 2148 có thể chỉ cho em với .

hbaocr
09-10-08, 21:34
Chào các bạn!
Cho mình hỏi về chế độ fast mode plus(1MHZ) i2c là sao? Và làm sao để khai báo chế độ đó trong con pca9633?Thanks.
Theo mình đã thử ; thì con số đó là tốc độ tối da cho phep giao tiep giữa PCA9633 và master khác!Còn tốc độ đạt tới 1Mhz hay không thì còn tùy thuôc vào master của bạn có support tới đó không!chứ không cần khai báo gì đâu!
Mình đã thử và chạy được tới 1500Kbit với master là LPC922(một chú uC thuộc họ 8051) khi giao tiếp I2C với PCA9633

còn nếu bạn dùng ARM lpc2000 thì I2C support tối đa có 400kbit hà!bạn có set cỡ nào đi chăng nữa thì nó cũng không đạt tới 1Mhz đâu

lacduong2007
13-10-08, 03:44
MInh co bai ve UART0 --no se noi len Philip LPC khi minh noi voi Hyper tẻminal. Câc ban xem va co y kien, khi minh noi voi Hyper terminal thi no van chua hien len Philp LPC
CAm on..

/* Include header file depending upon device been used */
#include"lpc214x.h"
void Initialize(void);
/* Macro Definitions */
#define TEMT (1<<6)
#define LINE_FEED 0xA
#define CARRIAGE_RET 0xD
/************************* MAIN *************************/
int main()
{
int i;
char c[]="Philips LPC";
Initialize();
/* Print forever */
while(i<=1)
{

/* Keep Transmitting until Null character('\0') is reached */
while(c[i])
{
U0THR=c[i];
i++;
}
U0THR=LINE_FEED;
U0THR=CARRIAGE_RET;
/* Wait till U0THR and U0TSR are both empty */
while(!(U0LSR & TEMT)){}
}
}
/*************** System Initialization ***************/
void Initialize()
{
/* Initialize Pin Select Block for Tx and Rx */
PINSEL0=0x5;
/* Enable FIFO's and reset them */
U0FCR=0x7;
/* Set DLAB and word length set to 8bits */
U0LCR=0x83;
/* Baud rate set to 9600 */
U0DLL=0x10;
U0DLM=0x0;
/* Clear DLAB */
U0LCR=0x3;
}

reuters
31-10-08, 13:17
// Initial output LE7SEG By Set P1.[22:16]
//Don vi:P1.[22:20]=011
//Chuc:P1.[22:20]=101
//Tram:P1.[22:20]=110
//Data:P1.[19:16]=A3 A2 A1 A0 || Using 74LS47
#include <stdio.h> /* prototype declarations for I/O functions */
#include <LPC214x.H> /* LPC21xx definitions */

unsigned char seg[10] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09};

/* pototype section */
void delay(unsigned long int); // Delay Time Function
void init_serial1 (void); // Initil UART-1
void init_serial0 (void); // Initil UART-0
void init_ADC0_DAC (void); // Initil ADC-0
void hien_thi_leg7seg( unsigned);
void hien_thi_dv( unsigned);
void hien_thi_c( unsigned);
void hien_thi_t( unsigned);
unsigned int val1,val2,i;
float volt1,volt2,DAC;

/****************/
/* main program */
/****************/
int main (void) { /* execution starts here */

init_serial1(); // Initial UART0 = 9600,N,8,1

printf("\rARM7 Test ADC 0.1 Input Voltage P0.28 (VREFF) 0-3.3V\n");
printf("\rARM7 Test DAC Output Voltage P0.25 (VREFF) 0-3.3V\n");


init_ADC0_DAC();
// Start Test Read ADC0 and Display on UART1
while (1) {
do // Loop Read ADC0
{
val1 = AD0DR1;
DACR = AD0DR1;
}
while ((val1 & 0x80000000) == 0); // Wait ADC Conversion Complete
//DAC
DAC = (DACR >> 6)& 0x03FF;
DAC =DAC* 3.3 / 1024.0;
//ADC
val1 = (val1 >> 6) & 0x03FF; // Shift ADC Result to Integer
volt1 = val1 * 3.3 / 1023.0; // Volt = ADC Result x [3.3V / 1024]
printf("\rADC 0.1 Result = %1.1f Volt. AOUT=%1.3f Volt.",volt1,DAC); // Display 3-Digit Result(0-3.3V)
//for(i=0;i<620;i++)
//{
hien_thi_leg7seg(volt1*100);
//}

}

}
/******************************/
/* Initial ADC0 = P0.28 */
/* @3MHz */
/******************************/
void init_ADC0_DAC (void)
{
// Initial DAC (GPIO-0.25) By Set PINSEL1[19:18=10]
// xxxx xxxx xxxx 10xx xxxx xxxx xxxx xxxx
// Initial ADC1 (GPIO-0.28) By Set PINSEL1[27:26=01]
// xxxx 01xx xxxx xxxx xxxx xxxx xxxx xxxx
PINSEL1 &= 0xFCF3FFFF;
PINSEL1 |= 0x01080000;

// Initial ADC0 (ADCR=0x01210680)
AD0INTEN = 0; // Disable ADC Interrupt
AD0CR &= 0x00000000; // Clear All Bit Control
AD0CR &= 0xFFFFFF00;
AD0CR |= 0x00000002; // Select ADC = AIN1
AD0CR |= 0x00000600; // ADC Clock = VBP(PCLK) / 7
AD0CR |= 0x00010000; // Busrt = 1 = Conversion Continue
AD0CR &= 0xFFF1FFFF; // CLKS = 000 = 10Bit : 11 Cycle Clock Conversion
AD0CR |= 0x00200000; // PDN = 1 = Active ADC Module
AD0CR &= 0xFF3FFFFF; // TEST[1:0] = 00 = Normal Mode
AD0CR &= 0xF7FFFFFF; // EDGE = 0 = Conversion on Falling Edge
AD0CR |= 0x01000000; // START = 001 = Start Conversion Now

}
/******************************/
/* Initial UART0 = 9600,N,8,1 */
/* VPB(pclk) = 60.00 MHz */
/******************************/
void init_serial1 (void)
{
/* initialize the serial interface */
PINSEL0 &= 0xFFF0FFFF;
PINSEL0 |= 0x00050000; /* Enable RxD1 and TxD1 */

U1LCR = 0x83; /* 8 bits, no Parity, 1 Stop bit */
U1DLL = 97; /* 9600 Baud Rate @ 15MHz VPB Clock */
U1LCR = 0x03; /* DLAB = 0 */

}
/******************************/
/* Initial UART0 = 9600,N,8,1 */
/* VPB(pclk) = 60.00 MHz */
/******************************/
void init_serial0 (void)
{
PINSEL0 &= 0xFFFFFFF0; // Reset P0.0,P0.1 Pin Config
PINSEL0 |= 0x00000005; // Select P0.0 = TxD(UART0)
//PINSEL0 |= 0x00000004; // Select P0.1 = RxD(UART0)

U0LCR &= 0xFC; // Reset Word Select(1:0)
U0LCR |= 0x03; // Data Bit = 8 Bit
U0LCR &= 0xFB; // Stop Bit = 1 Bit
U0LCR &= 0xF7; // Parity = Disable
U0LCR &= 0xBF; // Disable Break Control
U0LCR |= 0x80; // Enable Programming of Divisor Latches

// U0DLM:U0DLL = 60.00 MHz / [16 x Baud]
// = 60.00 MHz / [16 x 9600]
// = 390.6 = 391 = 0187H
U0DLM = 0x01; // Program Divisor Latch(391) for 9600 Baud
U0DLL = 0x87;

U0LCR &= 0x7F; // Disable Programming of Divisor Latches

U0FCR |= 0x01; // FIF0 Enable
U0FCR |= 0x02; // RX FIFO Reset
U0FCR |= 0x04; // TX FIFO Reset
U0FCR &= 0x3F;
}

/***********************/
/* Delay Time Function */
/* 1-4294967296 */
/***********************/
void delay(unsigned long int count1)
{
while(count1 > 0) {count1--;} // Loop Decrease Counter
}
/***********************/
/* Hien thi Led 7 doan */
/***********************/
void hien_thi_leg7seg( unsigned i)
{
unsigned long int x,y,z,tmp,count=100;
IODIR1 = 0x00FF0000;
for(;count > 0;count--) //Thoi gian hien thi ~1 sec
//for(;;)
{
x=i%10;
hien_thi_dv(x);

tmp=i/10;
y=tmp%10;
hien_thi_c(y);

z=i/100;
hien_thi_t(z);
}
IODIR1 = 0x00000000;
}
/***********************/
/* Hien thi hang don vi */
/***********************/
void hien_thi_dv( unsigned i)
{
IOSET1 = (seg[i]<<16)|0x00300000;
delay(5000); //~0.48 ms
IOCLR1 = (seg[i]<<16)|0x00300000;
}
/***********************/
/* Hien thi hang chuc */
/***********************/
void hien_thi_c( unsigned i)
{
IOSET1 = (seg[i]<<16)|0x00500000;
delay(5000); //~0.48 ms
IOCLR1 = (seg[i]<<16)|0x00500000;
}
/***********************/
/* Hien thi hang tram */
/***********************/
void hien_thi_t( unsigned i)
{
IOSET1 = (seg[i]<<16)|0x00600000;
delay(5000); //~0.48 ms
IOCLR1 = (seg[i]<<16)|0x00600000;
}

Đây là chuơng trình xuất led 7 đoạn,nhưng led xuất ra lại nhấp nháy ,mong được sự giúp đỡ của các bạn.

reuters
31-10-08, 13:20
Ah,cho hỏi làm sao gửi file chuơng trình được nén dưới dạng file .rar lên diễn đàn??!!

boycdt04
31-10-08, 14:53
Chao cac ban!
Cac ban biet o tphcm cho nao co ban modul wireless usb CYWUSB6935 khong ?

vanhungbk
01-11-08, 20:08
Theo mình đã thử ; thì con số đó là tốc độ tối da cho phep giao tiep giữa PCA9633 và master khác!Còn tốc độ đạt tới 1Mhz hay không thì còn tùy thuôc vào master của bạn có support tới đó không!chứ không cần khai báo gì đâu!
Mình đã thử và chạy được tới 1500Kbit với master là LPC922(một chú uC thuộc họ 8051) khi giao tiếp I2C với PCA9633

còn nếu bạn dùng ARM lpc2000 thì I2C support tối đa có 400kbit hà!bạn có set cỡ nào đi chăng nữa thì nó cũng không đạt tới 1Mhz đâu

Chao ban,
Minh cung dang tim hieu ve con PCA9633, minh viet code cho I2C ma chi gui được địa chỉ của con PCA9633, mà kô truy xuất đc địa chỉ thanh ghi điều khiển của nó, khi mình truy xuất thì nó ko gửi ACK về, bạn có code về phần này ko. Gửi cho mình với. Thank nha.
mail: danghung1986@yahoo.com

TUAN_87
03-11-08, 08:49
co ai co the chi minh cach viet chuong tring PWM cho 2106 ko vay
#-o

pavo_lusa
03-11-08, 15:04
chào các huynh!
cho em hỏi : LPC22xx có thể mô phỏng trên proteus được không ? em dùng proteus 7.2 mà ko thấy hỗ trợ.
Thanks!

xuanhaidt2
07-11-08, 14:35
@ boycdt04

Chao cac ban!
Cac ban biet o tphcm cho nao co ban modul wireless usb CYWUSB6935 khong ?
Bạn cần bao nhiêu con ?. Nếu ít mình có thể để lại. Giá cả sinh viên.

bạn có thể liên lạc với mình qua email: xuanhaidt2@yahoo.com

hbaocr
07-11-08, 17:44
chào các huynh!
cho em hỏi : LPC22xx có thể mô phỏng trên proteus được không ? em dùng proteus 7.2 mà ko thấy hỗ trợ.

proteus co LPC2138

ban co the mua mach that ma làm ma!hiennay co nheu cho cung ban lpc2148

hbaocr
07-11-08, 17:54
@vanhungbk
Chao ban,
Minh cung dang tim hieu ve con PCA9633, minh viet code cho I2C ma chi gui được địa chỉ của con PCA9633, mà kô truy xuất đc địa chỉ thanh ghi điều khiển của nó, khi mình truy xuất thì nó ko gửi ACK về, bạn có code về phần này ko. Gửi cho mình với. Thank nha.

đây là code viết trên lpc922(1 chú 8051 2 nguon xung clock)
include "reg922.h"
/************************************************** *************************
* Section: I2C
************************************************** *************************
* Description:
* I2C Support routines
************************************************** *************************/
// define pin names <EX1>

sbit EX_INT1 = P1^4;

enum {
I2C_IDLE=0,
I2C_ERROR=1,
I2C_OK=2,
I2C_BUSY=0x10,
I2C_BUSYTX=0x10,
I2C_BUSYRX=0x11
};

unsigned char G_i2cSlaveAddress;
unsigned char *G_i2cData;
unsigned char G_i2cDataLength;
bit G_i2cDoneFlag;
unsigned char G_i2cStatus;
unsigned char G_i2cIndex;

unsigned char index=0;//for ex_int1
unsigned char data_request[5];

/************************************************** *************************
* Section: LED to setup the value of PCA9633 control register
************************************************** *************************
* Description:
* LED support routines for the PCA9633 no auto increase pointer
************************************************** *************************/
#define BASE_LED_ADDR 0x60 // 7 bit address, low 7 bits
#define ALL_CALL_ADDR (0xE0>>1)

// Registers on the PCA9633
#define LED_REG_MODE1 0x00 //point to Mode1 reg
#define LED_REG_MODE2 0x01 //point to Mode2 reg
#define LED_REG_PWM0 0x02 //point to PWM0 reg
#define LED_REG_PWM1 0x03
#define LED_REG_PWM2 0x04
#define LED_REG_PWM3 0x05
#define LED_REG_GRPPWM 0x06
#define LED_REG_GRPFREQ 0x07
#define LED_REG_LEDOUT 0x08
#define LED_REG_SUBADR1 0x09
#define LED_REG_SUBADR2 0x0A
#define LED_REG_SUBADR3 0x0B
#define LED_REG_ALLCALLADR 0x0C

// Current PCA9633 LED driver I2C address
static unsigned char G_LEDAddr ;

// Index of 0-7 to denote which LED driver board being accessed
static unsigned char G_LEDIndex ;


void I2CInit(void);
unsigned char I2CWrite(
unsigned char aAddress,
unsigned char *aData,
unsigned char aLength);
bit I2CIsDone(void);
void I2CWaitTilDone(void);

void LEDRegWrite(unsigned char Led_Addr,unsigned char aReg, unsigned char aValue);
void LED_inits(unsigned char led_addr);
void LED_set_color(unsigned char led_addr,unsigned char PWM0,unsigned char PWM1,unsigned char PWM2,unsigned char PWM3);

void ports_init(void);
void delay(void) ;
void main(void)
{
unsigned int i;
//ports_init();
I2CInit();
EX_INT1=1;//set input pin
P0=0xFF; //set input port
IP0H &= 0xFB;//set lowest prio for ex_int
IP0 &= 0xFB;
EX1 =1;//enable EX_int1
EA = 1 ;
LED_inits(0x5);
while(1)
{
LED_set_color(0x5,255,0,0,0);
for(i=1;i<250;i++)
{
delay();
}
LED_set_color(0x5,0,255,0,0);

for(i=1;i<250;i++)
{
delay();
}

LED_set_color(0x5,0,0,255,0);

for(i=1;i<250;i++)
{
delay();
}

LED_set_color(0x5,255,255,0,0);

for(i=1;i<250;i++)
{
delay();
}

LED_set_color(0x5,0,255,255,0);

for(i=1;i<250;i++)
{
delay();
}

LED_set_color(0x5,255,0,255,0);

for(i=1;i<250;i++)
{
delay();
}

LED_set_color(0x5,255,255,255,0);

for(i=1;i<250;i++)
{
delay();
}

LED_set_color(0x5,255,100,255,0);

for(i=1;i<250;i++)
{
delay();
}

}

}
//Interrupt function
/*ex1 interupt to update data for led*/
void EX1_isr(void) interrupt 2
{
data_request[index]=P0;
if(index>=5)
{
index=0;
//configure led with data request from lpc2148
//LED_bar_component(data_request[0],data_request[1],data_request[2],data_request[3],data_request[4]);
}
else
{
index++;
}
}
/*-------------------------------------------------------------------------*
* Routine: I2CInterrupt
*-------------------------------------------------------------------------*
* Description:
* I2C interrupt service routine. Handled as a state machine that
* process steps based on the status of the I2C status register.
*-------------------------------------------------------------------------*/
void I2CInterrupt(void) interrupt 6 using 1
{
unsigned char status;

status = I2STAT & 0xF8;

switch(status)
{
// Start condition tranmitted
case 0x08:

// Repeat start condition transmitted
case 0x10:
// Send the slave address
I2DAT = G_i2cSlaveAddress;
STA = 0;
STO = 0;
G_i2cIndex = 0;
break;

// MASTER TRANSMITTER
// Slave Address + Write transmitted, and got ACK from slave
case 0x18:
// Transmit a byte
I2DAT = G_i2cData[G_i2cIndex];
STA = 0;
STO = 0;
break;

// Slave Address transmitted, no ACK received
case 0x20:
// Generate a stop condition and report error status
STA = 0;
STO = 1;
G_i2cStatus = I2C_ERROR;
G_i2cDoneFlag = 1;
break;

// Data byte written and ACK received.
case 0x28:
// Last byte?
if (G_i2cIndex >= G_i2cDataLength) {
// Yes, last. Generate a stop condition
STA = 0;
STO = 1;
G_i2cStatus = I2C_OK;
G_i2cDoneFlag = 1;
}
else
{
// Send the next byte
G_i2cIndex++;
I2DAT = G_i2cData[G_i2cIndex];
STA = 0;
STO = 0;
}
break;

// Data byte written but no ACK received
case 0x30:
// Generate a stop condition
STA = 0;
STO = 1;
G_i2cStatus = I2C_ERROR;
G_i2cDoneFlag = 1;
break;

// Arbitration was lost
case 0x38:
// Generate a start condition and try again
STA = 1;
STO = 0;
break;

// MASTER RECEIVER
// Slave address + Read sent, ACK received
case 0x40:
// Are we to receive more?
STA = 0;
STO = 0;
if (G_i2cIndex >= G_i2cDataLength) {
// No more needed.
// return NACK for data byte
AA = 0;
} else {
// More bytes needed.
// return ACK for data byte
AA = 1;
}
break;

// Slave address + Read sent, NO ACK received
case 0x48:
// Generate a stop condition
STA = 0;
STO = 1;
G_i2cStatus = I2C_ERROR;
G_i2cDoneFlag = 1;
break;

// Data byte received with ACK
case 0x50:
// Store received byte
G_i2cData[G_i2cIndex++] = I2DAT;

// Are we to receive more?
STA = 0;
STO = 0;
if (G_i2cIndex >= G_i2cDataLength) {
// return NACK for next data byte
AA = 0;
} else {
// return ACK for next data byte
AA = 1;
}
break;

// Data byte received with NACK (last byte)
case 0x58:
// Store last byte
G_i2cData[G_i2cIndex] = I2DAT;
// Generate a stop condition, but report OK
STA = 0;
STO = 1;
G_i2cStatus = I2C_OK;
G_i2cDoneFlag = 1;
break;

// Unhandled state
default:
// Generate a stop condition
STA = 0;
STO = 1;
G_i2cStatus = I2C_ERROR;
G_i2cDoneFlag = 1;
break;
}

// clear interrupt flag
SI = 0;
}
/*-------------------------------------------------------------------------*
* Routine: I2CInit
*-------------------------------------------------------------------------*
* Description:
* Setup the processor for doing I2C interrupt driven communications
*-------------------------------------------------------------------------*/
void I2CInit(void)
{
/* // Set pins (PCL/PDA) to open drain
P1M1 |= 0x0C;
P1M2 |= 0x0C;

/* // configure internal SCL generator for 400 kHz (
I2SCLH = 0x05;
I2SCLL = 0x04;
// configure timer 1
TMOD &= 0x0F;
// mode 1
TMOD |= 0x20;
// reload value f=12M/2/(256-TL1)=3000khz
TH1 = 0xFE;
TL1 = 0xFE;
// start timer 1
TR1 = 1;

// configure I2C interface
// configure I2C interface (AA and I2EN are set)
// use timer 1
I2CON = 0x45;
// set interrupt priority to 0
IP1 &= ~0x01;
IP1H &=~0x01;

// set initial status
G_i2cStatus = I2C_IDLE;

// Turn on the I2C interrupt
EI2C = 1; */

// set pins to open-drain
P1M1 |= 0x0C;
P1M2 |= 0x0C;

// configure I2C address
I2ADR = 0x00;
I2ADR = 0xFE;
// configure internal SCL generator
//I2SCLH = 0x08;
//I2SCLL = 0x07;

// configure I2C interface
// use internal SCL generator
// I2CON = 0x44;
// set interrupt priority to 0
// configure timer 1
TMOD &= 0x0F;
// mode 1
TMOD |= 0x20;
// reload value
TH1 = 0xF1;
TL1 = 0xF1;
// start timer 1
TR1 = 1;

// configure I2C interface
// use timer 1
I2CON = 0x45;

IP1 &= ~0x01;
IP1H &= ~0x01;

// initial status
G_i2cStatus = I2C_IDLE;

// enable interrupt
EI2C = 1;

} //end i2c_init

/*-------------------------------------------------------------------------*
* Routine: I2CWrite
*-------------------------------------------------------------------------*
* Description:
* Write a series of bytes out the I2C bus to the given slave address
* Inputs:
* unsigned char aAddress -- Address of slave
* unsigned char *aData -- Pointer to data to send
* unsigned char aLength -- Number of data bytes to write
* Outputs:
* unsigned char -- Status of I2C bus at start of write.
* Returns I2C_OK if successful.
*-------------------------------------------------------------------------*/
unsigned char I2CWrite(
unsigned char aAddress,
unsigned char *aData,
unsigned char aLength)
{
// Must be idle in order to send
if (G_i2cStatus & I2C_BUSY)
return G_i2cStatus;

// Mark busy
G_i2cStatus = I2C_BUSYTX;
G_i2cDoneFlag = 0;

// Setup address to be sent to
G_i2cSlaveAddress = aAddress<<1;

// Remember data and length
G_i2cData = aData;
G_i2cDataLength = aLength-1;

// Start
STA = 1;

return I2C_OK;
} //end i2cwrite



/*-------------------------------------------------------------------------*
* Routine: I2CIsDone
*-------------------------------------------------------------------------*
* Description:
* Returns true if the last I2C transaction is complete.
* Outputs:
* bit -- 1 if complete, else 0
*-------------------------------------------------------------------------*/
bit I2CIsDone(void)
{
return G_i2cDoneFlag;
}

/*-------------------------------------------------------------------------*
* Routine: I2CWaitTilDone
*-------------------------------------------------------------------------*
* Description:
* Blocks until the last I2C command completes.
*-------------------------------------------------------------------------*/
void I2CWaitTilDone(void)
{
while (!I2CIsDone())
{; }
}

/*-------------------------------------------------------------------------*
* Routine: LEDRegWrite
*-------------------------------------------------------------------------*
* Description:
* Set a register in the currently selected PCA9633 device(s).
* Blocks until I2C command is completed.
* Inputs:
* unsigned char aReg -- Register to write
* unsigned char aValue -- Value of register.
*-------------------------------------------------------------------------*/
void LEDRegWrite(unsigned char Led_Addr,unsigned char aReg, unsigned char aValue)
{
char command[2] ;
command[0] = aReg ; //reg addr of PCA96633
command[1] = aValue ;//value setup for reg of PCA9633 above
G_LEDAddr=Led_Addr;
I2CWrite(G_LEDAddr, command, 2);
I2CWaitTilDone();
}
/*init PCA9633 with led_addr provide*/
void LED_inits(unsigned char led_addr)
{
// Standard reset
LEDRegWrite(led_addr,LED_REG_MODE1, 0x0F);//set pca9633 respond to allcall/subaddress1;2;3
// All addressing acceptable
LEDRegWrite(led_addr,LED_REG_MODE2, 0x05);//configure output 4 led/disable when OE=1/dimming
LEDRegWrite(led_addr,LED_REG_PWM0, 0x00);
LEDRegWrite(led_addr,LED_REG_PWM1, 0x00);
LEDRegWrite(led_addr,LED_REG_PWM2, 0x00);
LEDRegWrite(led_addr,LED_REG_PWM3, 0x00);
LEDRegWrite(led_addr,LED_REG_GRPPWM, 0xFF);//set duty of PWM of all 4e led/f=190Hz
LEDRegWrite(led_addr,LED_REG_GRPFREQ, 0x00);//set f of group but don't care because DMBLNK bit in mode2=0
LEDRegWrite(led_addr,LED_REG_LEDOUT,0x15); //0x15); // all except amber are on
LEDRegWrite(led_addr,LED_REG_GRPFREQ, 0x00);//don't care

// Reprogram the addresses for race tracks
LEDRegWrite(led_addr,LED_REG_SUBADR1, 0xB0+(2*(G_LEDIndex%2)));
LEDRegWrite(led_addr,LED_REG_SUBADR2, 0xC0+(2*(G_LEDIndex%3)));
LEDRegWrite(led_addr,LED_REG_SUBADR3, 0xD0+(2*(G_LEDIndex%4)));

// Setup all call
LEDRegWrite(led_addr,LED_REG_ALLCALLADR,0xE1); //0xE1);
}

/*set color for LED with RGBA*/
void LED_set_color(unsigned char led_addr,unsigned char PWM0,unsigned char PWM1,unsigned char PWM2,unsigned char PWM3)
{
unsigned char bits = 0x00;

// All 4 leds allow independent and group PWM
if (PWM0)
bits |= 0x03;
if (PWM1)
bits |= 0x0C;
if (PWM2)
bits |= 0x30;
if (PWM3)
bits |= 0xC0;

// Write the configuration of on/off bits
LEDRegWrite(led_addr,LED_REG_LEDOUT,bits);

// Write the PWM values.
LEDRegWrite(led_addr,LED_REG_PWM0,PWM0);
LEDRegWrite(led_addr,LED_REG_PWM1,PWM1);
LEDRegWrite(led_addr,LED_REG_PWM2,PWM2);
LEDRegWrite(led_addr,LED_REG_PWM3,PWM3);
}
/*port init*/
void ports_init(void)
{
P0M1 &= 0x00;
P0M2 &= 0x00;
P1M1 |= 0x30;
P1M2 &= 0xCF;
} // ports_init

void delay(void)
{
unsigned char k=255;
unsigned char i=1;
while(i--)
{
k=255;
while(k--);
}
}

còn bạn muốn viết trên ARM LPC2000 thì cũng được nhưng mình đã thử trên LPC2148 với PCA9633 tốc độ I2C của master LPC2000 chuối lắm có 400Kbits/s ah.Trong khi Chú LPC922 có tốc độ i2C tối đa tới 3000Kbits/s lận
cheer

hbaocr
06-01-09, 18:15
Xin chào các bác ; lâu nay bận làm luận văn tốt nghiệp nên chả pót bài nào!Hi; hôm nay mới bảo vệ luận văn xong; em xin pót tiếp bài về cách sử dụng GLCD PCF8833 của nokia 6100

Đặc Điểm GLCD graphic PCF8833 dùng cho NoKia 6100:
• Nguồn 3.3V
• Giao tiếp SPI , truyền data 9 bit
• 132x132 điểm ảnh với 12 bit màu RGB(4bit Red , 4 bit Green, 4 bit Blue)

http://i177.photobucket.com/albums/w237/hbaocr/hinh1.gif

Chú ý khi thiết kế nè:
1: Các bác có thể sử dụng IC đệm để có thể giao tiếp Được với 5V như 74lvc244 hay 74lvc245
2:Tuy su dung nguon la 3v nhưng chan Blink của nó phai cấp áp từ 7->9v nó mới chạy

• Hoạt động (các bác xem hình 2) :
Nokia 6100 sử dụng giao thức SPI (clock and data) hoạt động như 1 Slave nhận Command và Data từ Master là ARM LPC2214.Chúng ta Send 9 bit trên đường truyền SPI (truyền MSB trước) bao gồm MSB chỉ rõ là Data hay Command, và 8 bit cuối là dữ liệu truyền.
MSB=0 dữ liệu LCD nhận là Command
MSB=1 dữ liệu LCD nhận Data


Chúng ta hiển thị lên LCD bằng cách send lệnh trước và các đối số của lệnh sau
Chúng ta có thể Display như mong muốn bằng cách kiểm soát từng điểm ảnh trên màn hình LCD. Các Command thường dùng
#define NOP 0x00 // nop
#define SWRESET 0x01 // software reset
#define BSTROFF 0x02 // booster voltage OFF
#define BSTRON 0x03 // booster voltage ON
#define RDDIDIF 0x04 // read display identification
#define RDDST 0x09 // read display status
#define SLEEPIN 0x10 // sleep in
#define SLEEPOUT 0x11 // sleep out
#define PTLON 0x12 // partial display mode
#define NORON 0x13 // display normal mode
#define INVOFF 0x20 // inversion OFF
#define INVON 0x21 // inversion ON
#define DALO 0x22 // all pixel OFF
#define DAL 0x23 // all pixel ON
#define SETCON 0x25 // write contrast
#define DISPOFF 0x28 // display OFF
#define DISPON 0x29 // display ON
#define CASET 0x2A // column address set
#define PASET 0x2B // page address set
#define RAMWR 0x2C // memory write
#define RGBSET 0x2D // colour set
#define PTLAR 0x30 // partial area
#define VSCRDEF 0x33 // vertical scrolling definition
#define TEOFF 0x34 // test mode
#define TEON 0x35 // test mode
#define MADCTL 0x36 // memory access control
#define SEP 0x37 // vertical scrolling start address
#define IDMOFF 0x38 // idle mode OFF
#define IDMON 0x39 // idle mode ON
#define COLMOD 0x3A // interface pixel format
#define SETVOP 0xB0 // set Vop
#define BRS 0xB4 // bottom row swap
#define TRS 0xB6 // top row swap
#define DISCTR 0xB9 // display control
#define DOR 0xBA // data order
#define TCDFE 0xBD // enable/disable DF temperature compensation
#define TCVOPE 0xBF // enable/disable Vop temp comp
#define EC 0xC0 // internal or external oscillator
#define SETMUL 0xC2 // set multiplication factor
#define TCVOPAB 0xC3 // set TCVOP slopes A and B
#define TCVOPCD 0xC4 // set TCVOP slopes c and d
#define TCDF 0xC5 // set divider frequency
#define DF8COLOR 0xC6 // set divider frequency 8-color mode
#define SETBS 0xC7 // set bias system
#define RDTEMP 0xC8 // temperature read back
#define NLI 0xC9 // n-line inversion
#define RDID1 0xDA // read ID1
#define RDID2 0xDB // read ID2
#define RDID3 0xDC // read ID3
Xem chi tiết các lệnh ở datasheet PCF8833
• Sơ đồ mạch ( đây chỉ là sơ đồ mạch đơn giản các bác thêm mắm thêm muối vô nhé)

http://i177.photobucket.com/albums/w237/hbaocr/hinh3.gif


Code thực hiện :
code dựa trên VĐK ARM LPC2000 nhưng các bác có thể sử dụng code này cho các VĐK khác kể cả 8051 vì GLCD này sử dụng giao thức SPI ; trong code thực hiện tuy viết trên ARM nhưng em ko sử dụng SPI mode của nó mà giả lập chức năng SPI trên các chân IO bình thường!Do đó các bác có thể dùng code này để phat trein tren các VDK khác ko ho tro SPI

#include <LPC22xx.H> // LPC2214 MPU Register
//define for LCD
/************************************************** ***************************
Command of LCD NOKIA6100(phillips chipset)
************************************************** ***************************/
#define NOP 0x00 // nop
#define SWRESET 0x01 // software reset
#define BSTROFF 0x02 // booster voltage OFF
#define BSTRON 0x03 // booster voltage ON
#define RDDIDIF 0x04 // read display identification
#define RDDST 0x09 // read display status
#define SLEEPIN 0x10 // sleep in
#define SLEEPOUT 0x11 // sleep out
#define PTLON 0x12 // partial display mode
#define NORON 0x13 // display normal mode
#define INVOFF 0x20 // inversion OFF
#define INVON 0x21 // inversion ON
#define DALO 0x22 // all pixel OFF
#define DAL 0x23 // all pixel ON
#define SETCON 0x25 // write contrast
#define DISPOFF 0x28 // display OFF
#define DISPON 0x29 // display ON
#define CASET 0x2A // column address set
#define PASET 0x2B // page address set
#define RAMWR 0x2C // memory write
#define RGBSET 0x2D // colour set
#define PTLAR 0x30 // partial area
#define VSCRDEF 0x33 // vertical scrolling definition
#define TEOFF 0x34 // test mode
#define TEON 0x35 // test mode
#define MADCTL 0x36 // memory access control
#define SEP 0x37 // vertical scrolling start address
#define IDMOFF 0x38 // idle mode OFF
#define IDMON 0x39 // idle mode ON
#define COLMOD 0x3A // interface pixel format
#define SETVOP 0xB0 // set Vop
#define BRS 0xB4 // bottom row swap
#define TRS 0xB6 // top row swap
#define DISCTR 0xB9 // display control
#define DOR 0xBA // data order
#define TCDFE 0xBD // enable/disable DF temperature compensation
#define TCVOPE 0xBF // enable/disable Vop temp comp
#define EC 0xC0 // internal or external oscillator
#define SETMUL 0xC2 // set multiplication factor
#define TCVOPAB 0xC3 // set TCVOP slopes A and B
#define TCVOPCD 0xC4 // set TCVOP slopes c and d
#define TCDF 0xC5 // set divider frequency
#define DF8COLOR 0xC6 // set divider frequency 8-color mode
#define SETBS 0xC7 // set bias system
#define RDTEMP 0xC8 // temperature read back
#define NLI 0xC9 // n-line inversion
#define RDID1 0xDA // read ID1
#define RDID2 0xDB // read ID2
#define RDID3 0xDC // read ID3
//define color
// backlight control
#define BKLGHT_LCD_ON 1
#define BKLGHT_LCD_OFF 2

// Booleans
#define NOFILL 0
#define FILL 1

// 12-bit color definitions
#define WHITE 0xFFF
#define BLACK 0x000
#define RED 0xF00
#define GREEN 0x0F0
#define BLUE 0x00F
#define CYAN 0x0FF
#define MAGENTA 0xF0F
#define YELLOW 0xFF0
#define BROWN 0xB22
#define ORANGE 0xFA0
#define PINK 0xF6A

// Font sizes
#define SMALL 0
#define MEDIUM 1
#define LARGE 2

//define pin
#define RS (1<<21)
#define CS (1<<11)
#define BL (1<<22)
#define SDA (1<<6) //MOSI
#define CLK (1<<4) //CLK
//define program
//************************************************** ***************************
// Program definition
//************************************************** ***************************/
#define LCD_CS_LOW IOCLR0 |= CS
#define LCD_CS_HIGH IOSET0 |= CS

#define CLK0 IOCLR0 |= CLK
#define CLK1 IOSET0 |= CLK

#define SDA0 IOCLR0 |= SDA
#define SDA1 IOSET0 |= SDA

#define LCD_RESET_LOW IOCLR0 |= RS
#define LCD_RESET_HIGH IOSET0 |= RS

/* pototype section */
//************************************************** **************************
// Program prototype
//******************FOR LCD PCF8833******************************************* ***************
void Send_Spi(unsigned int data);
void Backlight(unsigned char state);
void WriteSpiCommand(unsigned int data);
void WriteSpiData(unsigned int data);
void InitLcd(void);
void LCDWriteNum(int num, int x, int y, int size, int fcolor, int bcolor);
void LCDWrite130x130bmp(void);
void LCDClearScreen(void);
void LCDSetXY(int x, int y);
void LCDSetPixel(int x, int y, int color);
void LCDSetLine(int x1, int y1, int x2, int y2, int color);
void LCDSetRect(int x0, int y0, int x1, int y1, unsigned char fill, int color);
void LCDSetCircle(int x0, int y0, int radius, int color);
void LCDPutChar(char c, int x, int y, int size, int fcolor, int bcolor);
void LCDPutStr(char *pString, int x, int y, int Size, int fColor, int bColor) ;
void LCD_Display_Arg(int x1, int y1, float x2, float y2, int color);
//*********************For ADC and ADXL********************************************** ***************
//CCLK=12xM=12x5=60MHZ
//PCLK=CCLK (VPBDIV=0x00)
int readpinport0(unsigned int portpin);
int outpinport0(unsigned int portpin,unsigned int val);
void Delay(unsigned long int); // Delay Time Function
//********************************Finish prototype****************************************

//******************VAriable for LCD display***************************************
const unsigned char FONT6x8[97][8] = {

0x06,0x08,0x08,0x00,0x00,0x00,0x00,0x00, // columns, rows, num_bytes_per_char
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // space 0x20
0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00, // !
0x50,0x50,0x50,0x00,0x00,0x00,0x00,0x00, // "
0x50,0x50,0xF8,0x50,0xF8,0x50,0x50,0x00, // #
0x20,0x78,0xA0,0x70,0x28,0xF0,0x20,0x00, // $
0xC0,0xC8,0x10,0x20,0x40,0x98,0x18,0x00, // %
0x40,0xA0,0xA0,0x40,0xA8,0x90,0x68,0x00, // &
0x30,0x30,0x20,0x40,0x00,0x00,0x00,0x00, // '
0x10,0x20,0x40,0x40,0x40,0x20,0x10,0x00, // (
0x40,0x20,0x10,0x10,0x10,0x20,0x40,0x00, // )
0x00,0x20,0xA8,0x70,0x70,0xA8,0x20,0x00, // *
0x00,0x20,0x20,0xF8,0x20,0x20,0x00,0x00, // +
0x00,0x00,0x00,0x00,0x30,0x30,0x20,0x40, // ,
0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00, // -
0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00, // .
0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00, // / (forward slash)
0x70,0x88,0x88,0xA8,0x88,0x88,0x70,0x00, // 0 0x30
0x20,0x60,0x20,0x20,0x20,0x20,0x70,0x00, // 1
0x70,0x88,0x08,0x70,0x80,0x80,0xF8,0x00, // 2
0xF8,0x08,0x10,0x30,0x08,0x88,0x70,0x00, // 3
0x10,0x30,0x50,0x90,0xF8,0x10,0x10,0x00, // 4
0xF8,0x80,0xF0,0x08,0x08,0x88,0x70,0x00, // 5
0x38,0x40,0x80,0xF0,0x88,0x88,0x70,0x00, // 6
0xF8,0x08,0x08,0x10,0x20,0x40,0x80,0x00, // 7
0x70,0x88,0x88,0x70,0x88,0x88,0x70,0x00, // 8
0x70,0x88,0x88,0x78,0x08,0x10,0xE0,0x00, // 9
0x00,0x00,0x20,0x00,0x20,0x00,0x00,0x00, // :
0x00,0x00,0x20,0x00,0x20,0x20,0x40,0x00, // ;
0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x00, // <
0x00,0x00,0xF8,0x00,0xF8,0x00,0x00,0x00, // =
0x40,0x20,0x10,0x08,0x10,0x20,0x40,0x00, // >
0x70,0x88,0x08,0x30,0x20,0x00,0x20,0x00, // ?
0x70,0x88,0xA8,0xB8,0xB0,0x80,0x78,0x00, // @ 0x40
0x20,0x50,0x88,0x88,0xF8,0x88,0x88,0x00, // A
0xF0,0x88,0x88,0xF0,0x88,0x88,0xF0,0x00, // B
0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x00, // C
0xF0,0x88,0x88,0x88,0x88,0x88,0xF0,0x00, // D
0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8,0x00, // E
0xF8,0x80,0x80,0xF0,0x80,0x80,0x80,0x00, // F
0x78,0x88,0x80,0x80,0x98,0x88,0x78,0x00, // G
0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x00, // H
0x70,0x20,0x20,0x20,0x20,0x20,0x70,0x00, // I
0x38,0x10,0x10,0x10,0x10,0x90,0x60,0x00, // J
0x88,0x90,0xA0,0xC0,0xA0,0x90,0x88,0x00, // K
0x80,0x80,0x80,0x80,0x80,0x80,0xF8,0x00, // L
0x88,0xD8,0xA8,0xA8,0xA8,0x88,0x88,0x00, // M
0x88,0x88,0xC8,0xA8,0x98,0x88,0x88,0x00, // N
0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x00, // O
0xF0,0x88,0x88,0xF0,0x80,0x80,0x80,0x00, // P 0x50
0x70,0x88,0x88,0x88,0xA8,0x90,0x68,0x00, // Q
0xF0,0x88,0x88,0xF0,0xA0,0x90,0x88,0x00, // R
0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x00, // S
0xF8,0xA8,0x20,0x20,0x20,0x20,0x20,0x00, // T
0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00, // U
0x88,0x88,0x88,0x88,0x88,0x50,0x20,0x00, // V
0x88,0x88,0x88,0xA8,0xA8,0xA8,0x50,0x00, // W
0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x00, // X
0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x00, // Y
0xF8,0x08,0x10,0x70,0x40,0x80,0xF8,0x00, // Z
0x78,0x40,0x40,0x40,0x40,0x40,0x78,0x00, // [
0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00, // \ (back slash)
0x78,0x08,0x08,0x08,0x08,0x08,0x78,0x00, // ]
0x20,0x50,0x88,0x00,0x00,0x00,0x00,0x00, // ^
0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x00, // _
0x60,0x60,0x20,0x10,0x00,0x00,0x00,0x00, // ` 0x60
0x00,0x00,0x60,0x10,0x70,0x90,0x78,0x00, // a
0x80,0x80,0xB0,0xC8,0x88,0xC8,0xB0,0x00, // b
0x00,0x00,0x70,0x88,0x80,0x88,0x70,0x00, // c
0x08,0x08,0x68,0x98,0x88,0x98,0x68,0x00, // d
0x00,0x00,0x70,0x88,0xF8,0x80,0x70,0x00, // e
0x10,0x28,0x20,0x70,0x20,0x20,0x20,0x00, // f
0x00,0x00,0x70,0x98,0x98,0x68,0x08,0x70, // g
0x80,0x80,0xB0,0xC8,0x88,0x88,0x88,0x00, // h
0x20,0x00,0x60,0x20,0x20,0x20,0x70,0x00, // i
0x10,0x00,0x10,0x10,0x10,0x90,0x60,0x00, // j
0x80,0x80,0x90,0xA0,0xC0,0xA0,0x90,0x00, // k
0x60,0x20,0x20,0x20,0x20,0x20,0x70,0x00, // l
0x00,0x00,0xD0,0xA8,0xA8,0xA8,0xA8,0x00, // m
0x00,0x00,0xB0,0xC8,0x88,0x88,0x88,0x00, // n
0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x00, // o
0x00,0x00,0xB0,0xC8,0xC8,0xB0,0x80,0x80, // p 0x70
0x00,0x00,0x68,0x98,0x98,0x68,0x08,0x08, // q
0x00,0x00,0xB0,0xC8,0x80,0x80,0x80,0x00, // r
0x00,0x00,0x78,0x80,0x70,0x08,0xF0,0x00, // s
0x20,0x20,0xF8,0x20,0x20,0x28,0x10,0x00, // t
0x00,0x00,0x88,0x88,0x88,0x98,0x68,0x00, // u
0x00,0x00,0x88,0x88,0x88,0x50,0x20,0x00, // v
0x00,0x00,0x88,0x88,0xA8,0xA8,0x50,0x00, // w
0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x00, // x
0x00,0x00,0x88,0x88,0x78,0x08,0x88,0x70, // y
0x00,0x00,0xF8,0x10,0x20,0x40,0xF8,0x00, // z
0x10,0x20,0x20,0x40,0x20,0x20,0x10,0x00, // {
0x20,0x20,0x20,0x00,0x20,0x20,0x20,0x00, // |
0x40,0x20,0x20,0x10,0x20,0x20,0x40,0x00, // }
0x40,0xA8,0x10,0x00,0x00,0x00,0x00,0x00, // ~
0x70,0xD8,0xD8,0x70,0x00,0x00,0x00,0x00}; // DEL

const unsigned char FONT8x8[97][8] = {

0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00, // columns, rows, num_bytes_per_char
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // space 0x20
0x30,0x78,0x78,0x30,0x30,0x00,0x30,0x00, // !
0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00, // "
0x6C,0x6C,0xFE,0x6C,0xFE,0x6C,0x6C,0x00, // #
0x18,0x3E,0x60,0x3C,0x06,0x7C,0x18,0x00, // $
0x00,0x63,0x66,0x0C,0x18,0x33,0x63,0x00, // %
0x1C,0x36,0x1C,0x3B,0x6E,0x66,0x3B,0x00, // &
0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00, // '
0x0C,0x18,0x30,0x30,0x30,0x18,0x0C,0x00, // (
0x30,0x18,0x0C,0x0C,0x0C,0x18,0x30,0x00, // )
0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00,0x00, // *
0x00,0x30,0x30,0xFC,0x30,0x30,0x00,0x00, // +
0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x30, // ,
0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00, // -
0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00, // .
0x03,0x06,0x0C,0x18,0x30,0x60,0x40,0x00, // / (forward slash)
0x3E,0x63,0x63,0x6B,0x63,0x63,0x3E,0x00, // 0 0x30
0x18,0x38,0x58,0x18,0x18,0x18,0x7E,0x00, // 1
0x3C,0x66,0x06,0x1C,0x30,0x66,0x7E,0x00, // 2
0x3C,0x66,0x06,0x1C,0x06,0x66,0x3C,0x00, // 3
0x0E,0x1E,0x36,0x66,0x7F,0x06,0x0F,0x00, // 4
0x7E,0x60,0x7C,0x06,0x06,0x66,0x3C,0x00, // 5
0x1C,0x30,0x60,0x7C,0x66,0x66,0x3C,0x00, // 6
0x7E,0x66,0x06,0x0C,0x18,0x18,0x18,0x00, // 7
0x3C,0x66,0x66,0x3C,0x66,0x66,0x3C,0x00, // 8
0x3C,0x66,0x66,0x3E,0x06,0x0C,0x38,0x00, // 9
0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x00, // :
0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x30, // ;
0x0C,0x18,0x30,0x60,0x30,0x18,0x0C,0x00, // <
0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00, // =
0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x00, // >
0x3C,0x66,0x06,0x0C,0x18,0x00,0x18,0x00, // ?
0x3E,0x63,0x6F,0x69,0x6F,0x60,0x3E,0x00, // @ 0x40
0x18,0x3C,0x66,0x66,0x7E,0x66,0x66,0x00, // A
0x7E,0x33,0x33,0x3E,0x33,0x33,0x7E,0x00, // B
0x1E,0x33,0x60,0x60,0x60,0x33,0x1E,0x00, // C
0x7C,0x36,0x33,0x33,0x33,0x36,0x7C,0x00, // D
0x7F,0x31,0x34,0x3C,0x34,0x31,0x7F,0x00, // E
0x7F,0x31,0x34,0x3C,0x34,0x30,0x78,0x00, // F
0x1E,0x33,0x60,0x60,0x67,0x33,0x1F,0x00, // G
0x66,0x66,0x66,0x7E,0x66,0x66,0x66,0x00, // H
0x3C,0x18,0x18,0x18,0x18,0x18,0x3C,0x00, // I
0x0F,0x06,0x06,0x06,0x66,0x66,0x3C,0x00, // J
0x73,0x33,0x36,0x3C,0x36,0x33,0x73,0x00, // K
0x78,0x30,0x30,0x30,0x31,0x33,0x7F,0x00, // L
0x63,0x77,0x7F,0x7F,0x6B,0x63,0x63,0x00, // M
0x63,0x73,0x7B,0x6F,0x67,0x63,0x63,0x00, // N
0x3E,0x63,0x63,0x63,0x63,0x63,0x3E,0x00, // O
0x7E,0x33,0x33,0x3E,0x30,0x30,0x78,0x00, // P 0x50
0x3C,0x66,0x66,0x66,0x6E,0x3C,0x0E,0x00, // Q
0x7E,0x33,0x33,0x3E,0x36,0x33,0x73,0x00, // R
0x3C,0x66,0x30,0x18,0x0C,0x66,0x3C,0x00, // S
0x7E,0x5A,0x18,0x18,0x18,0x18,0x3C,0x00, // T
0x66,0x66,0x66,0x66,0x66,0x66,0x7E,0x00, // U
0x66,0x66,0x66,0x66,0x66,0x3C,0x18,0x00, // V
0x63,0x63,0x63,0x6B,0x7F,0x77,0x63,0x00, // W
0x63,0x63,0x36,0x1C,0x1C,0x36,0x63,0x00, // X
0x66,0x66,0x66,0x3C,0x18,0x18,0x3C,0x00, // Y
0x7F,0x63,0x46,0x0C,0x19,0x33,0x7F,0x00, // Z
0x3C,0x30,0x30,0x30,0x30,0x30,0x3C,0x00, // [
0x60,0x30,0x18,0x0C,0x06,0x03,0x01,0x00, // \ (back slash)
0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3C,0x00, // ]
0x08,0x1C,0x36,0x63,0x00,0x00,0x00,0x00, // ^
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF, // _
0x18,0x18,0x0C,0x00,0x00,0x00,0x00,0x00, // ` 0x60
0x00,0x00,0x3C,0x06,0x3E,0x66,0x3B,0x00, // a
0x70,0x30,0x3E,0x33,0x33,0x33,0x6E,0x00, // b
0x00,0x00,0x3C,0x66,0x60,0x66,0x3C,0x00, // c
0x0E,0x06,0x3E,0x66,0x66,0x66,0x3B,0x00, // d
0x00,0x00,0x3C,0x66,0x7E,0x60,0x3C,0x00, // e
0x1C,0x36,0x30,0x78,0x30,0x30,0x78,0x00, // f
0x00,0x00,0x3B,0x66,0x66,0x3E,0x06,0x7C, // g
0x70,0x30,0x36,0x3B,0x33,0x33,0x73,0x00, // h
0x18,0x00,0x38,0x18,0x18,0x18,0x3C,0x00, // i
0x06,0x00,0x06,0x06,0x06,0x66,0x66,0x3C, // j
0x70,0x30,0x33,0x36,0x3C,0x36,0x73,0x00, // k
0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00, // l
0x00,0x00,0x66,0x7F,0x7F,0x6B,0x63,0x00, // m
0x00,0x00,0x7C,0x66,0x66,0x66,0x66,0x00, // n
0x00,0x00,0x3C,0x66,0x66,0x66,0x3C,0x00, // o
0x00,0x00,0x6E,0x33,0x33,0x3E,0x30,0x78, // p 0x70
0x00,0x00,0x3B,0x66,0x66,0x3E,0x06,0x0F, // q
0x00,0x00,0x6E,0x3B,0x33,0x30,0x78,0x00, // r
0x00,0x00,0x3E,0x60,0x3C,0x06,0x7C,0x00, // s
0x08,0x18,0x3E,0x18,0x18,0x1A,0x0C,0x00, // t
0x00,0x00,0x66,0x66,0x66,0x66,0x3B,0x00, // u
0x00,0x00,0x66,0x66,0x66,0x3C,0x18,0x00, // v
0x00,0x00,0x63,0x6B,0x7F,0x7F,0x36,0x00, // w
0x00,0x00,0x63,0x36,0x1C,0x36,0x63,0x00, // x
0x00,0x00,0x66,0x66,0x66,0x3E,0x06,0x7C, // y
0x00,0x00,0x7E,0x4C,0x18,0x32,0x7E,0x00, // z
0x0E,0x18,0x18,0x70,0x18,0x18,0x0E,0x00, // {
0x0C,0x0C,0x0C,0x00,0x0C,0x0C,0x0C,0x00, // |
0x70,0x18,0x18,0x0E,0x18,0x18,0x70,0x00, // }
0x3B,0x6E,0x00,0x00,0x00,0x00,0x00,0x00, // ~
0x1C,0x36,0x36,0x1C,0x00,0x00,0x00,0x00}; // DEL

const unsigned char FONT8x16[97][16] = {

0x08,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00, // columns, rows, num_bytes_per_char
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00, // space 0x20
0x00,0x00,0x18,0x3C,0x3C,0x3C,0x18,0x18,0x18,0x00, 0x18,0x18,0x00,0x00,0x00,0x00, // !
0x00,0x63,0x63,0x63,0x22,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00, // "
0x00,0x00,0x00,0x36,0x36,0x7F,0x36,0x36,0x36,0x7F, 0x36,0x36,0x00,0x00,0x00,0x00, // #
0x0C,0x0C,0x3E,0x63,0x61,0x60,0x3E,0x03,0x03,0x43, 0x63,0x3E,0x0C,0x0C,0x00,0x00, // $
0x00,0x00,0x00,0x00,0x00,0x61,0x63,0x06,0x0C,0x18, 0x33,0x63,0x00,0x00,0x00,0x00, // %
0x00,0x00,0x00,0x1C,0x36,0x36,0x1C,0x3B,0x6E,0x66, 0x66,0x3B,0x00,0x00,0x00,0x00, // &
0x00,0x30,0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00, // '
0x00,0x00,0x0C,0x18,0x18,0x30,0x30,0x30,0x30,0x18, 0x18,0x0C,0x00,0x00,0x00,0x00, // (
0x00,0x00,0x18,0x0C,0x0C,0x06,0x06,0x06,0x06,0x0C, 0x0C,0x18,0x00,0x00,0x00,0x00, // )
0x00,0x00,0x00,0x00,0x42,0x66,0x3C,0xFF,0x3C,0x66, 0x42,0x00,0x00,0x00,0x00,0x00, // *
0x00,0x00,0x00,0x00,0x18,0x18,0x18,0xFF,0x18,0x18, 0x18,0x00,0x00,0x00,0x00,0x00, // +
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x18,0x18,0x18,0x30,0x00,0x00, // ,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00, // -
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x18,0x18,0x00,0x00,0x00,0x00, // .
0x00,0x00,0x01,0x03,0x07,0x0E,0x1C,0x38,0x70,0xE0, 0xC0,0x80,0x00,0x00,0x00,0x00, // / (forward slash)
0x00,0x00,0x3E,0x63,0x63,0x63,0x6B,0x6B,0x63,0x63, 0x63,0x3E,0x00,0x00,0x00,0x00, // 0 0x30
0x00,0x00,0x0C,0x1C,0x3C,0x0C,0x0C,0x0C,0x0C,0x0C, 0x0C,0x3F,0x00,0x00,0x00,0x00, // 1
0x00,0x00,0x3E,0x63,0x03,0x06,0x0C,0x18,0x30,0x61, 0x63,0x7F,0x00,0x00,0x00,0x00, // 2
0x00,0x00,0x3E,0x63,0x03,0x03,0x1E,0x03,0x03,0x03, 0x63,0x3E,0x00,0x00,0x00,0x00, // 3
0x00,0x00,0x06,0x0E,0x1E,0x36,0x66,0x66,0x7F,0x06, 0x06,0x0F,0x00,0x00,0x00,0x00, // 4
0x00,0x00,0x7F,0x60,0x60,0x60,0x7E,0x03,0x03,0x63, 0x73,0x3E,0x00,0x00,0x00,0x00, // 5
0x00,0x00,0x1C,0x30,0x60,0x60,0x7E,0x63,0x63,0x63, 0x63,0x3E,0x00,0x00,0x00,0x00, // 6
0x00,0x00,0x7F,0x63,0x03,0x06,0x06,0x0C,0x0C,0x18, 0x18,0x18,0x00,0x00,0x00,0x00, // 7
0x00,0x00,0x3E,0x63,0x63,0x63,0x3E,0x63,0x63,0x63, 0x63,0x3E,0x00,0x00,0x00,0x00, // 8
0x00,0x00,0x3E,0x63,0x63,0x63,0x63,0x3F,0x03,0x03, 0x06,0x3C,0x00,0x00,0x00,0x00, // 9
0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00, 0x18,0x18,0x00,0x00,0x00,0x00, // :
0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00, 0x18,0x18,0x18,0x30,0x00,0x00, // ;
0x00,0x00,0x00,0x06,0x0C,0x18,0x30,0x60,0x30,0x18, 0x0C,0x06,0x00,0x00,0x00,0x00, // <
0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x00,0x7E, 0x00,0x00,0x00,0x00,0x00,0x00, // =
0x00,0x00,0x00,0x60,0x30,0x18,0x0C,0x06,0x0C,0x18, 0x30,0x60,0x00,0x00,0x00,0x00, // >
0x00,0x00,0x3E,0x63,0x63,0x06,0x0C,0x0C,0x0C,0x00, 0x0C,0x0C,0x00,0x00,0x00,0x00, // ?
0x00,0x00,0x3E,0x63,0x63,0x6F,0x6B,0x6B,0x6E,0x60, 0x60,0x3E,0x00,0x00,0x00,0x00, // @ 0x40
0x00,0x00,0x08,0x1C,0x36,0x63,0x63,0x63,0x7F,0x63, 0x63,0x63,0x00,0x00,0x00,0x00, // A
0x00,0x00,0x7E,0x33,0x33,0x33,0x3E,0x33,0x33,0x33, 0x33,0x7E,0x00,0x00,0x00,0x00, // B
0x00,0x00,0x1E,0x33,0x61,0x60,0x60,0x60,0x60,0x61, 0x33,0x1E,0x00,0x00,0x00,0x00, // C
0x00,0x00,0x7C,0x36,0x33,0x33,0x33,0x33,0x33,0x33, 0x36,0x7C,0x00,0x00,0x00,0x00, // D
0x00,0x00,0x7F,0x33,0x31,0x34,0x3C,0x34,0x30,0x31, 0x33,0x7F,0x00,0x00,0x00,0x00, // E
0x00,0x00,0x7F,0x33,0x31,0x34,0x3C,0x34,0x30,0x30, 0x30,0x78,0x00,0x00,0x00,0x00, // F
0x00,0x00,0x1E,0x33,0x61,0x60,0x60,0x6F,0x63,0x63, 0x37,0x1D,0x00,0x00,0x00,0x00, // G
0x00,0x00,0x63,0x63,0x63,0x63,0x7F,0x63,0x63,0x63, 0x63,0x63,0x00,0x00,0x00,0x00, // H
0x00,0x00,0x3C,0x18,0x18,0x18,0x18,0x18,0x18,0x18, 0x18,0x3C,0x00,0x00,0x00,0x00, // I
0x00,0x00,0x0F,0x06,0x06,0x06,0x06,0x06,0x06,0x66, 0x66,0x3C,0x00,0x00,0x00,0x00, // J
0x00,0x00,0x73,0x33,0x36,0x36,0x3C,0x36,0x36,0x33, 0x33,0x73,0x00,0x00,0x00,0x00, // K
0x00,0x00,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x31, 0x33,0x7F,0x00,0x00,0x00,0x00, // L
0x00,0x00,0x63,0x77,0x7F,0x6B,0x63,0x63,0x63,0x63, 0x63,0x63,0x00,0x00,0x00,0x00, // M
0x00,0x00,0x63,0x63,0x73,0x7B,0x7F,0x6F,0x67,0x63, 0x63,0x63,0x00,0x00,0x00,0x00, // N
0x00,0x00,0x1C,0x36,0x63,0x63,0x63,0x63,0x63,0x63, 0x36,0x1C,0x00,0x00,0x00,0x00, // O
0x00,0x00,0x7E,0x33,0x33,0x33,0x3E,0x30,0x30,0x30, 0x30,0x78,0x00,0x00,0x00,0x00, // P 0x50
0x00,0x00,0x3E,0x63,0x63,0x63,0x63,0x63,0x63,0x6B, 0x6F,0x3E,0x06,0x07,0x00,0x00, // Q
0x00,0x00,0x7E,0x33,0x33,0x33,0x3E,0x36,0x36,0x33, 0x33,0x73,0x00,0x00,0x00,0x00, // R
0x00,0x00,0x3E,0x63,0x63,0x30,0x1C,0x06,0x03,0x63, 0x63,0x3E,0x00,0x00,0x00,0x00, // S
0x00,0x00,0xFF,0xDB,0x99,0x18,0x18,0x18,0x18,0x18, 0x18,0x3C,0x00,0x00,0x00,0x00, // T
0x00,0x00,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63, 0x63,0x3E,0x00,0x00,0x00,0x00, // U
0x00,0x00,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x36, 0x1C,0x08,0x00,0x00,0x00,0x00, // V
0x00,0x00,0x63,0x63,0x63,0x63,0x63,0x6B,0x6B,0x7F, 0x36,0x36,0x00,0x00,0x00,0x00, // W
0x00,0x00,0xC3,0xC3,0x66,0x3C,0x18,0x18,0x3C,0x66, 0xC3,0xC3,0x00,0x00,0x00,0x00, // X
0x00,0x00,0xC3,0xC3,0xC3,0x66,0x3C,0x18,0x18,0x18, 0x18,0x3C,0x00,0x00,0x00,0x00, // Y
0x00,0x00,0x7F,0x63,0x43,0x06,0x0C,0x18,0x30,0x61, 0x63,0x7F,0x00,0x00,0x00,0x00, // Z
0x00,0x00,0x3C,0x30,0x30,0x30,0x30,0x30,0x30,0x30, 0x30,0x3C,0x00,0x00,0x00,0x00, // [
0x00,0x00,0x80,0xC0,0xE0,0x70,0x38,0x1C,0x0E,0x07, 0x03,0x01,0x00,0x00,0x00,0x00, // \ (back slash)
0x00,0x00,0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C, 0x0C,0x3C,0x00,0x00,0x00,0x00, // ]
0x08,0x1C,0x36,0x63,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00, // ^
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xFF,0x00,0x00,0x00, // _
0x18,0x18,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00, // ` 0x60
0x00,0x00,0x00,0x00,0x00,0x3C,0x46,0x06,0x3E,0x66, 0x66,0x3B,0x00,0x00,0x00,0x00, // a
0x00,0x00,0x70,0x30,0x30,0x3C,0x36,0x33,0x33,0x33, 0x33,0x6E,0x00,0x00,0x00,0x00, // b
0x00,0x00,0x00,0x00,0x00,0x3E,0x63,0x60,0x60,0x60, 0x63,0x3E,0x00,0x00,0x00,0x00, // c
0x00,0x00,0x0E,0x06,0x06,0x1E,0x36,0x66,0x66,0x66, 0x66,0x3B,0x00,0x00,0x00,0x00, // d
0x00,0x00,0x00,0x00,0x00,0x3E,0x63,0x63,0x7E,0x60, 0x63,0x3E,0x00,0x00,0x00,0x00, // e
0x00,0x00,0x1C,0x36,0x32,0x30,0x7C,0x30,0x30,0x30, 0x30,0x78,0x00,0x00,0x00,0x00, // f
0x00,0x00,0x00,0x00,0x00,0x3B,0x66,0x66,0x66,0x66, 0x3E,0x06,0x66,0x3C,0x00,0x00, // g
0x00,0x00,0x70,0x30,0x30,0x36,0x3B,0x33,0x33,0x33, 0x33,0x73,0x00,0x00,0x00,0x00, // h
0x00,0x00,0x0C,0x0C,0x00,0x1C,0x0C,0x0C,0x0C,0x0C, 0x0C,0x1E,0x00,0x00,0x00,0x00, // i
0x00,0x00,0x06,0x06,0x00,0x0E,0x06,0x06,0x06,0x06, 0x06,0x66,0x66,0x3C,0x00,0x00, // j
0x00,0x00,0x70,0x30,0x30,0x33,0x33,0x36,0x3C,0x36, 0x33,0x73,0x00,0x00,0x00,0x00, // k
0x00,0x00,0x1C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C, 0x0C,0x1E,0x00,0x00,0x00,0x00, // l
0x00,0x00,0x00,0x00,0x00,0x6E,0x7F,0x6B,0x6B,0x6B, 0x6B,0x6B,0x00,0x00,0x00,0x00, // m
0x00,0x00,0x00,0x00,0x00,0x6E,0x33,0x33,0x33,0x33, 0x33,0x33,0x00,0x00,0x00,0x00, // n
0x00,0x00,0x00,0x00,0x00,0x3E,0x63,0x63,0x63,0x63, 0x63,0x3E,0x00,0x00,0x00,0x00, // o
0x00,0x00,0x00,0x00,0x00,0x6E,0x33,0x33,0x33,0x33, 0x3E,0x30,0x30,0x78,0x00,0x00, // p 0x70
0x00,0x00,0x00,0x00,0x00,0x3B,0x66,0x66,0x66,0x66, 0x3E,0x06,0x06,0x0F,0x00,0x00, // q
0x00,0x00,0x00,0x00,0x00,0x6E,0x3B,0x33,0x30,0x30, 0x30,0x78,0x00,0x00,0x00,0x00, // r
0x00,0x00,0x00,0x00,0x00,0x3E,0x63,0x38,0x0E,0x03, 0x63,0x3E,0x00,0x00,0x00,0x00, // s
0x00,0x00,0x08,0x18,0x18,0x7E,0x18,0x18,0x18,0x18, 0x1B,0x0E,0x00,0x00,0x00,0x00, // t
0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66, 0x66,0x3B,0x00,0x00,0x00,0x00, // u
0x00,0x00,0x00,0x00,0x00,0x63,0x63,0x36,0x36,0x1C, 0x1C,0x08,0x00,0x00,0x00,0x00, // v
0x00,0x00,0x00,0x00,0x00,0x63,0x63,0x63,0x6B,0x6B, 0x7F,0x36,0x00,0x00,0x00,0x00, // w
0x00,0x00,0x00,0x00,0x00,0x63,0x36,0x1C,0x1C,0x1C, 0x36,0x63,0x00,0x00,0x00,0x00, // x
0x00,0x00,0x00,0x00,0x00,0x63,0x63,0x63,0x63,0x63, 0x3F,0x03,0x06,0x3C,0x00,0x00, // y
0x00,0x00,0x00,0x00,0x00,0x7F,0x66,0x0C,0x18,0x30, 0x63,0x7F,0x00,0x00,0x00,0x00, // z
0x00,0x00,0x0E,0x18,0x18,0x18,0x70,0x18,0x18,0x18, 0x18,0x0E,0x00,0x00,0x00,0x00, // {
0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x00,0x18,0x18, 0x18,0x18,0x18,0x00,0x00,0x00, // |
0x00,0x00,0x70,0x18,0x18,0x18,0x0E,0x18,0x18,0x18, 0x18,0x70,0x00,0x00,0x00,0x00, // }
0x00,0x00,0x3B,0x6E,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00, // ~
0x00,0x70,0xD8,0xD8,0x70,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00}; // DEL
unsigned char count;
unsigned int dat_count,somau;
unsigned int value;
//================ham chinh==========================
int main(void)
{

//******************FUNCTION for LCD*****************************
// Initialize SPI interface to LCD
IO0DIR|= CS|BL|RS|CLK|SDA;//SET OUTPUT PIN
IO0SET|=CS|BL|RS|CLK|SDA;
IO0CLR|= CLK|SDA;//int SPI
IO0DIR&=~(1<<7);//set inputpin
InitLcd();
LCDSetRect(1, 1, 132, 132, FILL,BLACK );
LCDPutStr("HELLO",10,1,1,RED,BLACK);
LCDPutStr("Huynh Bao",1,1,1,RED,BLACK);
LCDPutStr("PCF8833",120,1,1,RED,BLACK);
while(1);

}
//==========================END OF MAIN FUNCTION==============================
//-------------read pin function-------------
int readpinport0(unsigned int portpin)
{
unsigned long p;
IODIR0&=~(1<<portpin); //set input
p=IOPIN0; //doc trang thai port 0
p=(p&(1<<portpin))>>portpin;// kiem tra bit p0.5
return (p) ;
}
//----------------write pin------------------
//out
int outpinport0(unsigned int portpin,unsigned int val)
{
IODIR0|=1<<portpin; //set output
if (val)
IOSET0|=1<<portpin;
else
IOCLR0|=1<<portpin;
return (1) ;
}
//=============spi control function 9 bit num and MSB first ==================
void Send_Spi(unsigned int data)
{
unsigned char bitnum=9;
unsigned int MSB;
unsigned char cho=5;
while(bitnum--)
{
MSB=(data>>bitnum)&0x0001;

if (MSB)
IO0SET|=SDA;
else
IO0CLR|=SDA;

IO0SET|=CLK;
// while(cho--); //delay
IO0CLR|=CLK;
}
}

//================Write Command============================
void WriteSpiCommand(unsigned int data)
{
/* unsigned int com;
LCD_CS_LOW;
Delay(1);
com= data & ~0x0100;// For Command MSB "LOW"
S0SPDR = com;
while((S0SPSR & 0x80)!= 0x80){;;} // Wait SPIF = 1 (SPI Send Complete)
Delay(1);
LCD_CS_HIGH;*/
LCD_CS_LOW;
Send_Spi(data & ~0x0100);
LCD_CS_HIGH;

}
//=============end function================

//write data to LCD
void WriteSpiData(unsigned int data)
{
/* LCD_CS_LOW;
Delay(1);
S0SPDR = data | 0x0100;// For Data MSB must "HIGH"
while((S0SPSR & 0x80)!= 0x80){;;} // Wait SPIF = 1 (SPI Send Complete)
Delay(1);
LCD_CS_HIGH;*/
LCD_CS_LOW;
Send_Spi(data | 0x0100);
LCD_CS_HIGH;
}
//================end function=============

//LCD blink
// Inputs: state - 1 = backlight on
// 2 = backlight off
void Backlight(unsigned char state)
{
if(state==1)
IOSET0 = BL; //on
else
IOCLR0 = BL; //off
}
//=====================end function========

//==================Int LCD===================

void InitLcd(void)
{ // Hardware reset
LCD_RESET_LOW;
Delay(10);
LCD_RESET_HIGH;
Delay(10);
WriteSpiCommand(SWRESET);
Delay(10);
// Sleep out (command 0x11)

WriteSpiCommand(SLEEPOUT);
// WriteSpiCommand(BSTRON);// booster vol on
Delay(10);

// Inversion on (command 0x20)
WriteSpiCommand(INVON); // seems to be required for this controller

// Color Interface Pixel Format (command 0x3A)
WriteSpiCommand(COLMOD);
WriteSpiData(0x03); // 0x03 = 12 bits-per-pixel

// Memory access controler (command 0x36)
WriteSpiCommand(MADCTL);
WriteSpiData(0xC8); // 0xC0 = mirror x and y, reverse rgb

// Write contrast (command 0x25)
WriteSpiCommand(SETCON);
WriteSpiData(0x30); // contrast 0x30
Delay(10);

// Display On (command 0x29)
WriteSpiCommand(DISPON);
Delay(10);

}
//======================end funtion===============


void LCDSetXY(int x, int y) {

// Row address set (command 0x2B)
WriteSpiCommand(PASET);
WriteSpiData(x);
WriteSpiData(x);

// Column address set (command 0x2A)
WriteSpiCommand(CASET);
WriteSpiData(y);
WriteSpiData(y);
}

void LCDSetPixel(int x, int y, int color) {

LCDSetXY(x, y);
WriteSpiCommand(RAMWR);
WriteSpiData((unsigned char)((color >> 4) & 0xFFFF));
WriteSpiData((unsigned char)(((color & 0x0F) << 4) | 0x00));
WriteSpiCommand(NOP);
}

void LCDSetLine(int x0, int y0, int x1, int y1, int color) {

int dy = y1 - y0;
int dx = x1 - x0;
int stepx, stepy;

if (dy < 0) { dy = -dy; stepy = -1; } else { stepy = 1; }
if (dx < 0) { dx = -dx; stepx = -1; } else { stepx = 1; }
dy <<= 1; // dy is now 2*dy
dx <<= 1; // dx is now 2*dx

LCDSetPixel(x0, y0, color);
if (dx > dy)
{
int fraction = dy - (dx >> 1); // same as 2*dy - dx
while (x0 != x1)
{
if (fraction >= 0)
{
y0 += stepy;
fraction -= dx; // same as fraction -= 2*dx
}
x0 += stepx;
fraction += dy; // same as fraction -= 2*dy
LCDSetPixel(x0, y0, color);
}
}
else
{
int fraction = dx - (dy >> 1);
while (y0 != y1)
{
if (fraction >= 0)
{
x0 += stepx;
fraction -= dy;
}
y0 += stepy;
fraction += dx;
LCDSetPixel(x0, y0, color);
}
}
}

void LCDSetRect(int x0, int y0, int x1, int y1, unsigned char fill, int color)
{
int xmin, xmax, ymin, ymax;
int i;

// check if the rectangle is to be filled
if (fill == FILL)
{
xmin = (x0 <= x1) ? x0 : x1;
xmax = (x0 > x1) ? x0 : x1;
ymin = (y0 <= y1) ? y0 : y1;
ymax = (y0 > y1) ? y0 : y1;
WriteSpiCommand(PASET);
WriteSpiData(xmin);
WriteSpiData(xmax);
WriteSpiCommand(CASET);
WriteSpiData(ymin);
WriteSpiData(ymax);
// WRITE MEMORY
WriteSpiCommand(RAMWR);
// loop on total number of pixels / 2
for (i = 0; i < ((((xmax - xmin + 1) * (ymax - ymin + 1)) / 2) + 1); i++)
{
// use the color value to output three data bytes covering two pixels
WriteSpiData((color >> 4) & 0xFF);
WriteSpiData(((color & 0xF) << 4) | ((color >> 8) & 0xF));
WriteSpiData(color & 0xFF);
}

}
else
{

// best way to draw un unfilled rectangle is to draw four lines
LCDSetLine(x0, y0, x1, y0, color);
LCDSetLine(x0, y1, x1, y1, color);
LCDSetLine(x0, y0, x0, y1, color);
LCDSetLine(x1, y0, x1, y1, color);
}
}
void LCDSetCircle(int x0, int y0, int radius, int color)
{
int f = 1 - radius;
int ddF_x = 0;
int ddF_y = -2 * radius;
int x = 0;
int y = radius;

LCDSetPixel(x0, y0 + radius, color);
LCDSetPixel(x0, y0 - radius, color);
LCDSetPixel(x0 + radius, y0, color);
LCDSetPixel(x0 - radius, y0, color);

while(x < y)
{
if(f >= 0)
{
y--;
ddF_y += 2;
f += ddF_y;
}
x++;
ddF_x += 2;
f += ddF_x + 1;
LCDSetPixel(x0 + x, y0 + y, color);
LCDSetPixel(x0 - x, y0 + y, color);
LCDSetPixel(x0 + x, y0 - y, color);
LCDSetPixel(x0 - x, y0 - y, color);
LCDSetPixel(x0 + y, y0 + x, color);
LCDSetPixel(x0 - y, y0 + x, color);
LCDSetPixel(x0 + y, y0 - x, color);
LCDSetPixel(x0 - y, y0 - x, color);
}
}

void LCDPutChar(char c, int x, int y, int size, int fColor, int bColor) {
int i,j;
unsigned int nCols;
unsigned int nRows;
unsigned int nBytes;
unsigned char PixelRow;
unsigned char Mask;
unsigned int Word0;
unsigned int Word1;
unsigned char *pFont;
unsigned char *pChar;
unsigned char *FontTable[] = {(unsigned char *)FONT6x8, (unsigned char *)FONT8x8, (unsigned char *)FONT8x16};

// get pointer to the beginning of the selected font table
pFont = (unsigned char *)FontTable[size];

// get the nColumns, nRows and nBytes
nCols = *pFont;
nRows = *(pFont + 1);
nBytes = *(pFont + 2);

// get pointer to the last byte of the desired character
pChar = pFont + (nBytes * (c - 0x1F)) + nBytes - 1;

// Row address set (command 0x2B)
WriteSpiCommand(PASET);
WriteSpiData(x);
WriteSpiData(x + nRows - 1);

// Column address set (command 0x2A)
WriteSpiCommand(CASET);
WriteSpiData(y);
WriteSpiData(y + nCols - 1);

// WRITE MEMORY
WriteSpiCommand(RAMWR);

// loop on each row, working backwards from the bottom to the top
for (i = nRows - 1; i >= 0; i--)
{

// copy pixel row from font table and then decrement row
PixelRow = *pChar--;

// loop on each pixel in the row (left to right)
// Note: we do two pixels each loop
Mask = 0x80;
for (j = 0; j < nCols; j += 2) {

// if pixel bit set, use foreground color; else use the background color
// now get the pixel color for two successive pixels
if ((PixelRow & Mask) == 0)
Word0 = bColor;
else
Word0 = fColor;
Mask = Mask >> 1;
if ((PixelRow & Mask) == 0)
Word1 = bColor;
else
Word1 = fColor;
Mask = Mask >> 1;

// use this information to output three data bytes
WriteSpiData((Word0 >> 4) & 0xFF);
WriteSpiData(((Word0 & 0xF) << 4) | ((Word1 >> 8) & 0xF));
WriteSpiData(Word1 & 0xFF);
}
}
// terminate the Write Memory command
WriteSpiCommand(NOP);
}
void LCDPutStr(char *pString, int x, int y, int Size, int fColor, int bColor)
{

// loop until null-terminator is seen
while (*pString != 0x00)
{

// draw the character
LCDPutChar(*pString++, x, y, Size, fColor, bColor);

// advance the y position
if (Size == SMALL)
y = y + 6;
else if (Size == MEDIUM)
y = y + 8;
else
y = y + 8;

// bail out if y exceeds 131
if (y > 131)

break;
}
}
//****************LCD write Num***************************
void LCDWriteNum(int num, int x, int y, int size, int fcolor, int bcolor)
{
unsigned char dv,chuc,tram;
if (num>=0)
{
LCDPutChar(' ',x,y,size,fcolor,bcolor);
}
else
{
LCDPutChar('-',x,y,size,fcolor,bcolor);
num=-num;
}
dv=num%10;
chuc=((num-dv)/10)%10;
tram=(num-dv-10*chuc)/100;
LCDPutChar(tram+48,x,y+8,size,fcolor,bcolor);
LCDPutChar('.',x,y+16,size,fcolor,bcolor);
LCDPutChar(chuc+48,x,y+24,size,fcolor,bcolor);
LCDPutChar(dv+48,x,y+32,size,fcolor,bcolor);

}
//========Write huong chuyen dong====================
void LCD_Display_Arg(int x1, int y1, float x2, float y2, int color)
{
int xdp,ydp;
//rescale -1.2g 1.2g full scale
xdp=floor(0.30*x2+60);//for -2g 2g thi 20x+40
ydp=floor(0.30*y2+60);
LCDSetLine(x1,y1,xdp,ydp,color) ;
}
void LCDWrite130x130bmp(void) {

long j; // loop counter
// Memory access controler (command 0x36)
WriteSpiCommand(MADCTL);
WriteSpiData(0x48); // no mirror Y (temporary to satisfy Olimex bmptoarray utility)
// Display OFF
WriteSpiCommand(DISPOFF);
// Column address set (command 0x2A)
WriteSpiCommand(CASET);
WriteSpiData(0);
WriteSpiData(131);
// Page address set (command 0x2B)
WriteSpiCommand(PASET);
WriteSpiData(0);
WriteSpiData(131);
// WRITE MEMORY
WriteSpiCommand(RAMWR);

for(j = 0; j < sizeof(bmp); j++) {
WriteSpiData(bmp[j]);
}
// Memory access controler (command 0x36)
WriteSpiCommand(MADCTL);
WriteSpiData(0xC8); // restore to (mirror x and y, reverse rgb)
// Display On
WriteSpiCommand(DISPON);
}
void Delay(unsigned long int count1)
{
unsigned long int i,k;
k=count1*5200;
for(i=0;i<k;i++); // Loop Decrease Counter
}

phucthinhel
22-02-09, 18:23
Bạn có thể thay thế phần chip của PHILIP thành EPSON để điều khiển LCD dòng chip S1D15G00 :
Đây là phần khai báo :
//************************************************** ******************
//
// EPSON Controller Definitions
//
//************************************************** ******************
#define DISON 0xAF
#define DISOFF 0xAE
#define DISNOR 0xA6
#define DISINV 0xA7
#define SLPIN 0x95
#define SLPOUT 0x94
#define COMSCN 0xBB
#define DISCTL 0xCA
#define PASET 0x75
#define CASET 0x15
#define DATCTL 0xBC
#define RGBSET8 0xCE
#define RAMWR 0x5C
#define RAMRD 0x5D
#define PTLIN 0xA8
#define PTLOUT 0xA9
#define RMWIN 0xE0
#define RMWOUT 0xEE
#define ASCSET 0xAA
#define SCSTART 0xAB
#define OSCON 0xD1
#define OSCOFF 0xD2
#define PWRCTR 0x20
#define VOLCTR 0x81
#define VOLUP 0xD6
#define VOLDOWN 0xD7
#define TMPGRD 0x82
#define EPCTIN 0xCD
#define EPCOUT 0xCC
#define EPMWR 0xFC
#define EPMRD 0xFD
#define EPSRRD1 0x7C
#define EPSRRD2 0x7D
#define NOP 0x25

phucthinhel
22-02-09, 18:39
À chú ý trên thị trường hiện có xuất hiện nhìu màn hình giống nhau . Các bạn mua nên chú ý loại philip hiện trong sài gòn còn tất ít điểm bán . Mình củng đang làm một cái module LCD như thằng sparkfun không hoàn toàn giống như vậy . Mình đang test thừ và đã chạy tốt nhưng mình muốn thử lại cho thiệt kỹ trước như bán ra .

ktuan22
23-02-09, 11:37
bác nào co doan code nao ve lap trinh cho LPC 2378 de dieu khien LCD graphic 32x64.viet game cho LCD nay.co doan code nao tuong tu vay cung duoc de toi biet de lap trinh.cam on nha

hbaocr
23-02-09, 19:26
Graphic loại nào vậy bạn có thể cho mình biết ko?Biết đâu mình có??? heee nhưng ma code cua minh chay tren 2148 thui :))

ga_con
23-02-09, 20:37
ủa bác hbaocr ơi,mấy cái thanh ghi lệnh của con LPC 2148 bác tìm ở đâu vậy? em thấy trên datasheet của nó đâu có liệt kê ra đâu,vậy nếu muốn lập trình thì làm sao hả bác?

hbaocr
24-02-09, 11:09
trong cai user manual của nó có ghi đó; nó nói tường tận luôn; từ địa chỉ thanh ghi;tên thanh ghi;chức năng của thanh ghi cho tới tác dụng của từng Bit trong thanh ghi đó luôn!
http://www.standardics.nxp.com/support/documents/microcontrollers/pdf/user.manual.lpc2141.lpc2142.lpc2144.lpc2146.lpc214 8.pdf

uit_ktmt
04-04-09, 23:29
Xin lỗi các cao thủ cho em hỏi một câu? Nếu không đúng chỗ thì xin các anh lượng thứ. Em đang làm một cái KIT ARM bằng LCP2138. Các anh, các bạn nào có biết chỗ bán ARM LPC2138 hay LPC2148 ở thành phố Hồ Chí Minh thì cho em biết với. Em đi tìm hoài, đi muốn nát Nhật Tảo mà không thấy chỗ nào bán. Cần gấp lắm, ai có kinh nghệm chỉ cho em với!

tallht
05-04-09, 12:35
bạn vào trang nhungviet.com hay hethongnhung.com mà xem!

kamejoko80
13-04-09, 23:32
Xin lỗi các cao thủ cho em hỏi một câu? Nếu không đúng chỗ thì xin các anh lượng thứ. Em đang làm một cái KIT ARM bằng LCP2138. Các anh, các bạn nào có biết chỗ bán ARM LPC2138 hay LPC2148 ở thành phố Hồ Chí Minh thì cho em biết với. Em đi tìm hoài, đi muốn nát Nhật Tảo mà không thấy chỗ nào bán. Cần gấp lắm, ai có kinh nghệm chỉ cho em với!

Bạn cần bao nhiêu con! Thông cảm đợi hàng về nhé bạn, khoảng sau 25/04/2009 nhé.

gacondihoc
20-04-09, 15:23
Xin duoc nho cac cao thu chi giao !
Em mơi mua được kít NV_DB2148 của Vietnhung. Khi em test gửi nhận dữ liệu qua 2 cổng UART0/1 đều ngon. Nhưng khi em cắm cái cổng UART này với thằng modem GSM/GPRS thì nó không thể truyền lên được nữa. Em đã thử mọi cách mà không biết tại sao? Nhờ các đại cao thủ ra tay cứu giúp. Vi em chỉ còn 1 tuần để làm cái này.Hịc

dinhkhanh06
20-04-09, 20:11
Xin duoc nho cac cao thu chi giao !
Em mơi mua được kít NV_DB2148 của Vietnhung. Khi em test gửi nhận dữ liệu qua 2 cổng UART0/1 đều ngon. Nhưng khi em cắm cái cổng UART này với thằng modem GSM/GPRS thì nó không thể truyền lên được nữa. Em đã thử mọi cách mà không biết tại sao? Nhờ các đại cao thủ ra tay cứu giúp. Vi em chỉ còn 1 tuần để làm cái này.Hịc

có thể lí do là Modem của bạn sử dụng Full Uart trong khi sử dụng LPC2148 thì chỉ là Half Uart ko có các chức năng như RTS, RSR

gacondihoc
21-04-09, 08:27
Da cảm ơn anh dinhkhanh06 đã quan tâm đến mục của em ạ. Nhưng em đã thử dùng chỉ cần 4 dây là 2,3,4,5 (Tương ứng là Tx, Rx,DTR, GND ) em truyền từ máy tính xuống bằng sdiags là điều khiển OK hết ạ.
Các Đại Cao Thủ đã từng gặp trường hợp này chưa giúp em với !

dinhkhanh06
21-04-09, 08:34
Da cảm ơn anh dinhkhanh06 đã quan tâm đến mục của em ạ. Nhưng em đã thử dùng chỉ cần 4 dây là 2,3,4,5 (Tương ứng là Tx, Rx,DTR, GND ) em truyền từ máy tính xuống bằng sdiags là điều khiển OK hết ạ.
Các Đại Cao Thủ đã từng gặp trường hợp này chưa giúp em với !
Máy tính có thể truyền Half Uart được mà, thậm chí ko cần DTR nó vẫn truyền được

cat52
21-04-09, 08:57
Da cảm ơn anh dinhkhanh06 đã quan tâm đến mục của em ạ. Nhưng em đã thử dùng chỉ cần 4 dây là 2,3,4,5 (Tương ứng là Tx, Rx,DTR, GND ) em truyền từ máy tính xuống bằng sdiags là điều khiển OK hết ạ.
Các Đại Cao Thủ đã từng gặp trường hợp này chưa giúp em với !

Để modem GPRS hoạt động với 3 dây (Tx, Rx, GND), em nối GPRS modem vào RS232 của máy tính rồi đánh các lệnh sau:

AT&D0 (không dùng DTR)
AT&K0 ( khônng dùng flow control)
AT&W0 ( giữ set up này trong profile 0)
AT&Y0 ( dùng profile 0 khi khởi động modem)

Sau đó em nối GPRS modem vào LPC2148 UART0 (Tx, Rx) hay full UART1 sẽ chạy được hết.

dinhkhanh06
21-04-09, 09:00
vậy bạn có thể upload Code và datasheet của modem bạn dùng, hi vọng anh em có thể giúp được

gacondihoc
21-04-09, 10:41
Dạ Anh oi em dung thang modem GSM nay cua thang wipmo dung toan bang lenh OPENAT no chi cung cap cac tap lenh de ket noi thoi a. Khong co so do Anh a. Em post so do ket noi cua MAX232 ket noi voi LPC2148 len nho Cac Dai Su ra tay cuu giup. Em cung da lam giong nhu Anh CAT52 nhung chi duoc khi truyen tu may tinh toi Modem va tu kit NV_DB2148 voi PC còn khi em ket noi từ KIT với MODEM là chịu thua luôn. Hichttp://etech.com.vn/lpc2148.jpgfile:///C:/Documents%20and%20Settings/Administrator/Desktop/12334.JPG

hbaocr
21-04-09, 22:46
hee ; lỗi này mình cũng đã gặp rùi khi giao tiếp với GPS EM408 bằng cổng UART0 ; nói chung code cua bạn ko sai; chi có con này hơi khó tính chút xíu thui!cách khắc phục là dùng MAx3232 làm cầu
UART (LPC2148_TX)--->nối vòng qua max3232(tức là nối vào đầu TX(3v3) và ở đầu ra tuong ứng với đầu vào đó là TX(RS232_+-12V) nối vào RX(rs232+-12V) khác của MAx232 và nối dau ra tuong ung voi ngo do vào RX cua moderm GSM)
làm tuong tu với LPC2148 RX)

hi giải thích hơi lằng nhằng 1 chút; nhưng tóm lại là bạn cứ sử dụng mà như 1 cái buffer để nối giữa LPC2148 và thiết bị

lpc2148-->max232--->max232--->thiết bị

àh quên; nếu bạn dùng giao tiếp moderm thì fai set đúng nó mới chạy; nếu kết nối theo kieu moderm rồi mà không dùng theo kieu moderm mà dùng như uART bình thường thì nó cũng không chạy đâu!Nói tóm các vd chỉ chạy tốt khi chỉ nối các chân UART(TX va RX) với nhau; nối thêm mấy chân moderm nữa là khác liền!
cheer;

cat52
24-04-09, 17:48
gacondihoc cần kiểm soát lại những mạch liên lạc giữa modem và RS232:

1. Một số modem ghi trong tài liệu là chân Tx có nghĩa là nối vào Tx của RS232. Họ ghi tên theo tên của chân trong MCU. Nếu bạn nối Rx của MCU vào Tx của modem thì sẽ sai vì cả hai là ngõ vào. Tương tự cho Tx.

Nếu bạn có oscilloscope để coi tín hiệu là thấy liền.

2. Cần biết modem hoạt động ở điện thế nào, có cùng điện thế của LPC2148 không. Nếu một component chạy ở 3.3 V, component kia ở 5V thì bạn phải có level shifter (để đổi điện thế cho đúng ).

gacondihoc
08-05-09, 10:48
Vang Em cam on cac Anh rat nhieu a. Nho cac Anh Em cung da sua duoc loi nay roi a.

gacondihoc
08-05-09, 10:54
Nhờ các cao thủ chỉ giáo về việc giao tiếp giữa LPC 2148 với thể nhớ theo định dạng của FAT16/32. Vì hiện tại em đăng muốn ghi đọc dư liệu vào thẻ nhớ rồi khi cần có thể dùng đầu đọc thẻ qua máy tính để đọc dữ liệu. Bác nào đã làm rồi thì có thể chia sẻ với em được không ạ. Em cảm ơn các Bác rất nhiều ạ!

gacondihoc
11-05-09, 08:35
Em cũng đăng dùng thằng LCD của màn hình nokia 6610 nhưng khi sử dụng chương trình BmpToArray để chuyển một anh bmp sang đuôi *.h thì không dùng được. Có BẬC CAO NHÂN nào đã làm được xin chi giúp em với được không ạ.

dinhkhanh06
11-05-09, 09:14
Em cũng đăng dùng thằng LCD của màn hình nokia 6610 nhưng khi sử dụng chương trình BmpToArray để chuyển một anh bmp sang đuôi *.h thì không dùng được. Có BẬC CAO NHÂN nào đã làm được xin chi giúp em với được không ạ.

bạn dùng photoshop chuyển bức hình về độ phân giải 132x132 hoặc nhỏ hơn nữa rồi mới dùng được bmptoarray

gacondihoc
11-05-09, 13:32
da Em da dung shop de chuyen ve do phan giai 132x132 roi a. Nhung khi Browse dua den anh roi an vao Open ma cha thay cai gi ca.Em tim khắp mà chả thấy nó ơ đâu.Anh dùng rồi có thể chỉ cho em được không ạ!
Em cảm ơn Anh nhiều ạ

robotden
01-06-09, 16:33
nhập môn hỏi cái
em làm cái ví dụ nháy led cho port0 cua arm lpc2138 mà sao mô phỏng bằng proteus không thấy j.
ct của em:

#include <lpc213x.h>

void delay(unsigned long dem);

int main(void)
{

SCS=0x00; //chon che do GPIO slow cho P0
IODIR0=0xFFFFFFFF; //thiet dat DIR cho P0 la chan ra
IOSET0=0xFFFFFFFF;
while(1)
{
IOSET0=0xFFFFFFFF;
delay(6000000); //1s
IOCLR0=0xFFFFFFFF;
delay(6000000);
}


}

//ham delay
void delay(unsigned long dem)
{
while(dem>0){dem--;}
}

CCLK=60MHZ
PCLK=30MHZ

file mô phỏng: đính kèm

khi chạy mô phỏng thì ca port 0 không biết trạng thái j cả, hình như là bị treo

robotden
01-06-09, 16:35
mà cách tính toán thời gian của hàm delay như nào nhỉ pàkon?
thank

robotden
01-06-09, 16:45
có ai bán kit hoặc chip arm 2148 không vậy? giá sinh viên nha

hbaocr
01-06-09, 22:32
có ai bán kit hoặc chip arm 2148 không vậy? giá sinh viên nha

bạn wa ben nhungviet.com thu xem.ben do ban kit arm khaong 450K
hay sao do

robotden
02-06-09, 15:34
a hbaocr xem jum em chuong trinh nhay led ben tren voi.
em co doc duoc a noi trong vòng lặp delay đó, thì mỗi dem-- thì sẽ tốn 10uS,
và có công thức tính thời gian delay=10*số count + 15uS,
như vậy nếu số count=60000000 Tdelay= khỏang 60s, thế là sao hả a?

hbaocr
02-06-09, 17:20
hii; thuc ra mà nói cái cthuc tren chỉ là kinh nghiệm ước chừng thôi khi sai thach anh 12MHz va set PLL cho no hoạt động ở 60MHz! Bạn muốn chính xác thì sử dụng bộ RTC của nó; hoặc dùng counter của Timer cho chắc ăn! Còn nữa muốn bit delay do bao nheiu ms thì bạn sử dụng simulate của Kiel nó co sẵn thời gian chay cho từng lệnh đó căn cứ vào đó mà tính ra thời gian delay. nhu truong hop cua bạn thì nó chạy khoảng 0.6 s

http://i177.photobucket.com/albums/w237/hbaocr/delay.gif

robotden
03-06-09, 23:59
thank a nhìu nhìu!
a Bảo học BKHCM ạ, chắc a ở HCM nhỉ

hbaocr
04-06-09, 13:46
hii;mình ở HCM.DHBKHCM

robotden
05-06-09, 08:02
hii;mình ở HCM.DHBKHCM
hi, em cũng ở trogn đó, nhưng em học ở HN cơ. dạo này phải học ôn thi, mấy bữa về hè vào miền nam sẽ vọc LPC2148 xem có đư sức ko? hy vọng đuọc sự tận tình giúp đỡ của mọi người
thank

MicroDuyphi
08-06-09, 23:13
ko biết ở sài gòn mình có thể tìm mua con LPC2106 với số lượng khoảng 5 con thì mua ở đâu được?

hbaocr
08-06-09, 23:41
@duyphi
bác chuyển sang design với lpc2103 thì bán nhiều. chứ LPC2106 em kiếm mòn cả mắt ko có chú nào!LPC2106 có giá gần bằng với LPC2148 mà 2148 lại mạnh hơn hỗ trợ ngoại vi tốt hơn (có USB và nhiều IO) nên người ta chỉ nhập lpc2148 chứ chưa thấy ai nhập và bán lpc2106.

MicroDuyphi
10-06-09, 22:27
@duyphi
bác chuyển sang design với lpc2103 thì bán nhiều. chứ LPC2106 em kiếm mòn cả mắt ko có chú nào!LPC2106 có giá gần bằng với LPC2148 mà 2148 lại mạnh hơn hỗ trợ ngoại vi tốt hơn (có USB và nhiều IO) nên người ta chỉ nhập lpc2148 chứ chưa thấy ai nhập và bán lpc2106.

Cám ơn bảo nhiều lắm! Anh nghe mấy thằng em chỗ cty khen em quá trời, cũng nhờ đọc qua mấy bài của em viết mà anh làm ARM cũng khá nhanh, anh đang chơi LPC2103 khá nhiều, cty nó mua đến 1.000 con. Nhưng do quá trình làm code càng nhiều nên anh nhắm lên con LPC2106, nếu em nói vậy thì chuyển sang LPC2148 chơi cũng đc.

Anh đang có 1 cái kit lpc23 mấy mấy anh quên tuốt, mua ở MicroE gần hết 5 chai. Nhưng thấy nó phí quá, chưa cần nên định làm ở mức lpc2106 là đc.
Cám ơn Bảo lần nữa nhá!

gacondihoc
11-06-09, 11:34
Có bác nào đã sử dụng được 2 cổng UART của LPC2148 cùng lúc thành công chưa ạ. Em mất mấy ngày roài mà ko thể dùng được, em dùng ngắt cho 2 cổng 0, và 1 vậy mà dùng ko được chỉ được từng cổng một thôi, bác nào có kinh nghiệm chỉ giúp cho em với, chỉ có test một chương trình đơn giản lấy dữ liệu từ cổng 0 kiểm tra điều kiện rồi gửi ra cổng 1 mà chạy không theo ý muốn? Có bác nào đã từng làm giúp em với, có code thì càng tốt ạ!

nguyenhide
11-06-09, 13:04
Cho em hỏi:em có 1 thiết bị hỗ trợ giao tiếp RS232(điện thế ra của nó là 3v) vậy em có cắm trực tiếp nó vào Tx và Rx của LPC2148 được hay không?, hay phải thông qua con Max3232
Àh mà cho em hỏi thêm là có ai biết chỗ nào bán MAX3232 chỉ em với
(em mới làm quen ARM mong mấy anh thông cảm)

hbaocr
11-06-09, 15:47
Có bác nào đã sử dụng được 2 cổng UART của LPC2148 cùng lúc thành công chưa ạ. Em mất mấy ngày roài mà ko thể dùng được, em dùng ngắt cho 2 cổng 0, và 1 vậy mà dùng ko được chỉ được từng cổng một thôi, bác nào có kinh nghiệm chỉ giúp cho em với, chỉ có test một chương trình đơn giản lấy dữ liệu từ cổng 0 kiểm tra điều kiện rồi gửi ra cổng 1 mà chạy không theo ý muốn? Có bác nào đã từng làm giúp em với, có code thì càng tốt ạ!

UART1 --> GPS baud 4800
UART0---> PC(hay VDK khác) baud>4800 (11520 hay 19200 hay 38400)
dùng polling thui !
hi nó chạy đó đã làm rùi

hbaocr
11-06-09, 15:59
Cho em hỏi:em có 1 thiết bị hỗ trợ giao tiếp RS232(điện thế ra của nó là 3v) vậy em có cắm trực tiếp nó vào Tx và Rx của LPC2148 được hay không?, hay phải thông qua con Max3232
Àh mà cho em hỏi thêm là có ai biết chỗ nào bán MAX3232 chỉ em với
(em mới làm quen ARM mong mấy anh thông cảm)

hii không có vấn đề gì nối vào không cháy đâu bạn ơi;
mình đã nối vào cổng UART của lpc2148 một cái module RF giao tiếp UART 5V mà nó vẫn chạy ào ào có sao đâu. nếu GPS của bạn ra 2.8V cắm vô thì có nguy cơ không chạy phải buffer nhưng mà cũng khong cháy đâu! hii đừng cắm trực tiếp vô RS232 (+-12V ) của PC là dc! cứ sài thoải mái;

batbatdieu
11-06-09, 21:46
Xin chào . Mình đang dùng ARM7 cua atmel , nay cũng muốn chuyển qua ARM7 cua NXP , đang tìm con LPC2368 , có bạn nào biết chỗ mua không ?
Mình cũng vừa làm xong cái project với TFT GLCD 2.8" 240x320 pixels, chỉ mới làm phần hiển thị thôi , phần touch còn đang nghiên cứu :D
GLCD mình dùng giống LCD trong mấy cái điện thoại cảm ứng của TQ. Tuy nhiên màn hình này thì có hàng nghìn loại với nhiều loại IC Driver khác nhau , mình đã mua 3 cái màn hình từ các cửa hàng bán điện thoại di động nhưng đều ko dùng đc vì ko biết đc IC driver của nó . Thế là đành đặt mua mấy cái từ TQ về.

Source code va schematic có thể tham khảo ở đây :
http://www.thaieasyelec.net/index.php/display-module/breakout-board/breakout-board-2-8-inch-qvga-tft-lcd-with-touch-screen/p_3.html

Đây là hình demo mình làm với Atmal SAM7
http://i39.photobucket.com/albums/e181/lewanthanh/DSC00437.jpg

TMe
12-06-09, 08:48
Các ARM7 của NXP hiện mình đang đặt hàng dự kiến sẽ có các loại như sau:
LPC2103FBD48 –LQFP48
LPC2138FBD64/01 LQFP64
LPC2148FBD64 – LQFP64
Loại LPC2368 mà BBD hỏi mình cũng sẽ check giá và báo cho bạn nhé.

Các loại khác, bạn nào có nhu cầu cứ liên hệ với mình mình sẽ cập nhật và báo cho các bạn.

gacondihoc
12-06-09, 08:53
hi cam on Anh hBaocr nhung neu duoc Anh co the post len cho Anh Em tham khao duoc khong a! Neu duoc vay thi tot qua! Em cung dang rat can a!

gacondihoc
12-06-09, 08:56
UART1 --> GPS baud 4800
UART0---> PC(hay VDK khác) baud>4800 (11520 hay 19200 hay 38400)
dùng polling thui !
hi nó chạy đó đã làm rùi

hi cam on Anh hBaocr nhung neu duoc Anh co the post len cho Anh Em tham khao duoc khong a! Neu duoc vay thi tot qua! Em cung dang rat can a!

CBJ
12-06-09, 10:30
Nghe đồn có http://www.nhungviet.com/index.php?page=shop.browse&category_id=8&option=com_virtuemart&Itemid=9999 bán arm của nxp nhưng mình gọi cho họ mấy lần ko thấy ai bắt máy. Mà địa chỉ tìm mãi ko ra. Không biết có bác nào đã mua ic hay kit ở đây chưa nhỉ.

CBJ
12-06-09, 10:31
Các ARM7 của NXP hiện mình đang đặt hàng dự kiến sẽ có các loại như sau:
LPC2103FBD48 –LQFP48
LPC2138FBD64/01 LQFP64
LPC2148FBD64 – LQFP64
Loại LPC2368 mà BBD hỏi mình cũng sẽ check giá và báo cho bạn nhé.

Các loại khác, bạn nào có nhu cầu cứ liên hệ với mình mình sẽ cập nhật và báo cho các bạn.

Không biết bên bac Tme chừng nào có hàng nhỉ?

hbaocr
14-06-09, 08:33
hi cam on Anh hBaocr nhung neu duoc Anh co the post len cho Anh Em tham khao duoc khong a! Neu duoc vay thi tot qua! Em cung dang rat can a!

chuogn trinh nè ; bạn thông cảm lục lọi lai code trong cái PC cà khổ :-S hơi lâu bây giờ mới thấy!

Connection
15-06-09, 16:40
Có điều này thật tiếc vì có rất ít người biết, đó là NXP đã có văn phòng đại diện tại Việt Nam cách đây 3,4 năm rồi( từ hồi còn thuộc Philips nhá). Hiện tại có khoảng 20 nhân viên ở ViệtNam gồm software và hadware team. NXP đang tìm kiếm một đại lý( hoặc cửa hàng bán lẻ) tại cả Hà Nội và HCM để stock các loại linh kiện của NXP (only NXP), tất nhiên đại lý(cửa hàng) sẽ được rất nhiều benefit từ công ty (Nói ra để bác nào có điều kiện thì liên hệ với em). Khi đó anh em sẽ không phải mất công tìm kiếm mấy con hàng hiếm LPCxxx hay odder từ Digikey... mà ko phải ai cũng có điều kiện order.

Còn công ty bác nào kết linh kiện của NXP ( triac, zener, MCU...) mà số lượng ko phải 1,2 con thì có thể liên hệ bên em, đảm bảo giá rẻ hơn từ Digikey hay mouser... (vì bọn nó là distributor mà).
Công ty NXP :
Add: 119 Điện Biên Phủ Q1, HCM.
em :
mail: nguyen.van.xuan@nxp.com
Tel : 0903911109.

Thế nhé, chúc các bác vui.

Connection
15-06-09, 16:45
Nghe đồn có http://www.nhungviet.com/index.php?page=shop.browse&category_id=8&option=com_virtuemart&Itemid=9999 bán arm của nxp nhưng mình gọi cho họ mấy lần ko thấy ai bắt máy. Mà địa chỉ tìm mãi ko ra. Không biết có bác nào đã mua ic hay kit ở đây chưa nhỉ.

Của bạn đây nhá :

Công ty TNHH Thương Mại và Dịch Vụ Nhúng Việt

Địa chỉ : 60 Đường số 10 Phường 9 Gò Vấp, Tp. Hồ Chí Minh (Số cũ 56 Cây Trâm)

Điện thoại : (08) - 22065438

http://www.nhungviet.com/index.php?option=com_content&view=article&id=47&Itemid=57

hbaocr
15-06-09, 18:59
hii; chào Xuân đại ca; bấy lâu nay đại ca ẩn danh nghen.Hôm nay mới bit connection là anh.Hiii; Đại ca Xuân post nhiều Tutu cho anh em được nhờ với!

gacondihoc
16-06-09, 09:11
chuogn trinh nè ; bạn thông cảm lục lọi lai code trong cái PC cà khổ :-S hơi lâu bây giờ mới thấy!

Em cam on Anh hbaocr a, nhung em down ve thay thieu 2 file :stdlib.h, va string.h, em dung thu nhung khong duoc anh co the up len luon duoc ko a.
tien day em cung hoi Anh va moi nguoi mot chut ve khoi tao cong UART day la đoạn code của em khi khởi tạo UART0/1 nhưng nếu gọi như này thì cứ UART nào gọi sau thì sẽ sử dụng được còn cái UART còn lại không dùng được, nhờ các đại cao thủ chỉ giúp em với ạ:

DWORD UARTInit( DWORD PortNum,DWORD baudrate )
{
DWORD Fdiv;
if(PortNum ==0)
{
PINSEL0 = 0x00000005; /* cho phep sử dụng RxD0 and TxD0 */

U0LCR = 0x83; /* 8 bits, no Parity, 1 Stop bit */
Fdiv = ( Fpclk / 16 ) / baudrate ; /*baud rate */
U0DLM = Fdiv / 256;
U0DLL = Fdiv % 256;
U0LCR = 0x03; /* DLAB = 0 */
U0FCR = 0x07; /* Enable and reset TX and RX FIFO. */
if ( install_irq( UART0_INT, (void *)UART0Handler) == FALSE )
{
return (FALSE);
}

U0IER = IER_RBR | IER_THRE | IER_RLS; /* Cho phép ngắt UART0 */
return (TRUE);
}
else if (PortNum ==1)
{
PINSEL0 = 0x00050000; /* Enable RxD1 and TxD1*/
U1LCR = 0x83; /* 8 bits, no Parity, 1 Stop bit */
Fdiv = ( Fpclk / 16 ) / baudrate ; /*baud rate */
U1DLM = Fdiv / 256;
U1DLL = Fdiv % 256;
U1LCR = 0x03; /* DLAB = 0 */
U1FCR = 0x07; /* Enable and reset TX and RX FIFO. */

if ( install_irq( UART1_INT, (void *)UART1Handler ) == FALSE )
{
return (FALSE);
}

U1IER = IER_RBR | IER_THRE | IER_RLS; /* cho phép ngắt */
return (TRUE);
}
return( FALSE );

}

Connection
16-06-09, 10:30
Em cam on Anh hbaocr a, nhung em down ve thay thieu 2 file :stdlib.h, va string.h, em dung thu nhung khong duoc anh co the up len luon duoc ko a.
tien day em cung hoi Anh va moi nguoi mot chut ve khoi tao cong UART day la đoạn code của em khi khởi tạo UART0/1 nhưng nếu gọi như này thì cứ UART nào gọi sau thì sẽ sử dụng được còn cái UART còn lại không dùng được, nhờ các đại cao thủ chỉ giúp em với ạ:



Hai file này có sẵn trong thư viện rùi chứ nhỉ ? Có ai rảnh lai tự đi viết lại chúng đâu, mà viết lại chắc gì đã viết được :D

robotden
17-06-09, 00:25
chuogn trinh nè ; bạn thông cảm lục lọi lai code trong cái PC cà khổ :-S hơi lâu bây giờ mới thấy!

a ơi hbaocr ơi, em muốn làm modun thu nhận và giải mã gps,
con thu GPS tên j,datasheet ra sao,giá cả sao vậy anh
thêm các kết nối nưẫ. tài liệu gps, lập trình gps...
thank

MicroDuyphi
17-06-09, 02:01
Xin chào . Mình đang dùng ARM7 cua atmel , nay cũng muốn chuyển qua ARM7 cua NXP , đang tìm con LPC2368 , có bạn nào biết chỗ mua không ?
Mình cũng vừa làm xong cái project với TFT GLCD 2.8" 240x320 pixels, chỉ mới làm phần hiển thị thôi , phần touch còn đang nghiên cứu :D
GLCD mình dùng giống LCD trong mấy cái điện thoại cảm ứng của TQ. Tuy nhiên màn hình này thì có hàng nghìn loại với nhiều loại IC Driver khác nhau , mình đã mua 3 cái màn hình từ các cửa hàng bán điện thoại di động nhưng đều ko dùng đc vì ko biết đc IC driver của nó . Thế là đành đặt mua mấy cái từ TQ về.

Source code va schematic có thể tham khảo ở đây :
http://www.thaieasyelec.net/index.php/display-module/breakout-board/breakout-board-2-8-inch-qvga-tft-lcd-with-touch-screen/p_3.html

Đây là hình demo mình làm với Atmal SAM7
http://i39.photobucket.com/albums/e181/lewanthanh/DSC00437.jpg
Hi Thanh, Ko còn chơi PIC nữa ah?!
Nếu có dùng ARM LPC210x thì alo anh, anh tặng cho 1 vài em!
Hiện anh đang dùng mấy con này!

batbatdieu
17-06-09, 20:56
Hi Thanh, Ko còn chơi PIC nữa ah?!
Nếu có dùng ARM LPC210x thì alo anh, anh tặng cho 1 vài em!
Hiện anh đang dùng mấy con này!
Thanks anh Phi ,em đang làm việc với CAN nên tìm họ LPC2368.
Pic thì giờ ko chơi nữa , chỉ làm việc với nó thôi :D

kamejoko80
22-06-09, 17:24
Anh em bây giờ có vẻ chán PIC roài thì phải, sorry vì đã câu bài...
Welcome to ARM.

robotden
22-06-09, 18:56
@kamejoko80: kiếm được đồ nghề vọc LPC cũng khó quá bạn ạ
mạch nạp,board...
thank

kamejoko80
22-06-09, 23:41
@robotden: So với trước đây thì bây giờ ARM không còn khó nữa bạn ah, K tin rằng trong vòng 1-2 năm nữa ARM sẽ là dòng VĐK được sử dụng rộng rãi ở VN.

Hiện nay chíp của NXP có giá cả phải chăng, không quá tầm với sinh viên, NXP có đại diện ở VN, tuy nhiên khó khăn ở chỗ họ không bán các chíp LPC trực tiếp cho người tiêu dùng.

K cũng có ý định làm trung gian phân phối các chíp LPC này, nhưng không biết nhu cầu của các bạn như thế nào. Các board demo về LPC2000 có rất nhiều trên mạng, đối với các bạn mới thì không có gì khó khăn lắm. Bạn có thể bắt đầu từ con LPC2103 nho nhỏ (giá không quá 8 USD). Mạch nạp rất đơn giản, chỉ cần sợi dây COM RS232 là đủ. Không nhất thiết phải có dây nạp JTAG đắt tiền làm gì.

Do có thói quen làm việc với embedded Linux, K chỉ cần dùng hàm printf làm công cụ debug là đủ. Và muốn các bạn nên phát triển theo hướng mã nguồn mở, không nên dùng các phần mềm có bản quyền dùng "crk". Việc phát triển dựa trên mã nguồn mở theo K nghĩ chúng ta sẽ có các lợi ích như sau:

1> Không sợ bị bơ vơ khi mình đang gặp một vấn đề nan giải nào đó, bởi vì cư dân open source đông đảo, sẵn sàng hỗ trợ cho chúng ta.
2> Tiết kiệm được chi phí vì mọi thứ đều không tốn tiền.
3> Làm quen với các tool, phần mềm của GNU.
4> Khi có kiến thức khá vững về UNIX, LINUX, tiến xa hơn, ta sẽ làm việc với Linux embedded system...

K có ý định mở rộng tầm ảnh hưởng của ARM trong lĩnh vực embedded, và mong sự giúp đỡ từ các bạn.

nthp_2011
23-06-09, 10:11
Chào mọi người !
Mình là thành viên mới mong các bạn giúp đỡ
Mình đang tìm hiều về con vi điều khiên LPC2148.Mình đang viết code giao tiếp với LCD nhưng làm hoài mà không chạy?
Có ai đã làm với lcd chưa?Cho mình ý kiến nhé?
Mà kết nối trực tiếp với lpc2148 hay phai qua một mạch chuyển tiếp gì khác không?
Thank ! Mình đang làm đồ án nè !

robotden
23-06-09, 21:20
@kamejoko80: hay đó K, cậu làm trung gian phân phối lpc thì hay quá, nếu được thì làm thêm board demo luôn. mà K ở đâu vậy.
đợt vừa rùi cũng xem qua lpc2148 nhưng không có chip thực hành nên đành để đó, khi nào có đồ nghề sẽ học
chắc phải gọi K là anh rùi vì em là 87
thank a K

robotden
23-06-09, 21:22
à ,em xin a K email liên lạc luôn nha.
em: robotden@gmail.com

robotden
23-06-09, 21:22
à ,em xin a K email liên lạc luôn nha.
em: robotden@gmail.com

nthp_2011
23-06-09, 23:26
Không ai giúp mình nhỉ?Sắp bảo vệ rùi mà còn lung tung quá.Mong các cao thủ để tâm vấn đề của em 1 chút

kamejoko80
24-06-09, 08:55
@nthp_2011 : Chào bạn, bạn có thể chi tiết về công việc bạn đang làm không, bạn dùng LCD nào? Bạn có thể up lên code mà bạn đang làm không, để anh em trong diễn đàn xem và ra hướng giải quyết.

@robotden: Email của K là kamejoko80@yahoo.com, bạn cần bao nhiêu con LPC? Nếu tiện thì viết email he.

robotden
24-06-09, 09:47
em sẽ mail nha a
thank a K

hbaocr
24-06-09, 10:43
HEE HEE;
@kamejoko80:
@robotden:
Các bác viết tutorial ve cách sử dụng opensource di; GCC đê. em bu vào tham gia cho vui!

hbaocr
24-06-09, 11:10
@nthp_2011: không biết ban sài LCD nào.Nhưng nếu là LCD thường(16X2) thì code ở đây
http://dientuvietnam.net/forums/showthread.php?t=12936&page=2

còn GLCD thì bạn phải nói là loại nào anh em mới biết ngõ mà jup chứ

kamejoko80
24-06-09, 11:55
Hi hbaocr, ku em có làm với WinArm lần nào chưa, có gì làm thử và đưa tutorial lên he. Về mặc ngôn ngữ C thì coi như chuẩn rồi, giống nhau đối với các trình biên dịch, chỉ các nhau một vài directive đặc biệt nào đó thôi.

Tham khảo vài bước cài đặt sau đây he:


WinARM is a collection of GNU tools for ARM MCU family packed by Martin Thomas that works on MS Windows. WinARM is developed by inspiration on WinAVR project and it is really simple to start working with it if you had a chance to try WinAVR. WinARM doesn't depend on cygwin or mingw-environment like GNUARM tools does. WinARM toolset is compilled to work with most ARM microcontrollers including LPC2000 series, Atmel's ARM microcontrollers and Analog devices ARM microcontrollers as well. Basically tools should work with any microcontroller with ARM architecture.
Latest WinARM includes in Version 20060606 (http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/WinARM-20060606.zip):

GNU-C/C++-Compiler Version 4.1.1 incl. stdlib3. The configuration supports ARM-Mode, Thumb-Mode and Mixed(ARM/Thumb)-Mode, little/big-endian and floating point-emulation;
GNU-Binutil;
newlib (http://sources.redhat.com/newlib/) Version 1.14.0;
newlib-lpc (http://www.aeolusdevelopment.com/Articles/download.html) Rel.5a (reentrant syscalls for newlib and Philips LPCs)
GNU-Utils to support the compiler/linker;
ARM header-files (register-defintions);
Example applications with full source-code, makefiles, linker-scripts and startup-code for Philips LPC2000, ADuC7k and Atmel AT91SAM7 ARM7TDMI controllers.
Programmers Notepad (http://www.pnotepad.org/) Editor Version 2.0.6.1
The lpc21isp (http://www.engelschall.com/~martin/lpc21xx/isp/) in-system-programming-software for Philips LPC2xxx and the Analog Devices ADUC 70xx family by Martin Maurer. Included Versions: 1.31 and 1.37(BETA)
Bray Terminal (http://bray.velenje.cx/avr/terminal/) by Vlado Brajer
Insight-GDB 6.5.50-20060517 - Win32-Native from devkitpro.org (http://www.devkitpro.org/)
gdb (command-line without Insight) GNU gdb 6.4.50.20060226-cvs from;
Setup-Exe of Macraigor's OCDRemote (http://www.macraigor.com/full_gnu.htm) (Wigger-gdb interface, Ver. 2.16);
Open On-Chip debugger (OpenOCD, SVN Version 65) made by Dominic Rath (http://openocd.berlios.de/web/) ;
H-JTAG (Ver. 0.2.1 beta 20060402) made by "twentyone" (http://twentyone.blogchina.com/) ;
J-Link gdb-Server V1.0 from the gnuarm yahoo-group;
There is still installer needs to be done.
Few ease steps to start working with WINARM:

Download WinARM (http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/WinARM-20060606.zip) from here or more compressed 7zip package here (http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/WinARM-20060606.exe).
Extract package contents in system root (for instant on C:\WinARM (file:///C:/WinARM));
Set Environmental variables. Goto "Control Panel" -> "System" -> "Advanced Tab" -> "Environmental variables"
Edit "System Variables" -> Path
add the following lines in the end of the Path variable.
(if you extracted WinARM to c:\) ;c:\WinARM\bin;c:\WinARM\utils\bin;
You are set up. Now lets compile an example project:
Open Programmers Notepad (pn.exe) from C:\WinARM\pn folder:
http://winarm.scienceprog.com/images/stories/ARMTools/WinARM/PN.PNG
Then in Programmes Notepad (PN) open example project from: c:\WinARM\examples\lpc2106_blink_switch\ folder called ledswitch.pnproj:
http://winarm.scienceprog.com/images/stories/ARMTools/WinARM/WInARM_Project.PNG
And now you can compile(make) the program by selecting one of following commands:
http://winarm.scienceprog.com/images/stories/ARMTools/WinARM/make_ARM_prog.PNG
Make All - compile the program to hex file;
Make Clean - remove all the object files and binaries of previous compilation;
Make Program - run the lpc21isp to download the compiled hex file to your LPC ARM( makefile has to be set up for this operation).

kamejoko80
24-06-09, 12:01
http://winarm.scienceprog.com/images/stories/2007/wiggler/JTAG_wigler.PNG
Có thể dùng mạch dây cable wigler trên để nạp LPC

nthp_2011
24-06-09, 23:32
@nthp_2011: không biết ban sài LCD nào.Nhưng nếu là LCD thường(16X2) thì code ở đây
http://dientuvietnam.net/forums/showthread.php?t=12936&page=2

còn GLCD thì bạn phải nói là loại nào anh em mới biết ngõ mà jup chứ
Mình dùng con LCD thường(16x2) như hbaocr nói đó.Mình có đọc rùi nhưng kết nối như vậy không hề chạy,chán quá cơ.
Mà code mình viết đây,các ban xem mình viết có gì sai không nhé?
/*------------------------------ CHUONG TRINH GIAO TIEP LCD------------------------------- */

// Cac chan dung cho giao tiep LCD
//P0.0 - P0.7 = D0 - D7
//P0.8 = LCD_EN
//P0.9 = LCD_RS
//P0.10 = LCD_RW

/* Include file */
#include <LPC214x.h>

/* Define LCD PinIO Mask */
#define LCD_EN 0x00000100 // P0.8(0000 0000 0000 0000 0000 000x 0000 0000)
#define LCD_RS 0x00000200 // P0.9(0000 0000 0000 0000 0000 00x0 0000 0000)
#define LCD_RW 0x00000400 // P0.10(0000 0000 0000 0000 0000 0x00 0000 0000)
#define LCD_BUS 0x000000ff // P0.0-P0.7(0000 0000 0000 0000 0000 0000 xxxx xxxx)

#define lcd_en_set() IOSET0 = LCD_EN // EN = 1 (Enable)
#define lcd_en_clr() IOCLR0 = LCD_EN // EN = 0 (Disable)
#define lcd_rs_set() IOSET0 = LCD_RS // RS = 1 (Select Instruction mode)
#define lcd_rs_clr() IOCLR0 = LCD_RS // RS = 0 (Select Data mode)
#define lcd_rw_set() IOSET0 = LCD_RW // RW = 1 (Read)
#define lcd_rw_clr() IOCLR0 = LCD_RW // RW = 0 (Write)

/* Chon chieu cac IO pins giao tiep LCD*/
#define lcd_dir_write() IODIR0 |= 0x000007ff //(0000 0000 0000 0000 0000 0xxx xxxx xxxx)
#define lcd_dir_read() IODIR0 &= 0xffffff00 //(0000 0000 0000 0000 0000 0000 xxxx xxxx)

/* Define cac thao tac co ban voi LCD */
#define lcd_clear() lcd_write_control(0x01) // Clear Display
#define lcd_cursor_home() lcd_write_control(0x02) // Set Cursor = 0
#define lcd_display_on() lcd_write_control(0x0E) // LCD Display Enable
#define lcd_display_off() lcd_write_control(0x08) // LCD Display Disable
#define lcd_display_blink() lcd_write_control(0x0F) // Set Cursor = Blink
#define lcd_cursor_on() lcd_write_control(0x0E) // Enable LCD Cursor
#define lcd_cursor_off() lcd_write_control(0x0C) // Disable LCD Cursor
#define lcd_cursor_left() lcd_write_control(0x10) // Shift Left Cursor
#define lcd_cursor_right() lcd_write_control(0x14) // Shift Right Cursor
#define lcd_display_sleft() lcd_write_control(0x18) // Shift Left Display
#define lcd_display_sright() lcd_write_control(0x1C) // Shift Right Display

/* prototype */
void lcd_init(void); // Initial LCD
void lcd_write_control(unsigned char); // Write Instuction to LCD
void lcd_write_ascii(unsigned char); // Write LCD Display(ASCII)
void goto_vitri(unsigned char); // Set Position Cursor LCD
void lcd_hienthi(unsigned char*); // Print Display to LCD
char busy_lcd(void); // Read Busy LCD Status
void enable_lcd(void); // Enable Pulse
void delay(unsigned long int); // Delay Function

/* Chuong trinh chinh */
int main(void)
{
lcd_init(); // Initial LCD

// Loop Print Message to LCD16 x 2 //
while(1) // Loop Continue
{
goto_vitri(0x80); // Set Cursor Line-1
lcd_hienthi("ngay 15/06/09"); // Display LCD Line-1
goto_vitri(0xC0); // Set Cursor = Line-2
lcd_hienthi("Chuong trinh LCD"); // Display LCD Line-2
delay(5000000); // Display Delay
lcd_clear();

goto_vitri(0x80); // Set Cursor Line-1
lcd_hienthi("LPC2148-NXP"); // Display LCD Line-1
goto_vitri(0xC0); // Set Cursor = Line-2
lcd_hienthi("EASY ARM!!!"); // Display LCD Line-2
delay(5000000); // Display Delay
lcd_clear();

goto_vitri(0x80); // Set Cursor Line-1
lcd_hienthi("Tac gia viet:"); // Display LCD Line-1
goto_vitri(0xC0); // Set Cursor = Line-2
lcd_hienthi("killer_hung yen"); // Display LCD Line-2
delay(5000000); // Display Delay
lcd_clear();
}

}
/************************************************** ****/
/* Initial LCD : 8bit,2-line display,5x7 dot charater */
/************************************************** ****/
void lcd_init()
{
//unsigned int i; // bien delay
PINSEL0 = 0x00000000; // GPIO cho cac pin P0.0 den P0.15(chon cac chan o Pinsel 0)
IODIR0 = 0x000007ff; // P0.0-P0.10 la output(gan cac chan p0.0-p0.10 lam dau ra)
delay(100000); // Power-On Delay (15 mS)

/* Check LCD*/
IOSET0 = 0x000007ff; // Reset all pins
IOCLR0 = 0x00000030; // D5:D4 = 11 (0000 0000 0000 0000 0000 0000 0011 0000)
enable_lcd(); // Xung enable cho LCD
delay(100000); // Delay 4.1ms

IOCLR0 = 0x000007ff; // Reset all pins
IOSET0 = 0x00000030; // D5:D4 = 11
enable_lcd();
while(busy_lcd()); // Xung enable cho LCD
delay(100000); // Delay 100 ms

IOCLR0 = 0x000007ff;
IOSET0 = 0x00000030;
enable_lcd();
while(busy_lcd()); //Wait LCD Execute complete

IOCLR0 = 0x000007ff;
IOSET0 = 0x00000030;
enable_lcd();
while(busy_lcd()); //Wait LCD Execute complete

/* Config cho LCD */
//lcd_write_control(0x30);
lcd_write_control(0x38); // Function Set (DL=1 8-Bit,N=1 2 Line,F=0 5X7)
lcd_write_control(0x0C); // Display on/off Control (Entry Display,Cursor off,Cursor not Blink)
//lcd_write_control(0x06); // Entry Mode Set (I/D=1 Increment,S=0 Cursor Shift)
//lcd_write_control(0x01); // Clear Display (Clear Display,Set DD RAM Address=0)
delay(100000); // Wait Command Ready
}

/************************/
/* thiet lap vi tri nhap nhay cua control*/
/************************/
void goto_vitri(unsigned char i)
{
i |= 0x80; // Set DD-RAM Address Command
lcd_write_control(i);
}

/******************************/
/* Write construction to LCD */
/******************************/
void lcd_write_control(unsigned char val)
{
//unsigned int i;
lcd_rs_clr();
lcd_rw_clr(); // RS = 0 = Instruction Select
IOCLR0 = LCD_BUS; // Reset Data pins RS=0
IOSET0 = (val & LCD_BUS); // write value
enable_lcd(); // Xung enable LCD
while(busy_lcd()); // Wait LCD Execute Complete
delay(100000); // Wait Command Ready
}

/*********************************/
/* Write ascii character to LCD */
/********************************/
void lcd_write_ascii(unsigned char val)
{
unsigned int i;
lcd_rs_set();
lcd_rw_clr(); // RS = 1 = Data Select
IOCLR0 = LCD_BUS; // Reset Data pins
IOSET0 = (val & LCD_BUS); // write value
enable_lcd(); // Xung enable LCD
while(busy_lcd()); // Wait LCD Execute Complete
delay(100000); // Wait Command Ready
}

/************************************/
/* Print Display Data(ASCII) to LCD */
/************************************/
void lcd_hienthi(unsigned char* str)
{
int i;
for (i=0;i<=16 && str[i]!=0;i++)
{ // 16 Character Print
lcd_write_ascii(str[i]);
} // Print Byte to LCD

}

/******************/
/* Wait LCD Ready */
/******************/

/*char busy_lcd(void)
{
unsigned long busy_status; // Busy Status Read
unsigned int i; // Delay Count

lcd_dir_read(); // LCD Data Bus = Read
lcd_rs_clr(); // Instruction Select
lcd_rw_set(); // Read Direction
lcd_en_set(); // Start Read Busy

for (i=0;i<100;i++); // Delay Before Read
busy_status = (IOPIN0 & 0x00000080); // D7 la busy flag

if(busy_status == 0x00800000) // Read & Check Busy Flag
{
lcd_en_clr(); // Disable Read
lcd_rw_clr(); // Default = Write Direction
lcd_dir_write(); // LCD Data Bus = Write
return 1; // LCD Busy Status
}
else
{
lcd_en_clr(); // Disable Read
lcd_rw_clr(); // Default = Write Direction
lcd_dir_write(); // LCD Data Bus = Write
return 0; // LCD Ready Status
}
}*/


/***********************/
/* Enable Pulse to LCD */
/***********************/
void enable_lcd(void) // Enable Pulse
{
//unsigned int i; // Delay Count
lcd_en_set(); // Enable ON (EN=1)
delay(100000);
lcd_en_clr(); // Enable OFF(EN=0)
}

/***********************/
/* Delay Time Function */
/* 1-4294967296 */
/***********************/
void delay(unsigned long int count1)
{
while(count1 > 0) {count1--;} // Loop Decrease Counter

}


Mình test trên protes chạy ngon
http://img241.imageshack.us/img241/968/lcdm.jpg (http://img241.imageshack.us/i/lcdm.jpg/)

Mình kết nối trực tiếp các đầu ra của lpc2148 với các chân điều khiển và data của lcd.Như vậy có gì sai không các bạn?Giúp mình nhé!

kamejoko80
25-06-09, 07:51
Nếu kết quả mô phỏng OK, mà không chạy khi test thực tế thì bạn thử xem lại kết nối phần cứng đúng hay chưa.

1> Để đảm bảo con LPC2148 chạy được hay không ta nên dùng chức năng debug qua cổng COM (dùng hàm printf, puts... chẳng hạn).

2> Kiểm tra lại xem bước kiểm tra cờ busy thành công hay không (đặt debug mesage tại bước này)

3> Nếu các bước trên không được bạn nên xem lại LCD có bị die hay không, dùng mạch chuyên dụng để test LCD nếu cần thiết.

Chúc thành công

nthp_2011
25-06-09, 08:04
Nếu kết quả mô phỏng OK, mà không chạy khi test thực tế thì bạn thử xem lại kết nối phần cứng đúng hay chưa.

1> Để đảm bảo con LPC2148 chạy được hay không ta nên dùng chức năng debug qua cổng COM (dùng hàm printf, puts... chẳng hạn).

2> Kiểm tra lại xem bước kiểm tra cờ busy thành công hay không (đặt debug mesage tại bước này)

3> Nếu các bước trên không được bạn nên xem lại LCD có bị die hay không, dùng mạch chuyên dụng để test LCD nếu cần thiết.

Chúc thành công

Mình kết nối trực tiếp các chân lcd với các chân ra của lpc2148 có lỗi gì không bạn?
Còn bước 1 và bước 2 mình không hiểu lắm.Bạn có thể nói cụ thể được không?
Thank

kamejoko80
25-06-09, 08:40
Kết nối trực tiếp 3v3 và 5v chắc là không có vấn đề gì ?

Bạn kiểm tra kết quả của hàm "busy_lcd()" thử.

nthp_2011
25-06-09, 09:50
Kết nối trực tiếp 3v3 và 5v chắc là không có vấn đề gì ?

Bạn kiểm tra kết quả của hàm "busy_lcd()" thử.
Bạn thử xem chương trình con hàm"busy_lcd", có sai gì không nhé?Mình chẳng thấy gì sai cả.

kamejoko80
25-06-09, 10:49
Ý K không phải đề cập chương trình viết đúng hay sai, mà đề cập đến phương pháp debug để tìm ra nguyên nhân, lúc bạn chạy, hàm này trả về kết quả như thế nào ???

nthp_2011
25-06-09, 15:42
Mình vừa làm toi con lcd rùi,chán quá.
Cho mình hỏi tốc độ xử lý của lpc2148 có ảnh hưởng gì đến việc hiện thị của lcd không?

kamejoko80
25-06-09, 16:58
Mình vừa làm toi con lcd rùi,chán quá.
Cho mình hỏi tốc độ xử lý của lpc2148 có ảnh hưởng gì đến việc hiện thị của lcd không?

Nếu mô phỏng tốt mà làm thực tế không chạy thì ta có thể đoán được do hardware.

Tốc độ ảnh hưởng ở chỗ thời gian đáp ứng, ví dụ chân E xuống thấp và lên cao cần phải đảm bảo thời gian tối thiểu nào đó. Nếu tham khảo datasheet của driver chip thì sẽ rõ.

Có 2 cách giao tiếp LCD loại này:

1> Ta biết trước thời gian thực thi của một lệnh, theo đó, cần phải có một khoảng thời gian chờ cho lệnh trước hoàn tất.
2> Hoặc kiểm tra cờ busy trên bit 7 báo hiệu lệnh thực thi hoàn tất, trong trường hợp này, driver điều khiển sẽ thực hiện đoạn code chờ bit cờ thay đổi trạng thái. Nếu vì lí do gì đó bit cờ này không thay đổi, chương trình chúng ta sẽ bị loop ngay chỗ này, chính vì thế ta cần kiểm tra kết quả của hàm busy_lcd().

batbatdieu
25-06-09, 18:55
Kết nối trực tiếp 3v3 và 5v chắc là không có vấn đề gì ?

Bạn kiểm tra kết quả của hàm "busy_lcd()" thử.

Bạn lại xem datasheet của LCD , V input High của LCD 5V thường là 3.6V nên khi kết nối với LPC thì chưa đủ để tạo mức logic high . tuy nhiên vẫn có 1 số trường hợp "hên xui" vẫn chạy bình thường nhưng ko ổn định

nthp_2011
25-06-09, 21:08
Để mình coi lại xem nhé.Mai lên Hà nội mua con lcd mới vậy.Làm đủ mọi cách mà không thấy động tĩnh gì cả chỉ hiển thị vài ký tự linh tinh.
Nhưng dù sao cũng cảm ơn các bác nhé.

kamejoko80
25-06-09, 21:25
LPC 3v3 có thể giao tiếp trực tiếp được với LCD 5V, tham khảo schematic của board sau:

http://www.olimex.com/dev/images/ARM/LPC/LPC-MT-2106-1.jpg

http://www.olimex.com/dev/images/lpc-mt-2106-sch.gif

nthp_2011
26-06-09, 07:57
Mình mới tìm hiểu về lpc2148 nên không hiểu điều sau:
Mình ví dụ:chân 21 có ghi:P0.1/RXD0/PWM3/EINT0.Nếu mình muốn sử dụng chức năng PWM3 thì phải làm thế nào?
bit ký hiệu ý nghĩa
+1:0 P0.0 00 GPIO Port 0.0 00
01 TXD (UART0)
10 PWM1
11 Reserved
Ai biết giải thích hộ mình bit(1:0)là thế nào?
00...
01...
10...
11... nghĩa là gì
Thank !

batbatdieu
26-06-09, 09:13
LPC 3v3 có thể giao tiếp trực tiếp được với LCD 5V, tham khảo schematic của board sau:

http://www.olimex.com/dev/images/ARM/LPC/LPC-MT-2106-1.jpg

http://www.olimex.com/dev/images/lpc-mt-2106-sch.gif


Không phải LCD nào cũng có DC Characteristics giống nhau nên 1 số giao tiếp được với 3.3V và 1 số thì không.
Như mình nói , phải xem lại DC Characteristics (Input voltage : VIL , VIH ) trong datasheet của cái LCD mình dùng.

akc
26-06-09, 09:24
Không biết mấy chú ảm này thì sao. Nhưng mình vẫn dùng lcd 5V kết nối với pic 3v3 và chạy rất ổn ko gặp 1 chút ko ổn định nào.

hbaocr
26-06-09, 10:39
Mình mới tìm hiểu về lpc2148 nên không hiểu điều sau:
Mình ví dụ:chân 21 có ghi:P0.1/RXD0/PWM3/EINT0.Nếu mình muốn sử dụng chức năng PWM3 thì phải làm thế nào?
bit ký hiệu ý nghĩa
+1:0 P0.0 00 GPIO Port 0.0 00
01 TXD (UART0)
10 PWM1
11 Reserved
Ai biết giải thích hộ mình bit(1:0)là thế nào?
00...
01...
10...
11... nghĩa là gì
Thank !

bạn xem kỹ lai Usermanual cua LPC2148 nhé chức năng của thanh ghi PINSEL0
để set chức năng PWM1 chon chân P0.1 .ta xem xét 2 bit : bit0 va bit1 của thanh ghi PINSEL. theo đó PWM1 thì bit 0 =0 ,và Bit 1 =1 .cách setip trong C
PINSEL0 &= (unsigned int)(~0x03);//reset bit0 va bit 1 = 00
PINSEL0 |=0x02;//bit0 =0;bit 1 =1

hbaocr
26-06-09, 10:45
Mình dùng con LCD thường(16x2) như hbaocr nói đó.Mình có đọc rùi nhưng kết nối như vậy không hề chạy,chán quá cơ.
Mà code mình viết đây,các ban xem mình viết có gì sai không nhé?
/*------------------------------ CHUONG TRINH GIAO TIEP LCD------------------------------- */

// Cac chan dung cho giao tiep LCD
//P0.0 - P0.7 = D0 - D7
//P0.8 = LCD_EN
//P0.9 = LCD_RS
//P0.10 = LCD_RW

/* Include file */
#include <LPC214x.h>

/* Define LCD PinIO Mask */
#define LCD_EN 0x00000100 // P0.8(0000 0000 0000 0000 0000 000x 0000 0000)
#define LCD_RS 0x00000200 // P0.9(0000 0000 0000 0000 0000 00x0 0000 0000)
#define LCD_RW 0x00000400 // P0.10(0000 0000 0000 0000 0000 0x00 0000 0000)
#define LCD_BUS 0x000000ff // P0.0-P0.7(0000 0000 0000 0000 0000 0000 xxxx xxxx)

#define lcd_en_set() IOSET0 = LCD_EN // EN = 1 (Enable)
#define lcd_en_clr() IOCLR0 = LCD_EN // EN = 0 (Disable)
#define lcd_rs_set() IOSET0 = LCD_RS // RS = 1 (Select Instruction mode)
#define lcd_rs_clr() IOCLR0 = LCD_RS // RS = 0 (Select Data mode)
#define lcd_rw_set() IOSET0 = LCD_RW // RW = 1 (Read)
#define lcd_rw_clr() IOCLR0 = LCD_RW // RW = 0 (Write)

/* Chon chieu cac IO pins giao tiep LCD*/
#define lcd_dir_write() IODIR0 |= 0x000007ff //(0000 0000 0000 0000 0000 0xxx xxxx xxxx)
#define lcd_dir_read() IODIR0 &= 0xffffff00 //(0000 0000 0000 0000 0000 0000 xxxx xxxx)

/* Define cac thao tac co ban voi LCD */
#define lcd_clear() lcd_write_control(0x01) // Clear Display
#define lcd_cursor_home() lcd_write_control(0x02) // Set Cursor = 0
#define lcd_display_on() lcd_write_control(0x0E) // LCD Display Enable
#define lcd_display_off() lcd_write_control(0x08) // LCD Display Disable
#define lcd_display_blink() lcd_write_control(0x0F) // Set Cursor = Blink
#define lcd_cursor_on() lcd_write_control(0x0E) // Enable LCD Cursor
#define lcd_cursor_off() lcd_write_control(0x0C) // Disable LCD Cursor
#define lcd_cursor_left() lcd_write_control(0x10) // Shift Left Cursor
#define lcd_cursor_right() lcd_write_control(0x14) // Shift Right Cursor
#define lcd_display_sleft() lcd_write_control(0x18) // Shift Left Display
#define lcd_display_sright() lcd_write_control(0x1C) // Shift Right Display

/* prototype */
void lcd_init(void); // Initial LCD
void lcd_write_control(unsigned char); // Write Instuction to LCD
void lcd_write_ascii(unsigned char); // Write LCD Display(ASCII)
void goto_vitri(unsigned char); // Set Position Cursor LCD
void lcd_hienthi(unsigned char*); // Print Display to LCD
char busy_lcd(void); // Read Busy LCD Status
void enable_lcd(void); // Enable Pulse
void delay(unsigned long int); // Delay Function

/* Chuong trinh chinh */
int main(void)
{
lcd_init(); // Initial LCD

// Loop Print Message to LCD16 x 2 //
while(1) // Loop Continue
{
goto_vitri(0x80); // Set Cursor Line-1
lcd_hienthi("ngay 15/06/09"); // Display LCD Line-1
goto_vitri(0xC0); // Set Cursor = Line-2
lcd_hienthi("Chuong trinh LCD"); // Display LCD Line-2
delay(5000000); // Display Delay
lcd_clear();

goto_vitri(0x80); // Set Cursor Line-1
lcd_hienthi("LPC2148-NXP"); // Display LCD Line-1
goto_vitri(0xC0); // Set Cursor = Line-2
lcd_hienthi("EASY ARM!!!"); // Display LCD Line-2
delay(5000000); // Display Delay
lcd_clear();

goto_vitri(0x80); // Set Cursor Line-1
lcd_hienthi("Tac gia viet:"); // Display LCD Line-1
goto_vitri(0xC0); // Set Cursor = Line-2
lcd_hienthi("killer_hung yen"); // Display LCD Line-2
delay(5000000); // Display Delay
lcd_clear();
}

}
/************************************************** ****/
/* Initial LCD : 8bit,2-line display,5x7 dot charater */
/************************************************** ****/
void lcd_init()
{
//unsigned int i; // bien delay
PINSEL0 = 0x00000000; // GPIO cho cac pin P0.0 den P0.15(chon cac chan o Pinsel 0)
IODIR0 = 0x000007ff; // P0.0-P0.10 la output(gan cac chan p0.0-p0.10 lam dau ra)
delay(100000); // Power-On Delay (15 mS)

/* Check LCD*/
IOSET0 = 0x000007ff; // Reset all pins
IOCLR0 = 0x00000030; // D5:D4 = 11 (0000 0000 0000 0000 0000 0000 0011 0000)
enable_lcd(); // Xung enable cho LCD
delay(100000); // Delay 4.1ms

IOCLR0 = 0x000007ff; // Reset all pins
IOSET0 = 0x00000030; // D5:D4 = 11
enable_lcd();
while(busy_lcd()); // Xung enable cho LCD
delay(100000); // Delay 100 ms

IOCLR0 = 0x000007ff;
IOSET0 = 0x00000030;
enable_lcd();
while(busy_lcd()); //Wait LCD Execute complete

IOCLR0 = 0x000007ff;
IOSET0 = 0x00000030;
enable_lcd();
while(busy_lcd()); //Wait LCD Execute complete

/* Config cho LCD */
//lcd_write_control(0x30);
lcd_write_control(0x38); // Function Set (DL=1 8-Bit,N=1 2 Line,F=0 5X7)
lcd_write_control(0x0C); // Display on/off Control (Entry Display,Cursor off,Cursor not Blink)
//lcd_write_control(0x06); // Entry Mode Set (I/D=1 Increment,S=0 Cursor Shift)
//lcd_write_control(0x01); // Clear Display (Clear Display,Set DD RAM Address=0)
delay(100000); // Wait Command Ready
}

/************************/
/* thiet lap vi tri nhap nhay cua control*/
/************************/
void goto_vitri(unsigned char i)
{
i |= 0x80; // Set DD-RAM Address Command
lcd_write_control(i);
}

/******************************/
/* Write construction to LCD */
/******************************/
void lcd_write_control(unsigned char val)
{
//unsigned int i;
lcd_rs_clr();
lcd_rw_clr(); // RS = 0 = Instruction Select
IOCLR0 = LCD_BUS; // Reset Data pins RS=0
IOSET0 = (val & LCD_BUS); // write value
enable_lcd(); // Xung enable LCD
while(busy_lcd()); // Wait LCD Execute Complete
delay(100000); // Wait Command Ready
}

/*********************************/
/* Write ascii character to LCD */
/********************************/
void lcd_write_ascii(unsigned char val)
{
unsigned int i;
lcd_rs_set();
lcd_rw_clr(); // RS = 1 = Data Select
IOCLR0 = LCD_BUS; // Reset Data pins
IOSET0 = (val & LCD_BUS); // write value
enable_lcd(); // Xung enable LCD
while(busy_lcd()); // Wait LCD Execute Complete
delay(100000); // Wait Command Ready
}

/************************************/
/* Print Display Data(ASCII) to LCD */
/************************************/
void lcd_hienthi(unsigned char* str)
{
int i;
for (i=0;i<=16 && str[i]!=0;i++)
{ // 16 Character Print
lcd_write_ascii(str[i]);
} // Print Byte to LCD

}

/******************/
/* Wait LCD Ready */
/******************/

/*char busy_lcd(void)
{
unsigned long busy_status; // Busy Status Read
unsigned int i; // Delay Count

lcd_dir_read(); // LCD Data Bus = Read
lcd_rs_clr(); // Instruction Select
lcd_rw_set(); // Read Direction
lcd_en_set(); // Start Read Busy

for (i=0;i<100;i++); // Delay Before Read
busy_status = (IOPIN0 & 0x00000080); // D7 la busy flag

if(busy_status == 0x00800000) // Read & Check Busy Flag
{
lcd_en_clr(); // Disable Read
lcd_rw_clr(); // Default = Write Direction
lcd_dir_write(); // LCD Data Bus = Write
return 1; // LCD Busy Status
}
else
{
lcd_en_clr(); // Disable Read
lcd_rw_clr(); // Default = Write Direction
lcd_dir_write(); // LCD Data Bus = Write
return 0; // LCD Ready Status
}
}*/


/***********************/
/* Enable Pulse to LCD */
/***********************/
void enable_lcd(void) // Enable Pulse
{
//unsigned int i; // Delay Count
lcd_en_set(); // Enable ON (EN=1)
delay(100000);
lcd_en_clr(); // Enable OFF(EN=0)
}

/***********************/
/* Delay Time Function */
/* 1-4294967296 */
/***********************/
void delay(unsigned long int count1)
{
while(count1 > 0) {count1--;} // Loop Decrease Counter

}


Mình test trên protes chạy ngon
http://img241.imageshack.us/img241/968/lcdm.jpg (http://img241.imageshack.us/i/lcdm.jpg/)

Mình kết nối trực tiếp các đầu ra của lpc2148 với các chân điều khiển và data của lcd.Như vậy có gì sai không các bạn?Giúp mình nhé!

kinh nghiệm cho thấy 1 số LCD (hên xui) . bit Busy (bit 7) đọc không được dẫn tới tình trạng treo chương trình. nên để chắc cú cho lcd_busy() nên đễ 1 hàm delay .

nthp_2011
26-06-09, 15:05
bạn xem kỹ lai Usermanual cua LPC2148 nhé chức năng của thanh ghi PINSEL0
để set chức năng PWM1 chon chân P0.1 .ta xem xét 2 bit : bit0 va bit1 của thanh ghi PINSEL. theo đó PWM1 thì bit 0 =0 ,và Bit 1 =1 .cách setip trong C
PINSEL0 &= (unsigned int)(~0x03);//reset bit0 va bit 1 = 00
PINSEL0 |=0x02;//bit0 =0;bit 1 =1
Theo mình biết thì:
p0.0 là đại diện của các giá trị 0, 1, 2, 3.
p0.1 là đại diện của các giá trị 0, 4, 8, 12.
p0.2 là đại diện của các giá trị 0, 16, 32, 48.
Nghĩa là muốn set chức năng chân TXD(UART0) và RxD(UART0) ta khai báo:
PINSEL0 |=0x00000001;//set P0.0=TxD(UART0)
PINSEL0 |=0x00000004;//set P0.1=RxD(UART0)
Có đúng không bạn?
Nhưng không có cách nào set chân P0.0 là GPIO Port 0.0 sa0?

kamejoko80
26-06-09, 17:51
Từ trước đến bây giờ, K giao tiếp 5V và 3v3 trực tiếp không gặp vấn đề gì rắc rối cả,
5V thì có VH min cỡ 2.5V, ngõ ra 3v3 thì sụt áp không đến nỗi dưới 2.5V vì vậy vấn đề giao tiếp không có vấn đề gì.

nthp_2011
26-06-09, 21:38
Có ai có code điều khiển động cơ 1 chiều dùng vi điều khiển ARM không cho mình đi.Đang làm điều khiển động cơ 1 chiều nè.LCD ngon rùi.
Thank tất cả các bác nhé !

hbaocr
26-06-09, 22:21
Theo mình biết thì:
p0.0 là đại diện của các giá trị 0, 1, 2, 3.
p0.1 là đại diện của các giá trị 0, 4, 8, 12.
p0.2 là đại diện của các giá trị 0, 16, 32, 48.
Nghĩa là muốn set chức năng chân TXD(UART0) và RxD(UART0) ta khai báo:
PINSEL0 |=0x00000001;//set P0.0=TxD(UART0)
PINSEL0 |=0x00000004;//set P0.1=RxD(UART0)
Có đúng không bạn?
Nhưng không có cách nào set chân P0.0 là GPIO Port 0.0 sa0?

bạn set như vậy là đúng rồi;
muốn set P0.0 là GPIO thì thì bít 1 va bit 0 của PINSEL0 là : 00 = 0
P0.1 là RxD thì thì bít 3 va bit 2 của PINSEL0 là: 01 = 1
P0.2 là CAP0.0 thì thì bít 5 va bit 4 của PINSEL0 là : 10 = 2
Như vậy để config 3 chức năng cho 3 chân như trên ta làm như sau:
PINSEL0 |=(0x00<<0)|(0x01<<2)|(0x02<<4);
http://i177.photobucket.com/albums/w237/hbaocr/pinsel.gif

nthp_2011
27-06-09, 03:20
Sao mình khai báo:
PINSEL0 |=(0x00<<0);//set chan P0.0 là GPIO
Nhưng không hề có tín hiệu?
Khi mình đổi thành:
PINSEL0 |=(0x01<<0);//set chan P0.0 là TxD(UART0)
Thì lại thấy tín hiệu là sao?

hbaocr
27-06-09, 16:12
Sao mình khai báo:
PINSEL0 |=(0x00<<0);//set chan P0.0 là GPIO
Nhưng không hề có tín hiệu?
Khi mình đổi thành:
PINSEL0 |=(0x01<<0);//set chan P0.0 là TxD(UART0)
Thì lại thấy tín hiệu là sao?

bạn cần xem lại 2 điều
1.Bạn xem lại bit0 hoặc bit 1 của PINSEL đã được set trước đó chưa!Nếu chúng đã dc set lên 1 trước đó rồi thì PINSEL0 |=(0x00<<0) ko co tac dụng.Vì thực chất dòng lệnh này chả có tác dụng gì đối với PINSEL cả mình chỉ viết để minh họa cho rõ trình tự phải làm khi set chức nag8 cho các PIN thô(hii cho giống với datasheet 00 la GPIO thui) Tra bảng chức năng trong datasheet và dịch bit thui.vì OR với 0 thì do nothing :no:.Vì thế để chắc cú bạn phải clear tất cả các bit trong PINSEL cần tác động để chọn chức năng cho PIN tuơng ứng.vd de set P0.0 la GPIO va P0.1 là UART(RXD). thì ta cần tác động tới bit 0-->bit 3 của PINSEL0.nên ta làm như sau
PINSEL0 &=unsigned int (~0x0F);//clear bit 0 to 3
PINSEL0 |=(0x01<<2); //set PO.0 la GPIO va p0.1 la RXD
vì lúc này bit0 va bit 1 mặc nhiên đã bằng 0 nen P0.0 la GPIO

2.nếu bạn đã chọn đúng chân P0.0 la GPIO thì bạn đã set chiều dữ liệu chưa(IODIR).Bạn muốn out put dữ liệu thì chon IODIR0 |=(1<<0);sau đó mới tiến hành set hay clear(bang IOSET va IOCLR) thì tín hiệu mới ra được.ngược lại nếu bạn muốn đọc dữ liệu từ chân này thì phải set nó là input pin đã IODIR0 &=usnigned int(~0x01) sau đó mới đọc dữ liệu bằng IOPIN.
:laychua:O:-)

nthp_2011
27-06-09, 22:29
Bạn hbaocr,bạn có tài liệu gì liên quan đến LPC2148 không?
Nếu có bạn send cho mình qua mail này nhé:nthp.2011@gmail.com
Mà bạn đã làm với động cơ một chiều và động cơ bước chưa vậy?
Mình đang chuẩn bị làm mà chưa biết hướng ra sao.

nthp_2011
01-07-09, 00:41
Sao không ai giúp mình nhỉ?

stalinz
09-07-09, 23:53
Các anh ơi cho em hỏi chút
Với con ARM mà csó thêm cổng PORT1 (nhu LPC2138..) muốn sử dụng cổng PORT1 đó thì khai báo như nào. PORT0 thi thiết lập PINSEL0. Muốn PORT1 cũng dùng GPIO thì khai báo như nào?

kamejoko80
10-07-09, 01:02
PINSEL0, PINSEL1, PINSEL2 dùng cho việc cấu hình chức năng cho PORT0.
PINSELx không thấy đề cập cho PORT1, có lẽ khi reset LPC thì PORT1 được cấu hình thành GPIO rồi. Bạn hãy thí nghiệm bằng cách xuất giá trị ra PORT1, gắn vào dãy LED kiểm tra thì sẽ rõ.

hongtam
10-07-09, 22:56
Mình đang làm luận văn về ARM7. Do mới bắt tay vào làm nên cũng không biết gì nhiều. Các bác xem dùm em trong hình con U3 mcp130T làm nhiệm vụ gì vậy? Có thể không dùng con này được không vậy? Nếu không dùng con này thì có thể nạp CT vào chip thông qua cổng com được không vậy? (do tiết tiền nên không có mua mạch nạp J-Tag). Thank các bác.
http://i594.photobucket.com/albums/tt27/hongtambk86/11.gif

kamejoko80
11-07-09, 01:01
Chào mừng bạn đã tham gia vào thế giới VĐK ARM.

Chíp MCP130T có chức năng reset cho hệ thống, chủ ý là giữ chân reset tích cực cho đến khi nào nguồn cung cấp ổn định với mong muốn khởi động hệ thống an toàn.
Dùng mạch RC và reset button là ổn, không dùng chíp này cũng không sao.

Về việc program LPC2000 có hai cách.

Dùng JTAG, bạn có thể tự làm lấy cable wigler JTAG rẻ tiền (thông qua LPT port)
Dùng UART, qui trình nạp được tóm tắt nhưa sau:
1> Gữ chân BSEL mức low đồng thời ấn nút reset.
2> Nhả chân reset và sau đó nhả chân BSEL lên mức hight, tại thời điểm này chíp của bạn đang ở trang thái UART boot mode, sẵn sàng nạp internal flash thông qua chương trình Philips ISP untility hoặc dùng command line của tool winarm.

Sau đay là sơ đồ nạp tự động mà K đã dùng trước đây.
http://i23.photobucket.com/albums/b370/kamejoko80/embedded/program_cable.jpg

Chúc thành công

hongtam
11-07-09, 08:41
Cám ơn bạn K nhiều nha.
1> Gữ chân BSEL mức low đồng thời ấn nút reset.
2> Nhả chân reset và sau đó nhả chân BSEL lên mức hight, tại thời điểm này chíp của bạn đang ở trang thái UART boot mode, sẵn sàng nạp internal flash thông qua chương trình Philips ISP untility hoặc dùng command line của tool winarm.

Sau đay là sơ đồ nạp tự động mà K đã dùng trước đây.
Vậy là mình chỉ cần lắp mạch như vậy và dùng phần mềm để nạp thôi đúng không?Vì bước 1 và 2 đã có cổng com(chân 7 và chân 4) làm rồi đúng không?

kamejoko80
11-07-09, 09:01
Đúng rồi bạn ah

hongtam
11-07-09, 09:21
Cám ơn bạn K nhiều.

herrtien
11-07-09, 09:45
Phương pháp nạp chương trình từ thẻ nhớ ngoài sẽ là một phương pháp hay để các bạn tham khảo khi dùng chíp xử lý ARM

nthp_2011
16-07-09, 08:35
không ai giúp mình về điều khiển động cơ 1 chiều dùng ARM sao?

hbaocr
16-07-09, 13:21
thuật toán PID thì có săn trên mạng rùi;bạn xem rồi map sang y chang thôi!

Auto_engine
11-08-09, 15:53
void UART0_Init(int BaudRate)
{
unsigned int brd = (Fpclk / BaudRate << 4);

// Connect P0.0 & P0.1 to Tx & Rx
PINSEL0 &= 0xFFFFFFF0; // Reset P0.0 & P0.1
PINSEL0 |= 0x00000001; // Connect P0.0 to Tx
PINSEL0 |= 0x00000004; // Connect P0.1 to Rx

// Set Terminal Characteristics
U0LCR |= 0x02; // 8 Bits Word Select
U0LCR &= 0xFB; // 1 Stop Bit
U0LCR &= 0xF7; // No Parity
U0LCR |= 0x80; // DLAB = 1 to change Baudrate

/*
X-TAL = 12Mhz
Multiple = 5
Divide = 2
--> CPU Clock = X-TAL*Multiple = 60Mhz
Peripheral Clock PCLK = CPU Clk/4 = 15Mhz
*/
// Set Baudrate
U0DLL = (brd & 0xFF);
U0DLM = (brd >> 8);
U0LCR &= 0x7F; // DLAB = 0 to stop change BaudRate

// FIFO Enable
U0FCR |= 0x01; // FIFO Enable
U0FCR |= 0x02; // Rx Reset
U0FCR |= 0x04; // Tx Reset
U0FCR &= 0x3F; // Trigger Level 0
}

Em đang học ARM, mua chung với thằng bạn Kit LPC2103, đã học đc 1 thời gian, GPIO rùi LCD làm dc rùi. Tuy nhiên đụng tới phần UART có vấn đề, đoạn code trên em đọc datasheet, rùi đọc các ví dụ ở đầu luồng này chỉnh sửa tí chút ^^. Tuy nhiên em gặp 1 vấn đề nhờ mọi ng giúp em đó là khi em nạp vào LPC2103 thật thì:
- Dùng lệnh printf của stdio.h ko gửi đc gì lên Terminal cả
- Sau đó em tức mình send kí tự từ máy tính xuống LPC thì nó gửi kí tự lại lên máy tính :eek:.
- BaudRate luôn là 9600 ko thay đổi đc.
Em nạp ISP board LPC2103 của NhungViet. Mọi ng giải thích dùm em nhé. Đang cố cuối tháng ăn xong con ARM này. :win:

hbaocr
13-08-09, 16:59
bạn pót nguyen code lên đi; nói thêm nữa là bạn sài keil version mấy! RV hay CARM!chứ bạn pót moi cái code init thế này thì sao ma biet bạn sai cho nào!

Auto_engine
13-08-09, 23:52
Đợi các bác trả lời lâu quá, sau vài ngày ôm Keil ARM em phát hiện vài điều sau, có gì sai các bác lượng thứ:
- Stdio.h của Keil nhà em có vấn đề, viết các hàm getchar() với putchar() thế nào nó ko dịch cho, trong khi code em down trên mạng về giống hệt dịch ngon lành chạy.
- Em chán tự viết hàm kiểu printf() nó lại dịch và chạy ngon lành (nhưng mà phải sửa hàm thành get_char() với put_char(), khác tên hàm kia)
Nói chung em ko rõ cái này lắm mất 3 hôm vật lộn với UART, hic hic. Ko biết ai mới học có dính chưởng này như em ko????? :laycu:

Ha ha, post xong mới thấy bài của bác hbaocr. Em dùng Keil mới nhất down trên trang của Keil ấy, hình như là RV nhưng mà sau đó em còn phải down cái CARM về cài vào (có lỗi gì đó em search trên trang của Keil down cái fix về)
Thực ra cái code này em tự code lại (chủ yếu sửa cho đúng BaudRate thôi) theo code mẫu down từ trang Hethongnhung, đem về copy sang, chỉnh sửa chút ít.
Quan trọng nhất là bác có thể giải thích hộ em vấn đề Getchar() với Putchar() ko? Vì ko dùng hàm printf() thì buồn lắm, tiện thể em gửi bác cái lỗi mà Keil nó báo em:
Main.c(6): error: #79: expected a type specifier --> lỗi báo với dòng "int putchar(int ch)"

hbaocr
14-08-09, 08:51
Đợi các bác trả lời lâu quá, sau vài ngày ôm Keil ARM em phát hiện vài điều sau, có gì sai các bác lượng thứ:
- Stdio.h của Keil nhà em có vấn đề, viết các hàm getchar() với putchar() thế nào nó ko dịch cho, trong khi code em down trên mạng về giống hệt dịch ngon lành chạy.
- Em chán tự viết hàm kiểu printf() nó lại dịch và chạy ngon lành (nhưng mà phải sửa hàm thành get_char() với put_char(), khác tên hàm kia)
Nói chung em ko rõ cái này lắm mất 3 hôm vật lộn với UART, hic hic. Ko biết ai mới học có dính chưởng này như em ko????? :laycu:

Ha ha, post xong mới thấy bài của bác hbaocr. Em dùng Keil mới nhất down trên trang của Keil ấy, hình như là RV nhưng mà sau đó em còn phải down cái CARM về cài vào (có lỗi gì đó em search trên trang của Keil down cái fix về)
Thực ra cái code này em tự code lại (chủ yếu sửa cho đúng BaudRate thôi) theo code mẫu down từ trang Hethongnhung, đem về copy sang, chỉnh sửa chút ít.
Quan trọng nhất là bác có thể giải thích hộ em vấn đề Getchar() với Putchar() ko? Vì ko dùng hàm printf() thì buồn lắm, tiện thể em gửi bác cái lỗi mà Keil nó báo em:
Main.c(6): error: #79: expected a type specifier --> lỗi báo với dòng "int putchar(int ch)"

kà kà; kô phải lỗi của file stdio.h đâu!
nếu mình đoán kô lầm thì bạn đang sài keil 3.05. hii
project dau của bạn lỗi vì nó cofig là dùng realview complie nên nó dùng thu vien stdio.h của RV. muốn sử dụng thư viện này bạn phải "retarget" 2 fuction là senchar(); và getkey() thay vì putchar và getchar như của keilCARM complier!
đây là file retarget
/************************************************** ****************************/
/* RETARGET.C: 'Retarget' layer for target-dependent low level functions */
/************************************************** ****************************/
/* This file is part of the uVision/ARM development tools. */
/* Copyright (c) 2005 Keil Software. All rights reserved. */
/* This software may only be used under the terms of a valid, current, */
/* end user licence from KEIL for a compatible version of KEIL software */
/* development tools. Nothing else gives you the right to use this software. */
/************************************************** ****************************/

#include <stdio.h>
#include "serial0.h"

#pragma import(__use_no_semihosting_swi)


//extern long timeval; /* in Time.c */


struct __FILE { int handle; /* Add whatever you need here */ };
FILE __stdout;
FILE __stdin;


int fputc(int ch, FILE *f) {
return (sendchar(ch));
}

int fgetc(FILE *f) {
return (sendchar(getkey()));
}


int ferror(FILE *f) {
/* Your implementation of ferror */
return EOF;
}


void _ttywrch(int ch) {
sendchar (ch);
}


void _sys_exit(int return_code) {
while (1); /* endless loop */
}


đây là file fuction
#include "LPC214x.H" // LPC2148 MPU Register
#include "serial0.h"

/******************************/
/* Initial UART0 = 9600,N,8,1 */
/* VPB(pclk) = 60.00 MHz */
/******************************/
/******************************/
/* Write Character To UART0 */
/******************************/
int sendchar (int ch)
{
if (ch == '\n')
{
while (!(U0LSR & 0x20)); // Wait TXD Buffer Empty
U0THR = 0x0D; // Write CR
}
while (!(U0LSR & 0x20)); // Wait TXD Buffer Empty
return (U0THR = ch); // Write Character
}

/*****************************/
/* Read Character From UART0 */
/*****************************/

int getkey (void)
{
while (!(U0LSR & 0x01)); // Wait RXD Receive Data Ready
return (U0RBR); // Get Receice Data & Return
}


void init_serial0 (void)
{
PINSEL0 &= 0xFFFFFFF0; // Reset P0.0,P0.1 Pin Config
PINSEL0 |= 0x00000001; // Select P0.0 = TxD(UART0)
PINSEL0 |= 0x00000004; // Select P0.1 = RxD(UART0)

U0LCR &= 0xFC; // Reset Word Select(1:0)
U0LCR |= 0x03; // Data Bit = 8 Bit
U0LCR &= 0xFB; // Stop Bit = 1 Bit
U0LCR &= 0xF7; // Parity = Disable
U0LCR &= 0xBF; // Disable Break Control
U0LCR |= 0x80; // Enable Programming of Divisor Latches

// U0DLM:U0DLL = 15.00 MHz / [16 x Baud]
// = 15.00 MHz / [16 x 9600]
// = 97.6 = 98 = 0062H
U0DLM = 0x00; // Program Divisor Latch(391) for 9600 Baud
U0DLL = 0x62;

U0LCR &= 0x7F; // Disable Programming of Divisor Latches

U0FCR |= 0x01; // FIF0 Enable
U0FCR |= 0x02; // RX FIFO Reset
U0FCR |= 0x04; // TX FIFO Reset
U0FCR &= 0x3F;
}

Auto_engine
14-08-09, 15:33
Cảm ơn anh hbaocr trả lời hộ em. Em cũng đã để ý tới sự sai khác này, vì khi vào Options for Target nó hiện ra 2 cách config khác nhau:
- 1 cách config mỳ ăn liền ngay code, dịch chạy ngon lành.
- 1 cách config kia thì luôn xuất hiện lỗi đó mặc dù là từ Keil trong máy em ra.

http://www.dientuvietnam.net/forums/attachment.php?attachmentid=17591&stc=1&d=1250238683
- Cái đầu tiên màn hình Options for Target, chuyển tới tab Target thì bên tay phải có Code generation cho mình chọn chế độ ARM-mode hoặc Thumb-mode (cái này em nghĩ của RV)

http://www.dientuvietnam.net/forums/attachment.php?attachmentid=17590&stc=1&d=1250238683
- Cái thứ 2 thì màn hình Options for Target, chuyển tới tab Target thì bên tay phải lại là các box cho mình tích vào có box Big Endian bỏ trống (chắc là thuộc CARM)

Xem ra có vẻ lằng nhằng, chả hiểu tối qua em nghịch thế nào thì đến sáng mọi thứ chạy tốt lắm làm project UART nào là chạy project đấy, nhưng sau khi thấy Keil ra phiên bản 3.80a, hứng chí em down về thì ôi thôi mọi việc lại trở về như cũ.
Anh hbaocr có cách nào giúp em chỉ sử dụng CARM(soft down về dùng, chứ em ngó trên trang của Keil toàn RV hic) ko, vì em thấy quyển "The Insider's guide to the Phillips ARM7-Based MicroControllers" của Hitex có hg dẫn học khá đầy đủ (em cũng đang học nó + Datasheet).
Thanks anh.

Auto_engine
16-08-09, 09:55
Cuối cùng thì nhờ anh Hbaocr + Help của Keil RV thì em cũng làm đc UART (hic ko có nó làm mấy cái Timer, Counter, ADC sau này biết thế nào :-w).
Kết quả đơn giản hơn em nghĩ nhiều. Sau đây em xin trình bày chút xíu cái fault này cho các bạn học ARM sau này dùng RV mà đọc phải các tài liệu hướng dẫn dùng CARM:
- Dùng UART cứ đọc sơ sơ Datasheet của LPC (em dùng LPC mà) để biết khái niệm chút (còn nếu ai lười thì chuyển bước tiếp theo cũng ko sao)
- Đọc tài liệu ARM, các tut viết về UART, có thời gian thì nghiên cứu nó 1 chút, cũng dễ hiểu thôi, ko thì copy hoàn toàn đoạn code của họ vào (ko biết có vi phạm bản quyền ko nhỉ :-SS).
Quan trọng là nếu các hàm truyền nhận là putchar(), getchar() thì phải đổi tên lại thành:
putchar() --> sendchar()
getchar() --> getkey()
- Cuối cùng bạn add thêm file "retarget.c" trong thư mục của Keil RV vào hình như là Keil/ARM/Startup, cuối cùng dùng các hàm của thư viện Stdio.h như bình thường.

Em có đọc trên net một số chỗ, nếu các hàm putchar(), getchar() này viết cho thiết bị ngoại vi nào thì printf() sẽ send ra cho thiết bị ngoại vi đó. Do đó nó khá thuận tiện, ai thích thì có thể viết lại gửi ra LCD, thiết bị khác ngoài UART. :))
Chúc anh em chủ nhật vui vẻ.:rose:

hongtam
29-08-09, 10:29
Xin mấy bác chỉ em sử dụng ngắt của con LPC2103 với. Mò hoài nhưng vẫn chưa được.
Em muốn sử dụng ngắt của UART0, chỉ sử dụng ngắt Rx thôi, khi nhận được 1 ký tự từ bàn phím thì ngắt xảy ra. trong CT phục vụ ngắt thì gửi lại ký tự đó lại cho UART0. Sau đây là các CT con và CT chính em viết:
* uart.c
#include "uart.h"
#include "lpc210x.h"


unsigned char UARTInit (unsigned int baudrate) //config for UART0
{
unsigned int Fdiv;

UART0_LCR = 0x83;
Fdiv = (15000000 / (16 *baudrate)) ;
UART0_DLM = Fdiv / 256;
UART0_DLL = Fdiv % 256;

UART0_LCR = 0x03; //disable acess to divisor latch reg
UART0_FCR = 0x07; // Enable and reset TX and RX FIFO.

UART0_IER = 0x01;
VICVectAddr6 = (unsigned int)UART_ISR;
VICVectCntl0 = 0x26;
VICIntEnClr = 0xFFFFFFFF;
VICIntEnable = (1 << 6);
return 1;

}




unsigned char UARTIsDataReady ()
{
if (UART0_LSR & 0x01) return 1;
else return 0;
}

void UARTPutChar (unsigned char character)
{
while (!(UART0_LSR & 0x20)) ;
UART0_THR = character;
}


unsigned char UARTGetChar ()
{
while (!UARTIsDataReady(0));
return UART0_RBR;
}

void UART_ISR (void)
{
UARTPutChar(UARTGetChar(0));
????????? // chỗ này phải có lệnh gì giống RETI bên 89C51 nhảy về CT được đúng không các bác
}

*uart.h
unsigned char UARTInit (unsigned int baudrate);
void UARTPutChar (unsigned char character);
unsigned char UARTGetChar ();
unsigned char UARTIsDataReady ();
extern void UART_ISR (void) __attribute__ ((interrupt("IRQ")));


*main.c
Initialize();
PINSEL0 = 0x00000005;
FIODIR0 = 0x01;
UARTInit (9600);

while (1)
{

}

hongtam
31-08-09, 10:58
Bác nào biết dùng ngắt UART cho lpc2103 chỉ dùm em với...Thank

hbaocr
03-09-09, 14:24
Bác nào biết dùng ngắt UART cho lpc2103 chỉ dùm em với...Thank

hehe gửi bạn nguyên ổ luôn nè! Interrupt UART
good luck

apple
12-09-09, 08:13
Trong Key Feature của ARM LPC2138 có ghi ISP-In System Programming wiith on-chip Bootloader. Điều này có nghĩa là ta ko cần dùng mạch nạp riêng mà chỉ cần dùng chương trình Flash LPC2000 và nạp qua bộ USART của chip là được hả các bác

hbaocr
13-09-09, 21:17
Trong Key Feature của ARM LPC2138 có ghi ISP-In System Programming wiith on-chip Bootloader. Điều này có nghĩa là ta ko cần dùng mạch nạp riêng mà chỉ cần dùng chương trình Flash LPC2000 và nạp qua bộ USART của chip là được hả các bác
uh; kô cần mạch nạp!!!! cắm cổng COM vô là nạp! nhớ chuyển mức RS232 bằng MAXX232 nhé!

Connection
17-09-09, 11:20
Up luôn cho các bạn code của mudole SPI của LPC2103

kaka_pato
21-09-09, 23:06
em đã làm theo hướng dẫn của anh Bảo add file retarget va sửa thành 2 file sendchar() va getkey() nhưng sao khi mo phỏng protues thi hàm printf không xuất được cái gia trị co dạng float ma ( chỉ xuất được 1 lần giá trị 0.0 va sau đó đứng .

và cho em hỏi 1 vấn đề nữa : trong A/D control register ( AD0CR co bit BURST có remark là start bit fải là 000 khi BURST=1 ỏ chuyển đổi sẽ không bắt đầu ( anh Bảo có ghi trong phần hướng dẫn về ADC ) nhưng code mẫu ngay bên dưới thi lại cho các bit start la 001 ứng với điều kiện start conversion now .

code init cho ADC
/**********************************/
// Initial ADC0 (ADCR=0x01210601)
ADINTEN = 0; // Disable ADC Interrupt
ADCR &= 0x00000000; // Clear All Bit Control
ADCR |= 0x00000001; // Select ADC = AIN0
ADCR |= 0x00000600; // ADC Clock = VBP(PCLK) / 7
ADCR |= 0x00010000; // Busrt = 1 = Conversion Continue
ADCR &= 0xFFF1FFFF; // CLKS = 000 = 10Bit : 11 Cycle Clock Conversion
ADCR |= 0x00200000; // PDN = 1 = Active ADC Module
ADCR &= 0xFF3FFFFF; // TEST[1:0] = 00 = Normal Mode
ADCR &= 0xF7FFFFFF; // EDGE = 0 = Conversion on Falling Edge
ADCR |= 0x01000000; // START = 001 = Start Conversion Now

/******************************************/
code cho uart
code em chỉ sửa baudrate cho phù hớp
#include <LPC2103.H> // LPC2103 MPU Register
#include <stdio.h> // For Used Function printf

/* pototype section */
void init_serial0 (void); // Initil UART-0
int sendchar (int ch); // Put Char to UART-0
int getkey (void); // Get Char From Uart-0
void delay(unsigned long int); // Delay Time Function


unsigned int val=6; // ADC Result (HEX)
float volt; // ADC Result Volt

int main(void)
{
init_serial0(); // Initial UART0 = 9600,N,8,1
printf("ET-ARM7 BASE LPC2103...TEST ADC-0(P0.22)\n"); // Call prinff Function
while(1)
{
printf("\rADC0 Result = %10.1f Volt.\n",volt); // Display 3-Digit Result(0-3.3V)
delay(100000);
volt = volt + 1.0;
}
}

/******************************/
/* Initial UART0 = 9600,N,8,1 */
/* VPB(pclk) = 29.4912 MHz */
/******************************/
void init_serial0 (void)
{
PINSEL0 &= 0xFFFFFFF0; // Reset P0.0,P0.1 Pin Config
PINSEL0 |= 0x00000001; // Select P0.0 = TxD(UART0)
PINSEL0 |= 0x00000004; // Select P0.1 = RxD(UART0)

U0LCR &= 0xFC; // Reset Word Select(1:0)
U0LCR |= 0x03; // Data Bit = 8 Bit
U0LCR &= 0xFB; // Stop Bit = 1 Bit
U0LCR &= 0xF7; // Parity = Disable
U0LCR &= 0xBF; // Disable Break Control
U0LCR |= 0x80; // Enable Programming of Divisor Latches

// U0DLM:U0DLL = 29.4912MHz / [16 x Baud]
// = 29.4912MHz / [16 x 9600]
// = 192 = 0x00C0
U0DLM = 0x00; // Program Divisor Latch(192) for 9600 Baud
U0DLL = 0x5A;

U0LCR &= 0x7F; // Disable Programming of Divisor Latches

U0FCR |= 0x01; // FIF0 Enable
U0FCR |= 0x02; // RX FIFO Reset
U0FCR |= 0x04; // TX FIFO Reset
U0FCR &= 0x3F;
}

/****************************/
/* Write Character To UART0 */
/****************************/
int sendchar (int ch)
{
if (ch == '\n')
{
while (!(U0LSR & 0x20)); // Wait TXD Buffer Empty
U0THR = 0x0D; // Write CR
}
while (!(U0LSR & 0x20)); // Wait TXD Buffer Empty
return (U0THR = ch); // Write Character
}

/*****************************/
/* Read Character From UART0 */
/*****************************/
int getkey (void)
{
while (!(U0LSR & 0x01)); // Wait RXD Receive Data Ready
return (U0RBR); // Get Receice Data & Return
}

/***********************/
/* Delay Time Function */
/* 1-4294967296 */
/***********************/
void delay(unsigned long int count1)
{
while(count1 > 0) {count1--;} // Loop Decrease Counter
}

thienlong198
24-09-09, 02:11
Em dùng LPC2124 muốn giao tiếp với LCD 16x2 nhưng em băn khoăn là MCU hoạt động ở mức điện áp 3.3V còn LCD thì 5V liệu có giao tiếp được không ?
mong mọi người giúp !

kamejoko80
24-09-09, 22:15
Em dùng LPC2124 muốn giao tiếp với LCD 16x2 nhưng em băn khoăn là MCU hoạt động ở mức điện áp 3.3V còn LCD thì 5V liệu có giao tiếp được không ?
mong mọi người giúp !

Kết nối vô tư bạn ah :-c

kaka_pato
27-09-09, 07:12
không ai giúp đỡ em sao,co ai có chỉ giúp em với , em cám ơn !!!

hoangdieupro
06-10-09, 14:34
help?
E đang tìm hieu về module phím capsens,dùng LPC 2148,nhung ngõ ra ADC thieu,vay co cach nao de tao ra nhieu ngo ra adc tu mot hoac nhieu chan cua LPC ko/

hbaocr
07-10-09, 22:54
help?
E đang tìm hieu về module phím capsens,dùng LPC 2148,nhung ngõ ra ADC thieu,vay co cach nao de tao ra nhieu ngo ra adc tu mot hoac nhieu chan cua LPC ko/
dùng IC analog SW :HCT4051 :
1 kenh ADC + 1 con IC 4051+3 GPIO= 8 ADC chanel input

robotden
10-10-09, 01:30
PINSEL0, PINSEL1, PINSEL2 dùng cho việc cấu hình chức năng cho PORT0.
PINSELx không thấy đề cập cho PORT1, có lẽ khi reset LPC thì PORT1 được cấu hình thành GPIO rồi. Bạn hãy thí nghiệm bằng cách xuất giá trị ra PORT1, gắn vào dãy LED kiểm tra thì sẽ rõ.

hình như anh K nhầm chỗ này rùi. PINSEL0 và PINSEL1 dùng cho PORT0 còn PINSEL2 dùng cho PORT1 mà anh.cụ thể:
bit 2 (GPIO/DEBUG): =0: P1.26-P1.31 là GPIO,=1 thì dùng cho Debug
bit 3(GPIO/TRACE):=0: P1.16-P1.25 là GPIO,=1 thì dùng cho Trace
chúc vui

teovubk
10-10-09, 23:56
em dung KeilC de dịc thi minh xai duoc lenh printf ko vay cac pac? em dung no ma sao bao loi hoai a? mong cac cao thu chi giao

hbaocr
11-10-09, 11:57
thì mình trả lời về printf trong keil C
KIEL C hiện nay có 2 loại :
1.version 3.05 trở xuống (vd ver 3.24 ,3.01a..) sử dụng complier là CARM ( của hitech).Véion nay ko còn đc keil tiếp tục support nữa. khi sử dung printf thi ngaoi viec include "stdio.h" thì fai viet thêm 2 cái hàm getchar và putchar như hương dẫn ở những page trước!
2.version 3.05 trở lên ( vd ver 3.11, 3.22 ....) :sử dụng complier mới là realview(hình như của ADS thì phải hok nhớ rõ).Version này đang dc support.bạn down keil trên mạng ở keil.com thì là bản này dùng RV. khi sử dung printf thi ngaoi viec include "stdio.h" thì fai làm như hướng dẫn ở bài trên.
good luck

teovubk
12-10-09, 13:55
cho minh hoi: che do Fast GPIO va Slow GPIO khac nhau nhu the nao? khi nao nen dung Fast GPIO? em thay toan xai Slow GPIO ko a nen thiet nghi fai co muc dich j do nguoi ta moi thiet ke vay? mong thinh giao cac pac.

teovubk
15-10-09, 11:01
em moi tim hieu nen chag ranh VDK lam.gio em mun ket noi ARM2103 voi PC de truyen thong UART thi co can phai qua MAX232 j do ko? hay la cu ket noi thag.Em doc qua datasheet no keu: P0.0(TXD0),P0.1(RXD0). vay la mih ket noi:
+TXD0-> Rx
+RXD0->Tx cua COM port ha may pac? Em so ket noi nham no ma chit la em cug die wa.

teovubk
15-10-09, 16:01
loay hoay cả ngày mà hok xong được UART các pác ơi.em đọc dữ liệu về bằng chương trình Terminal ma toàn ra cái j đâu ko a? mấy các jups em cái.đ
code em nhờ các pác coi giuèm:
/************************************************** **/
/* Examples Program For "CP-JR ARM7 LPC2138" Board */
/* Target MCU : Philips ARM7-LPC2138 */
/* : X-TAL : 19.6608 MHz */
/* : Run Speed 58.9824 MHz (With PLL) */
/* : PLL Setup = M(3),P(2) */
/* : VPB Clock = CPU Clock = 58.9824MHz */
/* Keil Editor : uVision3 V3.03a */
/* Compiler : Keil CARM V2.50a */
/* Create By : Eakachai Makarn (WWW.ETT.CO.TH) */
/* Last Update : 17/May/2006 */
/* Function : Example Use UART0 */
/************************************************** **/
// Print Message to UART0 (9600,N,8,1)
#include "LPC2103.H" // LPC2138 MPU Register
/* pototype section */
void init_serial0 (void); // Initil UART-0 // Get Char From Uart-0

int main(void)
{
char c[] = "HELLO";
int i = 0; // Char Buffer For UART
init_serial0(); // Initilial UART0 = 9600,N,8,1
while(1) // Loop Continue
{
U0THR = c[i];
// phat cho toi khi gap null chacracter
if( c[i] == '\n')
{
while (!(U0LSR & 0x20));
U0THR = 0x0D;
}
while (!(U0LSR & 0x20)); // wait TXD buffer empty
i++;
}
}

/******************************/
/* Initial UART0 = 9600,N,8,1 */
/* VPB(pclk) = 58.9824 MHz/2 */
/******************************/
void init_serial0 (void)
{
PINSEL0 &= 0xFFFFFFF0; // Reset P0.0,P0.1 Pin Config
PINSEL0 |= 0x00000001; // Select P0.0 = TxD(UART0)
PINSEL0 |= 0x00000004; // Select P0.1 = RxD(UART0)

U0LCR &= 0xFC; // Reset Word Select(1:0)
U0LCR |= 0x03; // Data Bit = 8 Bit
U0LCR &= 0xFB; // Stop Bit = 1 Bit
U0LCR &= 0xF7; // Parity = Disable
U0LCR &= 0xBF; // Disable Break Control
U0LCR |= 0x80; // Enable Programming of Divisor Latches

// U0DLM:U0DLL = 29.4912MHz / [16 x Baud]
// = 29.4912MHz / [16 x 9600]
// = 192 = 0x00C0
U0DLM = 0x00; // Program Divisor Latch(192) for 9600 Baud
U0DLL = 0xC0;

U0LCR &= 0x7F; // Disable Programming of Divisor Latches

U0FCR |= 0x01; // FIF0 Enable
U0FCR |= 0x02; // RX FIFO Reset
U0FCR |= 0x04; // TX FIFO Reset
U0FCR &= 0x3F;
}

hongtam
15-10-09, 23:42
Mình dùng con lcp2103. Mình cần dùng timer để tạo delay chính xác. Bác biết về vụ này giúp mình tí.
Đây là chương trình con tạo delay mình viết:
void delay_timer0 (U32 us)
{
TIMER0_CTCR = 0x00000000; // TIMER0 = CHE DO TIMER
TIMER0_MR0 = us; // thoi gian delay = (1 us) * MR0
TIMER0_MCR = 0x00000004; // TAT timer0 sau khi match
TIMER0_PR = 0x0000000E; // CLOCK CUA TIMER0 = PCLK/(PR +1) = 15MHz/(14 + 1) = 1Mhz
TIMER0_TCR = 0x00000002; // RESET TIMER0
TIMER0_TCR = 0x00000001; // CHAY TIMER0
while ( (TIMER0_TCR & 0x01) == 0x01 ); // DOI TIMER0 MATCH
}
Có phải thời gian delay của CT con này là: t = (1us) * us (biến cần nhập vào) ko vậy? Sao mà mình để us = 1.000.000 thì delay nhiều hơn 1 giây.

vietelec
16-10-09, 09:21
Có bác nào đã có kinh nghiệm về giao tiếp arm với usb xin chỉ giáo.

hbaocr
16-10-09, 14:32
Mình dùng con lcp2103. Mình cần dùng timer để tạo delay chính xác. Bác biết về vụ này giúp mình tí.
Đây là chương trình con tạo delay mình viết:
void delay_timer0 (U32 us)
{
TIMER0_CTCR = 0x00000000; // TIMER0 = CHE DO TIMER
TIMER0_MR0 = us; // thoi gian delay = (1 us) * MR0
TIMER0_MCR = 0x00000004; // TAT timer0 sau khi match
TIMER0_PR = 0x0000000E; // CLOCK CUA TIMER0 = PCLK/(PR +1) = 15MHz/(14 + 1) = 1Mhz
TIMER0_TCR = 0x00000002; // RESET TIMER0
TIMER0_TCR = 0x00000001; // CHAY TIMER0
while ( (TIMER0_TCR & 0x01) == 0x01 ); // DOI TIMER0 MATCH
}
Có phải thời gian delay của CT con này là: t = (1us) * us (biến cần nhập vào) ko vậy? Sao mà mình để us = 1.000.000 thì delay nhiều hơn 1 giây.

1.truoc het; bạn phai xem minh su dung thach anh nao 11.059 ; 19.6608 hay 12 MHZ
2.sau do; xem lai start up : VPCLK bang bao nhieu (VPDIV =1 ;2;4) để xem có đúng không!Truong hop cua ban o tren minh đoán thach anh la 12 M va vpdiv=4 he so nhan la 5.
3.Di nhien là se khong đugn chính xác vi con fai thuc hien cac lenh trong ham nua;