#define F_CPU 16000000 #include #include #include #define clr_bit ~0b1111100 //muss vor jedem setzen mit PORTC & gerechnet werden #define clr_adr ~0b11100 #define data_reg 0b0100000 #define error_feat 0b0100100 #define sect_count 0b0101000 #define sect_number 0b0101100 #define cyl_low 0b0110000 #define cyl_high 0b0110100 #define drive_head 0b0111000 #define stat_command 0b0111100 #define asr_devcon 0b1011000 #define drive_adress 0b1011100 unsigned char reg=0; unsigned char buf[400]={0}; //Puffer für TWI-Übertragungen //Routine zur Übertragung des Pufferinhalts an einen anderen //Controller mittels TWI: void Disp(){ bool run=1; i=0; ob=(0b1<<7) | 0b100; TWCR=TWCR & ~1; //TWI-Interrupt disabeln ob=ob | (1<<5); //START while(run){ TWCR=ob; while((TWCR & (1<<7))==0); //Auf TWINT warten stat=TWSR & ~0b111; //Status code auslesen if(stat==0x08){ ob=ob & ~(1<<5); } if(stat==0x20){ //kommt nach der Adresse kein ACK //Von vorne anfangen: ob=ob | (0b11<<4); i=0; } else{ if(i>=len){ run=0; TWCR=TWCR | (1<<4); } else{ TWDR=buf[i]; i++; } } } //TWCR=TWCR | 1; } int main(void){ DDRC=DDRC | ~0b11; //Reset & Adr & CHPSEL & TWI //PC7 : Reset; PC2-4 : Adr0-2; PC5-6 : CS3(Control Block)/CS1(Command Block) //PB0 : write; PB1 : read DDRB=0b11; PORTB=PORTB | 0b11; //Da beide Signale invertiert, müssen sie per default an sein PORTC=PORTC | (0b11<<5); //Chip select ist ebenfalls invertiert TWCR=0b100 | (1<<6); //TWI Enable TWBR=72; //100kHz bei CPU @ 16MHz TWAR=20; //Slave adress: 20 DDRD=0; //Lo-Byte Datenleitung DDRA=0; //High-Byte Datenleitung PORTD=255; PORTA=255; PORTC=PORTC | (1<<7); //Reset abschalten => Laufwerke hochfahren PORTC= (PORTC & clr_bit) | stat_command; //Alternate status register anwählen while(1){ PORTB=PORTB & ~0b10; //read __asm volatile("NOP"); __asm volatile("NOP"); __asm volatile("NOP"); reg=PIND; //lo-Byte einlesen PORTB=PORTB | 0b10; //read abschalten //Vorbereiten der TWI-Übertragung: buf[0]=ctrl; buf[1]=255; buf[2]=text; //reg++; i1=(1<<7); //Hier wird der Byte-Wert in ASCII-Zeichen umgewandelt, //die den Binärwert darstellen: for(i=3;i<11;i++){ if((reg & i1)==0){ buf[i]=48; } else{ buf[i]=49; } i1=(i1>>1); } len=11; Disp(); //Daten übertragen _delay_ms(15); } }