اطلاعیه

Collapse
No announcement yet.

کمک برای استفاده از وقفه

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

    کمک برای استفاده از وقفه

    سلام.خسته نباشید . ایام فاطمیه رو هم به دوستان تسلیت میگم
    دارم SIM908 راه میندازم اما یه مشکل دارم . یه برنامه ساده نوشتم که از وقفه خارجی صفر استفاده میکنه و داخل روتینش گفتم(با لبه پایین رونده)
    پورت B3 که یه LED بهش وصله رو tuggle کن و وضعیت پورت رو اسمس کم بعدش روی lcd بنویس sms sent بعدش یه تاخیر و پاک کردن lcd
    اینجا روتین وقفه تموم میشه,اما نحوه عملکرد مدار:
    میکرو و ال سی دی روشن میشن روی ال سی دی نوشته میشه Ready to work (توی حلقه بینهایت) و منتظر وقفه است
    لبه پایین رونده رو که با یه کلید ایجاد میکنم(pullup داخلی فعاله و int0 با button به زمین وصله) وضعیت B3 تاگل میشه یعنی خاموش بوده و روشن میشه
    اسمس هم ارسال میشه روی lcd هم نوشته میشه و پاک میشه اما:
    با پاک شدن lcd یعنی اخرین دستور روتین وقفه دوباره B3 برمیگرده به حالت اولش(خاموش)!!!!!!!!!!!! :surprised:
    و دیگه میکرو هیج کاری نمیکنه . در صورتیکه باید برگرده به حلقه بینهایت و روی lcd بنویسه ready to work و منتظر وقفه باشه
    دوستای با تجربه اگه کمکم کنید ممنون میشم.مشکلم کجاست؟؟؟؟
    کد:
    /*****************************************************
    This program was produced by the
    CodeWizardAVR V2.05.3 Standard
    Automatic Program Generator
    © Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
    http://www.hpinfotech.com
    
    Project : 
    Version : 
    Date  : 3/2/2015
    Author : User
    Company : 
    Comments: 
    
    
    Chip type        : ATmega32A
    Program type      : Application
    AVR Core Clock frequency: 8.000000 MHz
    Memory model      : Small
    External RAM size    : 0
    Data Stack size     : 512
    *****************************************************/
    
    #include <mega32a.h>
    #include <stdio.h>
    #include <delay.h>
    #include <alcd.h>
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    #define ctrl_z 0x1a
    flash char at_sms1[]= {'A','T','+','C','M','G','S','=','"','+','9','8','9','3','7','9','4','2','8','2','5','8','"','\r'};
    
    void wait_to_get(char ch) {
        while(ch != getchar());
        } 
      
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    
    // External Interrupt 0 service routine
    interrupt [EXT_INT0] void ext_int0_isr(void)
    {
       // #asm("cli")
        PORTB.3=~PORTB.3;
        lcd_clear();
        lcd_gotoxy(0,0);   
        putsf(at_sms1);
        wait_to_get('>'); 
        
        if (PORTB.3==1)
        printf(" Device Is On,Now"); 
        else if (PORTB.3==0)
        printf(" Device Is Off,Now"); 
        
        putchar(ctrl_z);
        lcd_putsf("The SMS Sent ! "); 
        delay_ms(3000);
         lcd_clear();
        // #asm("sei")
        
    }
    
    
    void main(void)
    {
    //PORTA=0x00;
    //DDRA=0x00;
    DDRB.3=1;
    PORTB.3=0;
    
    
    DDRD.2=0;
    PORTD.2=1;       //pull_up res
    
    
    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: Timer 0 Stopped
    // Mode: Normal top=0xFF
    // OC0 output: Disconnected
    TCCR0=0x00;
    TCNT0=0x00;
    OCR0=0x00;
    
    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: Timer1 Stopped
    // Mode: Normal top=0xFFFF
    // OC1A output: Discon.
    // OC1B output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer1 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: Timer2 Stopped
    // Mode: Normal top=0xFF
    // OC2 output: Disconnected
    ASSR=0x00;
    TCCR2=0x00;
    TCNT2=0x00;
    OCR2=0x00;
    
    // External Interrupt(s) initialization
    // INT0: On
    // INT0 Mode: Falling Edge
    // INT1: Off
    // INT2: Off
    GICR|=0x40;
    MCUCR=0x02;
    MCUCSR=0x00;
    GIFR=0x40;
    
    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x00;
    
    // USART initialization
    // Communication Parameters: 8 Data, 1 Stop, No Parity
    // USART Receiver: On
    // USART Transmitter: On
    // USART Mode: Asynchronous
    // USART Baud Rate: 38400
    UCSRA=0x00;
    UCSRB=0x18;
    UCSRC=0x06;
    UBRRH=0x00;
    UBRRL=0x0C;
    
    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;
    SFIOR=0x00;
    
    // ADC initialization
    // ADC disabled
    ADCSRA=0x00;
    
    // 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 - PORTA Bit 0
    // RD - PORTA Bit 1
    // EN - PORTA Bit 2
    // D4 - PORTA Bit 4
    // D5 - PORTA Bit 5
    // D6 - PORTA Bit 6
    // D7 - PORTA Bit 7
    // Characters/line: 20
    lcd_init(20);
    #asm("sei")
    
        // lcd_clear();
        //lcd_gotoxy(0,0);
        //lcd_putsf("Ready to work..."); 
         
    while (1)
       {
        lcd_clear();
        lcd_gotoxy(0,0);
        lcd_putsf("Ready to work..."); 
        delay_ms(3000);
       }
    }

    If your dreams don't scare you,They aren't big enough

    #2
    پاسخ : کمک برای استفاده از وقفه

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

    دیدگاه


      #3
      پاسخ : کمک برای استفاده از وقفه

      ممنون از پاسخت دوست عزیز ولی مشکل از اینجا نیست . حرف شمام درسته چون کدو زیاد دستکاری کردم اون تاخیر جا مونده!
      کارمو انجام دادم به یه روش دیگه اما هنوز متوجه نشدم کجای این برنامه مشکل داره !!!
      اگه کسی میدونه ممنون میشم بگه
      If your dreams don't scare you,They aren't big enough

      دیدگاه


        #4
        پاسخ : کمک برای استفاده از وقفه

        نوشته اصلی توسط ُSadeghi1994
        سلام.خسته نباشید . ایام فاطمیه رو هم به دوستان تسلیت میگم
        دارم SIM908 راه میندازم اما یه مشکل دارم . یه برنامه ساده نوشتم که از وقفه خارجی صفر استفاده میکنه و داخل روتینش گفتم(با لبه پایین رونده)
        پورت B3 که یه LED بهش وصله رو tuggle کن و وضعیت پورت رو اسمس کم بعدش روی lcd بنویس sms sent بعدش یه تاخیر و پاک کردن lcd
        اینجا روتین وقفه تموم میشه,اما نحوه عملکرد مدار:
        میکرو و ال سی دی روشن میشن روی ال سی دی نوشته میشه Ready to work (توی حلقه بینهایت) و منتظر وقفه است
        لبه پایین رونده رو که با یه کلید ایجاد میکنم(pullup داخلی فعاله و int0 با button به زمین وصله) وضعیت B3 تاگل میشه یعنی خاموش بوده و روشن میشه
        اسمس هم ارسال میشه روی lcd هم نوشته میشه و پاک میشه اما:
        با پاک شدن lcd یعنی اخرین دستور روتین وقفه دوباره B3 برمیگرده به حالت اولش(خاموش)!!!!!!!!!!!! :surprised:
        و دیگه میکرو هیج کاری نمیکنه . در صورتیکه باید برگرده به حلقه بینهایت و روی lcd بنویسه ready to work و منتظر وقفه باشه
        دوستای با تجربه اگه کمکم کنید ممنون میشم.مشکلم کجاست؟؟؟؟
        کد:
        /*****************************************************
        This program was produced by the
        CodeWizardAVR V2.05.3 Standard
        Automatic Program Generator
        © Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
        http://www.hpinfotech.com
        
        Project : 
        Version : 
        Date  : 3/2/2015
        Author : User
        Company : 
        Comments: 
        
        
        Chip type        : ATmega32A
        Program type      : Application
        AVR Core Clock frequency: 8.000000 MHz
        Memory model      : Small
        External RAM size    : 0
        Data Stack size     : 512
        *****************************************************/
        
        #include <mega32a.h>
        #include <stdio.h>
        #include <delay.h>
        #include <alcd.h>
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        #define ctrl_z 0x1a
        flash char at_sms1[]= {'A','T','+','C','M','G','S','=','"','+','9','8','9','3','7','9','4','2','8','2','5','8','"','\r'};
        
        void wait_to_get(char ch) {
            while(ch != getchar());
            } 
          
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        
        // External Interrupt 0 service routine
        interrupt [EXT_INT0] void ext_int0_isr(void)
        {
           // #asm("cli")
            PORTB.3=~PORTB.3;
            lcd_clear();
            lcd_gotoxy(0,0);   
            putsf(at_sms1);
            wait_to_get('>'); 
            
            if (PORTB.3==1)
            printf(" Device Is On,Now"); 
            else if (PORTB.3==0)
            printf(" Device Is Off,Now"); 
            
            putchar(ctrl_z);
            lcd_putsf("The SMS Sent ! "); 
            delay_ms(3000);
             lcd_clear();
            // #asm("sei")
            
        }
        
        
        void main(void)
        {
        //PORTA=0x00;
        //DDRA=0x00;
        DDRB.3=1;
        PORTB.3=0;
        
        
        DDRD.2=0;
        PORTD.2=1;       //pull_up res
        
        
        // Timer/Counter 0 initialization
        // Clock source: System Clock
        // Clock value: Timer 0 Stopped
        // Mode: Normal top=0xFF
        // OC0 output: Disconnected
        TCCR0=0x00;
        TCNT0=0x00;
        OCR0=0x00;
        
        // Timer/Counter 1 initialization
        // Clock source: System Clock
        // Clock value: Timer1 Stopped
        // Mode: Normal top=0xFFFF
        // OC1A output: Discon.
        // OC1B output: Discon.
        // Noise Canceler: Off
        // Input Capture on Falling Edge
        // Timer1 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: Timer2 Stopped
        // Mode: Normal top=0xFF
        // OC2 output: Disconnected
        ASSR=0x00;
        TCCR2=0x00;
        TCNT2=0x00;
        OCR2=0x00;
        
        // External Interrupt(s) initialization
        // INT0: On
        // INT0 Mode: Falling Edge
        // INT1: Off
        // INT2: Off
        GICR|=0x40;
        MCUCR=0x02;
        MCUCSR=0x00;
        GIFR=0x40;
        
        // Timer(s)/Counter(s) Interrupt(s) initialization
        TIMSK=0x00;
        
        // USART initialization
        // Communication Parameters: 8 Data, 1 Stop, No Parity
        // USART Receiver: On
        // USART Transmitter: On
        // USART Mode: Asynchronous
        // USART Baud Rate: 38400
        UCSRA=0x00;
        UCSRB=0x18;
        UCSRC=0x06;
        UBRRH=0x00;
        UBRRL=0x0C;
        
        // Analog Comparator initialization
        // Analog Comparator: Off
        // Analog Comparator Input Capture by Timer/Counter 1: Off
        ACSR=0x80;
        SFIOR=0x00;
        
        // ADC initialization
        // ADC disabled
        ADCSRA=0x00;
        
        // 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 - PORTA Bit 0
        // RD - PORTA Bit 1
        // EN - PORTA Bit 2
        // D4 - PORTA Bit 4
        // D5 - PORTA Bit 5
        // D6 - PORTA Bit 6
        // D7 - PORTA Bit 7
        // Characters/line: 20
        lcd_init(20);
        #asm("sei")
        
            // lcd_clear();
            //lcd_gotoxy(0,0);
            //lcd_putsf("Ready to work..."); 
             
        while (1)
           {
            lcd_clear();
            lcd_gotoxy(0,0);
            lcd_putsf("Ready to work..."); 
            delay_ms(3000);
           }
        }
        سلام دوست عزیز من برنامتونو چک کردم و اجرا شد :agree:
        میخواستم ببینم این مشکلو که میگید تو شبیه سازی متوجه شدی یا توی تست واقعی مدار با ماژول sim908?
        من فکر کنم مشکل از این دستو هست
        کد:
        void wait_to_get(char ch) {
            while(ch != getchar());
            }
        با حذف این دستور مشکل برنامه شما حل شد من الان تو protuse 8 شبیه سازی انجام دادم وبدمن مشکل کار میکرد
        برا همین پرسیدم تو شبیه ساز با این مشکل روبرو شدی یا تو مدار واقعی!؟
        چون توشبیه سازی این برنامه بادی کارکتر "<" ارسال بشه برای میکرو
        اینم برنامه کلی
        کد:
        /*****************************************************
        This program was produced by the
        CodeWizardAVR V2.05.3 Standard
        Automatic Program Generator
        © Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
        http://www.hpinfotech.com
        
        Project : 
        Version : 
        Date  : 3/2/2015
        Author : User
        Company : 
        Comments: 
        
        
        Chip type        : ATmega32A
        Program type      : Application
        AVR Core Clock frequency: 8.000000 MHz
        Memory model      : Small
        External RAM size    : 0
        Data Stack size     : 512
        *****************************************************/
        
        #include <mega32a.h>
        #include <stdio.h>
        #include <delay.h>
        #include <alcd.h>
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        #define ctrl_z 0x1a
        flash char at_sms1[]= {'A','T','+','C','M','G','S','=','"','+','9','8','9','3','7','9','4','2','8','2','5','8','"','\r'};
        void wait_to_get(char ch) {
            while(ch!=getchar());
            } 
          
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        
        // External Interrupt 0 service routine
        interrupt [EXT_INT0] void ext_int0_isr(void)
        {
           // #asm("cli")
            PORTB.3=~PORTB.3;
            lcd_clear();
            lcd_gotoxy(0,0);   
            putsf(at_sms1);
           //wait_to_get('>'); 
            
            if (PORTB.3==1)
            printf(" Device Is On,Now"); 
            else if (PORTB.3==0)
            printf(" Device Is Off,Now"); 
            
            putchar(ctrl_z);
            lcd_putsf("The SMS Sent ! "); 
            delay_ms(3000);
             lcd_clear();
            // #asm("sei")
            
        }
        
        
        void main(void)
        {
        //PORTA=0x00;
        //DDRA=0x00;
        DDRB.3=1;
        PORTB.3=0;
        
        
        DDRD.2=0;
        PORTD.2=1;       //pull_up res
        
        
        // Timer/Counter 0 initialization
        // Clock source: System Clock
        // Clock value: Timer 0 Stopped
        // Mode: Normal top=0xFF
        // OC0 output: Disconnected
        TCCR0=0x00;
        TCNT0=0x00;
        OCR0=0x00;
        
        // Timer/Counter 1 initialization
        // Clock source: System Clock
        // Clock value: Timer1 Stopped
        // Mode: Normal top=0xFFFF
        // OC1A output: Discon.
        // OC1B output: Discon.
        // Noise Canceler: Off
        // Input Capture on Falling Edge
        // Timer1 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: Timer2 Stopped
        // Mode: Normal top=0xFF
        // OC2 output: Disconnected
        ASSR=0x00;
        TCCR2=0x00;
        TCNT2=0x00;
        OCR2=0x00;
        
        // External Interrupt(s) initialization
        // INT0: On
        // INT0 Mode: Falling Edge
        // INT1: Off
        // INT2: Off
        GICR|=0x40;
        MCUCR=0x02;
        MCUCSR=0x00;
        GIFR=0x40;
        
        // Timer(s)/Counter(s) Interrupt(s) initialization
        TIMSK=0x00;
        
        // USART initialization
        // Communication Parameters: 8 Data, 1 Stop, No Parity
        // USART Receiver: On
        // USART Transmitter: On
        // USART Mode: Asynchronous
        // USART Baud Rate: 38400
        UCSRA=0x00;
        UCSRB=0x18;
        UCSRC=0x06;
        UBRRH=0x00;
        UBRRL=0x0C;
        
        // Analog Comparator initialization
        // Analog Comparator: Off
        // Analog Comparator Input Capture by Timer/Counter 1: Off
        ACSR=0x80;
        SFIOR=0x00;
        
        // ADC initialization
        // ADC disabled
        ADCSRA=0x00;
        
        // 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 - PORTA Bit 0
        // RD - PORTA Bit 1
        // EN - PORTA Bit 2
        // D4 - PORTA Bit 4
        // D5 - PORTA Bit 5
        // D6 - PORTA Bit 6
        // D7 - PORTA Bit 7
        // Characters/line: 20
        lcd_init(20);
        #asm("sei")
        
            // lcd_clear();
            //lcd_gotoxy(0,0);
            //lcd_putsf("Ready to work..."); 
             
        while (1)
           {
            lcd_clear();
            lcd_gotoxy(0,0);
            lcd_putsf("Ready to work..."); 
            delay_ms(3000);
           }
        }

        دیدگاه


          #5
          پاسخ : کمک برای استفاده از وقفه

          مهندس ممنون از جوابتون
          من شبیه سازی نکردم و در عمل به این مشکل خوردم . و همونطور که گفتم میخوام هروقت PORT این پین تغییر کرد بهم اسمس بده
          اما یه بار تغییر میکنه و اسمس میده و دوباره برمیگرده به حالت قبلیش و دیگه هیچکاری نمیتونم بکنم !!!!
          نفهمیدم مشکلم کجاست . حالا با کد تغییرات شما هم تستش میکنم ببینم چی میشه . توکل به خدا...
          If your dreams don't scare you,They aren't big enough

          دیدگاه

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