//------------------------------------------------------------------------- // Titel : Einzelspannungserfassung 24-Zeller //------------------------------------------------------------------------- // Funktion : auslesen eines Multiplexers // Schaltung : Einzelspannungserfassung 24-Zeller v0.91 (Eigenbau) //------------------------------------------------------------------------- // Prozessor : ATmega8 // Takt : 14745600 Hz // Sprache : Deutsch // Datum : 18.03.2008 // Version : 1.5 // Autor : Johan Mol // Programmer: // Port : //------------------------------------------------------------------------- #define F_CPU 14745600 // 3686400 // #include #include #include #include #include //#include // Defines für Multiplexeransteuerung // Aufbau: PORTB=0b|00(externer Quarz)|A0|EN0|A1|A2|EN1|EN2; #define aus PORTD&=~(1<115200 Baud siehe Baudratentabelle//3-->230400 UCSRB = 8 + 16; //Sender enable UCSRB / UCR bei z.B.: 2313 } //---------------------------------------------------------------------- void putChar(unsigned char data) { //warte bis UDR leer ist UCSRA / USR bei z.B.: 2313 while (!(UCSRA&32)); //sende UDR=data; } void print(char buffer[]) { for (int i=0;buffer[i]!=0;i++) putChar(buffer[i]); } //---------------------------------------------------------------------- //UART Funktion unsigned char getChar() { char data=0; //warte bis RX-complete RXC while (!(UCSRA&128)); //empfangen data=UDR; return data; } //---------------------------------------------------------------------- //---------------------------------------------------------------------- // Timer 2 initialisieren void init_timer_2() { TCCR2=0x06;// 0x06; // Teiler 1/256 TIMSK|=0b01000000; // Interrupt bei Überlauf //--- Interrupts erlauben --- sei(); } //---------------------------------------------------------------------- // Timer 2 Interruptroutine ISR(TIMER2_OVF_vect) { i_abbruch=0; } //---------------------------------------------------------------------- // ADC einlesen /*uint16_t einlesen (uint8_t i_spg_plex) { int i_index; uint16_t i_ergebnis=0; ADCSRA=0b10000101;//(1<=25) //after cel 24 send result of conversion and end of string { checksum+=result && 255; //putChar(result); <----AN //putChar((unsigned char) checksum); <----AN //putChar(22); count=1; //reset counter and checksum <----AN checksum=0; } set_output(count); if (count==1) //at first cel send header { //putChar(104); <----AN //putChar(24); <----AN //putChar(24); <----AN //putChar(104); <----AN //putChar(24); <----AN } else { checksum+=result && 255; //putChar(result); //otherwise send conversion result. <----AN } /*for (i_delay=0; i_delay<10000; i_delay++) { ; }*/ result=spannung();//erfassung(0);// i_zellspannungen[count]=result; /*print("Zellzl. >>"); putChar(' ');*/ itoa(count,c_buffer,10); print(c_buffer); putChar(' '); //print("Zellspg >>"); //putChar(' '); itoa(i_zellspannungen[count],c_buffer,10); print(c_buffer); putChar(' '); //sbi (ADCSRA,6); //i_pidsense=einlesen(2); if (count==24) //Regle erst nachdem alle Zellen getastet sind { i_temp=10; //Lese Regelparameter aus UART //---------------------------------------------------------------------- // Spezifikation des ankommenden Wertes if (i_temp<=199 && i_temp>=0) { i_pidsetpoint=i_temp; //Deklarierung des Sollwertes i_hold_value=i_pidsetpoint; } else if (i_temp>=200 && i_temp<=255) { i_anzahl_zellen=i_temp-200; i_pidsetpoint=i_hold_value; } else { i_pidsetpoint=i_hold_value; i_anzahl_zellen=0; } //---------------------------------------------------------------------- for (i_index=0;i_index<25;i_index++) { if (i_zellspannungen[i_index]1023) { f_help=1023; } else if (f_help<1) { f_help=1; } //OCR1A=f_help; } do //wartet so lange bis Timer übergelaufen { //springt in Timer 2 Interruptroutine Zeile Zeile 131 }while(i_abbruch!=0); count++; } //end mainloop } //======================================================================