اطلاعیه

Collapse
No announcement yet.

گیر افتادن پروگرام کانتر در تایمر 1

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

    گیر افتادن پروگرام کانتر در تایمر 1

    با سلام خدمت دوستان
    در کدویژن بنده در داخل تابع اصلی برنامه دو تا while دارم به صورت زیر:

    While(setting==0)
    {
    }

    //-------------------------------------------
    While(setting==1)
    {
    While(i>0)
    {
    }
    Setting=0;
    }
    که در while دوم ، متغیر i توی تایمر 1 ;--i میشه و هر موقع به صفر رسید اصولا باید برنامه وارد حلقه اولی بشه دوباره. ولی متاسفانه اونجور که با فایل cof نگاه کردم ، توی تایمر گیر میکنه ولی توی پروتیوس خطا نمیده ، فقط lcd ثابت می مونه
    ممنون میشم راهنمایی بفرمایید

    #2
    پاسخ : گیر افتادن پروگرام کانتر در تایمر 1

    نوشته اصلی توسط m_karimi7 نمایش پست ها
    با سلام خدمت دوستان
    در کدویژن بنده در داخل تابع اصلی برنامه دو تا while دارم به صورت زیر:

    While(setting==0)
    {
    }

    //-------------------------------------------
    While(setting==1)
    {
    While(i>0)
    {
    }
    Setting=0;
    }
    که در while دوم ، متغیر i توی تایمر 1 ;--i میشه و هر موقع به صفر رسید اصولا باید برنامه وارد حلقه اولی بشه دوباره. ولی متاسفانه اونجور که با فایل cof نگاه کردم ، توی تایمر گیر میکنه ولی توی پروتیوس خطا نمیده ، فقط lcd ثابت می مونه
    ممنون میشم راهنمایی بفرمایید
    سلام
    از این کد و توضیحاتی که دادید چیز زیادی نمیشه فهمید! یکم واضح تر مشکلتون رو بفرمایید.
    ضمنا برای قرار دادن کد حتما از تگ مناسب استفاده کنید که خوانایی اش بیشتر بشه. بهتره برای زبان C از تگ CPP استفاده کنید. تگ ها بالای این قسمتی که متن مینویسید مشخص هستن.

    دیدگاه


      #3
      پاسخ : گیر افتادن پروگرام کانتر در تایمر 1

      ممنون بابت توجه
      برنامه به صورت زیر است:
      در حلقه اول ساعت را از ds1307 میگیره و زمانی که به ساعت مد نظر ما رسید یک وسیله ای رو راه می اندازه و هر موقع وقفه INT1 زده بشه وارد حلقه دوم میشه و تا 20 ثانیه میشماره و از حلقه در میاد و اصولا باید وارد حلقه اول میشد که توی تایمر میچرخه



      #include <mega16a.h>


      // I2C Bus functions
      #include <i2c.h>


      // DS1307 Real Time Clock functions
      #include <ds1307.h>


      // Alphanumeric LCD functions
      #include <alcd.h>
      #include <delay.h>
      #include <stdio.h>


      // Declare your global variables here
      unsigned char hour,minute,second,w_hour,w_minute,w_second,row;
      int w_counter,i=10,light=20;;
      unsigned int sw_counter,pomp_set_counter;
      char lcdShow[32];
      bit setting=0;
      eeprom unsigned char s_hour,s_minute,s_second;
      eeprom unsigned int counter;
      [FONT=Yekan]interrupt [EXT_INT1] void ext_int1_isr(void)[/FONT]{
      // Place your code here
      light=20;
      setting=1;
      PORTB.0=1;
      row=1;
      i=10;
      }


      // Timer1 overflow interrupt service routine
      interrupt [TIM1_OVF] void timer1_ovf_isr(void)
      {
      // Reinitialize Timer1 value
      TCNT1H=0xCF2C >> 8;
      TCNT1L=0xCF2C & 0xff;
      // Place your code here
      i--;
      w_counter--;
      light--;
      if(light==0)PORTB.0=0;
      pomp_set_counter++;
      [FONT=Yekan]}
      [/FONT]while(setting==0)
      {
      rtc_get_time(&hour,&minute,&second);
      sprintf(lcdShow,"%02u:%02u:%02u setting%02u:%02u:%02u ",hour,minute,second,s_hour,s_minute,s_second);
      lcd_gotoxy(0,0);
      lcd_puts(lcdShow);
      delay_ms(1);
      {
      while(setting==1)
      {
      _lcd_write_data(0x0e);
      while(i>0)
      {
      rtc_get_time(&hour,&minute,&second);
      //line one= 15 from 0 line 2=14 from 0
      lcd_gotoxy(row,0);
      delay_ms(1);
      sprintf(lcdShow,"%02u:%02u:%02u watersetting<>%02u %02u",hour,minute,second,row,i);
      lcd_gotoxy(0,0);
      lcd_puts(lcdShow);
      delay_ms(1);

      }
      s_hour=w_hour;
      // delay_ms(1);
      s_minute=w_minute;
      // delay_ms(1);
      s_second=w_second;
      //delay_ms(1);
      counter=sw_counter;
      // delay_ms(1);
      _lcd_write_data(0x0c);
      setting=0;
      }

      }



      کد زیاد بود شرمنده
      در پایان حلقه دوم ، setting رو مساوی صفر قرار کیده که وارد حلقه اولی بشه ولی نمیشه
      ممنون

      دیدگاه


        #4
        پاسخ : گیر افتادن پروگرام کانتر در تایمر 1

        نوشته اصلی توسط m_karimi7 نمایش پست ها
        ممنون بابت توجه
        برنامه به صورت زیر است:
        در حلقه اول ساعت را از ds1307 میگیره و زمانی که به ساعت مد نظر ما رسید یک وسیله ای رو راه می اندازه و هر موقع وقفه INT1 زده بشه وارد حلقه دوم میشه و تا 20 ثانیه میشماره و از حلقه در میاد و اصولا باید وارد حلقه اول میشد که توی تایمر میچرخه



        #include <mega16a.h>


        // I2C Bus functions
        #include <i2c.h>


        // DS1307 Real Time Clock functions
        #include <ds1307.h>


        // Alphanumeric LCD functions
        #include <alcd.h>
        #include <delay.h>
        #include <stdio.h>


        // Declare your global variables here
        unsigned char hour,minute,second,w_hour,w_minute,w_second,row;
        int w_counter,i=10,light=20;;
        unsigned int sw_counter,pomp_set_counter;
        char lcdShow[32];
        bit setting=0;
        eeprom unsigned char s_hour,s_minute,s_second;
        eeprom unsigned int counter;
        [FONT=Yekan]interrupt [EXT_INT1] void ext_int1_isr(void)[/FONT]{
        // Place your code here
        light=20;
        setting=1;
        PORTB.0=1;
        row=1;
        i=10;
        }


        // Timer1 overflow interrupt service routine
        interrupt [TIM1_OVF] void timer1_ovf_isr(void)
        {
        // Reinitialize Timer1 value
        TCNT1H=0xCF2C >> 8;
        TCNT1L=0xCF2C & 0xff;
        // Place your code here
        i--;
        w_counter--;
        light--;
        if(light==0)PORTB.0=0;
        pomp_set_counter++;
        [FONT=Yekan]}
        [/FONT]while(setting==0)
        {
        rtc_get_time(&hour,&minute,&second);
        sprintf(lcdShow,"%02u:%02u:%02u setting%02u:%02u:%02u ",hour,minute,second,s_hour,s_minute,s_second);
        lcd_gotoxy(0,0);
        lcd_puts(lcdShow);
        delay_ms(1);
        {
        while(setting==1)
        {
        _lcd_write_data(0x0e);
        while(i>0)
        {
        rtc_get_time(&hour,&minute,&second);
        //line one= 15 from 0 line 2=14 from 0
        lcd_gotoxy(row,0);
        delay_ms(1);
        sprintf(lcdShow,"%02u:%02u:%02u watersetting<>%02u %02u",hour,minute,second,row,i);
        lcd_gotoxy(0,0);
        lcd_puts(lcdShow);
        delay_ms(1);

        }
        s_hour=w_hour;
        // delay_ms(1);
        s_minute=w_minute;
        // delay_ms(1);
        s_second=w_second;
        //delay_ms(1);
        counter=sw_counter;
        // delay_ms(1);
        _lcd_write_data(0x0c);
        setting=0;
        }

        }



        کد زیاد بود شرمنده
        در پایان حلقه دوم ، setting رو مساوی صفر قرار کیده که وارد حلقه اولی بشه ولی نمیشه
        ممنون
        این کد خیلی بهم ریختس و معلوم نیست اول و آخر بلوک ها کجاس. تابع main هم داخلش دیده نمیشه.
        کد کاملتون رو قرار بدید. ضمنا حتما از تگ CPP استفاده کنید که بشه کد ها رو خوند! توی کامنت قبلی توضیح دادم تگ رو.

        دیدگاه


          #5
          پاسخ : گیر افتادن پروگرام کانتر در تایمر 1

          کد کامل:
          [FONT=Yekan]/*******************************************************[/FONT]This program was created by the
          CodeWizardAVR V3.12 Advanced
          Automatic Program Generator
          © Copyright 1998-2014 Pavel Haiduc, HP InfoTech s.r.l.
          http://www.hpinfotech.com


          Project :
          Version :
          Date : 07/07/2020
          Author :
          Company :
          Comments:




          Chip type : ATmega16A
          Program type : Application
          AVR Core Clock frequency: 8/000000 MHz
          Memory model : Small
          External RAM size : 0
          Data Stack size : 256
          *******************************************************/


          #include <mega16a.h>


          // I2C Bus functions
          #include <i2c.h>


          // DS1307 Real Time Clock functions
          #include <ds1307.h>


          // Alphanumeric LCD functions
          #include <alcd.h>
          #include <delay.h>
          #include <stdio.h>


          // Declare your global variables here
          unsigned char hour,minute,second,w_hour,w_minute,w_second,row;
          int w_counter,i=10,light=20;;
          unsigned int sw_counter,pomp_set_counter;
          char lcdShow[32];
          bit setting=0;
          eeprom unsigned char s_hour,s_minute,s_second;
          eeprom unsigned int counter;


          // Declare your global variables here


          // External Interrupt 1 service routine
          interrupt [EXT_INT1] void ext_int1_isr(void)
          {
          // Place your code here
          light=20;
          setting=1;
          PORTB.0=1;
          row=1;
          i=10;
          }


          // Timer1 overflow interrupt service routine
          interrupt [TIM1_OVF] void timer1_ovf_isr(void)
          {
          // Reinitialize Timer1 value
          TCNT1H=0xCF2C >> 8;
          TCNT1L=0xCF2C & 0xff;
          // Place your code here
          i--;
          w_counter--;
          light--;
          if(light==0)PORTB.0=0;
          pomp_set_counter++;
          }


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


          // Input/Output Ports initialization
          // Port A initialization
          // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
          DDRA=(0<<DDA7) | (0<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0);
          // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
          PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0);


          // Port B initialization
          // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=Out Bit0=Out
          DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (1<<DDB1) | (1<<DDB0);
          // State: Bit7=T Bit6=P Bit5=P Bit4=P Bit3=P Bit2=P Bit1=0 Bit0=0
          PORTB=(0<<PORTB7) | (1<<PORTB6) | (1<<PORTB5) | (1<<PORTB4) | (1<<PORTB3) | (1<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);


          // Port C initialization
          // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
          DDRC=(0<<DDC7) | (0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<DDC0);
          // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
          PORTC=(0<<PORTC7) | (0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);


          // Port D initialization
          // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
          DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
          // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=P Bit2=T Bit1=T Bit0=T
          PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (1<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);


          // Timer/Counter 0 initialization
          // Clock source: System Clock
          // Clock value: Timer 0 Stopped
          // Mode: Normal top=0xFF
          // OC0 output: Disconnected
          TCCR0=(0<<WGM00) | (0<<COM01) | (0<<COM00) | (0<<WGM01) | (0<<CS02) | (0<<CS01) | (0<<CS00);
          TCNT0=0x00;
          OCR0=0x00;


          // Timer/Counter 1 initialization
          // Clock source: System Clock
          // Clock value: 125/000 kHz
          // Mode: Normal top=0xFFFF
          // OC1A output: Disconnected
          // OC1B output: Disconnected
          // Noise Canceler: Off
          // Input Capture on Falling Edge
          // Timer Period: 0/1 s
          // Timer1 Overflow Interrupt: On
          // Input Capture Interrupt: Off
          // Compare A Match Interrupt: Off
          // Compare B Match Interrupt: Off
          TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
          TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (1<<CS11) | (1<<CS10);
          TCNT1H=0xCF;
          TCNT1L=0x2C;
          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=0<<AS2;
          TCCR2=(0<<PWM2) | (0<<COM21) | (0<<COM20) | (0<<CTC2) | (0<<CS22) | (0<<CS21) | (0<<CS20);
          TCNT2=0x00;
          OCR2=0x00;


          // Timer(s)/Counter(s) Interrupt(s) initialization
          TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (1<<TOIE1) | (0<<OCIE0) | (0<<TOIE0);


          // External Interrupt(s) initialization
          // INT0: Off
          // INT1: On
          // INT1 Mode: Falling Edge
          // INT2: Off
          GICR|=(1<<INT1) | (0<<INT0) | (0<<INT2);
          MCUCR=(1<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);
          MCUCSR=(0<<ISC2);
          GIFR=(1<<INTF1) | (0<<INTF0) | (0<<INTF2);


          // USART initialization
          // USART disabled
          UCSRB=(0<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (0<<RXEN) | (0<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);


          // Analog Comparator initialization
          // Analog Comparator: Off
          // The Analog Comparator's positive input is
          // connected to the AIN0 pin
          // The Analog Comparator's negative input is
          // connected to the AIN1 pin
          ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);
          SFIOR=(0<<ACME);


          // ADC initialization
          // ADC disabled
          ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0);


          // SPI initialization
          // SPI disabled
          SPCR=(0<<SPIE) | (0<<SPE) | (0<<DORD) | (0<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);


          // TWI initialization
          // TWI disabled
          TWCR=(0<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWEN) | (0<<TWIE);


          // Bit-Banged I2C Bus initialization
          // I2C Port: PORTC
          // I2C SDA bit: 1
          // I2C SCL bit: 0
          // Bit Rate: 100 kHz
          // Note: I2C settings are specified in the
          // Project|Configure|C Compiler|Libraries|I2C menu.
          i2c_init();


          // DS1307 Real Time Clock initialization
          // Square wave output on pin SQW/OUT: Off
          // SQW/OUT pin state: 0
          rtc_init(0,0,0);


          // 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: 16
          lcd_init(16);


          // Global enable interrupts
          #asm("sei")


          while(setting==0)
          {
          rtc_get_time(&hour,&minute,&second);
          sprintf(lcdShow,"%02u:%02u:%02u setting%02u:%02u:%02u ",hour,minute,second,s_hour,s_minute,s_second);
          lcd_gotoxy(0,0);
          lcd_puts(lcdShow);
          delay_ms(1);
          if(PINB.2==0||PINB.3==0||PINB.4==0||PINB.5==0)
          {
          light=20;
          PORTB.0=1;
          }
          if(hour==s_hour)
          {
          if(minute==s_minute)
          {
          if(second==s_second)
          {
          w_counter=counter;

          do
          {
          PORTB.1=1;
          rtc_get_time(&hour,&minute,&second);
          sprintf(lcdShow,"%02u:%02u:%02u setting%02u:%02u:%02u to %02u",hour,minute,second,s_hour,s_minute,s_second,w_counter);
          lcd_gotoxy(0,0);
          lcd_puts(lcdShow);
          delay_ms(1);
          if(PINB.2==0||PINB.3==0||PINB.4==0||PINB.5==0)
          {
          light=20;
          PORTB.0=1;
          //delay_ms(1);
          //while(PINB.1==0||PINB.2==0||PINB.3==0||PINB.4==0){}
          }
          }while(w_counter>0);
          }
          else PORTB.1=0;
          }
          }
          PORTB.1=0;
          }
          while(setting==1)
          {
          _lcd_write_data(0x0e);
          while(i>0)
          {
          rtc_get_time(&hour,&minute,&second);
          //line one= 15 from 0 line 2=14 from 0
          lcd_gotoxy(row,0);
          delay_ms(1);
          sprintf(lcdShow,"%02u:%02u:%02u watersetting<>%02u %02u",hour,minute,second,row,i);
          lcd_gotoxy(0,0);
          lcd_puts(lcdShow);
          delay_ms(1);
          if(PINB.2==0)
          {
          light=20;
          i=10;
          row+=3;
          if(row==10)row=11;
          else if(row==14)row=1;
          // lcd_gotoxy(row,0);
          delay_ms(1);
          while(PINB.2==0){}
          }
          if(PINB.3==0)
          {
          light=20;
          i=10;
          row-=3;
          if(row==254)row=11;
          else if(row==8)row=7;
          //lcd_gotoxy(row,0);
          delay_ms(100);
          while(PINB.3==0){}
          }
          if(PINB.5==0)
          {
          light=20;
          i=10;
          // rtc_get_time(&hour,&minute,&second);
          switch(row)
          {
          case 1:hour++;
          if(hour>23)hour=0;
          break;
          case 4:minute++;
          if(minute>59)minute=0;
          break;
          case 7:second++;
          if(second>59)second=0;
          break;
          }
          rtc_set_time(hour,minute,second);
          delay_ms(1);
          while(PINB.5==0){}
          }
          if(PINB.4==0)
          {
          light=20;
          i=10;
          //rtc_get_time(&hour,&minute,&second);
          switch(row)
          {
          case 1:hour--;
          if(hour==255)hour=0;
          break;
          case 4:minute--;
          if(minute==255)minute=0;
          break;
          case 7:second--;
          if(second==255)second=0;
          break;
          }
          rtc_set_time(hour,minute,second);
          delay_ms(1);
          while(PINB.4==0){}
          }
          if(row==11)
          {
          row=1;
          while(i>0)
          {
          sprintf(lcdShow,"%02u:%02u:%02u to m:%02u water<>%02u %02u",w_hour,w_minute,w_second,sw_counter,row,i);
          lcd_gotoxy(row,0);
          delay_ms(1);
          lcd_gotoxy(0,0);
          lcd_puts(lcdShow);
          delay_ms(1);
          if(PINB.2==0)
          {
          light=20;
          i=10;
          row+=3;
          if(row==10)row=15;
          else if(row==18)row=1;

          //lcd_gotoxy(row,0);

          delay_ms(1);

          while(PINB.2==0){};
          }
          if(PINB.3==0)
          {
          light=20;
          i=10;
          row-=3;
          if(row==254)row=15;
          else if(row==12)row=7;
          // lcd_gotoxy(row,0);

          delay_ms(1);

          while(PINB.3==0){}
          }
          if(PINB.5==0)
          {
          light=20;
          i=10;
          switch(row)
          {
          case 1:w_hour++;
          if(w_hour>23)w_hour=0;
          break;
          case 4:w_minute++;
          if(w_minute>59)w_minute=0;
          break;
          case 7:w_second++;
          if(w_second>59)w_second=0;
          break;
          case 15:sw_counter++;
          break;
          }
          delay_ms(1);
          while(PINB.5==0){}
          }

          if(PINB.4==0)
          {
          light=20;
          i=10;
          switch(row)
          {
          case 1:w_hour--;
          if(w_hour==255)w_hour=23;
          break;
          case 4:w_minute--;
          if(w_minute==255)w_minute=59;
          break;
          case 7:w_second--;
          if(w_second==255)w_second=59;
          break;
          case 15:sw_counter--;
          if(sw_counter==65535)sw_counter=0;
          break;
          }
          delay_ms(1);
          while(PINB.4==0){}
          }
          if(PINB.6==0)
          {
          light=20;
          i=10;
          pomp_set_counter=0;
          delay_ms(1);
          while(PINB.6==0){}
          //delay_ms(1);
          while(PINB.6==1)
          {
          lcd_gotoxy(row,0);
          delay_ms(1);
          lcd_gotoxy(0,0);
          sprintf(lcdShow,"%5u ",pomp_set_counter);
          lcd_puts(lcdShow);
          delay_ms(1);
          i=10;
          PORTB.1=1;
          }
          delay_ms(1);
          while(PINB.6==0){}
          light=20;
          i=10;
          PORTB.1=0;
          sw_counter=pomp_set_counter;
          }

          }

          }

          }
          s_hour=w_hour;
          // delay_ms(1);
          s_minute=w_minute;
          // delay_ms(1);
          s_second=w_second;
          //delay_ms(1);
          counter=sw_counter;
          // delay_ms(1);
          _lcd_write_data(0x0c);
          setting=0;
          }

          [FONT=Yekan]}[/FONT]

          داخل cpp زدم
          وسط دوتا

          دیدگاه


            #6
            پاسخ : گیر افتادن پروگرام کانتر در تایمر 1

            نوشته اصلی توسط m_karimi7 نمایش پست ها
            کد کامل:
            [FONT=Yekan]/*******************************************************[/FONT]This program was created by the
            CodeWizardAVR V3.12 Advanced
            Automatic Program Generator
            © Copyright 1998-2014 Pavel Haiduc, HP InfoTech s.r.l.
            http://www.hpinfotech.com


            Project :
            Version :
            Date : 07/07/2020
            Author :
            Company :
            Comments:




            Chip type : ATmega16A
            Program type : Application
            AVR Core Clock frequency: 8/000000 MHz
            Memory model : Small
            External RAM size : 0
            Data Stack size : 256
            *******************************************************/


            #include <mega16a.h>


            // I2C Bus functions
            #include <i2c.h>


            // DS1307 Real Time Clock functions
            #include <ds1307.h>


            // Alphanumeric LCD functions
            #include <alcd.h>
            #include <delay.h>
            #include <stdio.h>


            // Declare your global variables here
            unsigned char hour,minute,second,w_hour,w_minute,w_second,row;
            int w_counter,i=10,light=20;;
            unsigned int sw_counter,pomp_set_counter;
            char lcdShow[32];
            bit setting=0;
            eeprom unsigned char s_hour,s_minute,s_second;
            eeprom unsigned int counter;


            // Declare your global variables here


            // External Interrupt 1 service routine
            interrupt [EXT_INT1] void ext_int1_isr(void)
            {
            // Place your code here
            light=20;
            setting=1;
            PORTB.0=1;
            row=1;
            i=10;
            }


            // Timer1 overflow interrupt service routine
            interrupt [TIM1_OVF] void timer1_ovf_isr(void)
            {
            // Reinitialize Timer1 value
            TCNT1H=0xCF2C >> 8;
            TCNT1L=0xCF2C & 0xff;
            // Place your code here
            i--;
            w_counter--;
            light--;
            if(light==0)PORTB.0=0;
            pomp_set_counter++;
            }


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


            // Input/Output Ports initialization
            // Port A initialization
            // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
            DDRA=(0<<DDA7) | (0<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0);
            // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
            PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0);


            // Port B initialization
            // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=Out Bit0=Out
            DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (1<<DDB1) | (1<<DDB0);
            // State: Bit7=T Bit6=P Bit5=P Bit4=P Bit3=P Bit2=P Bit1=0 Bit0=0
            PORTB=(0<<PORTB7) | (1<<PORTB6) | (1<<PORTB5) | (1<<PORTB4) | (1<<PORTB3) | (1<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);


            // Port C initialization
            // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
            DDRC=(0<<DDC7) | (0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<DDC0);
            // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
            PORTC=(0<<PORTC7) | (0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);


            // Port D initialization
            // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
            DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
            // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=P Bit2=T Bit1=T Bit0=T
            PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (1<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);


            // Timer/Counter 0 initialization
            // Clock source: System Clock
            // Clock value: Timer 0 Stopped
            // Mode: Normal top=0xFF
            // OC0 output: Disconnected
            TCCR0=(0<<WGM00) | (0<<COM01) | (0<<COM00) | (0<<WGM01) | (0<<CS02) | (0<<CS01) | (0<<CS00);
            TCNT0=0x00;
            OCR0=0x00;


            // Timer/Counter 1 initialization
            // Clock source: System Clock
            // Clock value: 125/000 kHz
            // Mode: Normal top=0xFFFF
            // OC1A output: Disconnected
            // OC1B output: Disconnected
            // Noise Canceler: Off
            // Input Capture on Falling Edge
            // Timer Period: 0/1 s
            // Timer1 Overflow Interrupt: On
            // Input Capture Interrupt: Off
            // Compare A Match Interrupt: Off
            // Compare B Match Interrupt: Off
            TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
            TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (1<<CS11) | (1<<CS10);
            TCNT1H=0xCF;
            TCNT1L=0x2C;
            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=0<<AS2;
            TCCR2=(0<<PWM2) | (0<<COM21) | (0<<COM20) | (0<<CTC2) | (0<<CS22) | (0<<CS21) | (0<<CS20);
            TCNT2=0x00;
            OCR2=0x00;


            // Timer(s)/Counter(s) Interrupt(s) initialization
            TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (1<<TOIE1) | (0<<OCIE0) | (0<<TOIE0);


            // External Interrupt(s) initialization
            // INT0: Off
            // INT1: On
            // INT1 Mode: Falling Edge
            // INT2: Off
            GICR|=(1<<INT1) | (0<<INT0) | (0<<INT2);
            MCUCR=(1<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);
            MCUCSR=(0<<ISC2);
            GIFR=(1<<INTF1) | (0<<INTF0) | (0<<INTF2);


            // USART initialization
            // USART disabled
            UCSRB=(0<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (0<<RXEN) | (0<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);


            // Analog Comparator initialization
            // Analog Comparator: Off
            // The Analog Comparator's positive input is
            // connected to the AIN0 pin
            // The Analog Comparator's negative input is
            // connected to the AIN1 pin
            ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);
            SFIOR=(0<<ACME);


            // ADC initialization
            // ADC disabled
            ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0);


            // SPI initialization
            // SPI disabled
            SPCR=(0<<SPIE) | (0<<SPE) | (0<<DORD) | (0<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);


            // TWI initialization
            // TWI disabled
            TWCR=(0<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWEN) | (0<<TWIE);


            // Bit-Banged I2C Bus initialization
            // I2C Port: PORTC
            // I2C SDA bit: 1
            // I2C SCL bit: 0
            // Bit Rate: 100 kHz
            // Note: I2C settings are specified in the
            // Project|Configure|C Compiler|Libraries|I2C menu.
            i2c_init();


            // DS1307 Real Time Clock initialization
            // Square wave output on pin SQW/OUT: Off
            // SQW/OUT pin state: 0
            rtc_init(0,0,0);


            // 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: 16
            lcd_init(16);


            // Global enable interrupts
            #asm("sei")


            while(setting==0)
            {
            rtc_get_time(&hour,&minute,&second);
            sprintf(lcdShow,"%02u:%02u:%02u setting%02u:%02u:%02u ",hour,minute,second,s_hour,s_minute,s_second);
            lcd_gotoxy(0,0);
            lcd_puts(lcdShow);
            delay_ms(1);
            if(PINB.2==0||PINB.3==0||PINB.4==0||PINB.5==0)
            {
            light=20;
            PORTB.0=1;
            }
            if(hour==s_hour)
            {
            if(minute==s_minute)
            {
            if(second==s_second)
            {
            w_counter=counter;

            do
            {
            PORTB.1=1;
            rtc_get_time(&hour,&minute,&second);
            sprintf(lcdShow,"%02u:%02u:%02u setting%02u:%02u:%02u to %02u",hour,minute,second,s_hour,s_minute,s_second,w_counter);
            lcd_gotoxy(0,0);
            lcd_puts(lcdShow);
            delay_ms(1);
            if(PINB.2==0||PINB.3==0||PINB.4==0||PINB.5==0)
            {
            light=20;
            PORTB.0=1;
            //delay_ms(1);
            //while(PINB.1==0||PINB.2==0||PINB.3==0||PINB.4==0){}
            }
            }while(w_counter>0);
            }
            else PORTB.1=0;
            }
            }
            PORTB.1=0;
            }
            while(setting==1)
            {
            _lcd_write_data(0x0e);
            while(i>0)
            {
            rtc_get_time(&hour,&minute,&second);
            //line one= 15 from 0 line 2=14 from 0
            lcd_gotoxy(row,0);
            delay_ms(1);
            sprintf(lcdShow,"%02u:%02u:%02u watersetting<>%02u %02u",hour,minute,second,row,i);
            lcd_gotoxy(0,0);
            lcd_puts(lcdShow);
            delay_ms(1);
            if(PINB.2==0)
            {
            light=20;
            i=10;
            row+=3;
            if(row==10)row=11;
            else if(row==14)row=1;
            // lcd_gotoxy(row,0);
            delay_ms(1);
            while(PINB.2==0){}
            }
            if(PINB.3==0)
            {
            light=20;
            i=10;
            row-=3;
            if(row==254)row=11;
            else if(row==8)row=7;
            //lcd_gotoxy(row,0);
            delay_ms(100);
            while(PINB.3==0){}
            }
            if(PINB.5==0)
            {
            light=20;
            i=10;
            // rtc_get_time(&hour,&minute,&second);
            switch(row)
            {
            case 1:hour++;
            if(hour>23)hour=0;
            break;
            case 4:minute++;
            if(minute>59)minute=0;
            break;
            case 7:second++;
            if(second>59)second=0;
            break;
            }
            rtc_set_time(hour,minute,second);
            delay_ms(1);
            while(PINB.5==0){}
            }
            if(PINB.4==0)
            {
            light=20;
            i=10;
            //rtc_get_time(&hour,&minute,&second);
            switch(row)
            {
            case 1:hour--;
            if(hour==255)hour=0;
            break;
            case 4:minute--;
            if(minute==255)minute=0;
            break;
            case 7:second--;
            if(second==255)second=0;
            break;
            }
            rtc_set_time(hour,minute,second);
            delay_ms(1);
            while(PINB.4==0){}
            }
            if(row==11)
            {
            row=1;
            while(i>0)
            {
            sprintf(lcdShow,"%02u:%02u:%02u to m:%02u water<>%02u %02u",w_hour,w_minute,w_second,sw_counter,row,i);
            lcd_gotoxy(row,0);
            delay_ms(1);
            lcd_gotoxy(0,0);
            lcd_puts(lcdShow);
            delay_ms(1);
            if(PINB.2==0)
            {
            light=20;
            i=10;
            row+=3;
            if(row==10)row=15;
            else if(row==18)row=1;

            //lcd_gotoxy(row,0);

            delay_ms(1);

            while(PINB.2==0){};
            }
            if(PINB.3==0)
            {
            light=20;
            i=10;
            row-=3;
            if(row==254)row=15;
            else if(row==12)row=7;
            // lcd_gotoxy(row,0);

            delay_ms(1);

            while(PINB.3==0){}
            }
            if(PINB.5==0)
            {
            light=20;
            i=10;
            switch(row)
            {
            case 1:w_hour++;
            if(w_hour>23)w_hour=0;
            break;
            case 4:w_minute++;
            if(w_minute>59)w_minute=0;
            break;
            case 7:w_second++;
            if(w_second>59)w_second=0;
            break;
            case 15:sw_counter++;
            break;
            }
            delay_ms(1);
            while(PINB.5==0){}
            }

            if(PINB.4==0)
            {
            light=20;
            i=10;
            switch(row)
            {
            case 1:w_hour--;
            if(w_hour==255)w_hour=23;
            break;
            case 4:w_minute--;
            if(w_minute==255)w_minute=59;
            break;
            case 7:w_second--;
            if(w_second==255)w_second=59;
            break;
            case 15:sw_counter--;
            if(sw_counter==65535)sw_counter=0;
            break;
            }
            delay_ms(1);
            while(PINB.4==0){}
            }
            if(PINB.6==0)
            {
            light=20;
            i=10;
            pomp_set_counter=0;
            delay_ms(1);
            while(PINB.6==0){}
            //delay_ms(1);
            while(PINB.6==1)
            {
            lcd_gotoxy(row,0);
            delay_ms(1);
            lcd_gotoxy(0,0);
            sprintf(lcdShow,"%5u ",pomp_set_counter);
            lcd_puts(lcdShow);
            delay_ms(1);
            i=10;
            PORTB.1=1;
            }
            delay_ms(1);
            while(PINB.6==0){}
            light=20;
            i=10;
            PORTB.1=0;
            sw_counter=pomp_set_counter;
            }

            }

            }

            }
            s_hour=w_hour;
            // delay_ms(1);
            s_minute=w_minute;
            // delay_ms(1);
            s_second=w_second;
            //delay_ms(1);
            counter=sw_counter;
            // delay_ms(1);
            _lcd_write_data(0x0c);
            setting=0;
            }

            [FONT=Yekan]}[/FONT]

            داخل cpp زدم
            وسط دوتا
            خوب بازم اونطوری که میگفتم کد رو قرار ندادید!
            بگذریم؛ این کد حلقه بی نهایت نداره و احتمالا به خاطر همون خواسته شما رو براورده نمیکنه. وقتی برنامه از حلقه setting==1 خارج میشه، به setting==0 وارد نمیشه چون مکانیزمی براش وجود نداره که برنامه رو به ابتدای حلقه setting==0 وارد کنه.
            شما باید توی همه برنامه های میکروکنترلری اتون از حلقه بی نهایت استفاده کنید.

            دیدگاه


              #7
              پاسخ : گیر افتادن پروگرام کانتر در تایمر 1

              شرمنده در پایان حلقه دوم زدم setting=0

              دیدگاه


                #8
                پاسخ : گیر افتادن پروگرام کانتر در تایمر 1

                نوشته اصلی توسط m_karimi7 نمایش پست ها
                شرمنده در پایان حلقه دوم زدم setting=0
                بله اون هست ولی حلقه بی نهایت نیست.

                دیدگاه


                  #9
                  پاسخ : گیر افتادن پروگرام کانتر در تایمر 1

                  الان حلقه اولی رو زدم
                  while(1)

                  ولی وقتی دکمه وقفه خارجی رو میزنم دیگه وارد حلقه دوم نمیشه

                  دیدگاه


                    #10
                    پاسخ : گیر افتادن پروگرام کانتر در تایمر 1

                    نوشته اصلی توسط m_karimi7 نمایش پست ها
                    الان حلقه اولی رو زدم
                    while(1)

                    ولی وقتی دکمه وقفه خارجی رو میزنم دیگه وارد حلقه دوم نمیشه
                    برای درست کردن ابرو که نباید زد چشم رو کور کرد! من منظورم این نبود حلقه اولی رو تغییر بدید، منظورم این بود کدتون به کلیت چیزی به اسم حلقه بی نهایت کم داره!
                    کد:
                    #include <mega16.h>
                    
                    
                    
                    
                    void main(void)
                    {
                    	// Hardware configuration
                    	
                    	while(1) // Infinite loop
                    	{
                    		// Code 
                    	}
                    }
                    ببینید ساختمان کلی یه کد که برای میکروکنترلر نوشته میشه به شکل بالا هستش. قسمت ابتدایی تابع main به پیکربندی سخت افزار و نوشتن کدهایی از برنامه اختصاص داره که از زمان شروع به کار میکروکنترلر، تنها یک بار قراره اجرا بشن. قسمت بعدی حلقه بی نهایت هستش که کدهایی در اون قرار میگیره که به صورت مکرر و تا توقف کار میکروکنترلر قرار اجرا بشن.
                    شما با توجه به خواسته و کارکرد مدارتون، باید کدهاتون رو در این بخش ها قرار بدید. مشکل کد شما این بود که قسمت حلقه بی نهایت براش در نظر گرفته نشده بود و همه کدها در کف تابع main قرار گرفته بود.

                    دیدگاه


                      #11
                      پاسخ : گیر افتادن پروگرام کانتر در تایمر 1

                      ممنونم دقیقاً درست فرمودید
                      یه حلقه بی نهایت زدم و دو تا حلقه ام رو داخل اون حلقه گذاشتم و درست شد
                      فقط بازم شرمنده من دو تا سوال دیگه هم داشتم که گذاشته بودم این مورد حل شه بعد مطرح کنم
                      یکی اینکه تایمر من که تنظیم کردم روی 100 میلی ثانیه ، یک ثاینه یک ثانیه مشماره
                      و دوم اینکه میخواستم مکان نما رو توی ال سی دی نشون بدم ولی متاسفانه جاش سریع تغییر میکنه و تند تند چندین مکان عوض میشه
                      بازم ممنونم

                      دیدگاه


                        #12
                        پاسخ : گیر افتادن پروگرام کانتر در تایمر 1

                        نوشته اصلی توسط m_karimi7 نمایش پست ها
                        ممنونم دقیقاً درست فرمودید
                        یه حلقه بی نهایت زدم و دو تا حلقه ام رو داخل اون حلقه گذاشتم و درست شد
                        فقط بازم شرمنده من دو تا سوال دیگه هم داشتم که گذاشته بودم این مورد حل شه بعد مطرح کنم
                        یکی اینکه تایمر من که تنظیم کردم روی 100 میلی ثانیه ، یک ثاینه یک ثانیه مشماره
                        و دوم اینکه میخواستم مکان نما رو توی ال سی دی نشون بدم ولی متاسفانه جاش سریع تغییر میکنه و تند تند چندین مکان عوض میشه
                        بازم ممنونم
                        خوب در مورد تایمر احتمالا محاسباتتون غلط بوده! یک بار دیگه بررسی کنید همه چیز رو.
                        در مورد مکان نما LCD هم باید بگم که هرجا آخرین بار عمل نوشتن انجام بشه، مکان نما یک خونه جلوترش می ایسته. اگر میخوایید برای زیبایی یا هرچیزی همیشه در جای خاصی قرار بگیره، میتونید با تابعlcd_gotoxy جاش رو تنظیم کنید.

                        دیدگاه


                          #13
                          پاسخ : گیر افتادن پروگرام کانتر در تایمر 1

                          آقا خیلی خیلی ممنونم از لطف شما

                          دیدگاه

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