اطلاعیه

Collapse
No announcement yet.

مشکل در بالا آمدن میکرو بدون اتصال LCD کاراکتری

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    #16
    پاسخ : مشکل در بالا آمدن میکرو بدون اتصال LCD کاراکتری

    مشکلم حل شد یعنی حل کردن برام :biggrin:
    اما اصلا خوشحال نیستم آخه نفهمیدم چه طور !
    مشل تو init ال سی دی نیست ! مشکل از _Lcd_Ready() به وجود می یاد . نوی تابع init ال سی دی هم این _Lcd_Ready() صدا زده شده !
    کلا هر موقع چیزی قراره نوشته بشه باید قبلش _Lcd_Ready() بیاد .
    فایل Library تغییر داده شده رو میذارم . اکه سر در اووردین به ما هم بگین خواهشا .
    دوجا تغییرات داده شده :

    1-دو خط زیر حذف شدن (نسبت به Library استاندارد کد ویژن)

    sbrc r26,__lcd_busy_flag
    rjmp __lcd_busy


    2-تابع _lcd_delay(); جندین بار تو Lcd_Ready() صدا زده شده که من فکر می کنم خواسته صبر کنه تا ال سی دی آماده ی دریافت بشه !

    http://www.4shared.com/file/2HRWsVeU/MYLCD.html

    زمان تنها واحد حقیقی اندازه گیریه
    زمان وجود ماده رو اثبات میکنه
    بدون زمان هیچکدوم ما وجود نخواهیم داشت
    زمان یکتاست

    دیدگاه


      #17
      پاسخ : مشکل در بالا آمدن میکرو بدون اتصال LCD کاراکتری

      نوشته اصلی توسط Robo-amir
      1-دو خط زیر حذف شدن (نسبت به Library استاندارد کد ویژن)

      sbrc r26,__lcd_busy_flag
      rjmp __lcd_busy
      هیشکی یعنی از این دستورا سر در نمیاره ؟
      اسملیه دگیه ؟
      زمان تنها واحد حقیقی اندازه گیریه
      زمان وجود ماده رو اثبات میکنه
      بدون زمان هیچکدوم ما وجود نخواهیم داشت
      زمان یکتاست

      دیدگاه


        #18
        پاسخ : مشکل در بالا آمدن میکرو بدون اتصال LCD کاراکتری

        sghl
        نوشته اصلی توسط iman-63
        .شما میتونی از کتابخانه های دیگه هم استفاده کنی. مثلاً winavr یه کتابخانه open sorse داره که میتونی راحت برا کدویژن تبدیل کنی و سپس استفاده کنی.
        مشکل من اومد دوباره سراغم !
        میشه لطفا این کتابخانه ی LCD یه WinAvr رو پلود کنیم برام و یه توضیحی بدید چه جوری می تونم ازش استفاده کنم ؟
        ممنون میشم کمکم کنید کارم خیلی لنگه !
        زمان تنها واحد حقیقی اندازه گیریه
        زمان وجود ماده رو اثبات میکنه
        بدون زمان هیچکدوم ما وجود نخواهیم داشت
        زمان یکتاست

        دیدگاه


          #19
          پاسخ : مشکل در بالا آمدن میکرو بدون اتصال LCD کاراکتری

          این همه اساتید برجسته ی AVR اینجا هست که خیلی هاشونم با CodeVision پروژه های بزرگی انجام دادن !!!!
          هیچکدومشون یعنی به این مشل بر نخوردن؟
          خواهش می کنم کمک کنید کارم خیلی لنگه !
          زمان تنها واحد حقیقی اندازه گیریه
          زمان وجود ماده رو اثبات میکنه
          بدون زمان هیچکدوم ما وجود نخواهیم داشت
          زمان یکتاست

          دیدگاه


            #20
            پاسخ : مشکل در بالا آمدن میکرو بدون اتصال LCD کاراکتری

            سلام دادا.

            سایت به این عظمت جای پلود نداره. برنامه lcd تحت winavr رو برات mail میکنم.

            موفق باشی.
            تشکر لازم نیست!

            دیدگاه


              #21
              پاسخ : مشکل در بالا آمدن میکرو بدون اتصال LCD کا

              سلام چند خط اول کتابخانه کد ویژن که زیر برنامه __lcd_ready() جزش میشه رو خط به خط واست با توضیح اوردم
              /*
              LCD driver routines for 4x40 alphanumeric LCD

              CodeVisionAVR C Compiler
              (C) 1998-2007 Pavel Haiduc, HP InfoTech S.R.L.
              */
              چون کد ویژن خواسته برنامه بهیه باشد با کد اسمبلی نوشته و در اسمبلی از دستور .equ برای نسبت دادن یک مقدار ثابت به یک اسم استفاده می کنیم ( میشه گفت مثل #define در c)
              #asm
              با توجه به مقدار پورتی که انتخاب کردید (همونی که مثلا برای porta می نویسید 0x15) مقدار DDR پورت مربوطه را بدست می آورد و در برنامه با عنوان __lcd_direction می شناسد (DDR هر پورت آدرسش یکی پایین تر از آدرس خود پورت)
              .equ __lcd_direction=__lcd_port-1
              اینجا هم آدرس PIN رو مقدار دهی می کند به همان روش که بالا گفته شد با این تفاوت که آدرس PIN هر پورتی دو تا پایینتر است
              مثلا اگر پورت را تعریف کرده باشد 0x15
              آدرس DDR=0x14
              و آدرس PIN=0x13
              .equ __lcd_pin=__lcd_port-2
              اینها هم پیش فرضهایی است که کد ویژن برای پیکربندی LCD در نظر گرفته است. (اگر خواستید پیین های یک lcd را به پایه های پیش فرضی که تعریف شده متصل کنید باید این قسمت را دستکاری کنید)
              .equ __lcd_rs=0
              .equ __lcd_rd=1
              .equ __lcd_enable1=2
              .equ __lcd_enable2=3
              وقتی که از روی lcd می خوانید (با یک کردن RW یا همان RD (یعنی انتخاب خواند) و با صفر کردن پایه RS (یعنی انتخاب دستور) و وارد کردن یک E (پالس به مدت .5us حداقل) بعد از 40 میکرو ثانیه یک بایت توسط lcd روی پایه های d0 تا d7 در مد 8 بیتی یا دو نیبل در مد 4 بیتی قرار می گیرد که بیت 7 این بایت فلگ lcd است که وضعیت lcd را نشان می دهدبطوریکه وقتی این بیت یک باشد به معنی مشغول بودن lcd و قادر نبودن به دریافت اطلاعات است.
              .equ __lcd_busy_flag=7
              #endasm

              #define LCD_MAXX 40

              #define LCD_EN1 4
              #define LCD_EN2 8

              #pragma used+
              از این دستور به بعد متغیرهای تعریفی از حافظه SRAM برای ذخیره سازی استفاده می کند. (کاری که به معمولا نیز انجام میگیرد)
              #pragma regalloc-
              unsigned char _en1_msk
              ;
              بعد از آوردن reglloc یک متغیر تعریف می کند که از رجیسترهای AVR برای ذخیره سازی استفاده می کند .
              #pragma regalloc+
              unsigned char _lcd_x,_lcd_y;
              #pragma used-
              ایجاد تاخیر با ایجاد loop به اندازه 45 سیکل ماشین (بدون در نظر گرفتن تاخیری که صدا زدن و همچنین بازگشت از تابع دارد و push و pop هایی که ممکن است کد ویژن درون یک تابع قرار بدهد)
              static void _lcd_delay(void)
              {
              #asm
              ldi r31,15 تاخیر 1
              __lcd_delay0:
              dec r31 تاخیر 1
              brne __lcd_delay0 به جز وقتی که از پرش نمی کند تاخیر 2 سیکل دارد
              #endasm
              }
              void _lcd_ready(void)
              {
              #asm
              پورتی که به lcd متصل شده است را بصورت ورودی تعریف می کند
              ldi r26,0xf ;set as input
              out __lcd_direction,r26
              پایه های کنترلی را آماده برای خواندن از lcd تنظیم می کند با En1=0،RD=1 و RS=0 و اگر En2هم داشته باشیم ان هم صفر می کند)
              sbi __lcd_port,__lcd_rd ;RD=1
              cbi __lcd_port,__lcd_rs ;RS=0
              in r26,__lcd_port
              نوع E یا همان Enable ر ا که قبلا توسط تابع lcd_init مقدار دهی شده است و نشان دهد نوع en است که با یکی کار می کند یا دو تا یعنی مقدار __en1_msk می تواند 00000100 یا 00001100 باشد
              lds r27,__en1_msk
              __lcd_busy:
              #endasm
              ایجاد تاخیر بطوری که هرچقدر که فرکانس را افزایش داده باشیم باز بیشتر از .5us باشد
              _
              lcd_delay();
              #asm
              مقدار en را یک می کند با یک پالس بالا رونده به lcd ، lcd مقادیر rs و rd را لود می کند
              ____
              en ___|

              or r26,r27
              out __lcd_port,r26 ;EN=1
              #endasm
              باز انتظار تا lcd دستوری که بهش دادیم که خواندن پرچم وضعیت و آدرس است را انجام دهد و در d0 تا d7 در حالت مد 8 بیتی و به صورت دو نیبل در دو مرحله در d4 تا d7 در مد 4bit این مقدار را قرار بدهد در اینجا فقط مد 4 بیتی استفاده شده است پس نیبل بالا الان درون رجیستر r30 قرار دارد
              _
              lcd_delay();
              #asm
              in r30,__lcd_pin
              دو باره یک پالس بالا رونده دیگر اعمال می شود تا نیبل پایین دریافت گردد. چون ما فقط با پرچم کار داریم و پرچم هم در نیبل بالا است و قبلا گرفته ایم پس خواندن نیبل پایین از روی d4 تا d7 به کارمون نمی یاد واسه همین اینجا خواندن از پورت ذکر نشه است
              andi r26,0xf3
              out __lcd_port,r26 ;EN=0
              #endasm
              _lcd_delay();
              #asm
              or r26,r27
              out __lcd_port,r26 ;EN=1
              #endasm
              _lcd_delay();
              #asm
              وقتی e را لازم نداریم در حالت صفر قرار می دهیم
              andi r26,0xf3
              out __lcd_port,r26 ;EN=0
              #endasm
              _lcd_delay();
              #asm
              این خط بیت 7 (که همان __lcd_busy_flag است و پرچم وضعیت lcd است) ازرجیستر r30 (که مقدار بایتی را که از lcd گرفته بودیم نگه داشته) تست می کند اگر این بیت صفر بود خط بعدی (یعنی rjamp __lcd_busy) را اجرا نمی کند و به خط بعد (یعنی پایان زیربرنامه ) می پرد و در صورتی که برابر یک باشد خط بعدی (یعنی rjmp ، بازگشت به ابتدای زیربرنامه و گرفتن پرچم وضعیت از lcd دوباره) اجرا می کند
              sbrc r30,__lcd_busy_flag
              rjmp __lcd_busy
              #endasm
              }
              در کل چون lcd کند تر از میکرو معمولا کار می کند و برای اجرای هر دستوری یا فرستادن data برای نمایش روی lcd نیاز به یک تاخیر (تاخیر های از 1u شروع می شود تا 1.5ms البته باید در دیتا شیت lcd نگاه کرد ) برای همین دو روش استفاده می کنند
              روش اول خواندن بیت فلگ بطوریکه اگر این بیت صفر باشد می توان به lcdمقدار یا دستور جدید ارسال کرد و یا می آیند از تاخیر استفاده می کنند (برنامه هایی مثل بسکام که پایه rd یا همان rw را به زمین متصل می کنند یعنی ما فقط می خواهیم به lcd داده یا دستور ارسال کنیم و کاری با پرچم فلگ یا خواندن دیتای درون آن نداریم).یعنی بین ارسال هر دستور یک حد بالا تاخیر را در نظر می گیرند و بین ارسالی ها قرار می دهند (البته تاخیرها می تواند با توجه هر دستور متفاوت باشد)
              اگر خواستی خودت یک کتابخونه بسازی یا می خوای بدونی دقیقا چطور می شود با یک lcd متن ارتباط برقرار کرد این عکس می تونه خیلی کمکت کنه


              راستی داشت یادم می رفت برای حل مشکلت نیاز به تغییر کتابخانه یا نوشتن قطعه برنامه خاصی نیست و می تونی یه کار دیگه بکنی به بیت 7 از پورتی که lcd بهش وصل هست یک مقاومت بالا به صورت pull-down (یعنی یک مقاومت تو مایه مقاومت در 10k بین زمین و بیت 7 پورت ) قرار بده (تا در صورتی که میکرو بخواهد lcd را بخواند و lcd نباشد مقدار این فلک صفر برگشت داده می شود که یعنی lcd مشکلی نداره و آماده به کاره،) مشکل حل می شه (البته این ایده تست نشدست)
              یا اگر باز اصرار داری به صورت نرم افزار این کار رو انجام بدی می تونی درون تابع _lcd_ready را کلا پاک کنی و از یک دستور delay_ms استفاده کنی و چون این زیربرنامه کلی استفاده شده و شما نمی خواهی در تک تک تابع های دیگر که از این دستور استفاده کرده اند تغییراتی انجام دهی مجبوری حداکثر تاخیر ممکن را لحاظ کنی یعنی بین 2 الی 5 میلی ثانیه (مثلا ;(delay_ms(3)
              راستی یادت باشه کتابخانه delay را قبل از کتابخانه lcd باید تعریف کنی و گرنه error میگیره
              هیچ کس و هیچ چیز نمی تونه مانع رسیدنت به آرزوهات بشه مگر خودت

              دیدگاه


                #22
                پاسخ : مشکل در بالا آمدن میکرو بدون اتصال LCD کاراکتری

                سلام
                از وقتی که گذاشتین و توضیحات جامعتون خیلی ممنون :agree:
                اگه بخوام با این دستورای اسمبلی آشنا شم باید از کجا شروع کنم؟ :read:
                کتابخانه ای که من پلود کردم رو دیدید؟ http://www.4shared.com/file/2HRWsVeU/MYLCD.html
                اونجا دقیقا مثل چیزی که شما گفتید بیخیال فلگ Busy شده و فقط یه سری تاخیر زیاد گذاشته
                این تاخیر اگه زیادی باشه مشکلی که پیش نمیاد ؟ فقط دیتا با سرعت کمتری ارسال میشه به LCD دیگه ؟
                من این تاخیر رو زیاد کردم اما یه بار که تغذیه مدار رو وصل میکنم میاد یه بار دیگه نمیاد !
                این تست رو من با تعداد زیادی LCD (همشون یه مارک و مدل)انجام دادم تو بعضیاشون هر چقدر هم تغذیه رو قطع و وصل میکنم یا میکرو رو Reset می کنم هیچ مشکلی نیست اما تو بعضی ها بگیر نگیر داره بعضی یا هم که کلا نمیاد :angry:
                پس یعنی این LCD به درد نخوره دیگه ؟ :angry:
                اینم datasheet ال سی دیه بیخودمه ! http://www.4shared.com/document/NYRfzvRp/LCD_1620A21.html


                زمان تنها واحد حقیقی اندازه گیریه
                زمان وجود ماده رو اثبات میکنه
                بدون زمان هیچکدوم ما وجود نخواهیم داشت
                زمان یکتاست

                دیدگاه


                  #23
                  پاسخ : مشکل در بالا آمدن میکرو بدون اتصال LCD کاراکتری

                  نه، مشکل از lcd نیست
                  شما امدید 50 بار دستور _lcd_dleay که 50 سیکل (با محاسبه دستور صدا زدن و بازگشت تنها) تاخیر ایجاد می کندرا گذاشته اید یعنی کل تاخیرتان برابر 2500 سیکل ماشین خواهد بود که اگر فرکانس کاریتان 1Mhz باشه ، مقدار تاخیر برابر 2.5ms درست می شود که مناسب است ولی فرکانس را که افزایش دهیم بهم می ریزد مثلا اگر فرکانس کاری را 8MHz در نظر بگیریم این تاخیر 312.5us خواهد شد برای همین گفتم از دستور delay_ms استفاده کن تا متناسب با فرکانس کاری مقدار تاخیر ایجاد شود ( و یک مورد دیگر هم وجود دارد که برای اطمینان بیشتر است یک تاخیر ابتدای lcdinit قرار بدهید .تاخیری که long_delay ایجاد می کند در حداکثر فرکانس یعنی 16Mhz برابر 4.09ms است (در فرکانس 1MHz مشکلی ندارد چون برابر 65.5ms است) برای همین بهتر است قبل از صدا زدن دستور lcdinit یک تاخیر 15ms بگذارید و یا درون خود تابع lcdinit اولین خط یک delay قرار بدهید . ابتدای برنامه متن زیر را قرار دهید تا اگر delay در برنامه تا الان تعریف نشده باشد تعریف شود
                  #ifndef _DELAY_INCLUDED_
                  #include <delay.h>
                  #endif
                  و همچنین به جای زیربرنامه ایی که برای _ldc_ready (همون که تغییر داده بودینش) نوشته شده است زیر برنامه زیر را قرار بدهید
                  void _lcd_ready(void)
                  {
                  #asm
                  clr r26
                  out __lcd_port,r26
                  #endasm
                  delay_ms(3);
                  }
                  علت صفر کردن مقدار روی پورت این است که در بعضی از قسمتهای برنامه که از این زیربرنامه (یعنی lcd_ready) استفاده شده است فرض را بر صفر بودن پایه های کنترلی گذاشته است (چون بعد از صدا زدن این تابع ، در اصل برنامه این پایه های کنترلی زمانی که به انتهای زیربرنامه می رسد صفر می شوند)
                  بعد هم یک تاخیر
                  این 3 تا تغییر که گفتم را در کتابخانه زیر لحاظ کردم.
                  http://telec.persiangig.com/Temp/LCD2.LIB
                  راستی گذاشتن مقاومت pull-down رو امتحان کردید؟ جواب داد؟ (بهتر به جای 10k مقاومت 8.2k بگذارید)
                  اگه بخوام با این دستورای اسمبلی آشنا شم باید از کجا شروع کنم؟
                  اگر می خواهی با خود دستوراتش آشنا بشوی بهترین منبع pdf خود atmel است متن انگلیسی آن بسیار روان و با یک مثال برای هر دستور است. این pdf توسط آقای صالح نامبخش ترجمه هم شده و بصورت کتاب موجود در باز هم هست (اسم کتاب را با عنوان زبان های اسمبلی میکروکنترلر برای AVR تو بازار می تونید پیدا کنید)
                  http://www.atmel.com/dyn/resources/p...ts/doc0856.pdf

                  اگر هم می خواهید از کتابهای موجود در بازار استفاده کنید به زبان اسمبلی ، کتاب میکروکنترلرهای AVR سری Mega انتشارات دیباگران هست که فقط برای زبان اسمبلی است و در کل کتاب بدی نیست (اما شاید یه کم گیج کننده باشد)
                  و اگر یک کتاب خوب هم زبان c و هم اسمبلی می خواهید من کتاب مرجع کامل میکروکنترلرهای AVR انتشارات نص را معرفی می کنم کتاب خسلس خوبی است.
                  این تاخیر اگه زیادی باشه مشکلی که پیش نمیاد ؟ فقط دیتا با سرعت کمتری ارسال میشه به LCD دیگه ؟
                  نه اون تاخیر اگر بیشتر از اندازه مورد نیاز بزرگ باشد مشکلی به وجود نمی آورد. و فقط داده با سرعت کمتری داده جابجا می شود
                  هیچ کس و هیچ چیز نمی تونه مانع رسیدنت به آرزوهات بشه مگر خودت

                  دیدگاه


                    #24
                    پاسخ : مشکل در بالا آمدن میکرو بدون اتصال LCD کاراکتری

                    سلام
                    بازم از توضیحات جامعتون و وقت که گذاشتید ممنون
                    نوشته اصلی توسط savameri
                    نه، مشکل از lcd نیست
                    اگه از ال.سی.دی نیست پس چرا تو بعضیاشون جواب نمیده؟این زمانه توشون متفاوته دیگه؟ :angry:

                    نوشته اصلی توسط savameri
                    راستی گذاشتن مقاومت pull-down رو امتحان کردید؟ جواب داد؟ (بهتر به جای 10k مقاومت 8.2k بگذارید)
                    بله انجام دادم
                    جواب داد :wow:به نظرم این بهترین راه بود :applause:با هر مدلی بدون تغییر کتابخانه جواب میداد :nice:
                    میشه بگید مقدار این مقاومت pull-down رو جه جوری محاسبه کردید ؟ خیلی برام مهمه (لطفا)
                    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

                    clr r26
                    out __lcd_port,r26

                    کار این دوتا دستور دقیقا چیه ؟میشه معادل C براش نوشت؟
                    زمان تنها واحد حقیقی اندازه گیریه
                    زمان وجود ماده رو اثبات میکنه
                    بدون زمان هیچکدوم ما وجود نخواهیم داشت
                    زمان یکتاست

                    دیدگاه


                      #25
                      پاسخ : مشکل در بالا آمدن میکرو بدون اتصال LCD کاراکتری

                      چرا تو بعضیاشون جواب نمیده؟این زمانه توشون متفاوته دیگه؟
                      درسته که lcd ها از نظر نوع تاخیرها با هم کمی متفاوت هستند اما نه اینقدر که با گذاشتن تاخیر ماکزیممی ، برای هر lcd یک سازی بزند و برای یکی درست عمل کند و برای دیگری نه
                      احتمالا مشکل در راه اندازی ابتدایی میکرو و تنظیم نبودن تاخیرها است (منظورم delay_long) که بهتر یه تاخیر 5ms هم براش بزاری شاید مشکل حل بشه
                      راستی چون داریم از زیربرنامه delay استفاده می کنیم بشدت به سرعتی که برای میکرو در کد ویژن تعیین کردیم بستگی داره و باید با مقدار آن با مقداری که در واقعیت بکار می برید یکی باشد تا تاخیرها متناسب با مقدار بیان شده عمل کنند
                      مقدار این مقاومت pull-down رو جه جوری محاسبه کردید ؟

                      مقاومتی داخلی که به عنوان pull up قرار دارد مقداری بین 20 الی 50 کیلو اهم دارد که با در نظر گرفتن مقدار Rpu (یک عددی بین 20 تا 50 )برای اینکه مقدار صفر منطقی (یعنی زیر 0.8 ولت) افت کند مقاومت 8.2k بدست می آید (تقسیم ولتاژ بین Rup و مقاومت pull down که می گذاریم بطوری که زیر 0.8 ولت دو سر مقاومت pull down افت کند)

                      کار این دوتا دستور دقیقا چیه ؟میشه معادل C براش نوشت؟
                      همونطور که گفتم چون دستوراتی که بعد از _lcd_ready بکار می روند فرض را بر صفر بودن پایه های کنترلی می گذارند در صورتی این دو خط را قرار ندهیم متن ممکن است بهم بخورد و دست نشان ندهد
                      معادل این دستور اگر بداند __lcd_port چه تعریف شده است مثلا .euq __lcd_port = 0x15 که PORTA ، باشد. در زبان c می شود
                      PORTA=0;
                      هیچ کس و هیچ چیز نمی تونه مانع رسیدنت به آرزوهات بشه مگر خودت

                      دیدگاه


                        #26
                        پاسخ : مشکل در بالا آمدن میکرو بدون اتصال LCD کاراکتری

                        نوشته اصلی توسط savameri
                        مقاومتی داخلی که به عنوان pull up قرار دارد مقداری بین 20 الی 50 کیلو اهم دارد که با در نظر گرفتن مقدار Rpu (یک عددی بین 20 تا 50 )برای اینکه مقدار صفر منطقی (یعنی زیر 0.8 ولت) افت کند مقاومت 8.2k بدست می آید (تقسیم ولتاژ بین Rup و مقاومت pull down که می گذاریم بطوری که زیر 0.8 ولت دو سر مقاومت pull down افت کند)
                        این مقدار Rpu رو توی دیتا شیت می نویسه یا یه مقدار استانداردی داره معمولا؟
                        زمان تنها واحد حقیقی اندازه گیریه
                        زمان وجود ماده رو اثبات میکنه
                        بدون زمان هیچکدوم ما وجود نخواهیم داشت
                        زمان یکتاست

                        دیدگاه


                          #27
                          پاسخ : مشکل در بالا آمدن میکرو بدون اتصال LCD کاراکتری

                          این مقدار در مشخصه های الکتریکی (قسمت dc) هر میکرو AVR در دیتا شیت ذکر شده است. اما اکثرا بین همین 20 تا 50 کیلو اهم هستند
                          هیچ کس و هیچ چیز نمی تونه مانع رسیدنت به آرزوهات بشه مگر خودت

                          دیدگاه

                          لطفا صبر کنید...
                          X