Zeroeightfifteen
26.11.2007, 23:11
Hallo
ich habe nun das ganze Forum durchgesucht aber nichts richtiges gefunden.
Ich will als Master einen Mega128 verwenden und als Slave einen Mega8.
Als Bus verwende ich TWI.
Für den Master verwende ich die Lib von Fleury.
Der Interrupt kommt beim Slave aber ich kann die Daten nicht empfangen.
Mit dem Master sende ich ein Byte zum Slave
#include <avr/io.h>
#include "i2cmaster.h"
#define Motor1 0x50 // device address of Motor1
int main(void)
{
i2c_init(); // initialize I2C library
i2c_start_wait(Motor1+I2C_WRITE); // set device address and write mode
// i2c_write(0x10); // write address = 10
i2c_write(0xFF); // write value 0x75 to Motor1
i2c_stop(); // set stop conditon = release bus
}
im Slave warte ich bis TWSR auf 0x80 gesetzt ist.
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include <avr/pgmspace.h>
#include "util/twi.h"
#ifndef F_CPU
#define F_CPU 16000000UL
#endif
ISR( TWI_vect )
{
//Statusregister abfragen
switch(TWSR)
{
case TW_SR_DATA_ACK:
OCR1A = TWDR; //PWM-Signal
return;
}
TWCR |= (1 << TWINT);
}
void main (void)
{
TWAR |= 0x50; // Slave Adresse
TWCR |= (1<<TWEN)|(1<<TWEA)|(1<<TWIE) ; //TWEN das TWI Modul aktivieren TWEA das Senden des Bestätigungsbits (ACK) zulassen
sei();
DDRB = 0xff;
PORTB = 0x02;
DDRD = 0xff;
PORTD = 0x44;
TCCR1A = (1<<WGM10)|(1<<COM1A1); // PWM, phase correct, 8 bit.
TCCR1B = (1<<CS11) |(1<<CS10); // set clock/prescaler 1/64 -> enable counter
OCR1A = 30; //PWM-Signal
}
was habe ich da falsch gemacht?
ich habe nun das ganze Forum durchgesucht aber nichts richtiges gefunden.
Ich will als Master einen Mega128 verwenden und als Slave einen Mega8.
Als Bus verwende ich TWI.
Für den Master verwende ich die Lib von Fleury.
Der Interrupt kommt beim Slave aber ich kann die Daten nicht empfangen.
Mit dem Master sende ich ein Byte zum Slave
#include <avr/io.h>
#include "i2cmaster.h"
#define Motor1 0x50 // device address of Motor1
int main(void)
{
i2c_init(); // initialize I2C library
i2c_start_wait(Motor1+I2C_WRITE); // set device address and write mode
// i2c_write(0x10); // write address = 10
i2c_write(0xFF); // write value 0x75 to Motor1
i2c_stop(); // set stop conditon = release bus
}
im Slave warte ich bis TWSR auf 0x80 gesetzt ist.
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include <avr/pgmspace.h>
#include "util/twi.h"
#ifndef F_CPU
#define F_CPU 16000000UL
#endif
ISR( TWI_vect )
{
//Statusregister abfragen
switch(TWSR)
{
case TW_SR_DATA_ACK:
OCR1A = TWDR; //PWM-Signal
return;
}
TWCR |= (1 << TWINT);
}
void main (void)
{
TWAR |= 0x50; // Slave Adresse
TWCR |= (1<<TWEN)|(1<<TWEA)|(1<<TWIE) ; //TWEN das TWI Modul aktivieren TWEA das Senden des Bestätigungsbits (ACK) zulassen
sei();
DDRB = 0xff;
PORTB = 0x02;
DDRD = 0xff;
PORTD = 0x44;
TCCR1A = (1<<WGM10)|(1<<COM1A1); // PWM, phase correct, 8 bit.
TCCR1B = (1<<CS11) |(1<<CS10); // set clock/prescaler 1/64 -> enable counter
OCR1A = 30; //PWM-Signal
}
was habe ich da falsch gemacht?