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 }







Zitieren

Lesezeichen