/**************** * Author 1: Martin Schramm * Dr. Noll GmbH * * ***************************************************** e-mail: schramm@talentsupporters.de Project : Häschen Version : Date : 19.02.09 Author : Company : Comments: Chip type : ATmega128 Program type : Application Clock frequency : 8,000000 MHz Memory model : External SRAM size : Data Stack size : *****************************************************/ #include #include #include #include #include #include #include #include #include #ifndef F_CPU //#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000" #define F_CPU 8000000L // Systemtakt in Hz - Definition als unsigned long beachten >> Ohne ergeben Fehler in der Berechnung #endif #define BAUD 38400L // Baudrate setzen // Berechnungen #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000) // Fehler in Promille, 1000 = kein Fehler. #if ((BAUD_ERROR<-10) || (BAUD_ERROR>10)) #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! #endif #include #include #include int main (void); void knight1(void); void knight2(void); void get_adc_res(void); void boot(void); void version(void); void information(void); void channel(int i); void savelastmv(int i); void median(int i); void get_adc_res(void); void messen (); char MSB; char LSB; unsigned int erg; float erg2, erg3; volatile char temp_str1,temp_str2,temp_str3,temp_str4,temp_str5; char puffer[20]; char puffer2[20]; float a = 6.05; int len = 0; //----- Begin Code ------------------------------------------------------------ void boot(void){ USART_Transmit1(0x2B); USART_Transmit1(0x2B); USART_Transmit1(0x2B); USART_Transmit1(0x0D); USART_Transmit1('I'); USART_Transmit1('L'); USART_Transmit1(0x01); USART_Transmit1(0x00); temp_str1 = USART_Receive1(); temp_str2 = USART_Receive1(); temp_str3 = USART_Receive1(); temp_str4 = USART_Receive1(); switch(temp_str3) //Fallunterscheidung anhand Typ { case 0x81 : knight1();break; case 0xC1 : knight2();break; } } void version(void){ USART_Transmit1(0x2B); USART_Transmit1(0x2B); USART_Transmit1(0x2B); USART_Transmit1(0x0D); USART_Transmit1('I'); USART_Transmit1('L'); USART_Transmit1(0x09); USART_Transmit1(0x00); temp_str1 = USART_Receive1(); temp_str2 = USART_Receive1(); temp_str3 = USART_Receive1(); temp_str4 = USART_Receive1(); switch(temp_str3) //Fallunterscheidung anhand Typ { case 0x89 : knight1();break; case 0xC9 : knight2();break; } } void information(void){ USART_Transmit1(0x2B); USART_Transmit1(0x2B); USART_Transmit1(0x2B); USART_Transmit1(0x0D); USART_Transmit1('I'); USART_Transmit1('L'); USART_Transmit1(0x0C); USART_Transmit1(0x00); temp_str1 = USART_Receive1(); temp_str2 = USART_Receive1(); temp_str3 = USART_Receive1(); temp_str4 = USART_Receive1(); switch(temp_str3) //Fallunterscheidung anhand Typ { case 0x8C : knight1();break; case 0xCC : knight2();break; } } void channel(int i){ USART_Transmit0(0x2B); USART_Transmit0(0x2B); USART_Transmit0(0x2B); USART_Transmit0(0x0D); USART_Transmit0('I'); USART_Transmit0('L'); USART_Transmit0(0x0E); USART_Transmit0(0x01); USART_Transmit0(i); temp_str1 = USART_Receive0(); temp_str2 = USART_Receive0(); temp_str3 = USART_Receive0(); temp_str4 = USART_Receive0(); /*switch(temp_str3) //Fallunterscheidung anhand Typ { case 0x8E : knight1();break; case 0xCE : knight2();break; }*/ } void savelastmv(int i){ USART_Transmit1(0x2B); USART_Transmit1(0x2B); USART_Transmit1(0x2B); USART_Transmit1(0x0D); USART_Transmit1('I'); USART_Transmit1('L'); USART_Transmit1(0x0F); USART_Transmit1(0x01); USART_Transmit1(i); temp_str1 = USART_Receive1(); temp_str2 = USART_Receive1(); temp_str3 = USART_Receive1(); temp_str4 = USART_Receive1(); switch(temp_str3) //Fallunterscheidung anhand Typ { case 0x8F : knight1();break; case 0xCF : knight2();break; } } void median(int i){ USART_Transmit1(0x2B); USART_Transmit1(0x2B); USART_Transmit1(0x2B); USART_Transmit1(0x0D); USART_Transmit1('I'); USART_Transmit1('L'); USART_Transmit1(0x10); USART_Transmit1(0x01); USART_Transmit1(i); temp_str1 = USART_Receive1(); temp_str2 = USART_Receive1(); temp_str3 = USART_Receive1(); temp_str4 = USART_Receive1(); switch(temp_str3) //Fallunterscheidung anhand Typ { case 0x90 : knight1();break; case 0xD0 : knight2();break; } } ISR (SIG_UART1_RECV) { cli(); temp_str1 = USART_Receive1(); if (temp_str1 == 0x03) { temp_str2 = USART_Receive1(); temp_str3 = USART_Receive1(); PORTB = 0b10101010; messen(); //dtostrf(a,1,2,puffer); if (erg2>9.99){ dtostrf(erg2,1,1,puffer);} //printf(puffer,"err");} else if (erg2<=9.99) {dtostrf(erg2,1,2,puffer);} //sprintf(puffer,"%f",a); dtostrf(a,1,2,puffer2); len = strlen(puffer); switch(temp_str3) //Fallunterscheidung anhand Typ { case 0x05 : USART_Transmit1(len);USART_Puts1(puffer);break; case 0x04 : PORTB = 0b11100111;break; } } sei(); } void messen (){ MSB = USART_Receive0(); LSB = USART_Receive0(); if ((MSB & 0b10000000)>=1){ //if (MSB & (1 << 8)){ //if ((MSB & 1)==1){ //LSB = USART_Receive1(); erg = (((unsigned int) (MSB & 0x1F)) << 7) + LSB; //unsigned int erg = (((unsigned int) (byte1 & 0x1F)) << 7) + byte2; //erg = (MSB | (LSB<<7)) & 0x3fff; erg2 = (erg - 40) * 10 / 4015.0; //erg3 = (erg3 + erg2)/1.0; //sprintf(puffer,"%x",erg2); } else if ((MSB & 0b10000000)==0){ erg = (((unsigned int) (LSB & 0x1F)) << 7) + MSB; //unsigned int erg = (((unsigned int) (byte1 & 0x1F)) << 7) + byte2; //erg = (MSB | (LSB<<7)) & 0x3fff; erg2 = (erg - 40) * 10 / 4015.0; } } int main(void) { DDRB = 0xff; USART_Init0(); USART_Init1(); channel(1); PORTB = 0b00000001; sei(); while (1) { } return 0; cli(); }