اطلاعیه

Collapse
No announcement yet.

ارسال میکرو به پی سی

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

    ارسال میکرو به پی سی

    سلام
    لطفا هرکس میتونه به من کمک کنه خیلی فوریه :cry: :cry: :sad:
    من یه برنامه بزبان کدویژن نوشتم که دمای دو تا نقطه را با دو تا lm35 اندازه میگیره و روی lcd نمایش میده توی پروتئوس مشکلی نداره اما توی ساخت جواب نمیده! بعدش باید این دو تا دما را از طریق ارتباط میکرو به پی سی بفرستم روی پی سی تا نشون بده.
    مشکلی که هست اینه که توی vb نرخ انتقال داده از طریق پورت com بصورت 8 بیتی تعریف میشه یعنی 1و8وnو9600 اما داده های من 16 بیتی فرستاده به پورت کام پیسی! میخوام بدونم چطور میتونم توی قسمت vb داده های منو بصورت دو تا داده هشت بیتی دریافت کنه!؟ :cry2: :cry2: :cry2:
    این برنامه کدویژنم :
    #include <mega16.h>
    #include <lcd.h>
    #include <stdio.h>
    #include <delay.h>
    #define xtal 8000000
    #asm
    .equ __lcd_port=0x15 ;PORTC
    #endasm
    #define ADC_VREF_TYPE 0xC0
    float t0,t1;
    unsigned int read_adc(unsigned char adc_input)
    {
    float t;
    ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
    delay_us(10);
    ADCSRA|=0x40;
    while ((ADCSRA & 0x10)==0);
    ADCSRA|=0x10;
    t=((ADCW*2.56)/1023)*100;
    return t;
    }
    void main(void)
    {
    char buffer[32];
    lcd_init(16);
    SFIOR=0x00;
    ADMUX=ADC_VREF_TYPE & 0xff;
    ADCSRA=0x86;
    while(1)
    {
    t0=read_adc(0);
    t1=read_adc(1);
    lcd_clear();
    sprintf(buffer,"T0=%f\nT1=%f",t0,t1);
    lcd_puts(buffer);
    delay_ms(100);
    }
    }

    اینم برنامه vb :
    Option Explicit
    Option Base 1
    Dim buffer As Variant
    Private Sub Command_Click()
    MSComm1.Output = Text1.Text
    End Sub
    Private Sub Form_Load()
    MSComm1.Settings = "9600,n,8,1"
    MSComm1.RThreshold = 1
    MSComm1.SThreshold = 1
    MSComm1.InputLen = 1
    MSComm1.CommPort = 1
    MSComm1.PortOpen = True
    End Sub
    Private Sub Form_Unload(Cancel As Integer)
    mscom1.PortOpen = False
    End Sub
    Private Sub MSComm1_OnComm()
    If MSComm1.CommEvent = comEvReceive Then
    buffer = MSComm1.Input
    buffer = Asc(buffer)
    If buffer < 50 Then Text1.Text = buffer
    End If
    End Sub

    #2
    پاسخ : ارسال میکرو به پی سی

    من هرچی برنامت را نگاه کردم اصلا کدی ندیدم که دیتا به کامپیوتر بفرسته.

    دیدگاه


      #3
      پاسخ : ارسال میکرو به پی سی

      ببخشید یعنی چی کدی را ندیدین!؟ چه کدی باید مینوشتم؟
      اون برنامه vb را با اون پورت mscomm1 ندیدین؟؟؟؟؟!!!
      من میخوام با استفاده از پورت کام pc و کابل usb به ttl اطلاعاتمو که همون adc0 و adc1 هستن بفرستم به pc
      اگه کدی لازمه به برنامه اضافه کنم خوب بگید لطفا!!!! :cry2: :cry2: :cry2:
      من راهنمایی خواستم هر چیزی به ذهنتون میرسه لطفا بگید

      دیدگاه


        #4
        پاسخ : ارسال میکرو به پی سی

        شما با استفاده از تابع sprintf فقط محتوای t0 , t1 را با فرمت string داخل متغیر buffer ریختید. همین.
        برای انتقال اطلاعات به بیرون میکرو(از طریق usart) شما باید از تابع printf استفاده کنید.
        درضمن تو برنامه میکرو اثری از تنظیمات usart دیده نمیشه. حتما باید این مورد را انجام بدید.

        دیدگاه


          #5
          پاسخ : ارسال میکرو به پی سی

          نوشته اصلی توسط karimip
          ببخشید یعنی چی کدی را ندیدین!؟ چه کدی باید مینوشتم؟
          اون برنامه vb را با اون پورت mscomm1 ندیدین؟؟؟؟؟!!!
          من میخوام با استفاده از پورت کام pc و کابل usb به ttl اطلاعاتمو که همون adc0 و adc1 هستن بفرستم به pc
          اگه کدی لازمه به برنامه اضافه کنم خوب بگید لطفا!!!! :cry2: :cry2: :cry2:
          من راهنمایی خواستم هر چیزی به ذهنتون میرسه لطفا بگید
          سلام
          دوست عزیز به نظر من شما اول برنامه میکرو رو در محیط هایپرترمینال ویندوز تست کنید ببینید درست عمل میکنه. بعد برنامه vb رو تست بزنید.چون اول باید ببینید سخت افزار و برنامه میکرو درست عمل میکنه و اطلاعات رو درست به pcمنتقل میکنه.

          دیدگاه


            #6
            پاسخ : ارسال میکرو به پی سی

            سلام من برای 8 بیتی کردن داده هام اومدم ADCW را یکبار بر 255 تقسیم کردم ریختم توی var1 و یکبار % باقیمانده شو ریختم توی var2 به این شکل برنامه رو تغییر دادم و متغیر بافرم را هم buffer[16] کردم
            var1=ADCW/255;
            var2=ADCW%255;
            t=((var1*2.56)/1023)*100;
            t=((var2*2.56)/1023)*100;
            من خیلی با usart آشنایی ندارم اما برای uart چنین کاری انجام دادم
            UCSRA=0x00; هشت بیتی بودن داده هامو مشخص میکنه
            UCSRB=0x08; گیرنده سریالمو فعال کردم
            UCSRC=0x86; فرستنده سریالمو فعال کردم
            UBRRH=0x00; نوع انتقال آسنکرون
            UBRRL=0x33; نرخ انتقالم که 9600
            اما نمیدونم اینارو باید تو کدوم برنامه بزارم؟
            میشه یکم کامل تر راهنمایی کنید من از این دو خطی که گفتید هیچی نفهمیدم اون کدی که لازمه بنویسم را لطفا بنویسید برام :cry2: :cry2:
            یعنی من باید دو تا میکرو بزارم و توی یکیش کد مربوط به تولید دما را بنویسم و توی میکرو دیگه برنامه مربوط به نمایش اونو بنویسم؟
            چه کدی باید بنویسم که usart من فعال بشه و اطلاعاتمو بفرسته به میکرئ تروخدا بگیـــــــــــــــــــــــد :cry2: خیلی حیاتیه!

            دیدگاه


              #7
              پاسخ : ارسال میکرو به پی سی

              آفرین
              کدهای تنظیم usart که نوشتی درسته فقط اونا را بایدداخل main قبل از while قرار بدید.(داخل برنامه میکرو)
              برای ازسال اطلاعات هم کافیه از printf یا puts استفاده کنید.
              کد:
              printf("%s",buffer");
              puts(buffer);
              یکی از دو تای بالا را بعد از خط زیر بذار درست میشه.

              sprintf(buffer,"T0=%f\nT1=%f",t0,t1);

              برای تست برنامه هم اول می تونی با virtual terminal که تو نرم افزار پروتئوس هست تست کنید. اگه جواب داد دیگه مشکلی از برنامه میکرو نیست وباید سخت افزارت را تست و در صورت ایراد،آن را برطرف کنید.
              اصلا هم نیازی به دو تا میکرو نیست نمی دونم شما از کجای حرف من اینطور برداشت کردید. :surprised:

              دیدگاه


                #8
                پاسخ : ارسال میکرو به پی سی

                مرسی خیلی ممنون درست شد یعنی فعلا توی پروتئوس چک کردم با ویرچوال ترمینال جواب داد
                حق با شماست اصلا میکرو دیگه لازم نبود من درحال انجام چندتا پروژم برای همین قاطی کردم همه رو :redface: :redface:
                یه سوال دیگه هم داشتم
                اگه بخوام از وقفه usart استفاده کنم چه تغییری باید بدم؟

                دیدگاه


                  #9
                  پاسخ : ارسال میکرو به پی سی

                  سلام من مدارمو ساختم و اتصالاتمو کامل چک کردم اما برنامه توی ساخت جواب نمیده :cry:
                  البته چراغ روی ماژول rx/tx سیم usb به ttl ام روشن میشه یعنی فکرمیکنم داده هارو ارسال میکنه اما نه روی ال سی دی نشون میده نه توی برنامه vb که برای اتصال میکرو به پی سی ساختم.
                  :cry2: تروخدابه من کمک کنید اگه من این پروژه رو تموم نکنم رسما بدبخت میشم :cry:
                  علتش چیه که توی پروتئوس درست کار میکنه اما توی ساختم نه؟!
                  امکان داره بخاطر این باشه که من داده هامو درست به هشت بینی تبدیل نکردم بخاطر همینم به پی سی نمیفرسته و نشون نمیده؟
                  یا بخاطر اینه که برنامه م ناقصه یعنی ارتباط usart م مشکل داره؟ :cry2:
                  این شماتیک مدار منه با ساختش و فرمی که برای vb اماده کردم اما هیچی توی textbox وی بی بهم نشون نمیده روی ال سی دی هم توی مدارم هیچی نشون نمیده




                  دیدگاه


                    #10
                    پاسخ : ارسال میکرو به پی سی

                    سلام
                    با هزار امید و آرزو اومدم اما جوابی نبود :cry2: چرا هیچکس به من جواب نمیده؟؟؟ :cry: :cry: :cry:
                    من تصمیم گرفتم یه تغییراتی توی برنامه بدم یعنی تصمیم گرفتم اول برای هشت بیتی کردن داده هامو توی برنامه میکرو انجام بدم یعنی عدد داخل adcw را با / و % بر 255 توی دو تا متغییر بریزم و اون دو تا متغیرمو بفرستم به pc بعد توی قسمت pc دوباره اینارو بهم متصل کنم و عمل تبدیل دما رو توی برنامه pc انجام بدم. برنامه هامو این شکلی تغییر دادم

                    کد:
                    #include <mega16.h>
                    #include <lcd.h>
                    #include <stdio.h>
                    #include <delay.h>
                    #define xtal 8000000
                    #asm
                      .equ __lcd_port=0x15 ;PORTC
                    #endasm
                    #define ADC_VREF_TYPE 0xC0
                    float t0,t1;
                    unsigned int read_adc(unsigned char adc_input)
                      {  
                      unsigned char var1,var2;
                      ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
                      delay_us(10);
                      ADCSRA|=0x40;
                      while ((ADCSRA & 0x10)==0);
                      ADCSRA|=0x10;
                      var1=ADCW/255;
                      var2=ADCW%255;
                      return var1,var2;
                      }
                    void main(void)
                    {
                      char buffer[32];
                      lcd_init(16);
                      SFIOR=0x00;
                      ADMUX=ADC_VREF_TYPE & 0xff;
                      ADCSRA=0x86;
                      UCSRA=0x00;
                      UCSRB=0x08;
                      UCSRC=0x86;
                      UBRRH=0x00;
                      UBRRL=0x33;
                      while(1)
                      { 
                        t0=read_adc(0);
                        t1=read_adc(1);
                        lcd_clear();
                        sprintf(buffer,"T0=%f\nT1=%f",t0,t1);
                        lcd_puts(buffer);
                        printf("%s",buffer);
                        delay_ms(100); 
                      }
                     }



                    اینم برنامه vb

                    کد:
                    Option Explicit
                    Option Base 1
                    Dim buffer, var1, var2, tempvar As Variant
                    Private Sub Form_Load()
                    MSComm1.Settings = "9600,n,8,1"
                    MSComm1.RThreshold = 1
                    MSComm1.SThreshold = 1
                    MSComm1.InputLen = 1
                    MSComm1.CommPort = 6
                    MSComm1.PortOpen = True
                    End Sub
                    Private Sub Form_Unload(Cancel As Integer)
                    MSComm1.PortOpen = False
                    End Sub
                    Private Sub MSComm1_OnComm()
                    If MSComm1.CommEvent = comEvReceive Then
                    buffer = MSComm1.Input
                    tempvar = var1 + var2
                    tempvar = ((tempvar * 2.56) / 1023) * 100
                    buffer = tempvar
                    Text1.Text = Asc(buffer)
                    End If
                    End Sub

                    مدارمو که ساخته بودم اتصالاتشو چندصدبار چک کردم اما همچنان روی lcd من هیچی نشون نمیده اما یه اتفاق خوشحال کننده افتاد اونم اینکه بالاخره توی برنامه vb من یه عدد 48 نشون میده
                    حالا میخوام بدونم این درسته؟
                    باتوجه به اینکه من دو تا سنسو lm35 دارم که باید دمای دو نقطه رو اندازه بگیره اما فقط یه عدد 48 به من نشون میده
                    آیا درست تغییراتو انجام دادم؟ چیزی کم و کسر نیست؟

                    دیدگاه


                      #11
                      پاسخ : ارسال میکرو به پی سی

                      سلام
                      چرا زیر تاپیک من زدید به نتیجه رسید !!؟؟؟
                      منکه هنوز به نتیجه نرسیدم !!!
                      پس سوالام چی میشه؟ :cry2: :cry: :cry:
                      در مقایسه با تاپیکای دیگه که هرکدوم حداقل 3 یا 4 صفحه هستن تاپیک من به یه صفحه هنوز نرسیده!!!
                      برخلاف خیلیها که میان توی سایت دوخط سوال میزارن در جوابشون یه برنامه 30 خطی براشون مینویسن من خودم بیشتر برنامه رو نوشتهبودم فقط چندتا راهنمایی کوچیک خواستم !!! اما ظاهرا هرچی تنبل تر باشی بیشتر تحویلت میگیرن و کارات زودتر پیش میره!
                      از دوستانی که منو راهنمایی کردن خیلی ممنونم
                      اما کاش به تاپیک ها بیشتر توجه میشد و یکی به ما هم یه جواب نتیجه بخش میداد :sad:
                      این سایت انگار قبلا بهتر راهنمایی میکرد!

                      دیدگاه


                        #12
                        پاسخ : ارسال میکرو به پی سی

                        فرصت نشد که جزئیات کدهای شما را بررسی کنم. اما با توجه به جواب گرفتن شما در شبیه ساز به نظر می رسد مشکل شما احتمالا در تنظیم فیوزبیت ها باشد. از جمله فیوزبیت مربوط به JTAG که به علت استفاده از پورت C باید غیر فعال شود و منابع کلاک هم اگر به درستی تنظیم نباشند، Baud rate مورد نظر حاصل نخواهد شد.
                        اوژن: به معنای افکننده و شکست دهنده است
                        دانایی، توانایی است-Knowledge is POWER
                        برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                        وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                        قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                        اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                        ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                        دیدگاه


                          #13
                          پاسخ : ارسال میکرو به پی سی

                          سلام ممنون که پاسخ دادید
                          مشکل از فیوزبیت ها نیست
                          من در پروگرامر هاتل برنامه رو پروگرم کردم و JTAG را هم یک کرده بودم
                          در مورد منابع کلاک میشه یکم بیشتر توضیح بدید؟
                          من در ابتدا تنظیمات برنامه را به این شکل انجام دادم
                          1 ADC Enabled
                          Volt Ref: Int
                          Clock: 125KHz
                          Auto trigger: None
                          کریستالم 8mhz انتخاب کردم
                          تغییرات دیگه ایی لازمه بدم؟
                          طریقه بستن lcd بروی مدارمم به این شکل انجام دادم
                          pc0=rs
                          pc1=rw
                          pc2=e
                          pc3=free
                          pc4=d4
                          pc5=d5
                          pc6=d6
                          pc7=d7
                          اند را با یه مقاومت 1k به vcc زدم و کاتدم را هم زمین کردم
                          vss را زمین کردم
                          vdd را vcc کردم
                          vee را هم با یه مقاومت 1k زمین کردم

                          دیدگاه


                            #14
                            پاسخ : ارسال میکرو به پی سی

                            در مورد منابع کلاک میکرو بهتر است به کتابهای مرجع مراجعه بفرمایید. من با پروگرمر هاتل کار نکردم و در مورد آن نمی تونم اظهار نظر کنم اما با توجه به علائمی که ارائه دادید من حدس می زنم که اصلا میکرو شما شروع به کار نمی کند برای تست میکرو این کار را انجام بدهید:
                            یک برنامه ساده بنویسید و موارد زیر را در اون انجام بدهید:
                            1- یکی از اون هشت led که تو عکس مشخص هست را روشن کنید.
                            2-سپس یک تاخیر 30 ثانیه ای ایجاد کنید.
                            3- بعد از تاخیر یک LED دیگر را روشن کنید.
                            4 بعد از آن هم یک جمله ساده روی LCD نمایش دهید.
                            5- سر آخر هم:
                            کد:
                            while(1);
                            با این برنامه، شما از سه جنبه تست انجام داده اید:
                            1- اصلا میکرو کار میکنه یا نه
                            2-فرکانس کلاک مطابق با تنظیمات نرم افزاری هست یا نه
                            3- ارتباط با LCD کاملا برقرار هست یا نه.
                            فعلا اینا را انجام بدید و نتایج را به دقت مورد بررسی قرار دهید تا ببینیم مشکل از کجاست.
                            موفق باشید.

                            دیدگاه


                              #15
                              پاسخ : ارسال میکرو به پی سی

                              سلام کاریکه گفتید انجام دادم
                              میکرو درست عمل کرد
                              روی چند تا میکرو دیگه هم چک کردم درست بود
                              هم ledها روشن میشدند و هم روی lcd پیغامم نمایش داده میشه
                              بنظرتون اگه توی برنامم اصلا lcd را روی یه پورت دیگه ببندم بهتر نیست؟ مثلا روی پورت b ببندم
                              اگر بخواهم عدد adcw را بفرستم به برنامه سمت pc بعد اونجا کار تبدیل هشت بیتی و تبدیل دما به سانتیگراد را انجام بدم چطور باید برنامه سمت پی سی را تغییر بدم؟ مثلا اینطوری درسته :

                              کد:
                              [code]If MSComm1.CommEvent = comEvReceive Then
                              MSComm1.Input = adcw
                              buffer = MSComm1.input
                              var1=buffer/255
                              var2=buffer%255
                              tempvar=var1+var2
                              tempvar = ((tempvar * 2.56) / 1023) * 100
                              buffer = tempvar
                              Text1.Text = Asc(buffer)
                              [/code]

                              دیدگاه

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