سلام دوستان.
من میخوام بین دوتا میکرو از طریق TWI به شکل multimaster ازتباط برقرار کنم.
ولی متاسفانه به مشکل خوردم . وقتی از یه سمت دارم دیتا برای اون یکی میفرستم همه چیز خوب پیش میره ولی وقتی بعدش از اونیکی سمت به این یکی دیتا بفرستم همه چیز خراب میشه . انگار اصلا باس TWI قفل میشه .
تا فردا باید تمومش کنم :angry: :cry2: :cry2: :cry2:
لطفا کمکم کنید
ممنون
البته خیلی به این کد کازی نداشته باشید . در کل باید چجوری با TWI روش multimaster پیاده کنم
اینم کدم:
من میخوام بین دوتا میکرو از طریق 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);
}

