/** * Hier wird der eigentliche TWI-Treiber angesprochen * \param *data_pack Container mit den Daten fuer den Treiber * \return Resultat der Aktion */ uint8_t Send_to_TWI(tx_type_t * data_pack) { uint8_t state,i,j; state = SUCCESS; for(i=0;(data_pack[i].slave_adr != OWN_ADR)&&(state == SUCCESS);i++) { state = Send_start(); if (state == SUCCESS) state = Send_adr(data_pack[i].slave_adr); /** * Abhaengig von W/R senden oder empfangen */ if(!(data_pack[i].slave_adr & R)) { if (state == SUCCESS){ /** * Wenn W bis alle Daten gesendet sind */ for(j=0;((j<data_pack[i].size)&&(state == SUCCESS));j++) state = Send_byte(data_pack[i].data_ptr[j]); } } else{ if (state == MRX_ADR_NACK) { state = Send_start(); } if (state == SUCCESS){ /** * Wenn R bis alle Daten empfangen sind */ for(j=0;((j<data_pack[i].size)&&(state == SUCCESS));j++){ /** * Wenn wir keine Daten mehr erwarten NACK senden */ if(j == data_pack[i].size-1) state = Get_byte(data_pack[i].data_ptr++,0); else state = Get_byte(data_pack[i].data_ptr++,1); } } } Send_stop(); } Close_TWI(); return state; }
/*! * Der Mikrocontroller und der PC-Simulator brauchen ein paar Einstellungen, * bevor wir loslegen koennen. */ void init(void){ #ifdef MCU PORTA=0; DDRA=0; //Alles Eingang alles Null PORTB=0; DDRB=0; PORTC=0; DDRC=0; PORTD=0; DDRD=0; // Watchdog aus! wdt_disable(); #ifdef DISPLAY_SCREEN_RESETINFO reset_flag = MCUCSR & 0x1F; //Lese Grund fuer Reset und sichere Wert MCUCSR = 0; //setze Register auf 0x00 (loeschen) #endif #endif #ifdef UART_AVAILABLE uart_init(); #endif #ifdef BOT_2_PC_AVAILABLE bot_2_pc_init(); #endif #ifdef PC bot_2_sim_init(); #endif #ifdef DISPLAY_AVAILABLE display_init(); display_update=1; #endif #ifdef LED_AVAILABLE LED_init(); #endif motor_init(); bot_sens_init(); bot_behave_init(); #ifdef MCU #ifdef RC5_AVAILABLE ir_init(); #endif #endif #ifdef MAUS_AVAILABLE maus_sens_init(); #endif #ifdef DISPLAY_BEHAVIOUR_AVAILABLE behaviour_page = 1; #endif #ifdef TWI_AVAILABLE Init_TWI(); Close_TWI(); #endif }