اطلاعیه

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); 	 				
    }
    چیزی را بگو که بتوانی بنویسی
    چیزی را بنویس که بتوانی امضا کنی
    چیزی را امضا کن که بتوانی به آن عمل کنی (ناپلئون)
  • ۱٬۲۳۰٬۰۰۰ ریال ۷۳۸٬۰۰۰ ریال
    ۵۳٬۶۰۰٬۰۰۰ ریال ۵۰٬۹۲۰٬۰۰۰ ریال
    ۴۷۰٬۰۰۰ ریال ۲۸۲٬۰۰۰ ریال
    ۱۱۳٬۰۰۰ ریال ۶۲٬۱۵۰ ریال
    ۴٬۴۰۰ ریال ۳٬۶۵۲ ریال
    ۳٬۹۲۰٬۰۰۰ ریال ۱٬۹۶۰٬۰۰۰ ریال
    ۷٬۸۴۰٬۰۰۰ ریال ۷٬۰۵۶٬۰۰۰ ریال
لطفا صبر کنید...