اطلاعیه

Collapse
No announcement yet.

روشن نشدن pic18f4550

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

    روشن نشدن pic18f4550

    با عرض سلام و وقت بخیر. من یک برد smd لحیم کردم که میکروش کار نمیکنه. یعنی از برنامه ای که نوشتم مطمئنم که درسته. چون کد آخری که ریختم خیلی خلاصه و در حد high کردن یک پین هست. موقعی هم که برنامه رو روی میکرو منتقل میکنم هیچ خطای نرم افزاری ندارم. حالا فرض کنیم میکرو ok هست ممکنه مشکل از کریستال باشه میخواستم قبل از برداشتنش مشورت کنم. یا احتمال دیگه ای هم هست؟؟
    میکرو pic18f4550 هست. قبل از جدا کردن کریستال، اگر بخوام با کلاک داخلی کار کنم چی؟ این دستوری هست که برای کلاک داخلی استفاده کردم:
    setup_oscillator(OSC_8MHZ|OSC_INTRC|OSC_31250|OSC_ PLL_OFF);
    ولی متاسفانه باز فرقی نکرد. تغذیه میکرو هم درسته.
    اینم کل کدم هست:

    #include <18F4550.h>
    #use delay(clock=8000000)
    #use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)

    void initialisations(){
    setup_oscillator(OSC_8MHZ|OSC_INTRC|OSC_31250|OSC_PLL_OFF);
    setup_adc_ports(AN0_TO_AN7|VSS_VDD);
    setup_adc(ADC_OFF);
    setup_psp(PSP_DISABLED);
    setup_spi(SPI_SS_DISABLED);
    setup_wdt(WDT_OFF);
    setup_timer_0(RTCC_INTERNAL);
    setup_timer_1(T1_DISABLED);
    setup_timer_2(T2_DISABLED,0,1);
    setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
    setup_comparator(NC_NC_NC_NC);
    setup_vref(FALSE);
    }

    void main(){
    initialisations();

    SET_TRIS_C(0x80);//set pin 1000 0000
    output_high(PIN_B2);//B2 is Bluetooth Reset

    while(TRUE){

    delay_ms(10);
    }
    }


    دلیل: ادغام دو پست برای جلوگیری از اسپم

    من قبلا با tnm پروگرم میکردم و یک قسمت داشت که نوع کلاک زنی رو موقع ریختن برنامه داخل میکرو تنظیم میکردیم ولی الان دسترسی به tnm ندارم و یه پروگرمر pic از شرکت eca دارم و برنامه اش PICkit 2 Programmer هست. موقعی که به میکرو وصل هست usb رو به کامپیوتر میزنم و بدون مشکل میکرو رو شناسایی میکنه. به پیش فرض ها هم اصلا دست نزدم. بعد یکبار دکمه Erase رو میزنم، بعد فایل هگز رو Import میکنم و در آخر Write. اگر میشه این شکل رو ببینید!!

    دلیل: ادغام دو پست برای جلوگیری از اسپم

    جدیدترین ویرایش توسط tayebeh_it83; ۲۰:۰۵ ۱۳۹۵/۱۲/۲۷.

    #2
    پاسخ : روشن نشدن pic18f4550

    سلام.
    ظاهرا هیچ مشکلی وجود نداره؛ به جز اینکه شما پورت C رو خروجی تعریف کردین، بعدش دستور High رو واسه پورت B نوشتین.
    داخل while هم از دستور output_toggle استفاده کنین، بعدش delay که بتونین چشمک زدن پایه رو مشاهده کنین.
    اگر با اینها حل نشد، اطلاع بدین تا بیشتر بررسی بشه.
    موفق باشید

    دیدگاه


      #3
      پاسخ : روشن نشدن pic18f4550

      با سلام. کد رو به شکل زیر تغییر دادم ولی تفاوتی نکرد و روی پین B2 همون ولتاژ 0.41 هست.

      #include <18F4550.h>
      #use delay(clock=8000000)
      #use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)

      void initialisations(){
      setup_oscillator(OSC_8MHZ|OSC_INTRC|OSC_31250|OSC_PLL_OFF);
      setup_adc_ports(AN0_TO_AN7|VSS_VDD);
      setup_adc(ADC_OFF);
      setup_psp(PSP_DISABLED);
      setup_spi(SPI_SS_DISABLED);
      setup_wdt(WDT_OFF);
      setup_timer_0(RTCC_INTERNAL);
      setup_timer_1(T1_DISABLED);
      setup_timer_2(T2_DISABLED,0,1);
      setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
      setup_comparator(NC_NC_NC_NC);
      setup_vref(FALSE);
      }

      void main(){
      initialisations();
      SET_TRIS_C(0x80);//set pin 1000 0000
      SET_TRIS_B(0x00);

      while(TRUE){
      output_toggle(PIN_B2);
      delay_ms(1000);
      }
      }

      دیدگاه


        #4
        پاسخ : روشن نشدن pic18f4550

        با این کد تست بکنین:

        #include <18F4550.h>
        #device ADC=16


        #FUSES NOWDT //No Watch Dog Timer
        #FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
        #FUSES NOBROWNOUT //No brownout reset
        #FUSES NOPBADEN //PORTB pins are configured as digital I/O on RESET
        #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
        #FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)


        #use delay(crystal=8000000)
        #use FIXED_IO( D_outputs=PIN_D7,PIN_D6,PIN_D5,PIN_D4,PIN_D3,PIN_D2,PIN_D1,PIN_D0 )


        void on_off()
        {
        OUTPUT_D(0);
        delay_ms(200);
        OUTPUT_D(255);
        delay_ms(200);
        }


        void main()
        {
        while(TRUE)
        {
        on_off();
        }
        }



        دیدگاه


          #5
          پاسخ : روشن نشدن pic18f4550

          با عرض سلام و تشکر فراوان از وقتی که اختصاص دادید. من کد شما رو برای پورت B تنظیم کردم (کد زیر). و خدا رو شکر پین B2 هم روی 5 ولت تنظیم شد. ولی مشکلی که هست پین B3 هم روی key بلوتوث تنظیم شده که در حالت عادی باید روی صفر منطقی باشه نه 1. به همین خاطر بلوتوث در مد کانفیگ روشن میشه نه ارسال و دریافت داده. برای اینکه بتونم با تک تک پین ها مجزا کار کنم چه دستوری وجود داره؟ و یک سوال: چرا دستوراتی که قبل از کد شما ارسال کردم و برای pic16f877 درست کار میکرده الان برای pic18f4550 کار نمیکنه؟ از کجا باید تشخیص بدیم که مثلا دستوراتی که شما زحمتشو کشیدید کار میکنه؟ اگر منبعی کاملی از دستورات pic معرفی کنید ممنون میشم.

          #include <18F4550.h>

          #device ADC=16

          #FUSES NOWDT //No Watch Dog Timer
          #FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
          #FUSES NOBROWNOUT //No brownout reset
          #FUSES NOPBADEN //PORTB pins are configured as digital I/O on RESET
          #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
          #FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)

          #use delay(crystal=8000000)
          #use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)
          #use FIXED_IO( B_outputs=PIN_B7,PIN_B6,PIN_B5,PIN_B4,PIN_B3,PIN_B2,PIN_B1,PIN_B0 )

          void main()
          {
          OUTPUT_B(255);//B2 is connected to HC05 reset(255) & B3 to HC05 key(0)
          while(TRUE)
          {
          delay_ms(20);
          putc('a');
          }
          }

          جدیدترین ویرایش توسط tayebeh_it83; ۱۲:۱۳ ۱۳۹۵/۱۲/۲۹.

          دیدگاه


            #6
            پاسخ : روشن نشدن pic18f4550

            الان اصلاحش کردم پین B3 رو برداشتم
            #use FIXED_IO( B_outputs=PIN_B7,PIN_B6,PIN_B5,PIN_B4,PIN_B2,PIN_B1,PIN_B0 )



            خیلی ممنونم. خدا خیرتون بده
            جدیدترین ویرایش توسط tayebeh_it83; ۱۴:۰۱ ۱۳۹۵/۱۲/۲۹.

            دیدگاه


              #7
              پاسخ : روشن نشدن pic18f4550

              با عرض سلام مجدد. متاسفانه یک مشکل دیگه هم وجود داره. بعد از اتصال به مدار با بلوتوث داده ها رو در کامپیوتر با برنامه ویژوال C# دریافت می کنم. اما داده هایی که دریافت میشه خیلی ربطی به ولتاژ روی پین های آنالوگ میکرو نداره و خیلی هم نوسان میکنه در صورتی با ولت متر اندازه می گیرم اصلا تغییری روی ولتاژها ندارم. مشکل از ADC میکرو هست یا این دستورات ؟؟؟

              while(TRUE)
              {
              delay_ms(20);
              set_adc_channel(0);
              g = read_adc();
              set_adc_channel(1);
              s = read_adc();
              set_adc_channel(5);
              x = read_adc();
              set_adc_channel(6);
              y = read_adc();
              set_adc_channel(7);
              z = read_adc();

              putc(1);
              putc(g);
              putc(2);
              putc(s);
              putc(3);
              putc(x);
              putc(4);
              putc(y);
              putc(5);
              putc(z);
              }

              جدیدترین ویرایش توسط tayebeh_it83; ۱۸:۴۲ ۱۳۹۶/۰۱/۰۱.

              دیدگاه


                #8
                پاسخ : روشن نشدن pic18f4550

                سلام. سال نو مبارک. ببخشید دیر جواب میدم.
                بعد از دستور set_adc_channel باید یه تاخیر در حد 20 میکروثانیه وجود داشته باشه، وگرنه ماژول adc درست کار نمیکنه.

                دیدگاه


                  #9
                  پاسخ : روشن نشدن pic18f4550

                  با عرض سلام. سال نو بر شما هم مبارک باشه. من طبق فرمایش شما کد رو تغییر دادم. و در ضمن هم بگم که دستور #device ADC=16 رو به طور کامل برداشتم چون داده های آنالوگ رو اشتباه میده و مدام بین 0 تا مثلا 200 نوسان شدید داره و اصلا ربطی به مقداری که رو پایه هست نداره. اما بعد از حذف فقط نوسان در حد 2 تا 3 دارم (مثلا بین 78 تا 90 روی یک پایه). با اینکه شتاب سنج کاملا بی حرکت هست چرا باید این نوسان کم هم وجود داشته باشه، حالا اگر این رو هم ندید بگیریم، من زاویه شتاب سنج رو تغییر دادم و با ولت متر پایه های میکرو رو چک کردم مثلا خروجی Z شتاب سنج از 2.08 به 2.15 تغییر کرد ولی این تغییر رو اصلا میکرو اعمال نمیکنه (یعنی روی برنامه C# من تغییرات رو نمی بینم). ببخشید طولانی شد.


                  set_adc_channel(0);
                  g = read_adc();
                  delay_us(50);
                  set_adc_channel(1);
                  s = read_adc();
                  delay_us(50);

                  جدیدترین ویرایش توسط tayebeh_it83; ۰۷:۵۷ ۱۳۹۶/۰۱/۰۴.

                  دیدگاه


                    #10
                    پاسخ : روشن نشدن pic18f4550

                    باز هم که همون جوری نوشتین کد رو!
                    بعد از ست کردن کانال ADC، تاخیر 20 میکرو ثانیه بذارین، بعدش ADC رو بخونین و همین تاخیر 50 میکرو هم بمونه سرجاش (جهت انتظار برای اتمام تبدیل ADC)
                    اینکه نوسان میکنه: احتمالا یا تغذیه مدار نوسان داره که باعث میشه ولتاژ رفرنس نوسان بکنه و نتیجه ی تبدیل ADC ثابت نشون داده نشه. یا اینکه خروجی سنسور نوساناتی داره که با مولتی متر مشاهده نمیشه و باید با اسیلوسکوپ اون رو دید.
                    حالا از طرف دیگه، تغییرات سنسور بین 2.08 تا 2.15 هست. یعنی 0.07 ولت. دقت ADC که 10 بیت هست و رفرنس هم 5 ولت. هر استپ ADC میشه 5 تقسیم بر 1023 یا همون 4.88 میلی ولت. خب تغییرات سنسور 0.07 بود. اگر این ولتاژ رو تقسیم بر مقدار استپ کنیم، تبدیل شده ی ADC به دست میاد که میشه 14.34 که چون ممیز نداریم تو تبدیل ADC، نتیجه همون 14 میشه. اگه تغییرات تبدیل ADC در این محدوده هست، نتیجه درسته. ( تبدیل 2.15 ولت میشه حدود 440 و 2.08 ولت هم میشه 426. خروجی باید بین این دو مقدار باشه)

                    دیدگاه


                      #11
                      پاسخ : روشن نشدن pic18f4550

                      منظورتون به این شکل هست؟

                      set_adc_channel(0);
                      delay_us(20);
                      g = read_adc();
                      delay_us(50);

                      set_adc_channel(1);
                      delay_us(20);
                      s = read_adc();
                      delay_us(50);

                      دلیل مسئله هم پیدا شد، راستش من ارسال داده ام روی بلوتوث مشکل داشت. الان به جای putc از printf استفاده کردم. کاملا درسته و نوسان بی مورد حذف شد و اعدادی که شما محاسبه کردید تقریبا درست درمیاد. فقط خودش عدد دریافتی رو سمت C# میشکنه به ارقامش و کد اسکی هر رقم جدا ارسال میشه. مثلاً اگر قراره x عدد 341 باشه به ترتیب 51، و 52 و 49 دریافت میشن. حالا سعی می کنم یه جوری سمت C# حلش کنم.



                      printf("%c", 1);
                      printf("%lu", x);
                      printf("%c", 2);
                      printf("%lu", y);


                      جدیدترین ویرایش توسط tayebeh_it83; ۱۳:۲۱ ۱۳۹۶/۰۱/۰۴.

                      دیدگاه

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