michaelb
22.12.2005, 13:21
Hi Leutz,
ich hab da ein Problem mit der TWI Kommunikation!
Meine 2 Atmega32 sind über 2 Kabel verbunden(SDA - SDA / SCL -SCL)
diese jeweils über nen 10KOhm zu VCC. Desweiteren hängt an jedem der µC an PortB 0 eine LED + Widerstand gegen GND.
Hier der Mastercode:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
unsigned volatile char slave_adresse, daten, error;
int twi_start(void);
int twi_adresse(void);
int twi_daten(void);
void twi_stop(void);
int main(void)
{
DDRB = 0x00;
TWAR = 0x01;
TWBR = 0xC;
slave_adresse = 0x02;
daten = 0x03;
for(;;)
{
error = twi_start();
error = twi_adresse();
error = twi_daten();
if(error == 1)
{
PORTB = (1<<PB0);
}
else
{
PORTB &= ~(1<<PB0);
}
}
}
int twi_start(void)
{
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) == 0x08)
{
return 0;
}
else
{
return 1;
}
}
int twi_adresse(void)
{
TWDR = slave_adresse;
TWCR = (1<<TWINT)|(1<<TWEN);
while(!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) == 0x18)
{
return 0;
}
else
{
return 1;
}
}
int twi_daten(void)
{
TWDR = daten;
TWCR = (1<<TWINT)|(1<<TWEN);
while(!(TWCR & (1<<TWINT)))
if ((TWSR & 0xF8) == 0x28)
{
return 0;
}
else
{
return 1;
}
}
void twi_stop(void)
{
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
}
und hier der Slavecode:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
unsigned volatile char slave_adresse, daten;
int main(void)
{
sei();
DDRB = 0xFF;
PORTB &= ~(1<<PB0);
TWAR = 0x02;
TWBR = 0xC;
TWCR = (1<<TWEA)|(1<<TWEN);
TWSR &= 0b11111100;
for(;;)
{
if(daten == 0x03)
{
PORTB = (1<<PB0);
}
else
{
PORTB &= ~(1<<PB0);
}
}
}
SIGNAL (SIG_2WIRE_SERIAL)
{
if((TWSR & 0b11111000) == 0x80)
{
daten = TWDR;
}
TWCR |= (1<<TWINT);
}
ich hoffe jemand blickt den Code und kann mir helfen! Helft mir!
Gruß Michi
ich hab da ein Problem mit der TWI Kommunikation!
Meine 2 Atmega32 sind über 2 Kabel verbunden(SDA - SDA / SCL -SCL)
diese jeweils über nen 10KOhm zu VCC. Desweiteren hängt an jedem der µC an PortB 0 eine LED + Widerstand gegen GND.
Hier der Mastercode:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
unsigned volatile char slave_adresse, daten, error;
int twi_start(void);
int twi_adresse(void);
int twi_daten(void);
void twi_stop(void);
int main(void)
{
DDRB = 0x00;
TWAR = 0x01;
TWBR = 0xC;
slave_adresse = 0x02;
daten = 0x03;
for(;;)
{
error = twi_start();
error = twi_adresse();
error = twi_daten();
if(error == 1)
{
PORTB = (1<<PB0);
}
else
{
PORTB &= ~(1<<PB0);
}
}
}
int twi_start(void)
{
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) == 0x08)
{
return 0;
}
else
{
return 1;
}
}
int twi_adresse(void)
{
TWDR = slave_adresse;
TWCR = (1<<TWINT)|(1<<TWEN);
while(!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) == 0x18)
{
return 0;
}
else
{
return 1;
}
}
int twi_daten(void)
{
TWDR = daten;
TWCR = (1<<TWINT)|(1<<TWEN);
while(!(TWCR & (1<<TWINT)))
if ((TWSR & 0xF8) == 0x28)
{
return 0;
}
else
{
return 1;
}
}
void twi_stop(void)
{
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
}
und hier der Slavecode:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
unsigned volatile char slave_adresse, daten;
int main(void)
{
sei();
DDRB = 0xFF;
PORTB &= ~(1<<PB0);
TWAR = 0x02;
TWBR = 0xC;
TWCR = (1<<TWEA)|(1<<TWEN);
TWSR &= 0b11111100;
for(;;)
{
if(daten == 0x03)
{
PORTB = (1<<PB0);
}
else
{
PORTB &= ~(1<<PB0);
}
}
}
SIGNAL (SIG_2WIRE_SERIAL)
{
if((TWSR & 0b11111000) == 0x80)
{
daten = TWDR;
}
TWCR |= (1<<TWINT);
}
ich hoffe jemand blickt den Code und kann mir helfen! Helft mir!
Gruß Michi