اطلاعیه

Collapse
No announcement yet.

هنگ کردن LCD بعد از خواندن از mmc

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

    هنگ کردن LCD بعد از خواندن از mmc

    سلام دوستان
    من یه مشکلی دارم، بعد از اینکه که از mmc دیتا رومیخونم، میخام با ال سی دی کار کنم، ال سی دی هنگ میکنه، تایمر واچ داگ رو فعال میکنم ، میکرو ریست میشه اونوقت مشکل ال سی دی برطرف میشه، اما بدلایلی نمیخام میکرو ریست بشه، درضمن دیتارو درست میخونه فقط مشکل هنگ کردن رو داره، از mmc با فرمت FAT میخونم، از کتابخونه ی mmc.h استفاده میکنم، زبان برنامه نویسیمم C، میکرو mega16

    دوستان اگر اطلاعاتی دارند لطفا راهنمایی کنند.
    ممنون.
    تقدیر تقویم انسانهای عادی ، تغییر تدبیر انسانهای عالیست.

    #2
    پاسخ : هنگ کردن LCD بعد از خواندن از mmc

    LCD که استفاده میکنید چی هست ؟؟؟؟
    دلا خو کن به تنهایی که از تنها بلا خیزد

    دیدگاه


      #3
      پاسخ : هنگ کردن LCD بعد از خواندن از mmc

      نوشته اصلی توسط Navid_Micro
      LCD که استفاده میکنید چی هست ؟؟؟؟
      ال سی دی کاراکتری 16*2
      تقدیر تقویم انسانهای عادی ، تغییر تدبیر انسانهای عالیست.

      دیدگاه


        #4
        پاسخ : هنگ کردن LCD بعد از خواندن از mmc

        دوست عزیز ، منظورتون رو متوجه نمیشم ، متن برنامه رو بزارین احتمالان مشکل برنامه هست
        آخه مگه میشه ؟
        اگر از مد 8بیت LCD استفاده میکنید 4بیتش کنید به احتماله 99% مشکلتون حل میشه
        دلا خو کن به تنهایی که از تنها بلا خیزد

        دیدگاه


          #5
          پاسخ : هنگ کردن LCD بعد از خواندن از mmc

          نوشته اصلی توسط Navid_Micro
          دوست عزیز ، منظورتون رو متوجه نمیشم ، متن برنامه رو بزارین احتمالان مشکل برنامه هست
          آخه مگه میشه ؟
          اگر از مد 8بیت LCD استفاده میکنید 4بیتش کنید به احتماله 99% مشکلتون حل میشه
          [tt]#include <mega16.h>
          #asm
          .equ __i2c_port=0x15 ;PORTC
          .equ __sda_bit=1
          .equ __scl_bit=0
          #endasm
          #include <delay.h>
          #include <i2c.h>
          #include <lm75.h>
          #include <ds1307.h>
          #include <alcd.h>
          #include <spi.h>
          #include "mmc.h"
          #include <stdio.h>
          #include <stdlib.h>
          #include <math.h>
          #include <ff.h>

          #define T1_OVF_FREQ 100
          #define T1_PRESC 1024L
          #define T1_INIT (0x10000L-(_MCU_CLOCK_FREQUENCY_/(T1_PRESC*T1_OVF_FREQ)))

          #define r1 PORTD.0
          #define r2 PORTD.1
          #define r3 PORTB.0
          #define r4 PORTD.3

          #define c1 PIND.4
          #define c2 PIND.5
          #define c3 PIND.6
          #define c4 PIND.7

          unsigned char hour , minute , second , month , date , year;
          unsigned char hour_1 , minute_1 , second_1 , month_1 , date_1 , year_1;
          unsigned char key=16 , time_st[16] , mmc_st[10] , i , j;
          unsigned char temp_st[16] , minmax_st[16];
          int min_temp , max_temp , temp[5]={18,23,55,87,900} , sector_n;
          bit write_en;
          int mmc_temp_min , mmc_temp_max;
          eeprom char log_en;

          void set_time(void);
          void read_temp_mmc(void);

          interrupt [EXT_INT0] void ext_int0_isr(void)
          {
          if(write_en == 1)
          {
          if(i<=4)
          {
          // temp[i] = lm75_temperature_10(i) / 10;
          sprintf(temp_st," T%d = %d 'c ",i+1,temp[i]);
          lcd_gotoxy(0,0);
          lcd_puts(temp_st);
          delay_ms(100);
          i++;
          }
          else
          {
          i=0;
          max_temp=0;
          min_temp=1000;
          for(j=0;j<=4;j++)
          {
          min_temp = min(temp[j],min_temp);
          max_temp = max(temp[j],max_temp);
          }

          lcd_gotoxy(0,0);
          lcd_putsf(" Saving... "

          mmc_read(date,mmc_st);
          mmc_temp_min = atoi(mmc_st); //read old data from mmc
          mmc_read(date+100,mmc_st);
          mmc_temp_max = atoi(mmc_st);

          if(min_temp < mmc_temp_min)
          {
          sprintf(mmc_st,"%d",min_temp);
          mmc_write(date,mmc_st);
          delay_ms(30);
          }

          if(max_temp > mmc_temp_max)
          {
          sprintf(mmc_st,"%d",max_temp);
          mmc_write(date+100,mmc_st);
          delay_ms(30);
          }

          // Watchdog Timer initialization
          // Watchdog Timer Prescaler: OSC/16k
          WDTCR=0x18;
          WDTCR=0x08;
          delay_ms(1000);


          }
          }
          }

          interrupt [TIM0_OVF] void timer0_ovf_isr(void)
          {
          r1=0; r2=1; r3=1; r4=1;
          delay_us(10);
          if(c1 == 0) { while(c1 == 0); key = 1; }
          if(c2 == 0) { while(c2 == 0); key = 2; }
          if(c3 == 0) { while(c3 == 0); key = 3; }
          if(c4 == 0) { while(c4 == 0); key = 12; }

          r1=1; r2=0; r3=1; r4=1;
          delay_us(10);
          if(c1 == 0) { while(c1 == 0); key = 4; }
          if(c2 == 0) { while(c2 == 0); key = 5; }
          if(c3 == 0) { while(c3 == 0); key = 6; }
          if(c4 == 0) { while(c4 == 0); key = 13; }

          r1=1; r2=1; r3=0; r4=1;
          delay_us(10);
          if(c1 == 0) { while(c1 == 0); key = 7; }
          if(c2 == 0) { while(c2 == 0); key = 8; }
          if(c3 == 0) { while(c3 == 0); key = 9; }
          if(c4 == 0) { while(c4 == 0); key = 14; }

          r1=1; r2=1; r3=1; r4=0;
          delay_us(10);
          if(c1 == 0) { while(c1 == 0); key = 10; }
          if(c2 == 0) { while(c2 == 0); key = 0; }
          if(c3 == 0) { while(c3 == 0); key = 11; }
          if(c4 == 0) { while(c4 == 0); key = 15; }


          }

          void main(void)
          {
          PORTB=0x00;
          DDRB=0xB1;

          PORTD=0x00;
          DDRD=0x0B;

          // Timer/Counter 0 initialization
          // Clock source: System Clock
          // Clock value: 500.000 kHz
          // Mode: Normal top=0xFF
          // OC0 output: Disconnected
          TCCR0=0x02;
          TCNT0=0x00;
          OCR0=0x00;

          // External Interrupt(s) initialization
          // INT0: On
          // INT0 Mode: Falling Edge
          // INT1: Off
          // INT2: Off
          GICR|=0x40;
          MCUCR=0x02;
          MCUCSR=0x00;
          GIFR=0x40;

          TIMSK=0x01;

          ACSR=0x80;
          SFIOR=0x00;

          SPCR=0x52;
          SPSR=0x00;

          delay_ms(500);
          spiInit();
          mmc_init();
          mmc_reset();

          i2c_init();
          lm75_init(0,75,80,0);
          lm75_init(1,75,80,0);
          lm75_init(2,75,80,0);
          lm75_init(3,75,80,0);
          lm75_init(4,75,80,0);


          lcd_init(16);

          #asm("sei&quot

          while (1)
          {
          if(key == 13) set_time();
          if(key == 12) read_temp_mmc();
          write_en = 1;

          // if(log_en == 1)

          rtc_get_time(&hour , &minute , &second);
          delay_ms(100);
          rtc_get_date(&date , &month , &year);
          sprintf(time_st,"%d:%d:%d - %d/%d",hour,minute,second,month,date);
          lcd_gotoxy(0,1);
          lcd_puts(time_st);

          }
          }

          void read_temp_mmc(void)
          {
          write_en=0;
          log_en = 1;
          lcd_clear();

          mmc_read(date,mmc_st);
          lcd_gotoxy(0,0);
          lcd_puts(mmc_st);

          mmc_read(date+100,mmc_st);
          lcd_gotoxy(0,0);
          lcd_puts(mmc_st);

          }

          void set_time(void)
          {
          write_en=0;
          key=16;
          /**************************** get year *******************************/
          lcd_clear();
          get_year:
          {
          sprintf(time_st,"?? / %d / %d ",month,date);
          lcd_gotoxy(0,0);
          lcd_puts(time_st);

          key=16;
          while(key == 16);

          year_1 = key;
          sprintf(time_st,"%d? / %d / %d ",year_1,month,date);
          lcd_gotoxy(0,0);
          lcd_puts(time_st);

          key=16;
          while(key == 16);

          year = ((year_1 * 10) + key);
          }
          /************************** get month **********************************/
          get_month:
          {
          sprintf(time_st,"%d / ?? / %d ",year,second);
          lcd_gotoxy(0,0);
          lcd_puts(time_st);

          key=16;
          while(key == 16);

          month_1 = key;
          sprintf(time_st,"%d / %d? / %d ",year,month_1,date);
          lcd_gotoxy(0,0);
          lcd_puts(time_st);

          key=16;
          while(key == 16);

          month = (month_1 * 10) + key;
          }
          if(month > 12) goto get_month;
          /**************************** get date *******************************/
          get_date:
          {
          sprintf(time_st,"%d / %d / ?? ",year,month);
          lcd_gotoxy(0,0);
          lcd_puts(time_st);

          key=16;
          while(key == 16);

          date_1 = key;
          sprintf(time_st,"%d / %d / %d? ",year,month,date_1);
          lcd_gotoxy(0,0);
          lcd_puts(time_st);

          key=16;
          while(key == 16);

          date = (date_1 * 10) + key;
          }
          if(date > 31) goto get_date;
          /************************************************** *******************/
          sprintf(time_st,"%d / %d / %d ",year,month,date);
          lcd_gotoxy(0,0);
          lcd_puts(time_st);

          key=16;
          while(key == 16);
          lcd_clear();
          /**************************** get hour **********************************/
          get_hour:
          {
          sprintf(time_st,"??h : %dm : %ds",minute,second);
          lcd_gotoxy(0,0);
          lcd_puts(time_st);

          key=16;
          while(key == 16);

          hour_1 = key;
          sprintf(time_st,"%d?h : %dm : %ds",hour_1,minute,second);
          lcd_gotoxy(0,0);
          lcd_puts(time_st);

          key=16;
          while(key == 16);
          hour = (hour_1 * 10) + key;
          }
          if(hour > 23) goto get_hour;
          /**************************** get minute ********************************/
          get_minute:
          {
          sprintf(time_st,"%dh : ??m : %ds",hour,second);
          lcd_gotoxy(0,0);
          lcd_puts(time_st);

          key=16;
          while(key == 16);

          minute_1 = key;
          sprintf(time_st,"%dh : %d?m : %ds",hour,minute_1,second);
          lcd_gotoxy(0,0);
          lcd_puts(time_st);

          key=16;
          while(key == 16);
          minute = (minute_1 * 10) + key;
          }
          if(minute > 59) goto get_minute;
          /************************** get second **********************************/
          get_second:
          {
          sprintf(time_st,"%dh : %dm : ??s",hour,minute);
          lcd_gotoxy(0,0);
          lcd_puts(time_st);

          key=16;
          while(key == 16);

          second_1 = key;
          sprintf(time_st,"%dh : %dm : %d?s",hour,minute,second_1);
          lcd_gotoxy(0,0);
          lcd_puts(time_st);

          key=16;
          while(key == 16);
          second = (second_1 * 10) + key;
          }
          if(second > 59) goto get_second;
          /************************************************** *******************/
          sprintf(time_st,"%dh : %dm : %ds",hour,minute,second);
          lcd_gotoxy(0,0);
          lcd_puts(time_st);

          key=16;
          while(key == 16);
          key=16;
          /************************************************** *****************/
          rtc_set_time(hour , minute , second);
          rtc_set_date(date , month , year);


          }
          [/tt]
          تقدیر تقویم انسانهای عادی ، تغییر تدبیر انسانهای عالیست.

          دیدگاه


            #6
            پاسخ : هنگ کردن LCD بعد از خواندن از mmc

            شما برنامه رو با Codevision و کد با استفاده از CodeWizard نوشتید .
            نگفتید LCD روی مد چند بیته ؟؟؟؟؟؟ 8 یا 4 ؟؟؟؟
            برای ال سی دی از ای سی رابط اسفاده میکنید ؟؟؟؟؟
            به ال سی دی مستقیم عدد ندید ، از فرمان itoa استفاده کنید که عدد رو به رشته تبدیل کنه سپس به LCD بفرستید
            به دستور های While هم که برای اسکن کلید ها استفاده کردید نیازی نیست و همینطور برای اسکن کلیدها هم نیازی به تایمر نیست
            اینا رو بررسی کنید و دوباره اطلاع بدید
            دلا خو کن به تنهایی که از تنها بلا خیزد

            دیدگاه


              #7
              پاسخ : هنگ کردن LCD بعد از خواندن از mmc

              نوشته اصلی توسط Navid_Micro
              شما برنامه رو با Codevision و کد با استفاده از CodeWizard نوشتید .
              نگفتید LCD روی مد چند بیته ؟؟؟؟؟؟ 8 یا 4 ؟؟؟؟
              برای ال سی دی از ای سی رابط اسفاده میکنید ؟؟؟؟؟
              به ال سی دی مستقیم عدد ندید ، از فرمان itoa استفاده کنید که عدد رو به رشته تبدیل کنه سپس به LCD بفرستید
              به دستور های While هم که برای اسکن کلید ها استفاده کردید نیازی نیست و همینطور برای اسکن کلیدها هم نیازی به تایمر نیست
              اینا رو بررسی کنید و دوباره اطلاع بدید
              LCD چهار بیته، از آی سی رابط استفاده نمیکنم، عدد رو با دستور sprintf به رشته تبدیل میکنم، از تایمر هم برای Real time بودن صفحه کلید استفاده کردم، من با این روش ها مشکلی ندارم چندساله دارم ازشون استفاده میکنم، فقط انگار بعد از خوندن از صفحه کلید، ال سی دی کانفیگ خودش رو از دست میده و با ریست میکرو درست میشه.
              یه برنامه دیگه گذاشتم بیزحمت یه نگاه بندازید اینم همین مشکل رو داره.
              ممنون از توجهتون.

              [tt]
              #include <mega16.h>

              // Alphanumeric LCD Module functions
              #asm
              .equ __lcd_port=0x1B ;PORTA
              #endasm

              #include <lcd.h>
              #include <mmc.h>
              #include <delay.h>
              #include <spi.h>

              unsigned char a[12],w[]="Hello World!";

              // Declare your global variables here

              void main(void)
              {
              // Declare your local variables here

              // Input/Output Ports initialization
              // Port A initialization
              // Func7=In Func6=Out Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
              // State7=T State6=0 State5=T State4=T State3=T State2=T State1=T State0=T
              PORTA=0x00;
              DDRA=0x40;

              // Port B initialization
              // Func7=In Func6=Out Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
              // State7=T State6=0 State5=T State4=T State3=T State2=T State1=T State0=T
              PORTB=0x00;
              DDRB=0xb0;

              // Port C initialization
              // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
              // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
              PORTC=0x00;
              DDRC=0x00;

              // Port D initialization
              // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
              // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
              PORTD=0x00;
              DDRD=0x00;

              // Timer/Counter 0 initialization
              // Clock source: System Clock
              // Clock value: Timer 0 Stopped
              // Mode: Normal top=FFh
              // OC0 output: Disconnected
              TCCR0=0x00;
              TCNT0=0x00;
              OCR0=0x00;

              // Timer/Counter 1 initialization
              // Clock source: System Clock
              // Clock value: Timer 1 Stopped
              // Mode: Normal top=FFFFh
              // OC1A output: Discon.
              // OC1B output: Discon.
              // Noise Canceler: Off
              // Input Capture on Falling Edge
              // Timer 1 Overflow Interrupt: Off
              // Input Capture Interrupt: Off
              // Compare A Match Interrupt: Off
              // Compare B Match Interrupt: Off
              TCCR1A=0x00;
              TCCR1B=0x00;
              TCNT1H=0x00;
              TCNT1L=0x00;
              ICR1H=0x00;
              ICR1L=0x00;
              OCR1AH=0x00;
              OCR1AL=0x00;
              OCR1BH=0x00;
              OCR1BL=0x00;

              // Timer/Counter 2 initialization
              // Clock source: System Clock
              // Clock value: Timer 2 Stopped
              // Mode: Normal top=FFh
              // OC2 output: Disconnected
              ASSR=0x00;
              TCCR2=0x00;
              TCNT2=0x00;
              OCR2=0x00;

              // External Interrupt(s) initialization
              // INT0: Off
              // INT1: Off
              // INT2: Off
              MCUCR=0x00;
              MCUCSR=0x00;

              // Timer(s)/Counter(s) Interrupt(s) initialization
              TIMSK=0x00;

              // Analog Comparator initialization
              // Analog Comparator: Off
              // Analog Comparator Input Capture by Timer/Counter 1: Off
              ACSR=0x80;
              SFIOR=0x00;

              // SPI initialization
              // SPI Type: Slave
              // SPI Clock Rate: 250.000 kHz
              // SPI Clock Phase: Cycle Half
              // SPI Clock Polarity: Low
              // SPI Data Order: MSB First
              SPCR=0x50;
              SPSR=0x00;

              // LCD module initialization
              lcd_init(16);

              // Global enable interrupts
              #asm("sei&quot
              lcd_gotoxy(0,0);
              lcd_putsf("Please wait"
              delay_ms(100);
              spiInit();
              mmc_init();
              mmc_reset();

              while (1)
              {
              mmc_write(50,w);
              delay_ms(5);
              mmc_read(50,a);

              lcd_clear();
              lcd_gotoxy(2,1);
              lcd_puts(a);
              delay_ms(100);
              };
              }
              [/tt]
              تقدیر تقویم انسانهای عادی ، تغییر تدبیر انسانهای عالیست.

              دیدگاه


                #8
                پاسخ : هنگ کردن LCD بعد از خواندن از mmc

                فرکانس کلاک میکروتون چقدره ؟
                داخلیه یا خارجی ؟
                با یه LCD دیگه امتحان کردید ؟
                یه بار SPI رو از مدار بردارید و دوباره امتحان کنید !!!
                عجیبه ، اخه برنامه که مشکل نداره ،
                ولی احتمالا این تو خوندن از MMC گیر میکنه ، حالا یه کاری کنید !؟ بیاید برنامه رو یه بار با بسکام امتحان کنید ، ببینید بازم هنگ میکنه ، چون منم یه بار به یه همچین مشکلی با کدویژن برخوردم ، موقعی که میومد MMC رو دیتکت کنه میکرو هنگ میکرد ، آخر مجبورم کرد با بسکام بنویسمش
                دلا خو کن به تنهایی که از تنها بلا خیزد

                دیدگاه


                  #9
                  پاسخ : هنگ کردن LCD بعد از خواندن از mmc

                  نوشته اصلی توسط Navid_Micro
                  فرکانس کلاک میکروتون چقدره ؟
                  داخلیه یا خارجی ؟
                  با یه LCD دیگه امتحان کردید ؟
                  یه بار SPI رو از مدار بردارید و دوباره امتحان کنید !!!
                  عجیبه ، اخه برنامه که مشکل نداره ،
                  ولی احتمالا این تو خوندن از MMC گیر میکنه ، حالا یه کاری کنید !؟ بیاید برنامه رو یه بار با بسکام امتحان کنید ، ببینید بازم هنگ میکنه ، چون منم یه بار به یه همچین مشکلی با کدویژن برخوردم ، موقعی که میومد MMC رو دیتکت کنه میکرو هنگ میکرد ، آخر مجبورم کرد با بسکام بنویسمش
                  سلام، ممنون از اینکه جواب دادید.
                  کلاک میکروم داخلیه، اشکال از مقدارش هم نیست چون با همه ی مقدارهاش تست کردم، من تو پروژه های قبلیم هم همین مشکلرو داشتم ولی اونجا اطلاعات رو بعد از خوندن تو eeprom ذخیره میکردم و میکرو رو ریست میکردم، اما اینجا نباید اینکار رو کنم، پس اشکال از lcd نیست، بدون وجود MMC هم هیچ مشکلی نداره، این یک قسمت از پروژمه یعنی پروژم زبان C باید باشه، من حدس میزنم کتابخونه ی mmc.h مشکل دار باشه، شما اگر کتابخونه ای به زبانc برای mmc دارید لطفا بفرستید.
                  ممنون.
                  تقدیر تقویم انسانهای عادی ، تغییر تدبیر انسانهای عالیست.

                  دیدگاه


                    #10
                    پاسخ : هنگ کردن LCD بعد از خواندن از mmc

                    نه ، من کتاب خونه دیگه ای ندارم ، همش همین mmc.h هست منم از همین استفاده کردم ، اخرش هم به جایی نرسیدم ، چرا شما واسه استفاده از مموری از بسکام استفاده نمیکنید ؟ درایور MMCش هم راحته ، هم جالب
                    دلا خو کن به تنهایی که از تنها بلا خیزد

                    دیدگاه

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