Hey,
ja da hast du nicht ganz unrecht....hab ihn mal etwas verschönert und schon funktionierte es ^-^
Hab mich wohl irgendwie verrannt....
Danke trotzdem für die Hilfe 
Hier ist der funktionierende Code:
Code:
/*
* XMega_I2C.c
*
* Created: 02.10.2012 15:47:40
* Author: Daniel
*/
#define F_CPU 32000000
#define CPU_SPEED 32000000
#define BAUDRATE 400000
#define TWI_BAUD(F_SYS, F_TWI) ((F_SYS / (2 * F_TWI)) - 5)
#define TWI_BAUDSETTING TWI_BAUD(CPU_SPEED, BAUDRATE)
#define PCF8574 0x20 // PCF8574 Adresse definieren
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <string.h>
#include <stddef.h> // Makro "offsetof" einbinden
#include <avr/pgmspace.h> // Funktionen zum auslesen
#include <stdlib.h>
int main(void)
{
Clock_init(); // Clock mit 32MHz initialisieren
Int_init(); // Interrupts aktivieren
TimerC0_init();
UART_init();
Port_init();
TWI_MasterInit(&TWIF); // TWI initialisieren
while(1)
{
PCF8574_send_byte(&TWIF, 0); // Eine 0 zum PCF senden
_delay_ms(1000); // 1 Sekunde warten
PCF8574_send_byte(&TWIF, 1);
_delay_ms(1000);
}
}
void Clock_init(void)
{
OSC.CTRL |= OSC_RC32MEN_bm; // Oszillator auf 32Mhz stellen
while(!(OSC.STATUS & OSC_RC32MEN_bm)); // Warten bis der Oszillator bereit ist
CCP = CCP_IOREG_gc;
CLK.CTRL = CLK_SCLKSEL_RC32M_gc; // Clock auf 32MHz stellen // Prescaler A = CLK/2, Prescaler B/C = CLK/1
}
void Int_init(void)
{
PMIC.CTRL |= PMIC_LOLVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_HILVLEN_bm; // Interrupts (Highlevel, Mediumlevel und Lowlevel freigeben)
sei(); // Globale Interruptfreigabe
}
void TimerC0_init()
{
TCC0.CTRLA = TC_CLKSEL_DIV1024_gc; // Vorteiler einstellen
TCC0.CTRLB = 0x00; // Timer in Normalmodus stellen
TCC0.INTCTRLA = 0x03; // Interrupt konfigurieren
}
void UART_init(void)
{
USARTC0.BAUDCTRLB = 0; // BSCALE = 0
USARTC0.BAUDCTRLA = 0x68; // Baudrate 19200 @ 41MHz
USARTC0.CTRLA = USART_RXCINTLVL_HI_gc; // Interrupts mit Highlevel aktivieren
USARTC0.CTRLB = USART_TXEN_bm | USART_RXEN_bm; // RX+TX Enable CLK
USARTC0.CTRLC = USART_CHSIZE_8BIT_gc; // Async, no parity, 8 bit data, 1 stop bit
}
void Port_init(void)
{
PORTC.DIR = 0x08; // Pins für den UART C0 einstellen
}
void TWI_MasterInit(TWI_t *twi)
{
twi->MASTER.BAUD = TWI_BAUDSETTING;
twi->MASTER.CTRLA = TWI_MASTER_ENABLE_bm;
twi->MASTER.STATUS = TWI_MASTER_BUSSTATE_IDLE_gc;
}
void Send_UART(char data[])
{
char Counter;
char lenght = 0x00;
lenght = strlen(data);
while(Counter < lenght)
{
while (!(USARTC0.STATUS & USART_DREIF_bm));
USARTC0.DATA = data[Counter];
Counter++;
}
Counter = 0x00;
while (!( USARTC0.STATUS & USART_DREIF_bm));
USARTC0.DATA = 0x0A;
while (!( USARTC0.STATUS & USART_DREIF_bm));
USARTC0.DATA = 0x0D;
}
ISR(TCC0_OVF_vect)
{
}
void Send_Address(TWI_t *twi, unsigned char Adresse, unsigned char RW)
{
char Add = 0x00;
Add = Adresse << 1; // Adresse um eine Stelle nach links schieben
Add |= RW; // RW setzen
twi->MASTER.ADDR = Add; // Adresse in das Adressregister schreiben
_delay_ms(5);
}
void PCF8574_send_byte(TWI_t *twi, unsigned char byte)
{
Send_Address(&TWIF, PCF8574, 0);
twi->MASTER.DATA = byte; // Byte ins Datenregister schreiben
}
Lesezeichen