اطلاعیه

Collapse
No announcement yet.

درست کارنکردن LCD هنگام اتصال PICKIT3

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

    #16
    پاسخ : درست کارنکردن LCD هنگام اتصال PICKIT3

    نوشته اصلی توسط saleh_chz
    سلام به همگی
    من تازه PICKIT3 رو از سایت خریدم . متاسفانه وقتی پروگرمر به برد بورد متصله نوشته های LCD بعد از چند ثانیه کار به صورت شیفتی محو میشه!
    وقتی پروگرمر رو جدا می کنم درست کار می کنه!
    توی فروم ها معمولا برعکسشو مشکل دارند !
    راهنمایی لطفا.
    برنامه توی ccs :

    کد:
    #include <16F877A.h>
    #device adc=16
    
    #include <math.h>
    
    #use delay(clock=20000000)
    
    //#include <lcd.c>
    
    #define LCD_ENABLE_PIN PIN_D2                 
    #define LCD_RS_PIN   PIN_D3                 
    #define LCD_RW_PIN   PIN_C4                 
    #define LCD_DATA4    PIN_C5              
    #define LCD_DATA5    PIN_C6                
    #define LCD_DATA6    PIN_C7                
    #define LCD_DATA7    PIN_D4
    
    #include <lcd.c>
    
    #define  LCD_CLS()  lcd_putc(\f)
    
    #use FIXED_IO( D_outputs=PIN_D5 )
    #use FIXED_IO( C_outputs=PIN_C2 ) //CCP1 OUTPUT
    #define LED  PIN_D5 
    
    #define LEFT_K   PIN_D6
    #define RIGHT_K   PIN_D7
    #define OK_K     PIN_B0
    #define MENU_K   PIN_B1
    #define UP_K     PIN_B2
    #define DOWN_K   PIN_B4
    
    #define MAX_MENU  2
    
    #FUSES NOWDT          //No Watch Dog Timer
    #FUSES HS            //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
    #FUSES LVP 
    
    unsigned int a=100;
    
    void main()
    {
      lcd_init();
      delay_ms(100);
      printf(lcd_putc,"Saleh\n");
      printf(lcd_putc,"int=%U",a);
      //output_high(LED);
      while(1)
      {
      output_high(LED);
      
      delay_ms(500);
      output_low(LED);
      delay_ms(500);
      
      }
    }
    سلام دوست عزیز
    این یک مشکل عادی است تقریبا چون وقتی پروگرمر وصل هست از بیرون در واقع داره به میکرو تغذیه وارد میشه به پایه هایی که پروگرمر وصل است که پایه های مهمی هستن برای اینکه بتونن خطا ایجاد کنن پس بهتر بهد از ریختن برنامه رو میکرو پروگرمر رو قطع کنی و یکیار ریست کنی میکرو رو البته یکم غیر عادی بود که انقدر زیاد این مشکل رو دارید من هر از چند گاهی اینجوری شده و اینکه گفتید اسکوپ وصل میکنید اون هم میشه همین دلیل رو براش آورد البته یکم مفصل تره ممکنه اسیلوسکوپ یجوری بشه که نوک پراپ ولتاژی بده رو یه پایه از بیرون که این مشل رو ایجاد کنه و به حافظه صدمه بزنه در حال اجرا که با ریست یا دوباره پروگرم کردن درست میشه

    دیدگاه


      #17
      پاسخ : درست کارنکردن LCD هنگام اتصال PICKIT3

      نوشته اصلی توسط saleh_chz
      سلام دوستان
      تشکر می کنم بابت پاسخ های ارزنده رفقا...

      راستش همونطور که حضرات فرمودند بنده تقریبا آخرین نسخه ccs رو دانلود کردم و مشکلم با پروگرمر و LCD و نویز تا حدود خوبی رفع شد.
      موضوعی که منو متعجب میکنه اینه که توی برنامه ام پایه های LCD رو اینطور تعریف کردم :


      کد:
      #define LCD_ENABLE_PIN PIN_C4
      #define LCD_RS_PIN PIN_C5
      #define LCD_RW_PIN PIN_C6
      #define LCD_DATA4 PIN_D0
      #define LCD_DATA5 PIN_D1
      #define LCD_DATA6 PIN_D2
      #define LCD_DATA7 PIN_D3
      و از طرفی توی وقفه ی تایمر یه شکل موج روی پایه ی RC2 ایجاد کردم.
      در این حالت وقتی پایه صفر و یک میشه ، دیگه LCD کار نمی کنه!
      حتی پیکر بندی هم نمیشه!!

      من پایه ی کنترلی LCD رو آوردم روی پورت D و مشکلم حل شد! البته با این کار صورت مساله رو پاک کردم!!


      کد:
      #define LCD_ENABLE_PIN PIN_D4
      #define LCD_RS_PIN PIN_D5
      #define LCD_RW_PIN PIN_D6
      #define LCD_DATA4 PIN_D0
      #define LCD_DATA5 PIN_D1
      #define LCD_DATA6 PIN_D2
      #define LCD_DATA7 PIN_D3
      کسی می دونه چرا اینطوری میشه ؟
      باید با اسکوپ خروجی دو پایه سی رو بگیری ببینی درست کار می کنه یا نه احتمال داره اون پایه ها آسیب دیده باشه و درست کار نکنه یا اینکه درست نتوستی اینیشیال کنی پورت سی رو به عنوان خروجی

      دیدگاه


        #18
        پاسخ : درست کارنکردن LCD هنگام اتصال PICKIT3

        نوشته اصلی توسط saleh_chz
        و اما مشکل جدید !!!

        این سورس برنامه ی من هست:

        کد:
        #include <18F452.h>
        #device ADC=16 *=16
        
        #FUSES NOWDT          //No Watch Dog Timer
        #FUSES WDT128          //Watch Dog Timer uses 1:128 Postscale
        #FUSES PUT           //Power Up Timer
        #FUSES NOBROWNOUT        //No brownout reset
        #FUSES BORV45          //Brownout reset at 4.5V
        #FUSES NOLVP          //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
        
        #use delay(crystal=20MHz)
        #use fixed_io(c_outputs=PIN_C2 , PIN_C3)
        #define FEED1  PIN_A0
        #define FEED2  PIN_A1
        #define FEED3  PIN_A2
        #define FEED4  PIN_A3
        #define FEED5  PIN_A4
        #define FEED6  PIN_A5
        #define OK_K  PIN_B0
        #define UP_K  PIN_B1
        #define DOWN_K  PIN_B2
        #define LEFT_K  PIN_B3
        #define RIGHT_K  PIN_B4
        #define MENU_K  PIN_D7
        کد:
        #include <main.h>
        
        #define LCD_ENABLE_PIN PIN_D4
        #define LCD_RS_PIN PIN_D5
        #define LCD_RW_PIN PIN_D6
        #define LCD_DATA4 PIN_D0
        #define LCD_DATA5 PIN_D1
        #define LCD_DATA6 PIN_D2
        #define LCD_DATA7 PIN_D3
        
        #include <lcd.c>
        
        #define MAX_MENU  2
        #define PRE_T0   16
        #define PRE_T1   1
        #define F_SYS  5000000
        #define MAX_tfsw  65510  // FOR 192307.69/2 Hz  ~ 96 KHz
        #define MIN_tfsw  63035  // FOR 1999.2/2 Hz   ~ 1  KHz
        #define MAX_tfrq  63973  // FOR 199.93/2 Hz   ~ 100 Hz
        #define MIN_tfrq  34285  // FOR 9.999/2 Hz    ~ 5  Hz
        
        unsigned int menu=0;
        unsigned int16 tfsw=65358 ,tfrq=62410 ;
        float fsw=14124.293 ,frq=50.002 ;
        //unsigned int stat_c2=0,stat_c3=0;
        
        //unsigned int32 temp1=0,temp2=0;
        
        #INT_TIMER0
        void TIMER0_isr(void) // for 50 Hz
        {
          clear_interrupt(int_timer0);
          set_timer0(tfrq);
          output_toggle(PIN_C2);
          
        }
        
        #INT_TIMER1
        void TIMER1_isr(void) // for 28KHz
        {
          clear_interrupt(int_timer1);
          //setup_timer_1(T1_DISABLED);
          set_timer1(tfsw);
          output_toggle(PIN_C3);
          //setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
        }
        
        void main()
        {
          delay_ms(10);
          output_drive(PIN_C2);
          output_drive(PIN_C3);
          output_low(PIN_C2);
          output_low(PIN_C3);
          setup_timer_0(RTCC_INTERNAL|RTCC_DIV_16);   
          setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);   
          
          lcd_init();
          delay_ms(10);
          
          printf(lcd_putc,"\fAPS PWM\n");
          printf(lcd_putc,"Saleh.ChZ");
          delay_ms(750);
          fsw = (float) (F_SYS/PRE_T1)/(65536-tfsw)/2;
          frq = (float) (F_SYS/PRE_T0)/(65536-tfrq)/2;
          //printf(lcd_putc,"\f fsw=%5.3fHz\n frq=%3.3fHz",fsw,frq);
          printf(lcd_putc,"\f %5.3f,%Lu\n %3.3f,%Lu",fsw,tfsw,frq,tfrq);
          
          enable_interrupts(INT_TIMER1);
          enable_interrupts(INT_TIMER0);
          enable_interrupts(GLOBAL);
        
          while(TRUE)
          {
           //TODO: User Code
           if (input(MENU_K)==0)
           {
             delay_ms(50);
             if (input(MENU_K)==0)
             {
              if(menu>0)
              {
                menu=0;
                lcd_gotoxy(1,1);
                lcd_putc(' ');
                lcd_gotoxy(1,2);
                lcd_putc(' ');
              }
              else
              {
                menu=1;
                lcd_gotoxy(1,1);
                lcd_putc('>');
                lcd_gotoxy(1,2);
                lcd_putc(' ');
              }
             while(input(MENU_K)==0);
             }
           }
           //*****************************************************************
           if(menu>0)
           {
             if (input(LEFT_K)==0)//************  left
             {
              delay_ms(50);
              if (input(LEFT_K)==0)
              {
                if(menu>1) menu--;
                while(input(LEFT_K)==0);  
              }
             }
             if (input(RIGHT_K)==0)//************  right
             {
              delay_ms(50);
              if (input(RIGHT_K)==0)
              {
                if(menu<MAX_MENU) menu++;
                while(input(RIGHT_K)==0);
              }
             }
             if (input(UP_K)==0)//************   up
             {
              delay_ms(50);
              if (input(UP_K)==0)
              {
                switch(menu)
                {
                 case 1: // fsw
                   if(tfsw < MAX_tfsw) tfsw++;
                   while(input(UP_K)==0);
                 break;
                 case 2: // sin freq
                   if(tfrq < MAX_tfrq) tfrq++;
                   delay_ms(10);
                 break;
                }
                fsw = (float) (F_SYS/PRE_T1)/(65536-tfsw)/2;
                frq = (float) (F_SYS/PRE_T0)/(65536-tfrq)/2;
                //printf(lcd_putc,"\f fsw=%5.3fHz\n frq=%3.3fHz",fsw,frq);
                printf(lcd_putc,"\f %5.3f,%Lu\n %3.3f,%Lu",fsw,tfsw,frq,tfrq);
                //while(input(UP_K)==0);
              }
             }
             if (input(DOWN_K)==0)//************
             {
              delay_ms(50);
              if (input(DOWN_K)==0)
              {
                switch(menu)
                {
                 case 1: // fsw
                   if(tfsw > MIN_tfsw) tfsw--;
                   while(input(DOWN_K)==0);
                 break;
                 case 2: // sin freq
                   if(tfrq > MIN_tfrq) tfrq--;
                   delay_ms(10);
                 break;
                }
                fsw = (float) (F_SYS/PRE_T1)/(65536-tfsw)/2;
                frq = (float) (F_SYS/PRE_T0)/(65536-tfrq)/2;
                //printf(lcd_putc,"\f fsw=%5.3fHz\n frq=%3.3fHz",fsw,frq);
                printf(lcd_putc,"\f %5.3f,%Lu\n %3.3f,%Lu",fsw,tfsw,frq,tfrq);
                //while(input(DOWN_K)==0);
              }
             }
             switch(menu)
             {
              case 1://changing fsw
                lcd_gotoxy(1,1);
                lcd_putc('>');
                lcd_gotoxy(1,2);
                lcd_putc(' ');
              break;
              case 2://changing frq
                lcd_gotoxy(1,1);
                lcd_putc(' ');
                lcd_gotoxy(1,2);
                lcd_putc('>');
              break;
             }
           }
           else
           {
             //clearing '>' characters
             lcd_gotoxy(1,1);
             lcd_putc(' ');
             lcd_gotoxy(1,2);
             lcd_putc(' ');
             
           }
          }
        
        }
        نکته قابل توجه اینه که وقتی من محاسبات رو انجام می دم فرکانس خروجی از پایه ی مورد نظرم باید 14044.94 هرتز باشه ولی وقتی با اسکوپ و مولتی متر چک می کنم فرکانس 10810 هرتز میاد!!!
        از طرفی وقتی روتین مربوط به فرکانس 50 هرتز رو غیر فعال می کنم ، فرکانس 10810 هرتزی یه مقدار بالاتر میاد ! :eek:

        من که گیج شدم!
        کلی محاسبات انجام دادم ولی همش بی فایدست ....
        راهنمایی ؟
        لطفا ؟
        دوست عزیز موضوعی که در این بارهمیدونم این است که اون فرکانسی رو که انتخاب می کنی کمتر بهت رو میده و یکی از دلیلاش تعداد دستوراتی هست که میره اونو انجام میده
        به طور مثال برای اینکه پورت صفر و یک بشه و رو یه فرکانسی تنظیم کنیم بسته به نوع زبان نوشتن فرق داره فرکانسی که میگیری برای بالاتر بردن سرعت اگه خیلی نیاز باشه معمولا از دستورات اسمبلی استفاده میکنن مثلا وقتی شما از تابع های آماده استفاده میکنید می مثلا میگید output_c(1) میکرو برای یک کردن خروجی سی اولین کار این دستور رو می خونه که خودش میشه یک سیکل بعد میره تابعی که این کار رو می کنه از هدر پیدا میکنه میشه دو سیکل و بعد دستورات داخلش رو می خونه بخاطر همین چند سیکل اضافه میشه و مدت زمان طولانی تر میشه پس فرکانس پایین میاد برای تغییر خروجی به طور مثال برای همین میان مستقیم دستور رو به رجیستر میدن که
        کمترین زمان ممکن طول بکشه

        دیدگاه

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