اطلاعیه

Collapse
No announcement yet.

مشکل در TWI

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

    مشکل در TWI

    سلام دوستان.
    من میخوام بین دوتا میکرو از طریق TWI به شکل multimaster ازتباط برقرار کنم.
    ولی متاسفانه به مشکل خوردم . وقتی از یه سمت دارم دیتا برای اون یکی میفرستم همه چیز خوب پیش میره ولی وقتی بعدش از اونیکی سمت به این یکی دیتا بفرستم همه چیز خراب میشه . انگار اصلا باس TWI قفل میشه .
    تا فردا باید تمومش کنم :angry: :cry2: :cry2: :cry2:
    لطفا کمکم کنید
    ممنون
    البته خیلی به این کد کازی نداشته باشید . در کل باید چجوری با TWI روش multimaster پیاده کنم

    اینم کدم:
    کد:
    /*****************************************************
    This program was produced by the
    CodeWizardAVR V2.05.0 Advanced
    Automatic Program Generator
    © Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
    http://www.hpinfotech.com
    
    Project : 
    Version : 
    Date  : 9/9/2015
    Author : www.Eca.ir *** www.Webkade.ir
    Company : 
    Comments: 
    
    
    Chip type        : ATmega8
    Program type      : Application
    AVR Core Clock frequency: 8.000000 MHz
    Memory model      : Small
    External RAM size    : 0
    Data Stack size     : 256
    *****************************************************/
    
    #include <mega8.h>
    #include <delay.h>
    
    #define TP2 PINB.0
    #define TP1 PINB.1
    #define BUZZER PORTB.7
    #define PAIRING PIND.3
    #define RSTAT PORTD.6
    #define GSTAT PORTD.7
    #define BSTAT PORTD.5
    #define SEG7A PORTD.4
    #define SEG7B PORTD.1
    #define SEG7DP PORTC.3 //SEG7C
    #define SEG7D PORTC.2
    #define SEG7E PORTC.1
    #define SEG7G PORTB.6 //SEG7F
    #define SEG7F PORTC.0 //SEG7G
    #define SEG7C PORTD.0 //SEG7DP
    
    #define TWIE 0
    #define TWEN 2
    #define TWSTA 5
    #define TWINT 7
    #define TWSTO 4
    #define TWEA 6
    
    #define START 		   0x08 
    #define Repeated_START 	 0x10
    // Master Transmitter
    #define MT_SLA_ACK    0x18
    #define MT_SLA_NACK   0x20
    #define MT_DATA_ACK   0x28
    #define MT_DATA_NACK   0x30
    #define MT_ARB_LOST   0x38
    
    
    // Master Receiver
    #define MR_ARB_LOST   0x38
    #define MR_SLA_ACK    0x40
    #define MR_SLA_NACK   0x48
    #define MR_DATA_ACK   0x50
    #define MR_DATA_NACK   0x58
    
     // Slave Transmitter
    #define ST_SLA_ACK        0xA8
    #define ST_ARB_LOST_SLA_ACK   0xB0
    #define ST_DATA_ACK       0xB8
    #define ST_DATA_NACK       0xC0
    #define ST_LAST_DATA       0xC8
    
     // Slave Receiver
    #define REP_START        0x10      
    #define SLA_R          0xC9     
    #define SR_SLA_ACK        0x60
    #define SR_ARB_LOST_SLA_ACK   0x68
    #define SR_GCALL_ACK       0x70
    #define SR_ARB_LOST_GCALL_ACK  0x78
    #define SR_DATA_ACK       0x80
    #define SR_DATA_NACK       0x88
    #define SR_GCALL_DATA_ACK    0x90
    #define SR_GCALL_DATA_NACK    0x98
    #define SR_STOP         0xA0
    
    #define GlobalAddress  0
    
    //Slave addresses
    #define LIGHTER   2
    #define TEMP    3
    #define MIC     4
    #define MOTOR    5
    #define FAN     6
    
    
    unsigned char MR_TWI(unsigned char);
    void MT_TWI(unsigned char,unsigned char); 
    char pairing_table[5];
    char click_counter;
    char command;
    int i;
    int timer_counter;
    
    // External Interrupt 1 service routine
    interrupt [EXT_INT1] void ext_int1_isr(void)
    {
    // Place your code here
    if(click_counter==0)
      {    	 
      click_counter++; 
      }
    else if(click_counter==1)
      {
      click_counter=0;
      } 
    }
    
    // Timer 0 overflow interrupt service routine
    interrupt [TIM0_OVF] void timer0_ovf_isr(void)
    {
    // Place your code here
    
    }
    
    // Two Wire bus interrupt service routine
    interrupt [TWI] void twi_isr(void)
    {
    // Place your code here
    unsigned char status;
    status = TWSR & 0xF8;     
    switch(status)
      {                 
      case SR_GCALL_DATA_ACK:           
        break;
      case SR_GCALL_DATA_NACK:     
        break;   
      case SR_DATA_ACK:  
        break;         
      case ST_SLA_ACK: 
      break;      
      } 
    TWCR|=(1<<TWINT);
    }
    
    // Declare your global variables here
    
    void main(void)
    {
    // Declare your local variables here
    
    // Input/Output Ports initialization
    // Port B initialization
    // Func7=Out Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
    // State7=0 State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
    PORTB=0x00;
    DDRB=0x80;
    DDRB.6=1;
    DDRB.2=1;
    
    
    // Port C initialization
    // Func6=In Func5=In Func4=In Func3=Out Func2=Out Func1=Out Func0=Out 
    // State6=T State5=T State4=T State3=0 State2=0 State1=0 State0=0 
    PORTC=0x00;
    DDRC=0x0F;
    
    // Port D initialization
    // Func7=Out Func6=Out Func5=Out Func4=Out Func3=In Func2=In Func1=Out Func0=Out 
    // State7=0 State6=0 State5=0 State4=0 State3=T State2=T State1=0 State0=0 
    PORTD=0x00;
    DDRD=0xF3;
    
    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: 7.813 kHz
    TCCR0=0x05;
    TCNT0=0x00;
    
    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: 1000.000 kHz
    // Mode: Ph. & fr. cor. PWM top=ICR1
    // OC1A output: Discon.
    // OC1B output: Non-Inv.
    // 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=0x20;
    TCCR1B=0x12;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=2;
    
    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: Timer2 Stopped
    // Mode: Normal top=0xFF
    // OC2 output: Disconnected
    ASSR=0x00;
    TCCR2=0x00;
    TCNT2=0x00;
    OCR2=0x00;
    
    // External Interrupt(s) initialization
    // INT0: Off
    // INT1: On
    // INT1 Mode: Any change
    GICR|=0x80;
    MCUCR=0x04;
    GIFR=0x80;
    
    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x01;
    
    // USART initialization
    // USART disabled
    UCSRB=0x00;
    
    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;
    SFIOR=0x00;
    
    // ADC initialization
    // ADC disabled
    ADCSRA=0x00;
    
    // SPI initialization
    // SPI disabled
    SPCR=0x00;
    
    // TWI initialization
    // Bit Rate: 100.000 kHz
    TWBR=0x20;
    // Two Wire Bus Slave Address: 1
    // General Call Recognition: Off
    TWAR=0x02;
    // Generate Acknowledge Pulse: On
    // TWI Interrupt: On
    TWCR=0x45;
    TWSR=0x00;
    
    RSTAT=1;
    GSTAT=1;
    BSTAT=1;
    SEG7A=1;
    SEG7B=1;
    SEG7C=1;
    SEG7D=1;
    SEG7E=1;
    SEG7F=1;
    SEG7G=1;
    SEG7DP=1;
    OCR1BL=2;
    for(i=0;i<256;i=i+10) 
        {
        ICR1L=i;
        delay_ms(100);
        } 
    OCR1BL=0;
    
    // Global enable interrupts
    #asm("sei")
          
    while (1)
       { 
       timer_counter++;
    if(timer_counter==1)
      {
      if(command==0)
        {
        GSTAT=0;
        delay_ms(1);
        GSTAT=1; 
        }
      else if(command==1)
        {
        RSTAT=0;
        delay_ms(1);
        RSTAT=1;
        } 
                  
      TWCR = (1<<TWINT)| (1<<TWEN)| (1<<TWSTA);  	 	
    	while(!(TWCR & (1<<TWINT)));   
    	RSTAT=0;  
     	if ((TWSR & 0xF8) == START || (TWSR & 0xF8) == Repeated_START )
        { 
        							  	 										  	 
    		TWDR = (3 << 1) | 0x01;            	
    		TWCR = (1<<TWINT) | (1<<TWEN);		 
    		while (!(TWCR & (1<<TWINT))); 		
     	  }                			
     	 	  	
     	if((TWSR & 0xF8) == MR_SLA_ACK) 
        {   	
      	TWCR = (1<<TWINT)| (1<<TWEN)| (1<<TWEA);  	
        while (!(TWCR & (1<<TWINT)));    
    		command=TWDR;	
    		TWCR = (1<<TWINT)| (1<<TWEN);  
    		while (!(TWCR & (1<<TWINT)));	 			   
     	  }	          
     	TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
      timer_counter=0;
      }
       }
    }
    
    //-----------------------------------
    unsigned	char MR_TWI(unsigned char address_device) 
    {
    	unsigned char  get_data; 
    	
    	TWCR = (1<<TWINT)| (1<<TWEN)| (1<<TWSTA);  	 	
    	while(!(TWCR & (1<<TWINT)));   
    	 
     	if ((TWSR & 0xF8) == START || (TWSR & 0xF8) == Repeated_START ){ 							  	 										  	 
    		TWDR = (address_device << 1) | 0x01;            	
    		TWCR = (1<<TWINT) | (1<<TWEN);		 
    		while (!(TWCR & (1<<TWINT))); 		
     	}                			
     	 	 	 	
     	if((TWSR & 0xF8) == MR_SLA_ACK) {   	
      	TWCR = (1<<TWINT)| (1<<TWEN)| (1<<TWEA);  	
       while (!(TWCR & (1<<TWINT)));    
    		get_data=TWDR;	
    		TWCR = (1<<TWINT)| (1<<TWEN);  
    		while (!(TWCR & (1<<TWINT)));	 			   
     	}	          
     	TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO); 	 	  	
    	return get_data;
    	   				
    } 
    //----------------------------------
    void MT_TWI(unsigned char data,unsigned char address_device)
    {                    	
    	TWCR = (1<<TWINT)|(1<<TWEN)| (1<<TWSTA) ;  
     	while(!(TWCR & (1<<TWINT)));    
     	
      if ((TWSR & 0xF8) == START || (TWSR & 0xF8) == Repeated_START ){	
    		TWDR = (address_device << 1) & 0xFE;            		
    	  TWCR = (1<<TWINT) | (1<<TWEN);		 	  
    		while (!(TWCR & (1<<TWINT)));	 		   		
      }     		 
     	if ((TWSR & 0xF8) == MT_SLA_ACK ){   	  
     		TWDR =data;    		      
    	  TWCR = (1<<TWINT) | (1<<TWEN);		 
    		while (!(TWCR & (1<<TWINT)));  			   		
      }    		   		  	
      TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO); 	 				
    }
    چيزي را بگو که بتواني بنويسي
    چيزي را بنويس که بتواني امضا کني
    چيزي را امضا کن که بتواني به آن عمل کني (ناپلئون)
لطفا صبر کنید...
X