اطلاعیه

Collapse
No announcement yet.

کمک!!! میکروم ریست میشه

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

    کمک!!! میکروم ریست میشه

    :-(( :-((سلام دوستان.
    به یه مشکل جدی برخورد کردم. یه دستگاه همزن برقی با موتور 12 ولت دیسی که روی اون دو تا آهن ربا هست درست کردم که با دو تا ولوم دور موتور و دمای محلول تنظیم میشود.
    مشکل اینجاست که دستگاه پس از حدود 5 دقیقه یک بار ریست میشود. تغذیه ام سوئیچینگه و فرکانسمم روی 8 مگ هستش و پایه ریست هم پول پ هستش. در ضمن مقدار متغییر های adc هام هم گاهی بیخودی به هم میریزه به صورتی که مدام عددهام تغییر میکنه و به ولوم هام حساس نمیشه.
    خواهشا کمک کنید... :cry: :cry: :cry:
    سُبُّوحٌ قُدُّوسٌ رَبُّ الْمَلَائِکَهِ وَ الرُّوحِ

    (SMART DESIGN....(POWERFUL & QUICK

    موفقیت اتفاقی نیست......بابای پولدار میخواد

    #2
    پاسخ : کمک!!! میکروم ریست میشه

    سلام
    شماتیک و برنامه رو بزارید

    دیدگاه


      #3
      پاسخ : کمک!!! میکروم ریست میشه

      برنامه:
      کد:
      #include <mega8.h>
      #include <delay.h>
      #include <stdio.h>
      #include <alcd.h>
      eeprom unsigned char add=0;
      char i;
      unsigned int temp[20],pwm[20],dama[20],c;
      long int sum_temp,sum_pwm,sum_dama,asli;
      unsigned char line1[17],line2[17];
      bit flag_cal,cal,flag_lose;
      
      // Timer1 overflow interrupt service routine
      interrupt [TIM1_OVF] void timer1_ovf_isr(void)
      {
        static unsigned int pwm_cnt;
        TCNT1=-100;
        if(++pwm_cnt>99)pwm_cnt=0;
        if(pwm_cnt>=sum_pwm)PORTB.5=0;else PORTB.5=1;
      }
      
      #define ADC_VREF_TYPE 0x00
      
      // Read the AD conversion result
      unsigned int read_adc(unsigned char adc_input)
      {
      ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
      // Delay needed for the stabilization of the ADC input voltage
      delay_us(10);
      // Start the AD conversion
      ADCSRA|=0x40;
      // Wait for the AD conversion to complete
      while ((ADCSRA & 0x10)==0);
      ADCSRA|=0x10;
      return ADCW;
      }
      
      // Decalre your global variables here
      
      void main(void)
      {
      // Decalre your local variables here
      
      // Input/Output Ports initialization
      // Port B 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 
      PORTB=0x01;
      DDRB=0xfe;
      
      // Port C initialization
      // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
      // 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: 1000/000 kHz
      TCCR0=0x00;
      TCNT0=0x00;
      
      // Timer/Counter 1 initialization
      // Clock source: System Clock
      // Clock value: 1000/000 kHz
      // Mode: Normal top=0xFFFF
      // OC1A output: Discon.
      // OC1B output: Discon.
      // Noise Canceler: Off
      // Input Capture on Falling Edge
      // Timer1 Overflow Interrupt: On
      // Input Capture Interrupt: Off
      // Compare A Match Interrupt: Off
      // Compare B Match Interrupt: Off
      TCCR1A=0x00;
      TCCR1B=0x02;
      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: Timer2 Stopped
      // Mode: Normal top=0xFF
      // OC2 output: Disconnected
      ASSR=0x00;
      TCCR2=0x00;
      TCNT2=0x00;
      OCR2=0x00;
      
      // External Interrupt(s) initialization
      // INT0: Off
      // INT1: Off
      MCUCR=0x00;
      
      // Timer(s)/Counter(s) Interrupt(s) initialization
      TIMSK=0x05;
      
      // USART initialization
      // USART disabled
      UCSRB=0x00;
      
      // Analog Comparator initialization
      // Analog Comparator: Off
      // Analog Comparator Input Capture by Timer/Counter 1: Off
      ACSR=0x80;
      SFIOR=0x00;
      
      // ADC initialization
      // ADC Clock frequency: 1000/000 kHz
      // ADC Voltage Reference: AREF pin
      ADMUX=ADC_VREF_TYPE & 0xff;
      ADCSRA=0x83;
      
      // SPI initialization
      // SPI disabled
      SPCR=0x00;
      
      // TWI initialization
      // TWI disabled
      TWCR=0x00;
      
      // Alphanumeric LCD initialization
      // Connections are specified in the
      // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
      // RS - PORTD Bit 0
      // RD - PORTD Bit 1
      // EN - PORTD Bit 2
      // D4 - PORTD Bit 4
      // D5 - PORTD Bit 5
      // D6 - PORTD Bit 6
      // D7 - PORTD Bit 7
      // Characters/line: 8
      lcd_init(8);
      
      // Global enable interrupts
      
      lcd_clear();
      /*sprintf(line1,"EHYA TEB");
      sprintf(line2,"55549898");
      lcd_gotoxy(0,0);
      lcd_puts(line1);
      lcd_gotoxy(0,1);
      lcd_puts(line2);
      delay_ms(2300);
      lcd_clear();
      */
      #asm("sei")
      while (1)
        {
         	if(PINB.0==0){
           delay_ms(40);
           if(PINB.0==0 && flag_cal==0){
             flag_cal=1;
             cal=!cal;
             lcd_clear();
             sum_pwm=0;
           }
         }else flag_cal=0;
         
         if(cal){
           for(i=0;i<20;i++){
             temp[i]=read_adc(1)/10;
             if(temp[i]>100) temp[i]=100;
               delay_us(10);
           }     
           
           sum_temp=0;
           for(i=0;i<20;i++) sum_temp+=temp[i];
           sum_temp/=20;
           add=sum_temp;
           
           for(i=0;i<20;i++){
             dama[i]=read_adc(3)*.49;
             delay_us(10);
           }
           sum_dama=0; 
           for(i=0;i<20;i++){
             sum_dama+=dama[i];
           }
           sum_dama/=20;
           asli=sum_dama;
           sum_dama-=5;
           sum_dama+=add;
           
           sprintf(line1,"Real=%3d",asli);
           sprintf(line2,"temp=%3d",sum_dama);
           lcd_gotoxy(0,0);
           lcd_puts(line1);
           lcd_gotoxy(0,1);
           lcd_puts(line2);
         }
          
         if(!cal){
         
           for(i=0;i<20;i++){
             temp[i]=read_adc(1)/9.5+10;
             if(temp[i]>110) temp[i]=110;
             delay_us(10);
           }
           sum_temp=0;
           for(i=0;i<20;i++) sum_temp+=temp[i];
           sum_temp/=20;
           
           for(i=0;i<20;i++){
             pwm[i]=read_adc(0)/11;
             if(pwm[i]<10) pwm[i]=0;
             if(pwm[i]>=10)pwm[i]+=10;       
             if(pwm[i]>100)pwm[i]=100;
             delay_us(10);
           }
           
           sum_pwm=0; 
           TCCR1B=0X00;
           for(i=0;i<20;i++) sum_pwm+=pwm[i];
           sum_pwm/=20;
           TCCR1B=0X02;
           
           for(i=0;i<20;i++){
             dama[i]=read_adc(3)*.49;
             delay_us(10);
           }
           
           sum_dama=0; 
           for(i=0;i<20;i++){
             sum_dama+=dama[i];
           }
           sum_dama/=20;
           if(sum_dama>250 || sum_dama==0) flag_lose=1;
           sum_dama-=5;
           sum_dama+=add;
           
           if(sum_temp>sum_dama+1){PORTB.6=1;PORTB.1=1;}
           if(sum_temp<sum_dama+1){PORTB.6=0;PORTB.1=0;}
           
           sprintf(line1,"temp=%-3d",sum_temp);
           sprintf(line2,"out=%d%% ",sum_pwm);
           lcd_gotoxy(0,0);
           lcd_puts(line1);
           lcd_gotoxy(0,1);
           lcd_puts(line2); 
           
           while(flag_lose){
           PORTB.6=0;PORTB.1=0;
           PORTB.5=0;
           sum_dama=read_adc(3)*.49;
           if(sum_dama<200 && sum_dama>5)flag_lose=0;
           sprintf(line1," check ");
           sprintf(line2," sensor ");
           lcd_gotoxy(0,0);
           lcd_puts(line1);
           lcd_gotoxy(0,1);
           lcd_puts(line2);
           }
           if(++c>500){c=0;
            lcd_clear();  
           }
         }
        }
      }
      شماتیک:
      سُبُّوحٌ قُدُّوسٌ رَبُّ الْمَلَائِکَهِ وَ الرُّوحِ

      (SMART DESIGN....(POWERFUL & QUICK

      موفقیت اتفاقی نیست......بابای پولدار میخواد

      دیدگاه


        #4
        پاسخ : کمک!!! میکروم ریست میشه

        سلام ، اگه فیوزبیت BODLEVEL پراگرم شده باشه ، در صورتی که ولتاژپایه Vcc کمتر از 4 ولت بشه ، میکرو ریست میشه ، در غیر این صورت ( حالت پیش فرض خودش ) اگر ولتاژ پایه Vcc کمتر از 2.5 ولت بشه ریست میشه .

        دیدگاه


          #5
          پاسخ : کمک!!! میکروم ریست میشه

          فیوزبیتم روی 2.5 ولت تنظیمه
          سُبُّوحٌ قُدُّوسٌ رَبُّ الْمَلَائِکَهِ وَ الرُّوحِ

          (SMART DESIGN....(POWERFUL & QUICK

          موفقیت اتفاقی نیست......بابای پولدار میخواد

          دیدگاه


            #6
            پاسخ : کمک!!! میکروم ریست میشه

            نوشته اصلی توسط seyyed mohammad Razavi
            برنامه:
            کد:
            #include <mega8.h>
            #include <delay.h>
            #include <stdio.h>
            #include <alcd.h>
            eeprom unsigned char add=0;
            char i;
            unsigned int temp[20],pwm[20],dama[20],c;
            long int sum_temp,sum_pwm,sum_dama,asli;
            unsigned char line1[17],line2[17];
            bit flag_cal,cal,flag_lose;
            
            // Timer1 overflow interrupt service routine
            interrupt [TIM1_OVF] void timer1_ovf_isr(void)
            {
              static unsigned int pwm_cnt;
              TCNT1=-100;
              if(++pwm_cnt>99)pwm_cnt=0;
              if(pwm_cnt>=sum_pwm)PORTB.5=0;else PORTB.5=1;
            }
            
            #define ADC_VREF_TYPE 0x00
            
            // Read the AD conversion result
            unsigned int read_adc(unsigned char adc_input)
            {
            ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
            // Delay needed for the stabilization of the ADC input voltage
            delay_us(10);
            // Start the AD conversion
            ADCSRA|=0x40;
            // Wait for the AD conversion to complete
            while ((ADCSRA & 0x10)==0);
            ADCSRA|=0x10;
            return ADCW;
            }
            
            // Decalre your global variables here
            
            void main(void)
            {
            // Decalre your local variables here
            
            // Input/Output Ports initialization
            // Port B 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 
            PORTB=0x01;
            DDRB=0xfe;
            
            // Port C initialization
            // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
            // 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: 1000/000 kHz
            TCCR0=0x00;
            TCNT0=0x00;
            
            // Timer/Counter 1 initialization
            // Clock source: System Clock
            // Clock value: 1000/000 kHz
            // Mode: Normal top=0xFFFF
            // OC1A output: Discon.
            // OC1B output: Discon.
            // Noise Canceler: Off
            // Input Capture on Falling Edge
            // Timer1 Overflow Interrupt: On
            // Input Capture Interrupt: Off
            // Compare A Match Interrupt: Off
            // Compare B Match Interrupt: Off
            TCCR1A=0x00;
            TCCR1B=0x02;
            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: Timer2 Stopped
            // Mode: Normal top=0xFF
            // OC2 output: Disconnected
            ASSR=0x00;
            TCCR2=0x00;
            TCNT2=0x00;
            OCR2=0x00;
            
            // External Interrupt(s) initialization
            // INT0: Off
            // INT1: Off
            MCUCR=0x00;
            
            // Timer(s)/Counter(s) Interrupt(s) initialization
            TIMSK=0x05;
            
            // USART initialization
            // USART disabled
            UCSRB=0x00;
            
            // Analog Comparator initialization
            // Analog Comparator: Off
            // Analog Comparator Input Capture by Timer/Counter 1: Off
            ACSR=0x80;
            SFIOR=0x00;
            
            // ADC initialization
            // ADC Clock frequency: 1000/000 kHz
            // ADC Voltage Reference: AREF pin
            ADMUX=ADC_VREF_TYPE & 0xff;
            ADCSRA=0x83;
            
            // SPI initialization
            // SPI disabled
            SPCR=0x00;
            
            // TWI initialization
            // TWI disabled
            TWCR=0x00;
            
            // Alphanumeric LCD initialization
            // Connections are specified in the
            // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
            // RS - PORTD Bit 0
            // RD - PORTD Bit 1
            // EN - PORTD Bit 2
            // D4 - PORTD Bit 4
            // D5 - PORTD Bit 5
            // D6 - PORTD Bit 6
            // D7 - PORTD Bit 7
            // Characters/line: 8
            lcd_init(8);
            
            // Global enable interrupts
            
            lcd_clear();
            /*sprintf(line1,"EHYA TEB");
            sprintf(line2,"55549898");
            lcd_gotoxy(0,0);
            lcd_puts(line1);
            lcd_gotoxy(0,1);
            lcd_puts(line2);
            delay_ms(2300);
            lcd_clear();
            */
            #asm("sei")
            while (1)
              {
               	if(PINB.0==0){
                 delay_ms(40);
                 if(PINB.0==0 && flag_cal==0){
                   flag_cal=1;
                   cal=!cal;
                   lcd_clear();
                   sum_pwm=0;
                 }
               }else flag_cal=0;
               
               if(cal){
                 for(i=0;i<20;i++){
                   temp[i]=read_adc(1)/10;
                   if(temp[i]>100) temp[i]=100;
                     delay_us(10);
                 }     
                 
                 sum_temp=0;
                 for(i=0;i<20;i++) sum_temp+=temp[i];
                 sum_temp/=20;
                 add=sum_temp;
                 
                 for(i=0;i<20;i++){
                   dama[i]=read_adc(3)*.49;
                   delay_us(10);
                 }
                 sum_dama=0; 
                 for(i=0;i<20;i++){
                   sum_dama+=dama[i];
                 }
                 sum_dama/=20;
                 asli=sum_dama;
                 sum_dama-=5;
                 sum_dama+=add;
                 
                 sprintf(line1,"Real=%3d",asli);
                 sprintf(line2,"temp=%3d",sum_dama);
                 lcd_gotoxy(0,0);
                 lcd_puts(line1);
                 lcd_gotoxy(0,1);
                 lcd_puts(line2);
               }
                
               if(!cal){
               
                 for(i=0;i<20;i++){
                   temp[i]=read_adc(1)/9.5+10;
                   if(temp[i]>110) temp[i]=110;
                   delay_us(10);
                 }
                 sum_temp=0;
                 for(i=0;i<20;i++) sum_temp+=temp[i];
                 sum_temp/=20;
                 
                 for(i=0;i<20;i++){
                   pwm[i]=read_adc(0)/11;
                   if(pwm[i]<10) pwm[i]=0;
                   if(pwm[i]>=10)pwm[i]+=10;       
                   if(pwm[i]>100)pwm[i]=100;
                   delay_us(10);
                 }
                 
                 sum_pwm=0; 
                 TCCR1B=0X00;
                 for(i=0;i<20;i++) sum_pwm+=pwm[i];
                 sum_pwm/=20;
                 TCCR1B=0X02;
                 
                 for(i=0;i<20;i++){
                   dama[i]=read_adc(3)*.49;
                   delay_us(10);
                 }
                 
                 sum_dama=0; 
                 for(i=0;i<20;i++){
                   sum_dama+=dama[i];
                 }
                 sum_dama/=20;
                 if(sum_dama>250 || sum_dama==0) flag_lose=1;
                 sum_dama-=5;
                 sum_dama+=add;
                 
                 if(sum_temp>sum_dama+1){PORTB.6=1;PORTB.1=1;}
                 if(sum_temp<sum_dama+1){PORTB.6=0;PORTB.1=0;}
                 
                 sprintf(line1,"temp=%-3d",sum_temp);
                 sprintf(line2,"out=%d%% ",sum_pwm);
                 lcd_gotoxy(0,0);
                 lcd_puts(line1);
                 lcd_gotoxy(0,1);
                 lcd_puts(line2); 
                 
                 while(flag_lose){
                 PORTB.6=0;PORTB.1=0;
                 PORTB.5=0;
                 sum_dama=read_adc(3)*.49;
                 if(sum_dama<200 && sum_dama>5)flag_lose=0;
                 sprintf(line1," check ");
                 sprintf(line2," sensor ");
                 lcd_gotoxy(0,0);
                 lcd_puts(line1);
                 lcd_gotoxy(0,1);
                 lcd_puts(line2);
                 }
                 if(++c>500){c=0;
                  lcd_clear();  
                 }
               }
              }
            }
            شماتیک:
            سلام
            دوست عزیز avcc و aref با یک سلف 10mh بزن به vcc و با یک خازن 100pf هم بزن به زمین.
            من این مشکلو داشتم اینجور حلش کردمو البته اونجا من ال سی دی هم داشتم که ال سی دی هم بهم میریخت و روی پایه 10 و 11 میکرو خازن 104 گذاشتم روی پایه 1و2 ال سی دی هم 10 میکرو که مشکلم حل شد.

            دیدگاه


              #7
              پاسخ : کمک!!! میکروم ریست میشه

              با سلام خروجیه سوییچینگ از یک رگولاتور 7805 و یک خازن 1000 مکرو برای تغذیه میکرو استفاده کنید

              دیدگاه


                #8
                پاسخ : کمک!!! میکروم ریست میشه

                سلام. همه ی این کارها رو کردم ولی فایده نداشت
                سُبُّوحٌ قُدُّوسٌ رَبُّ الْمَلَائِکَهِ وَ الرُّوحِ

                (SMART DESIGN....(POWERFUL & QUICK

                موفقیت اتفاقی نیست......بابای پولدار میخواد

                دیدگاه


                  #9
                  پاسخ : کمک!!! میکروم ریست میشه

                  سر راه تغذیه موتور دیود بگذارید یه دیود دیگه هم در گرایش معکوس که سر کاتدش زمین شده با بگذارید یر راه تغذیه موتور. یادم نیس ولی توی دیتا سیت L298 گفته بود برای وقتی که جریان کشی زیاد هست یکی از پایه ها رو(یادم نیست کدوم داخل دیتاشیت گفته)با یه مقاومت به زمین وصل کنید. رابط کاربری Jtag رو در حالت خاموش قرار دادید؟چون موتور دارید یه مقاومت کم مثلا 10 اهم با پایه adc سری کنید بعد بخونیدش البته به افت ولتاژ روی مقاومت هم توجه داشته باشید و در برنامه(اگر مهم هست) منظور کنید. این اشکالات مال نویز توی میکرو هست. یه پیشنهاد دوباره برنامتون رو چک کنید.
                  گویند سنگ لعل شود در مقام صبر اری شود ولی به خون جگر شود
                  همیشه آخر همه چیز خوبه، اگر هم هنوز خوب نشده پس هنوز آخرش نشده(چارلی چاپلین)

                  دیدگاه


                    #10
                    پاسخ : کمک!!! میکروم ریست میشه

                    یه سلف کوچیک با تغذیه میکرو سری کنید. بهتر هست به جای L298 از اپتوکوپلر استفاده کنید اینطوری دیگه دیود هم لازم نداره. اگر مدار ساخته شده باید تغذیه میکرو و موتورها جدا باشه. یه صفحه رسانا ترجیحا فویل الومینیوم بردارید و فسمت موتورها رو از قسمت کنترل جدا کنید بعد فویل رو به منفی تغذیه موتورها وصل کنید.
                    گویند سنگ لعل شود در مقام صبر اری شود ولی به خون جگر شود
                    همیشه آخر همه چیز خوبه، اگر هم هنوز خوب نشده پس هنوز آخرش نشده(چارلی چاپلین)

                    دیدگاه


                      #11
                      پاسخ : کمک!!! میکروم ریست میشه

                      نوشته اصلی توسط seyyed mohammad Razavi
                      سلام. همه ی این کارها رو کردم ولی فایده نداشت
                      داداش برای پین ریست این مدارو ببند:

                      اون کلید هم برای ریست دستیه، دلبخواهیه و میتونی نزاری.
                      1 در دنیا 100 در آخرت (درس و مشق فعالیتمو تو انجمن کم کرده)
                      من آنچه شرط بلاغست با تو میآ‌گویم. تو خواه از سخنم پند گیر و خواه ملال. سعدی
                      !Electronic On! Programming On
                      هوشمندانه سوال بپرسیم!
                      http://ir02x6.persiangig.com/logo/eca/tanks_01.png

                      دیدگاه


                        #12
                        پاسخ : کمک!!! میکروم ریست میشه

                        حتما دیود های هرزگرد موتور را بگذارید
                        به این فرمیکه توی این وبسایت هست
                        http://forum.p30world.com/showthread.php?t=320348

                        دیدگاه


                          #13
                          پاسخ : کمک!!! میکروم ریست میشه

                          سلام خدمت دوستان. مشکل از سخت افزارم بود. موتور روی تغذیه نویز ایجاد میکرد که با گذاشتن یک خازن عدسی مشکل به کلی حل شد.
                          از همکاری شما ممنونم.
                          سُبُّوحٌ قُدُّوسٌ رَبُّ الْمَلَائِکَهِ وَ الرُّوحِ

                          (SMART DESIGN....(POWERFUL & QUICK

                          موفقیت اتفاقی نیست......بابای پولدار میخواد

                          دیدگاه

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