اطلاعیه

Collapse
No announcement yet.

مشکل عجیب با ATtiny13a

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

    مشکل عجیب با ATtiny13a

    سلام خدمت اساتید
    دوستان من خیلی قبلا واسه میکروهای ای وی ار برنامه نوشتم هیچ مشکلی نبوده ولی الان یه میکرو هست تمتمام کدها درسته توی شبیه ساز هم درست کار میکنه (طبق کدها) ایرادی هم نمیگیره همه چی درسته ولی روی برد تو مرحله اول یه جورایی گیر میکنه یعنی در ابتدا قراره 3 ثانیه یه ال ای دی چشمک بزنه و بعد روشن ثابت کدها درسته تو شبیه ساز هم درسته ولی وقت تست میکنم عملی تو مرحله اول میمونه یعنی تا ابد هم وایسی همنجوری چشمک میزنه . از واچ داگ استفاده کردم / غیر فعالش کردم / کل پروژه رو به غیر از کد اجرای اولیه ولی بازم مشکل همونه !!!
    دو روزه دیگه دارم دیوونه میشم جون من کمک کنین خیلی غیر منطقیه درست هم پروگرام میشه فیوزبیتا هم درسته
    این کد :
    یه دزدگیر کوچولوئه از یه پین دستور فعال شدن الارم میگیره یه خروجی واسه ال ای دی داره و دو تا دکمه یکی برا ریست یکی هم واسه روشن شدن با تاخیر 3 دقیقه ای . از dalay هم استفاده نکردم .

    #include <tiny13a.h>

    // Varibles
    unsigned long int TimerCounter,AfterSecound;
    bit FirstRun=0;
    bit StateNormal=0;
    bit StateAlarm=0;
    bit ActiveAfterSecound=0,ASActive=0;

    void StartIntilazing();
    void NormalStateActive();
    //void AfterSecoundActive();
    void AlarmStateActive();
    // Timer 0 overflow interrupt service routine
    interrupt [TIM0_OVF] void timer0_ovf_isr(void)
    {
    // Reinitialize Timer 0 value
    TCNT0=0x38;
    // Place your code here
    //Per 20 Count Time = 1 Secound
    TimerCounter++;
    AfterSecound++;
    if(AfterSecound > 9999999){
    AfterSecound=0;
    }
    if(TimerCounter > 9999999){
    TimerCounter=0;
    }
    }

    void main(void){

    // Intilasing
    StartIntilazing();
    //End

    while (1)
    {
    //Go Start
    if(PINB.1 == 1){
    ActiveAfterSecound=1;
    TimerCounter=0;
    AfterSecound=0;
    StateNormal=0;
    StateAlarm=0;
    }

    //Normal State
    if(StateNormal){
    NormalStateActive();
    }

    if(ActiveAfterSecound){
    // AfterSecoundActive();
    }

    //Alarm State
    if(StateAlarm){
    AlarmStateActive();
    }


    //Reset Watchdog
    #asm("wdr")
    }
    }

    void NormalStateActive(){
    //If First Run
    if(TimerCounter > 60 && FirstRun==0){
    FirstRun=1;
    }else if(FirstRun==0){
    if(AfterSecound >= 5){
    AfterSecound=0;
    if(PINB.3==1){
    PORTB.3=0;
    }else{
    PORTB.3=1;
    }
    }
    }else{
    //LED On
    PORTB.3=1;
    if(PINB.4 == 1){
    PORTB.3=0;
    StateAlarm=1;
    TimerCounter=0;
    AfterSecound=0;
    StateNormal=0;
    }
    }
    }


    void AfterSecoundActive(){
    //Intilaze
    if(ASActive==0){
    ASActive=1;
    TimerCounter=0;
    AfterSecound=0;
    }
    //Start
    if(TimerCounter >= 2400){
    //End
    StateNormal=1;
    ActiveAfterSecound=0;
    ASActive=0;
    }else{
    StateNormal=0;
    StateAlarm=0;
    ActiveAfterSecound=1;
    ASActive=1;
    }
    //LED On/Off
    if(AfterSecound >= 10){
    AfterSecound=0;
    if(PINB.3==1){
    PORTB.3=0;
    }else{
    PORTB.3=1;
    }
    }
    }


    void AlarmStateActive(){
    //Play Alarm Signall
    if(TimerCounter >= 8){
    TimerCounter=0;
    if(PINB.2==1){
    PORTB.2=0;
    PORTB.3=1;
    }else{
    PORTB.2=1;
    PORTB.3=0;
    }
    }
    //End Alarm State
    if(AfterSecound >= 3000){
    StateAlarm=0;
    StateNormal=1;
    }
    }


    void StartIntilazing(){

    StateNormal=1;
    // Input/Output Ports initialization
    // Port B initialization
    // Function: Bit5=In Bit4=In Bit3=In Bit2=Out Bit1=Out Bit0=In
    DDRB=(0<<DDB5) | (0<<DDB4) | (1<<DDB3) | (1<<DDB2) | (1<<DDB1) | (0<<DDB0);
    // State: Bit5=T Bit4=T Bit3=T Bit2=0 Bit1=0 Bit0=T
    PORTB=(0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);

    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: 75.000 kHz
    // Mode: Normal top=0xFF
    // OC0A output: Disconnected
    // OC0B output: Disconnected
    // Timer Period: 2 ms
    TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (0<<WGM00);
    TCCR0B=(0<<WGM02) | (0<<CS02) | (1<<CS01) | (1<<CS00);
    TCNT0=0x6A;
    OCR0A=0x00;
    OCR0B=0x00;

    // Timer/Counter 0 Interrupt(s) initialization
    TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (1<<TOIE0);

    // Watchdog Timer initialization
    // Watchdog Timer Prescaler: OSC/2k
    // Watchdog timeout action: Reset
    #pragma optsize-
    WDTCR=(0<<WDTIF) | (0<<WDTIE) | (0<<WDP3) | (1<<WDCE) | (1<<WDE) | (0<<WDP2) | (0<<WDP1) | (0<<WDP0);
    WDTCR=(0<<WDTIF) | (0<<WDTIE) | (0<<WDP3) | (0<<WDCE) | (1<<WDE) | (0<<WDP2) | (0<<WDP1) | (0<<WDP0);
    #ifdef _OPTIMIZE_SIZE_
    #pragma optsize+
    #endif

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


    }

    #2
    پاسخ : مشکل عجیب با ATtiny13a

    درود . اولین کار واچ داگ رو حذف کنید . مرحله بعد در قسمت های مختلف برنامه از دستور سریال استفاده کنید و لاگ بگیرید ببینید برنامه تا کجا اجرا میشه و کجا گیر می*کنه یا در کدوم حلقه میوفته

    دیدگاه


      #3
      پاسخ : مشکل عجیب با ATtiny13a

      مرسی داداش همه تستا رو انجام دادم میدونم تو کدوم حلقه گیر میکنه ولی گیر کردنش منطقی نیست ! الان اون قسمت کدو میزارم ببینید تو وضعیت نرمال که وضعیت اولیه هست قراره 3 ثانیه صبر کنه و تو این مدت ال ای دی روشن خاموش بشه ثانیه ای 2 بار بعد از سه سانیه همه چی تموم میشه و قسمت اصلی کد بخش نرمال باید بی افته تو حلقه که اینجور که به نظر میرسه از این قسمت خارج نمیشه ! در حالی کخه کد درسته و توی پروتئوس هم شبیه ساز دیقا کدی که نوشتمو درست اجرا میکنه .
      اینم قسمتی که توش گیر میکنه با توضیح :
      در ابتدا این دو متغیر رو داریم یکی برای اینکه برنامهخ بفهمه اولین باره اجرا میشه بعد 1 میشه . و یکی دیگه
      bit FirstRun=0;
      long int TimerCounter;
      که تایمر کانتر هر حدود 50 میلی ثانیه یکی بهش اضافه میشه و یه متغیر دیگه AfterSecound که عین همونه واسه جاهایی که لازمه یه جورایی از دو تایمر استفاده شه .
      حالا کد :

      void NormalStateActive(){
      //If First Run
      if(TimerCounter > 60 && FirstRun==0){
      FirstRun=1;
      }else if(FirstRun==0){
      if(AfterSecound >= 5){
      AfterSecound=0;
      if(PINB.3==1){
      PORTB.3=0;
      }else{
      PORTB.3=1;
      }
      }
      }else{
      //LED On
      PORTB.3=1;
      if(PINB.4 == 1){
      PORTB.3=0;
      StateAlarm=1;
      TimerCounter=0;
      AfterSecound=0;
      }
      }
      }

      دیگه کد فک کنم کاملا واضحه دیگه حتی شده فقط همین قسمتو کاپایل کنم ولی بازم همون مشکل یعنی انگار از قسمت اول کد که قراره وقتی روشن میشه یا ریست تا سه ثانیه چشمک بزنه خارج نمیشه در صورتی که مطمئنم تایمر مشکل نداره چون طبق برنامه چشمک میزنه
      واقعا کلافم کرده

      دیدگاه


        #4
        پاسخ : مشکل عجیب با ATtiny13a

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

        دیدگاه


          #5
          پاسخ : مشکل عجیب با ATtiny13a

          دمت گرم داداش ممنون نکته خوبی بود تست میکنم
          ولی قبلا از این میکرو استفاده کرده بودم درست کار میکرد ایندفه فقط فیوزبیت فرکانس رو تغییردادم . کدها هم درسته واقعا گیج شدم ولی به هر حال میچسبم بهش گفتم اول بپرسم شاید یه مشکل معمول باشه

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

          راستی این دستور سریال چیه اثن چجوری کار میکنه ؟

          دیدگاه


            #6
            پاسخ : مشکل عجیب با ATtiny13a

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

            دیدگاه


              #7
              پاسخ : مشکل عجیب با ATtiny13a

              ممنون سعید عزیز واقعا دارم دیوونه میشم اصلا معلوم نیست چشه بدون واچ داگ یه حالت خاصی از خودش نشون میده که برنامه ریزی نشدس مثلا دیگه از حالت خاموش روشن در نمیاد یا اصلا روشن نمیشه یا بعد از چند ثانیه یه بار روشن میشه و خاموش ! هر کاری فک کنید کردم واچ داگ رو کاملا حذف کردم با فیوزبیتش فعالش کردم کدا رو بهینه تر نوشتم که امکان خطا اصلا وجود نداشته باشه الان تغریبا از کدها مطمئنم چون جای فراری باز نزاشتم و روی شبیه ساز هم دقیقا طبق برنامه ریزی عمل میکنه واچ داگ رو با کد ویزارد فعال کردم و کار ریست واچ داگ رو با کد : #asm ("wdr") انجام میدم که طبق چیز که تو شبیه ساز میبینم کار هم میکنه ولی... از نظر ریست هم مین اصلا از delay استفاده نکردم خیلی زودتر از یک میلی ثانیه ریست میشه _ میگم آیا ممکنه میکرویی آسیب ببینه ولی به راحتی پروگرام بشه اثن ممکنه ؟ کدای ویرایش شده رو جایگزین کردم واضح تر هم شد کلا از اول تا اخر من خیلی میکرو تا حالا پروگرام کردم ببینین شاید یه چیز ساده رو جا انداخته باشم التبه از نظر برنامه نویسی خیالتون راحت میدونم مشکلی نداره حرفه ایم در مورد چیزای خاص برنامه نویسی برای میکرو منظورمه چون تازه کارم .



              #include <tiny13a.h>

              // Varibles
              unsigned long int TimerCounter,AfterSecound;
              int Mode; //0=Normal 1=AfterSecound 2=Alert
              bit FirstRun=0;

              void StartIntilazing();
              void NormalStateActive();
              void AfterSecoundActive();
              void AlarmStateActive();
              // Timer 0 overflow interrupt service routine
              interrupt [TIM0_OVF] void timer0_ovf_isr(void)
              {
              // Reinitialize Timer 0 value
              TCNT0=0x38;
              // Place your code here
              //Per 20 Count Time = 1 Secound
              TimerCounter++;
              AfterSecound++;
              if(AfterSecound > 9999999){
              AfterSecound=0;
              }
              if(TimerCounter > 9999999){
              TimerCounter=0;
              }
              }

              void main(void){

              // Intilasing
              StartIntilazing();
              //End

              while (1)
              {
              //Go Start
              switch(Mode){
              case 0:
              NormalStateActive();
              break;
              case 1:
              AfterSecoundActive();
              break;
              case 2:
              AlarmStateActive();
              break;
              }

              //Reset Watchdog
              #asm("wdr")
              }
              }

              void NormalStateActive(){
              //If First Run
              if(TimerCounter > 60 && FirstRun==0){
              FirstRun=1;
              }else if(FirstRun==0){
              if(AfterSecound >= 5){
              AfterSecound=0;
              if(PINB.3==1){
              PORTB.3=0;
              }else{
              PORTB.3=1;
              }
              }
              }else{
              //LED On
              PORTB.3=1;
              if(PINB.4 == 1){
              TimerCounter=0;
              AfterSecound=0;
              Mode=2; //Alert
              }
              if(PINB.1==1){
              TimerCounter=0;
              AfterSecound=0;
              Mode=1; //AfterSecound
              }
              }
              }


              void AfterSecoundActive(){

              //Start
              if(TimerCounter >= 2400){
              //End
              Mode=0; //Normal State
              }else{
              //LED On/Off
              if(AfterSecound >= 15){
              AfterSecound=0;
              if(PINB.3==1){
              PORTB.3=0;
              }else{
              PORTB.3=1;
              }
              }
              }
              }


              void AlarmStateActive(){
              //Play Alarm Signall
              if(AfterSecound >= 5){
              AfterSecound=0;
              if(PINB.2==1){
              PORTB.2=0;
              PORTB.3=1;
              }else{
              PORTB.2=1;
              PORTB.3=0;
              }
              }
              //End Alarm State
              if(TimerCounter >= 3000){
              TimerCounter=0;
              Mode=0; //Normal
              }else{
              if(PINB.1==1){
              TimerCounter=0;
              Mode=1; //AfterSecound
              }
              }
              }


              void StartIntilazing(){

              Mode=0;
              // Input/Output Ports initialization
              // Port B initialization
              // Function: Bit5=In Bit4=In Bit3=In Bit2=Out Bit1=Out Bit0=In
              DDRB=(0<<DDB5) | (0<<DDB4) | (1<<DDB3) | (1<<DDB2) | (0<<DDB1) | (0<<DDB0);
              // State: Bit5=T Bit4=T Bit3=T Bit2=0 Bit1=0 Bit0=T
              PORTB=(0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);

              // Timer/Counter 0 initialization
              // Clock source: System Clock
              // Clock value: 75.000 kHz
              // Mode: Normal top=0xFF
              // OC0A output: Disconnected
              // OC0B output: Disconnected
              // Timer Period: 2 ms
              TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (0<<WGM00);
              TCCR0B=(0<<WGM02) | (0<<CS02) | (1<<CS01) | (1<<CS00);
              TCNT0=0x6A;
              OCR0A=0x00;
              OCR0B=0x00;

              // Timer/Counter 0 Interrupt(s) initialization
              TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (1<<TOIE0);

              // Watchdog Timer initialization
              // Watchdog Timer Prescaler: OSC/2k
              // Watchdog timeout action: Reset
              #pragma optsize-
              WDTCR=(0<<WDTIF) | (0<<WDTIE) | (0<<WDP3) | (1<<WDCE) | (1<<WDE) | (0<<WDP2) | (0<<WDP1) | (0<<WDP0);
              WDTCR=(0<<WDTIF) | (0<<WDTIE) | (0<<WDP3) | (0<<WDCE) | (1<<WDE) | (0<<WDP2) | (0<<WDP1) | (0<<WDP0);
              #ifdef _OPTIMIZE_SIZE_
              #pragma optsize+
              #endif

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


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

              دیدگاه


                #8
                پاسخ : مشکل عجیب با ATtiny13a

                وای واقعا داغونم با این تنظیمات حتی یه ال ای دی رو هم روشن نمیکنه در حالی که کاملا دقیق و سالم پروگرام میشه :|
                واقعا که دارم به این مورد که من تو تموم کردن پروژه ها واقعا بدشانسم ایمان میارم . همیشه تو مرحله اخر یا کمبود وقت یا ... کارو خراب میکنه موقعی که بازیساز بودم به خاطر طولانی بودن پروژه ها همیشه آخر کار به دلیل وقت کم گند زده میشد تو کار الانم گفتم یه پروژه کوچولو تموم کنم بهم روحیه بده اینم گذاشته رو دور آخر که خلاف من بچرخه اه تو این زندگی واقعا
                این مشکل واسه هیشکی پیش نیومده هم میکرو کاملا درست پروگرام میشه هم کدها درسته با انواع و اقسام تغیر فیوزبیتها و حتی فرکانس هم تست کردم ولی یه چیزی که قرار نباشه بشه نمیشه عاغا نمیشه حالا ادیسون باش
                اینم وضعیت من با ساده ترین کد ممکن فقط روشن کردن یه ال ای دی :

                دیدگاه


                  #9
                  پاسخ : مشکل عجیب با ATtiny13a

                  نوشته اصلی توسط Reza Azimy_RW نمایش پست ها
                  اینم وضعیت من با ساده ترین کد ممکن فقط روشن کردن یه ال ای دی :
                  سلام
                  والا من هرچی تو کدهای AVR دیدم
                  DDRB.3
                  وجود نداره و اینکه از شما ایراد نگرفته یه باگ نرم افزاری هست
                  شما نمی تونید DDRB با یک نقطه اطلاق کنید به پین مورد نظرتون اصلا این تعریف درست نیست
                  باید
                  DDRB
                  =
                  |
                  (1<<DDB3)
                  این طوری نوشت
                  در ضمن تصویری که گذاشتید گویای این است که واچ داگ فعال است و کلاک دیویژن شما هم فعال است که فرکانس 9.6 مگاهرتز شما تقسیم بر 8 میشه
                  در مورد کد قبلی هم شما تایمرتون رو 2 میلی ثانیه تعریف کردید ولی تو قسمت اینتراپتش این مقدار به 2.667 تغییر پیدا کرده

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

                  // Crystal Oscillator division factor: 1
                  #pragma optsize-
                  CLKPR=(1<<CLKPCE);
                  CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
                  #ifdef _OPTIMIZE_SIZE_
                  #pragma optsize+
                  #endif
                  این قسمت از برنامه را خودتون پاک کردید؟؟؟
                  وقتی با کدویزارد تنظیم می کنید این بخش اولین کدی است که داخل main دیده میشه
                  جدیدترین ویرایش توسط seyed saeed; ۰۸:۳۹ ۱۳۹۷/۰۵/۳۰.
                  اللهم صل علی محمد و ال محمد و عجل فرجهم
                  پیامبر اکرم(ص):زکات علم نشر آن است.
                  در کشور هاي غربي انتقال تجربيات و دانش به افراد مبتدي يک پيشرفت محسوب شده و به آن مديريت دانش مي گويند. ولي متاسفانه اين فرهنگ هنوز در کشور ايران رايج نشده است !!!

                  دیدگاه


                    #10
                    پاسخ : مشکل عجیب با ATtiny13a

                    دمت گرم توجه کردی قبلا به همون شکل بود اینجا میخاستم فقط همین خروجی بشه و فعال که اصلا هواسم به =| نبود ! البته قبلش همونجوری نصبت داده بودم تو کدای قبلی

                    // Crystal Oscillator division factor: 1
                    [URL="https://www.eca.ir/forums/usertag.php?do=list&action=hash&hash=pragma"]#pragma[/URL] optsize-
                    CLKPR=(1<<CLKPCE);
                    CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
                    [URL="https://www.eca.ir/forums/usertag.php?do=list&action=hash&hash=ifdef"]#ifdef[/URL] _OPTIMIZE_SIZE_
                    [URL="https://www.eca.ir/forums/usertag.php?do=list&action=hash&hash=pragma"]#pragma[/URL] optsize+
                    [URL="https://www.eca.ir/forums/usertag.php?do=list&action=hash&hash=endif"]#endif[/URL]
                    بله خودم حذف کردم چون فک کردم اضافس من که خودم فی.زبیت فرکانس رو تعیین میکنم این دیگه چیه :دی یعنی نمیدونم چیکار میکنه واسه همین حذفش کردم میشه توضیح بدین ؟

                    دیدگاه


                      #11
                      پاسخ : مشکل عجیب با ATtiny13a

                      عاغا کلا دیشب دیوونه شده بودم اشتباه چک میکردم پایه 3 رو با 5 اشتباه گرفته بودم :|
                      الان تک به تک چیزا رو غیر فعال کردم تا رسیدم به مشکل الان میدونم از کجاست اما نمیدونم چرا ؟!
                      ببینین این کد بخش normal:
                      v
                      oid NormalStateActive(){
                      //If First Run
                      if(TimerCounter > 1000 && FirstRun==0){
                      FirstRun=1;
                      }else if(FirstRun==0){
                      if(AfterSecound >= 50){
                      AfterSecound=0;
                      if(PINB.3==1){
                      PORTB.3=0;
                      }else{
                      PORTB.3=1;
                      }
                      }
                      }else{
                      //LED On
                      PORTB.3=1;
                      if(PINB.4 == 1){
                      TimerCounter=0;
                      AfterSecound=0;
                      Mode=2; //Alert
                      }

                      الان این کد درست عمل میکنه تا جایی که :

                       if(PINB.4 == 1){ 
                      TimerCounter=0;
                      AfterSecound=0;
                      Mode=2; //Alert
                      }

                      این PIN4 انگار همیشه رو حالت 1 قرار داره یعنی بلافاصله از قسمت نرمال میپره به Alert به خاطر این که این پین الکی یکه !
                      دلیل چی میتونه باشه ؟ واقعا گیج شدم
                      یعنی باید وقتی پین 4 فشار فشار داده شد یا 1 شد باید بره به الارم ولی بلافاصله بعد از رسیدن کد به این ایف میپره بخش الارم !
                      اینم کل کد جدید :
                      #include <tiny13a.h>

                      // Varibles
                      unsigned long int TimerCounter,AfterSecound;
                      int Mode; //0=Normal 1=AfterSecound 2=Alert
                      bit FirstRun=0;

                      void StartIntilazing();
                      void NormalStateActive();
                      void AfterSecoundActive();
                      void AlarmStateActive();
                      // Timer 0 overflow interrupt service routine
                      interrupt [TIM0_OVF] void timer0_ovf_isr(void)
                      {
                      // Reinitialize Timer 0 value
                      TCNT0=0x6A;
                      // Place your code here
                      //Per 500 Count Time = 1 Secound
                      TimerCounter++;
                      AfterSecound++;
                      if(AfterSecound > 9999999){
                      AfterSecound=0;
                      }
                      if(TimerCounter > 9999999){
                      TimerCounter=0;
                      }
                      }

                      void main(void){

                      // Intilasing
                      StartIntilazing();
                      //End

                      while (1)
                      {
                      //Go Start
                      switch(Mode){
                      case 0:
                      NormalStateActive();
                      break;
                      case 1:
                      AfterSecoundActive();
                      break;
                      case 2:
                      AlarmStateActive();
                      break;
                      }

                      //Reset Watchdog
                      // #asm("wdr")
                      }
                      }

                      void NormalStateActive(){
                      //If First Run
                      if(TimerCounter > 1000 && FirstRun==0){
                      FirstRun=1;
                      }else if(FirstRun==0){
                      if(AfterSecound >= 50){
                      AfterSecound=0;
                      if(PINB.3==1){
                      PORTB.3=0;
                      }else{
                      PORTB.3=1;
                      }
                      }
                      }else{
                      //LED On
                      PORTB.3=1;
                      if(PINB.4 == 1){
                      TimerCounter=0;
                      AfterSecound=0;
                      Mode=2; //Alert
                      }
                      // if(PINB.1==1){
                      // TimerCounter=0;
                      // AfterSecound=0;
                      // Mode=1; //AfterSecound
                      // }
                      }
                      }


                      void AfterSecoundActive(){

                      //Start
                      if(TimerCounter >= 2400){
                      //End
                      Mode=0; //Normal State
                      }else{
                      //LED On/Off
                      if(AfterSecound >= 15){
                      AfterSecound=0;
                      if(PINB.3==1){
                      PORTB.3=0;
                      }else{
                      PORTB.3=1;
                      }
                      }
                      }
                      }


                      void AlarmStateActive(){
                      //Play Alarm Signall
                      if(AfterSecound >= 5){
                      AfterSecound=0;
                      if(PINB.2==1){
                      PORTB.2=0;
                      PORTB.3=1;
                      }else{
                      PORTB.2=1;
                      PORTB.3=0;
                      }
                      }
                      //End Alarm State
                      if(TimerCounter >= 9000){
                      TimerCounter=0;
                      Mode=0; //Normal
                      }else{
                      if(PINB.1==1){
                      TimerCounter=0;
                      Mode=1; //AfterSecound
                      }
                      }
                      }


                      void StartIntilazing(){
                      Mode=0;

                      // Crystal Oscillator division factor: 1
                      #pragma optsize-
                      CLKPR=(1<<CLKPCE);
                      CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
                      #ifdef _OPTIMIZE_SIZE_
                      #pragma optsize+
                      #endif

                      // Input/Output Ports initialization
                      // Port B initialization
                      // Function: Bit5=In Bit4=In Bit3=Out Bit2=Out Bit1=In Bit0=In
                      DDRB=(0<<DDB5) | (0<<DDB4) | (1<<DDB3) | (1<<DDB2) | (0<<DDB1) | (0<<DDB0);
                      // State: Bit5=T Bit4=T Bit3=0 Bit2=0 Bit1=T Bit0=T
                      PORTB=(0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);

                      // Timer/Counter 0 initialization
                      // Clock source: System Clock
                      // Clock value: 75.000 kHz
                      // Mode: Normal top=0xFF
                      // OC0A output: Disconnected
                      // OC0B output: Disconnected
                      // Timer Period: 2 ms
                      TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (0<<WGM00);
                      TCCR0B=(0<<WGM02) | (0<<CS02) | (1<<CS01) | (1<<CS00);
                      TCNT0=0x6A;
                      OCR0A=0x00;
                      OCR0B=0x00;

                      // Timer/Counter 0 Interrupt(s) initialization
                      TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (1<<TOIE0);


                      // Watchdog Timer initialization
                      // Watchdog Timer Prescaler: OSC/2k
                      // Watchdog timeout action: Reset
                      //#pragma optsize-
                      //WDTCR=(0<<WDTIF) | (0<<WDTIE) | (0<<WDP3) | (1<<WDCE) | (1<<WDE) | (0<<WDP2) | (0<<WDP1) | (0<<WDP0);
                      //WDTCR=(0<<WDTIF) | (0<<WDTIE) | (0<<WDP3) | (0<<WDCE) | (1<<WDE) | (0<<WDP2) | (0<<WDP1) | (0<<WDP0);
                      //#ifdef _OPTIMIZE_SIZE_
                      //#pragma optsize+
                      //#endif

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

                      دیدگاه


                        #12
                        پاسخ : مشکل عجیب با ATtiny13a

                        دوستان گیرم فقط همین کد ساده ایفه ها :

                        if(PINB.4 == 1){
                        Mode=2; //Alert
                        }

                        که چرا اطفاق می افته در صورتی که پایه B4 یک نیست این ایف اجرا میشه و میپره به حالت ALERT )MODE=2)

                        دیدگاه


                          #13
                          پاسخ : مشکل عجیب با ATtiny13a

                          او مای گاد مشکل صفر نکردن یکی از ورودیها توسط مقاومت بود که نویز باعث فعال شدنش میشد
                          شرمنده و تشکر فراوان از همه دوستانی که کدها رو مرور کردن خیلی بهم کمک کرد
                          جدیدترین ویرایش توسط Reza Azimy_RW; ۱۲:۱۷ ۱۳۹۷/۰۶/۰۲.

                          دیدگاه

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