اطلاعیه

Collapse
No announcement yet.

مشکل در عملکرد پین 3 پورت C در Mega8

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

    مشکل در عملکرد پین 3 پورت C در Mega8

    سلام

    دوستان یه برنامه نوشتم که با پین 3 پورت C یه عملی رو انجام میده و درست جواب میده تا اینکه از دستور sei() استفاده می کنم.
    بعد از اضافه کردن این دستور این پورت عملکرد عادیش مختل میشه.

    به نظر شما علت چیه؟

    ATmega8
    atstudio

    #2
    پاسخ : مشکل در عملکرد پین 3 پورت C در Mega8

    دوستان هیچ ایده ای ندارید؟

    دیدگاه


      #3
      پاسخ : مشکل در عملکرد پین 3 پورت C در Mega8

      با این اطلاعاتی که قرار دادین نظر خاصی نمیشه داد. بهتر سورس برنامه را هم قرار بدین.

      نکات بسیار مهم در تهیه پروگرامر که متاسفانه فراموش میشود!

      دیدگاه


        #4
        پاسخ : مشکل در عملکرد پین 3 پورت C در Mega8

        همون طور که تو کد معلومه به چند طریق سعی کردم برای حل مشکل اقدام کنم. اونا رو با کامنت Test مشخص کردم.
        کد:
        	// defining parameters and general definition
        #define F_CPU			8000000		// CPU frequency
        #define debounce_time	50			// delay time before accepting any input key push
        
        	// Pins definition
        #define buzzer_on		PORTD |= (1<<PORTD4)
        #define buzzer_off		PORTD &= ~(1<<PORTD4)
        #define lamp_on			PORTC |= (1<<PORTC2)
        #define lamp_off		PORTC &= ~(1<<PORTC2)
        #define motor_on		PORTC |= (1<<PORTC3)
        #define motor_off		PORTC &= ~(1<<PORTC3)
        #define motor_right		PORTC &= ~(1<<PORTC4)
        #define motor_left		PORTC |= (1<<PORTC4)
        #define dir_switch		( PIND&(1<<PORTD0) )
        #define klight_on		PORTB |= (1<<PORTB4)
        #define klight_off		PORTB &= ~(1<<PORTB4)
        #define detector		( PINC&(1<<PORTC0) )
        #define power			( PINB&(1<<PORTB3) )
        #define pause			( PINB&(1<<PORTB2) )
        #define left_arrow		( PINB&(1<<PORTB1) )
        #define right_arrow		( PINB&(1<<PORTB0) )
        
        	//	Header files
        #include <avr/io.h>
        #include <util/delay.h>
        #include <avr/interrupt.h>
        
        
        	// interrupt Sub routine
        ISR( TIMER0_OVF_vect){
        	TCNT0 = 164;		// Pre value to reach 5.33Khz >> first I reach to value 162 but I modifyed it
        	PORTC = ~( PINC & (1<<PORTC5) );	// this line make toggle signal
        }
        
        
        	//	interrupt sub routine		>>		use for generating unit pulse for timer
        ISR(TIMER2_OVF_vect){
        	TCNT2 = 8;
        //	PORTD = ~( PIND &(1<<PORTD1) );	// this line make toggle signal		// test line
        }
        
        
        unsigned char key_scan(void);
        
        int main(void)
        {
        	SFIOR &= ~(1<<PUD); 
        	
        // setting timer0, target frequency: 5.3Khz
        TCCR0 |= (1<<CS01);			// set Pre scaler for 1/8
        TIMSK |= (1<<TOIE0);		// Enable overflow interrupt
        
        // setting timer2, target period : 1mS	>>	this timer use for unit timer
        TCCR2 |= (1<<CS21)|(1<<CS20);	// set pre scaler for 1/32
        TIMSK |= (1<<TOIE2);			// Enable overflow interrupt
        
        	// Port C
        DDRC &= ~(1<<PORTC0);		// set as input for detector
        DDRC |= (1<<PORTC2);		// set as output for Lamp
        DDRC |= (1<<PORTC3);		// set as output for motor
        DDRC |= (1<<PORTC4);		// set as output for motor direction
        DDRC |= (1<<PORTC5);		// set as output for Pulse Generator
        
        	// Port D
        DDRD &= ~(1<<PORTD0);		// set as input for Direction switch
        DDRD |= (1<<PORTC4);		// set as output for buzzer
        
        	// Port B
        DDRB &= ~( (1<<PORTB3)|(1<<PORTB2)|(1<<PORTB1)|(1<<PORTB0) );		// set as input for four keyboard pins
        DDRB |= (1<<PORTB4);		// set as output for keyboard's light
        
        
        sei();	// Enable general interrupt
        
        
        
        	// loop while
        while(1){
        /*
        if(arrow==0){  // first key scan
        	// Key Scan
        	switch( key_scan() ){
        
        		case 3: // check power condition
        		power_func();
        		break;
        		
        		case 2: // check pause condition
        		pause_func();
        		break;
        		
        		case 1: // call left arrow
        		left_func();
        		break;
        		
        		case 0: // call right arrow
        		right_func();
        		break;
        		
        	}; // End switch
        }; // End if [first key]
        */
        
        
        // test
        if (key_scan()==3)
        {
        	motor_on;
        	klight_on;
        	lamp_on;
        	buzzer_on;
        	motor_right;
        	_delay_ms(1000);
        } 
        else
        {
        	motor_off;
        	klight_off;
        	lamp_off;
        	buzzer_off;
        	motor_left;
        }// end test
        
        
        /*
        // test
        _delay_ms(3000);
        PORTC &= ~(1<<PORTC3);
        _delay_ms(3000);
        PORTC |= (1<<PORTC3);*/
        
        }	// End loop while
        
        } // End Mian

        دیدگاه


          #5
          پاسخ : مشکل در عملکرد پین 3 پورت C در Mega8

          روش تاگل کردن شما در روتین وقفه درست نیست و سایر پین های پورت سی و دی دستکاری میشوند.
          از روش زیر استفاده کنید :

          کد:
          PORTC ^= (1 << PINC3)

          نکات بسیار مهم در تهیه پروگرامر که متاسفانه فراموش میشود!

          دیدگاه


            #6
            پاسخ : مشکل در عملکرد پین 3 پورت C در Mega8

            ممنون.
            ولی ممکنه بگی ایراد کار از کجاست؟

            دیدگاه


              #7
              پاسخ : مشکل در عملکرد پین 3 پورت C در Mega8

              متوجه شدم.
              ممنون

              دیدگاه

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