//------------------------------------------------------------------------- // 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 : // Programmer: // Port : //------------------------------------------------------------------------- #define F_CPU 3686400 //14745600 // #include #include #include #include #include // Defines für Multiplexeransteuerung // Aufbau: PORTB=0b|00(externer Quarz)|A0|EN0|A1|A2|EN1|EN2; #define aus PORTB=0b00000000; #define Zelle1 PORTB=0b00010000; #define Zelle2 PORTB=0b00110000; #define Zelle3 PORTB=0b00011000; #define Zelle4 PORTB=0b00111000; #define Zelle5 PORTB=0b00010100; #define Zelle6 PORTB=0b00110100; #define Zelle7 PORTB=0b00011100; #define Zelle8 PORTB=0b00111100; #define Zelle9 PORTB=0b00000010; #define Zelle10 PORTB=0b00100010; #define Zelle11 PORTB=0b00001010; #define Zelle12 PORTB=0b00101010; #define Zelle13 PORTB=0b00000110; #define Zelle14 PORTB=0b00100110; #define Zelle15 PORTB=0b00001110; #define Zelle16 PORTB=0b00101110; #define Zelle17 PORTB=0b00000001; #define Zelle18 PORTB=0b00100001; #define Zelle19 PORTB=0b00001001; #define Zelle20 PORTB=0b00101001; #define Zelle21 PORTB=0b00000101; #define Zelle22 PORTB=0b00100101; #define Zelle23 PORTB=0b00001101; #define Zelle24 PORTB=0b00101101; // Globale Variablen volatile uint32_t mittelwert; //merker der letzten Zellspannung volatile int fallunterscheidung; volatile int16_t i_pidsetpoint=0; //Sollwert volatile int i_abbruch; //Abbruchkriterium für Timer volatile int16_t i_pidsense; //gucken ob global nötig ist volatile int16_t i_hold_value; //Backupvariable für Setpoint, kann ggf gelöscht werden //------------------------------------------------------------------------ // Initialisierungen //------------------------------------------------------------------------ void init() { // Ports initialisieren sbi(DDRB,0); // (Enable Zelle 17-24) sbi(DDRB,1); // (Enable Zelle 9-16) sbi(DDRB,2); // Multiplexer A2 sbi(DDRB,3); // Multiplexer A1 sbi(DDRB,4); // (Enable Zelle 1-8) sbi(DDRB,5); // Multiplexer A0# // Port Belegung Regelung DDRB|=(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; ADCSRA=(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 } result=spannung(); i_zellspannungen[count]=result; itoa(count,c_buffer,10); print(c_buffer); putChar(' '); print("<< Zellzahl Zellspannung >>"); putChar(' '); itoa(i_zellspannungen[count],c_buffer,10); print(c_buffer); putChar(' '); if (count==24) //Regle erst nachdem alle Zellen getastet sind { i_temp=getChar(); //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; } //---------------------------------------------------------------------- /*print("Set"); itoa(i_pidsetpoint,c_buffer,10); print(c_buffer); putChar(' ');*/ for (i_index=0;i_index<25;i_index++) { /*itoa(i_zellspannungen[i_index],c_buffer,10); <<<<<<<<<<<<<<<<<< print(c_buffer); putChar(' ');*/ if (i_zellspannungen[i_index]1023) { f_help=1023; } else if (f_help<1) { f_help=1; } /* print("Help"); itoa(f_help,c_buffer,10); print(c_buffer); putChar(' ');*/ OCR1A=f_help; } count++; do //wartet so lange bis Timer übergelaufen { //springt in Timer 2 Interruptroutine Zeile Zeile 131 }while(i_abbruch!=0); } //end mainloop } //======================================================================