به نام خدا : تو این دو مطلب پروژه آرم، میخاوم یه ۶-۷ تا پروژه قرار بدم، درباره UART میکروکنترلر LPC176X/5X، و یه کتابخونه ایجاد خواهیم کرد و تو هر پروژه ارتقاش میدیم، هر پروژه نسبت به پروژه قبلیش یه سطح بالاتر هستش و مشکل پروژه قبلیش رو حل کرده، و باز خودش مشکلی داره که تو پروژه بعدی حل میشه، روال پروژه های این دو مطلب به همین صورته، بیشتر آموزش پروژه محور هستن، آموزش منظم و کامل رجستر ها هم بعد این دو مطلب در سایت قرار میگیره؛ تمام پروژه های این دو مطلب ( کلا هر چی پروژه و مطلب و … تو سایت هستش ) در عمل تست شده.
پروژه arm ارتباط سریال uart میکروکنترلر lpc1768 ق۱
پروژه آرم با میکروکنترلر LPC17xx – پروژه ۱
این پروژه : تو این پروژه ارسال و دریافت انجام میدیم، بدون استفاده از وقفه.
شماتیک پروژه :
یه ماژول USB TO TTL میخرید، من از CP2012 استفاده میکنم، اینو گیر بیارید خیلی خوب میشه؛ پایه TX اش رو به پایه P0.3 و پایه RX اش رو به پایه P0.2 میکرو و GND ایش رو به GND میکرو وصل کنید و بعد ماژول فوق رو به کامپیوتر وصل کنید؛ بعد یکی برید لینک بالا و یه نرم افزار برا ارتباط سریال انتخاب کنید و دانلود کنید و شروع کنید به تبادل داده با میکروکنترلر تون ^_^
کد پروژه :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
#include <lpc17xx.h> // UART0 FIFO Control Register(FCR) #define _FifoEnable ۰ #define _RxFifoReset ۱ #define _TxFifoReset ۲ #define _DmaModeSelect ۳ #define _RxTriggerLevel ۶ // UART0 Line Control Register(LCR) #define _WordLengthSelect ۰ #define _StopBitSelect ۲ #define _ParityEnable ۳ #define _ParitySelect ۴ #define _BreakControl ۶ #define _DLAB ۷ // DivisorLatchAccessBit // UART0 Line Status Register(LSR) #define _RDR ۰ // ReceiverDataReady #define _OE ۱ // OverrunError #define _PE ۲ // ParityError #define _FE ۳ // FramingError #define _BI ۴ // BreakInterrupt #define _THRE ۵ // TransmitterHoldingRegisterEmpty #define _TEMT ۶ // TransmitterEmpty #define _RXFE ۷ // ErrorInRXFIFO // UART0 Fractional Divider Register(FDR) #define _DIVADDVAL 0 #define _MULVAL ۴ // UART0 Divisor Latch LSB register(DLL) #define _DLLSB 0 // UART0 Divisor Latch MSB register(DLM) #define _DLMSB 0 // UART0 Transmit Holding Register(THR) #define _THR 0 // UART0 Receiver Buffer Register(RBR) #define _RBR 0 void initialization(uint32_t baudrate) { uint32_t var_UART0ClockDivider_u32, var_UART0Clock_u32, var_RegValue_u32; // ۰b00000000,00000000,00000000,01010000 = 0x00000050 // Set P0.2(TXD0) And P0.3(RXD0) to USART LPC_PINCON -> PINSEL0 = 0x00000050; // ۰b00000000,00000000,00000000,00000000 = 0x00000000 // P0.2(TXD0) And P0.3(RXD0) -> pull-up // LPC_PINCON -> PINMODE0 = 0x000000A0; // Enable FIFO & Reset Rx/Tx FIFO buffers LPC_UART0 -> FCR = (0<<_RxTriggerLevel) | (0<<_DmaModeSelect) | (1<<_TxFifoReset) | (1<<_RxFifoReset) | (1<<_FifoEnable); // ۸bit data, 1Stop bit, No parity LPC_UART0 -> LCR = (1<<_DLAB) | (0<<_BreakControl) | (0<<_ParitySelect) | (0<<_ParityEnable) | (0<<_StopBitSelect) | (3<<_WordLengthSelect); // Get the "UART0 Clock Divider" from PCLKSELx register 7-6 bits var_UART0ClockDivider_u32 = (LPC_SC->PCLKSEL0 >> 6) & 0x03; switch( var_UART0ClockDivider_u32 ) { case 0x00: var_UART0Clock_u32 = SystemCoreClock/4; break; case 0x01: var_UART0Clock_u32 = SystemCoreClock/1; break; case 0x02: var_UART0Clock_u32 = SystemCoreClock/2; break; case 0x03: var_UART0Clock_u32 = SystemCoreClock/8; break; } var_RegValue_u32 = ( var_UART0Clock_u32 / (16 * baudrate )); LPC_UART0->DLL = var_RegValue_u32 & 0xFF; LPC_UART0->DLM = (var_RegValue_u32 >> 8) & 0xFF; // Clear DLAB after setting DLL,DLM LPC_UART0->LCR &= ~(1<<_DLAB); } void write(char data) { while( !((LPC_UART0 -> LSR) & (1 << _THRE)) ); // صبر میکنیم تا دیتای قبلی ارسال بشه LPC_UART0 -> THR = data; // دادن اطلاعات به بایت بالایی حافظه فیفو ارسال داده } void print(char *data) { unsigned char i; for(i=0; data[i]!='\0'; i++) write( data[i] ); } void println(char *data) { print(data); write('\n'); } void printNumber(int data, int base) { char buf[8 * sizeof(long) + 1]; char *str = &buf[sizeof(buf) - 1]; char c; unsigned long m; *str = '\0'; // prevent crash if called with base == 1 if (base < 2) base = 10; do { m = data; data /= base; c = m - base * data; *--str = c < 10 ? c + '0' : c + 'A' - 10; } while(data); print( str ); } char readData(void) { while( !((LPC_UART0 -> LSR) & ((1 << _RDR))) ); // تا زمانی که دیتا دریافت نکردیم صبر میکنیم return LPC_UART0 -> RBR; // دادن اطلاعات به بایت بالایی حافظه فیفو دریافت داده } int main() { initialization(9600); write('a'); write('\n'); print("DMF"); printNumber(313, 10); println(".IR"); while(1) { write( readData() ); println("^_^\n"); }; } |
توضیح پروژه بالا رو در زیر به صورت مفصل میدم، خوب بخونید که دیگه دفه های بعد این قدر توضیح نمیدم :
خب بریم سراغ توضیح تابع initialization که برا راه اندازی اولیه UART0 هستش ( حالا شما برا تمرین میتونید همین پروژه رو با UART1 و یا UART3 انجام بدید – کار خاصی نداره – یعنی اگه نتونستید – با کله برید تو دیوار – از شوخی بگذریم ولی خب سعی کنید انجامش بدید حالا با چند بار تست و خطا کردن زیاد مهم نیست – مهم اینه که آخر سر انجامش بدید)، چیز جالبی که این تابع داره اینه که برا راه اندازی UART فقط Baud Rate رو باید بهش بدی ^_^ این یعنی سادگی کار در برنامه نویسی های آینده :
1 |
uint32_t var_UART0ClockDivider_u32, var_UART0Clock_u32, var_RegValue_u32; |
۰) تعریف چند تا متغییر که در این تابع نیاز داریم بهشون؛ در هر قسمت که برسیم، کار هر کدوم رو متوجه میشید.
1 2 3 |
// ۰b00000000,00000000,00000000,01010000 = 0x00000050 // Set P0.2(TXD0) And P0.3(RXD0) to USART LPC_PINCON -> PINSEL0 = 0x50; |
۱) تعیین نقش پایه های P0.2 و P0.3 به عنوان UART0؛ در کد بالا به ساده ترین روش ممکن مقدار دهی کردم، در آینده منظور حرفم رو میفهمید. ^_^
توجه : اگه فراموش کردید به مطلب مقابل برید : آموزش آرم lpc1768 جلسه ۱ pin connect block
1 2 3 |
// ۰b00000000,00000000,00000000,00000000 = 0x00000000 // P0.2(TXD0) And P0.3(RXD0) -> pull-up // LPC_PINCON -> PINMODE0 = 0x000000A0; |
۲) با توجه به نکته ای که در جلسات قبل گفتم نباید در پایه دریافت اطلاعات مقاومت داخلی pull-down رو فعال کنید ( اگه فعال کنید، دریافت کننده اطلاعات UART کار نمیکنه -تست کردم که دارم میگم^_^- ) و چون در حالت عادی مقاومت داخلی pull-up تمام پایه ها فعاله و این مورد مشکلی برا ما ایجاد نمیکنه، لذا کاری با ریجستر PINMODE0 نداریم.
توجه مهم : بهتره مقاومت داخلی pull-up پایه های ارسال و دریافت رو بزارید فعال بمونه و غیر فعالش نکنید.
1 2 |
// Enable FIFO & Reset Rx/Tx FIFO buffers LPC_UART0 -> FCR = (0<<_RxTriggerLevel) | (0<<_DmaModeSelect) | (1<<_TxFifoReset) | (1<<_RxFifoReset) | (1<<_FifoEnable); |
۳) در این مرحله اومدیم حافظه فیفو ارسال و دریافت رو از اطلاعات خالی کردیم، چون ممکنه از آخرین باری که میکرو روشن بوده، اطلاعاتی داخل این بافر ها بوده باشه؛ و همچین FIFO رو هم فعال کردیم.
توجه ۱ : با بیت های RX Trigger Level ( چه تعداد دیتا باید دریافت شود تا وقفه یا درخواست DMA فعال بشه ) هم فعلا کاری نداریم چون از وقفه استفاده نمیکنیم و این مورد برامون مهم نیست؛ یرخی فقط میخوایم اطلاعات رو دریافت کنیم ^_^
1 2 |
// ۸bit data, 1Stop bit, No parity LPC_UART0 -> LCR = (1<<_DLAB) | (0<<_BreakControl) | (0<<_ParitySelect) | (0<<_ParityEnable) | (0<<_StopBitSelect) | (3<<_WordLengthSelect); |
۴) در این قسمت اومدم فرمت دیتا رو تعیین کردم، و بیت (Divisor Latch Access Bit (DLAB رو هم ۱ کردم ( تا بتونم به ریجسترهای UnDLL و UnDLM دسترسی داشته باشم و بتونم Baud Rate رو تعیین کنم و بعد که تعیین کردیم، تو ۳ سوت ^_^ مقدارش رو ۰ میکنیم تا بتونیم به ریجستر های RBR و THR و IER دسترسی داشته باشم – این کارا رو در ادامه انجام میدم و توضیح میدم )
1 2 |
// Get the "UART0 Clock Divider" from PCLKSELx register 7-6 bits var_UART0ClockDivider_u32 = (LPC_SC->PCLKSEL0 >> 6) & 0x03; |
۵) تو این خط کاری به رجیسترش نداشته باشید ( بعد تمام شدن مطالب UART توضیح میدم مبحط کلاک و POWER رو، فعلا بیخیال شید و هر چی من گفتم شما تایید کنید ^_^ )؛ خب تو این خط میایم بررسی میکنیم که مقدار تقسیم کننده کلاک UART0 چند تعیین شده ( در حالت عادی، تمام امکانات میکروکنترلر، تقسیم کننده کلاکشون ۴ هستش، مگر این که تغییرش بدین )؛ این مقدار در ادامه به کار میاد…
توجه : نحوه تعیین تقسیم فرکانسی ها به صورت زیر امکان پذیر هستش ( پیش خودم گفتم بگم تا تو خماری نمونید تو این قسمت O_o میبینید چقدر به فکرتون هستم ^_^ )؛ تو این قسمت ابتدا فایل مربوطه رو باز میکنیم(قسمت قرمز رنگ)، بعد میریم به صفحه مربوطه(قسمت سبز رنگ)، بعد میریم سراغ گزینه مد نظرمون و مقدارش رو تغییر میدیم که این جا UART0 چیزی هستش که ما باهاش کار داریم( قسمت صورتی رنگ )، رو اون ComboBox (دکمه کشویی) کلیک کنید تقسیم فرکانسی های ۱و۲و۴و۸ رو به ما میده و هر کدوم رو دوست داشتیم انتخاب میکنیم، همون طور که میبینید مقدار پیشفرض مقسم (تقسیم کننده!) برای تمام امکانات جانبی میکروکنترلر برابر ۴ هستش.
1 2 3 4 5 6 |
switch( var_UART0ClockDivider_u32 ) { case 0x00: var_UART0Clock_u32 = SystemCoreClock/4; break; case 0x01: var_UART0Clock_u32 = SystemCoreClock/1; break; case 0x02: var_UART0Clock_u32 = SystemCoreClock/2; break; case 0x03: var_UART0Clock_u32 = SystemCoreClock/8; break; } |
۶) خب تو قسمت قبل مقدار رجیستر مقسم فرکانسی UART0 ( مقدار رجیستر و نه خود مقدار مقسم – ۱و۲و۴و۸ – )؛ حالا تو این قسمت میایم میبینیم که کدوم مقدار مقسم انتخاب شده، به کمکش میایم کلاک اصلی رو بر اون مقدار تقسیم میکنیم و میدیم به متغییر var_UART0Clock_u32 که حاوی فرکانس کاری UART0 هستش و از این متغییر در فرمول محاسبه Baud Rate استفاده میکنیم. ( البته بگم فرمول محاسبه رجیسترهای Baud Rate درست تر هستش. )
1 |
var_RegValue_u32 = ( var_UART0Clock_u32 / (16 * baudrate )); |
۷) اینم از فرمول محاسبه ریجسترهای نرخ داده؛ در ادامه با var_RegValue_u32 کار داریم…
1 2 |
LPC_UART0->DLL = var_RegValue_u32 & 0xFF; LPC_UART0->DLM = (var_RegValue_u32 >> 8) & 0xFF; |
۸) مقدار var_RegValue_u32 رو به رجیسترهای DLL و DLM میدیم.
توجه : از ریجستر U0FDR استفاده نکردم تا کار ساده تر بشه؛ حالا شاید سوال بشه خب چرا مقدار ۰ و ۱ رو هم بهشون ندادی؟ خب اگه مطلب قبل رو خوب یادتون باشه، تو توضیح رجیستر UnFDR گفتم که در حالت عادی این ویژگی غیر فعال هستش و داریم : DIVADDVAL=0 و MULVAL=1 لذا در فرمول هم این دو رو به همین صورت مقدار دهی میکنیم.
1 2 |
// Clear DLAB after setting DLL,DLM LPC_UART0->LCR &= ~(1<<_DLAB); |
۹) بیت DLAB از رجیستر LCR رو پاک میکنیم ( بنا به دلایلی که در چند خط بالا تر گفتم و الان حال ندارم دوباره تکرار کنم ^_^ )
بریم سراغ تابع بعدی، اسم این تابع write هستش که وظیفش ارسال کاراکتر هستش؛ این تابع به صورت زیر هستش، توضیحات فارسی هم برا هر خط ذکر کردم :
1 2 3 4 |
void write(char data) { while( !((LPC_UART0 -> LSR) & (1 << _THRE)) ); // صبر میکنیم تا دیتای قبلی ارسال بشه LPC_UART0 -> THR = data; // دادن اطلاعات به بایت بالایی حافظه فیفو ارسال داده } |
جواب : خب باید صبر کنیم تا رجیتسر U0THR دیتای قبلی که بهش دادم رو به حافظه FIFO ارسال بده، و بعد بیایم بهش دیتای جدید بدیم، حالا چطور متوجه بشیم که U0THR دیتا رو به FIFO داده و الان خالی هستش؟ خب به کمک رجیستر U0LSR و بیت ۵ امش ( THRE ) میتنیم از این موضوع با خبر بشیم؛ حالا اگه رجیستر U0THR هنوز از دیتا خالی نشده، بیایم بهش دیتا بدیم چی میشه؟ خب معلومه دیتای قبلی از بین میره ^_^
تابع بعدی، readData هستش که وظیفش دریافت کاراکتر هستش؛ این تابع به صورت زیر هستش، توضیحات فارسی هم برا هر خط ذکر کردم؛ علت وجود خط ۲ در کد زیر هم معلومه، تا زمانی که در ریجستر U0RBR دیتایی نباشه نمیتونیم مقدارش رو بخونیم ^_^ :
1 2 3 4 |
char readData(void) { while( !((LPC_UART0 -> LSR) & ((1 << _RDR))) ); // تا زمانی که دیتا دریافت نکردیم صبر میکنیم return LPC_UART0 -> RBR; // دادن اطلاعات به بایت بالایی حافظه فیفو دریافت داده } |
توجه : مشکلی که این جور توابع دارند اینه که تا زمانی که دیتایی دریافت نشده تابع دریافت اطلاعات اجرا میشه، یعنی برنامه تو اون خط ۲ وای میسته و اینطوری CPU و در نتیجه کل پروژه به فنا میره، چون بقیه کارها و کدها رو نمیره اجرا کنه، لذا به همین خاطر معمولا از وقفه برا این کار استفاده میکنن و یا این که خط ۲ رو به صورت if مینویسن که اون داستان خودش رو داره ولی در کل بهترین گزینه معمولا وقفه هستش.
بقیه توابع هم ترکبی از تابع write هستن و بیشتر به بحث برنامه نویسی C مربوط میشن تا به میکروکنترلر!!! این حرفا یعنی ان که توضیح نمیدمشون ^_^ البته فعلا، حالا بعدا ببینیم چی میشه، شاید در مطلب کتابخونه UART میکروکنترلر LPC17xx توضیح دادم، شاید هم ندادم ^_^
پروژه آرم با میکروکنترلر LPC17xx – پروژه ۲
این پروژه : تو این پروژه ارسال و دریافت انجام میدیم، و از وقفه RBR ( اطلاع از دیرافت اطلاعات جدید) استفاده میکنیم.
توجه ۱ : تو این پروژه برا سادگی هرچه بیشتر کار، اومدم توابع مربوط به ارتباط سریال و راه اندازیش و ارسال و دریافت و … رو داخل یه فایل قرار دادم و از این به بعد فقط نام فایل رو تو پروژه فراخونی میکنیم ( یه جورایی اون چند تا تابع رو تبدیل به یه کتابخونه کردم، البته نمیدونم لفظ کتابخونه براش درسته یا نه ولی خب ما میگیم کتاب خونه ^_^ )؛ اینطوری پروژه هم خلوت تر میشه و هم احتمال رخ دادن هر گونه سوتی کاهش پیدا میکنه و … با این فایل کتابخونه UART که فعال برا UART0 هستش و همش ۴-۵ تا تابع داره فعلا کار داریم، در هر قسمت یه توابعی بهش اضافه میکنم و تغییراتی توش میدم.
توجه ۲ : کار دیگه که من کردم اینه که، تابع readData رو اومدم یکم بهبود دادم؛ چون بعضی اطلاعات که دیافت میشه ممکنه خطایی درشون وجود داشته باشه که من این مسئله رو اصلا بررسی نکردم، این مورد رو به تابع اضافه کردم :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
char readData(void) { char LsrRegisterValue; do { LsrRegisterValue = LPC_UART0 -> LSR; } while( !(LsrRegisterValue & (1<<_RDR)) ); // Wait While UARTn receiver FIFO is empty if( LsrRegisterValue & ((1<<_OE)|(1<<_PE)|(1<<_FE)) ) { LPC_UART0 -> RBR; // Read Data then This Data With Eror Will Clear return 0; } else { return LPC_UART0 -> RBR; // Read Data From RBR ( Top Byte of RX FIFO - Oldest Char ) } } |
شماتیک پروژه : دقیقا مثل شماتیک پروژه قبلی هستش.
کد پروژه : حال کنید، میبیند چقدر کد پروژه کوتاه شده ^_^؛ ته مطلب تموم پروژه های این مطلب رو قرار میدم، نگران کدهای فایل serial.h نباشید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include <lpc17xx.h> #include "serial.h" char DataRead; void UART0_IRQHandler(void) { DataRead = readData(); if( DataRead == 0 ) { while(1){}; } else { write( DataRead+2 ); } } int main() { initialization(9600); NVIC_EnableIRQ(UART0_IRQn); LPC_UART0->IER = (1 << _RbrInterruptEnable); // U0IER : این ریجستر برا فعال کردن ۳ منبع وقفه ارتباط سریال۰ بکار میره - وقفه دریافت اطلاعات رو فعال کردم while(1); } |
توضیح پروژه بالا : این پروژه رو من این طور نوشتم که هر دیتایی که دریافت بشه، داخل وقفه دریافت، میایم همون دیتا رو +۲ میکنیم و ارسال میکنیم؛ مثلا ۱ دریافت کنه ۳ ارسال میکنه؛ و اگه a دریافت کنه c ارسال میکنه ( اگه متوجه نشدید در باب کد اسکی یکم مطالعه کنید ) خب حالا اگه خطایی رخ بده ( حالا هر نوع خطایی که میخواد باشه )، برنامه میره تو حلقه while و دیگه کاری نمیکنه؛ البته میدونم استفاده از while اونم به این صورت داخل یه وقفه درست نیست ولی خب راه دیگه ای به ذهنم نرسید برا نمایش خطای رخ داده شد. (راه ساده تر از این ^_^ وگرنه میشد یه led هم قرار داد ولی خب حسش نبود جان داش)؛ حالا برای این که دیتایی ارسال کنید که دارای خطا باشه باید چیکار کرد؟ خب نرم افزاری که باهاش دیتا ارسال میکنید رو فرمت دیتاش رو عوض کنید، مثلا بیت توازنش رو تغییر بدید، میبینید که دیگه میکرو دیتایی ارسال نمیکنه ^_^ فیلم زیر رو هم خواستید ببیند؛ توضیحاتی در باب این پروژه، چیز خاصی توش نگفتم ولی خب ببینیدش ظرر نداره :
فعلا یا علی.
مهمان
سلام.لطفا فایل دانلود پروژه arm ارتباط سریال uart میکروکنترلر lpc1768 ق۱ را در این سایت قرار دهید.
نویسنده این مطلب
سلام – فک کنم این باشه – اگه نبود دیگه همون کدهای داخل مطلبو باید…
1 – UART – Send & Recieve Data WithOut Interrupt
مهمان
سلام وخسته نباشید.
ببخشید ارم lpc1768 با 3.3 ولت کار میکنه ولی ماژول سریال با ولت. اتصال اینها به هم مشکلی ایجاد نمیکنه؟
مهمان
سلام، ببخشید برا من خط 60 و 63 رو وقتی بیتا رو تعیین میکنم برنامه ارور میگیره،
// Enable FIFO & Reset Rx/Tx FIFO buffers
LPC_UART0 -> FCR = (0<<_RxTriggerLevel) | (0<<_DmaModeSelect) | (1<<_TxFifoReset) | (1<<_RxFifoReset) | (1< LCR = (1<<_DLAB) | (0<<_BreakControl) | (0<<_ParitySelect) | (0<<_ParityEnable) | (0<<_StopBitSelect) | (3<<_WordLengthSelect);
چراا؟
نویسنده این مطلب
سلام
تو پروژه یه چند تا از عددا انگار فارسی هستن – انگلیسیشون کنید و تست کنید.
مهمان
سلام ممنون از آموزش بسیار خوبتون.
برای شبکه کردن سه تا نود که ماژول ها ارتباط UARTبا میکروها دارند در برنامه بالا چه دستوراتی باید اضافه کنم؟
تشکر
مهمان
سلام ممنون از تدریس خیلی خوبتون.
فقط لینک پروژه ته مطلب نیستش.
نویسنده این مطلب
سلام
کد پروژه (ها) داخل مطلب هستش.
مهمان
سلام ممکنه یک نگاهی به برنامم بکنی نه warning داره نه error ولی میکروم هیچ عکس العملی نسبت بهش نشون نمیده.
https://www.dropbox.com/s/wwtjflizkutrfsz/lpc_uart0.rar?dl=0
نویسنده این مطلب
سلام-برو جلسه دوم همین مطلب و کتابخونه رو از ته مطلب دانلود کن و با اون تست کن.
مهمان
حل شد
مهمان
تو پروژه اول منظورمه
مهمان
اون ; بعد از while آخر چه کاری میکنه؟
نویسنده این مطلب
تو زبان سی بعد از هر دستور باید ; بزاری
مهمان
اول تشکر می کنم برای زحمتی که کشیدین
دوم این که برا من کار نکرد
هیچی نشون نمیده
وقتی داده میفرستم چراغ مبدل چشمک میزنه ولی وقتی میکرو رو روشن میکنم و یا ریست میکنم هیچی نمیشه. به نظرتون مشکل از کجا میتونه باشه؟
نویسنده این مطلب
سلام
برو مطلب جلسه بعد – کتابخونه آماده و آخرین نسخه اشو دانلود کن.
نمیدونم والا مشکل از کجاس – پروژه باید پیشم باشه ولی فک کنم نرخ داده – اتصالات – اینا رو باید بررسی کنی.
مهمان
سلام
در مورد عملکرد تابعprintNumberخیلی متوجه نشدم چطوری عمل می کنه…میشه یه مقدار توضیحش بدید….
نویسنده این مطلب
سلام-ارسال یه عدد
پارامتر اول – خود عدد
پارامتر دوم – فرمت ارسال عدد – ۱۰=دسیمال
۲=باینری
۸=هگزا دسیمال
و…
مهمان
void print(char *data) {
unsigned char i;
for(i=0; data[i]!=’\0′; i++)
write( data[i] );
تو این تابع اشاره گر رو چرا گذاشتی؟ فرقی نداره که گه خود data رو بنویسیم
نویسنده این مطلب
الان یه رشته میشه گفت دریافت میکنم – اگه * رو نمیزاشتم میشد دریافت کاراکتر!
مهمان
SystemCoreClock
این کجاست؟
تو برنامه تعریف نشده
آیا این عبارت تو system init هستش؟؟؟
نویسنده این مطلب
system_LPC17xx.c
مهمان
char readData(void) {
while( !((LPC_UART0 -> LSR) & ((1 < RBR; // دادن اطلاعات به بایت بالایی حافظه فیفو دریافت داده
}
تو این تابع دریافت، ثبات وضعیت ،برای بررسی خطا بررسی نشده
نویسنده این مطلب
تو این مطلب من امکانات رو کم کم اضافه کردم – پروژه های بعدی و آخرین ویرایش کتابخونه ته مطلب رو ببینی همچین مشکلی وجود نداره.
مهمان
تابع بعدی، readData هستش که وظیفش ارسال کاراکتر هستش
اشتباه تایپی:وظیفش دریافت کاراکتر
نویسنده این مطلب
مهمان
توجه ۱ : در این رجیستر نیازی نیست حافظه FIFO رو فعال کنیم، چون در حالت پیشفرض خودش فعاله.
رجیستر FCR مقدار پیش فرضش صفره که فعال نیست پس باید فعالش کنیم.
البته طبق چیزی که من فهمیدم
نویسنده این مطلب
ممنون از شما – بله دیتاتشیت رو دیدم و حرف شما رو تایید میکنم – الان تصحیح میکنم