//char Array für Ausgabe volatile char adrehmoment[10]; //Ausgabearray für Drehmomentwert volatile char adrehzahl[10]; //Ausgabearray für Drehzahlwert volatile char aleistung[10]; //Ausgabearray für Leistung volatile unsigned char leistungsbereich = 0; //Auswertung -> falls leistung mehr als 9999W //Variablen für Frequenzauswertung global volatile long overflow = 0; //Anzahl der Pufferüberläufe des Timers volatile unsigned int ic_zp_A = 0; //ICR-Wert bei 1.High-Flanke speichern volatile unsigned int ic_zp_B = 0; //ICR-Wert bei 2.High-Flanke speichern volatile unsigned char x; //Laufvariable für für 1./2. High-Flanke volatile unsigned char icpfertig; //Fertige Messung detektieren -> Berechnug (in dieser Zeit keine neue Auswertung) volatile float zw_Erg = 0; volatile float Erg = 0; //------------------------------------------------------- void Init(void){ //Initialisierung //PINS konfigurieren DDRD &=~ ( (1 << MENUETASTE) |(1 << HOCHTASTE) | (1 << RUNTERTASTE) | (1 << OKTASTE) | (1 << UEBERSICHTTASTE) | (1< Eingang: ADC0! ADCSRA = ( 1<125kHz und einmal auslesen zum inbetriebnehmen //Timer/ICP konfigurieren -> noch in der main() //RS232Ausgabe konfigurieren UCSRB |= ( 1 << TXEN ); // UART TX einschalten UCSRC |= ( 1 << URSEL )|( 3<Datenblatt -->19200 Baud!! } //------------------------------------------------------- int uart_putc(unsigned char c){ //Funktion um Zeichen auf RS232 auszugeben (polling) while (!(UCSRA & (1<= 9999){ leistung = leistung / 1000; leistungsbereich = 1; } else if (leistung <=-9999){ leistung = leistung / 1000; leistungsbereich = 1; } else{ leistungsbereich = 0; } sprintf (aleistung, "%.2f", leistung); return leistung; } //------------------------------------------------------- void Ausgabe_RS232(void){ //Ausgabe auf RS232 uart_putc(DREHZAHLZEICHEN); uart_puts(adrehzahl); uart_putc(TRENNZEICHEN); uart_putc(MOMENTZEICHEN); uart_puts(adrehmoment); uart_putc(TRENNZEICHEN); } //------------------------------------------------------- void Ausgabe_LCD(void){ //Ausgabe auf LCD LCD_WritePosString(0, 0,"Leistungsmessung:", 1); LCD_WritePosString(1, 0,"Drehz.:", 1); LCD_WritePosString(1, 9,adrehzahl, 1); LCD_WritePosString(1, 15,"1/min", 1); LCD_WritePosString(2, 0,"Moment:", 1); LCD_WritePosString(2, 9,adrehmoment, 1); LCD_WritePosString(2, 17,"Nm", 1); LCD_WritePosString(3, 0,"Leistung:", 1); LCD_WritePosString(3, 9,aleistung, 1); if (leistungsbereich == 0){ LCD_WritePosString(3, 17,"W", 1); } if (leistungsbereich == 1){ LCD_WritePosString(3, 17,"KW", 1); } verz(1); Ausgabe_RS232(); } //------------------------------------------------------- ISR(ADC_vect){ if (adcbesch == 1){ return; } else if (icpfertig == 1){ return; } else{ adczaehler++; adcspeicher += ADC; } } //------------------------------------------------------- ISR(TIMER1_CAPT_vect){ if( icpfertig == 1 ){ //auf vorherige Messung warten return; } if (x == 0){ // 1.High Flanke ic_zp_A = ICR1; //Erste Flanke erfassen overflow = 0; //Überlauf null setzen x = 1; } else{ // 2.High Flanke ic_zp_B = ICR1; //Zweite Flanke erfassen icpfertig = 1; //Messung ist fertig, /Berechnung und Ausgabe können gestartet werden x = 0; } } //------------------------------------------------------- ISR(TIMER1_OVF_vect){ overflow++; //Überlauf inkrementieren -> "1 Zeitabschnitt" vorbei } //------------------------------------------------------- int main(void){ verz(6); float leistung = 0; //Speicherwert für Leistung long adcergebnis = 0; //Speicherwert für eingelesene Analogwerte LCD_Init(0); //Initialisierung des Displays LCD_Clr(); //Display löschen verz(4); //Pause fürs Display Init(); //Taster-Initialisierung, ADC-Initialisierung, RS232- Initialisierung TCCR1B = (1<Taktfrequenz: 8MHz externer Quarz TIMSK = (1<= 4){ adcbesch = 1; adcergebnis = adcspeicher/adczaehler; write = 1; //Display soll beschrieben werden } if( icpfertig == 1 ) { adcbesch = 1; zw_Erg = ((overflow*65536) + ic_zp_B - ic_zp_A); //Overflow berücksichtigen (65536 == int Wert; Register ist so groß wie Int) Erg = 8000000 / zw_Erg; //kein Vorteiler, daher läuft Timer mit 8Mhz write = 1; //Display soll bechrieben werden } if ( write == 1){ //Ausgabe der Werte, je nachdem ob write gesetzt oder nicht TIMSK &= (1<Überlauf sehr oft voll) x = 0; sprintf (adrehmoment, "%.2f", adcergebnis); sprintf (adrehzahl, "%.f", Erg); if ( ausgabemodus == 1){ //Ausgabe der Werte über LCD + RS232 leistung = leistungsberechnung(adcergebnis,Erg); Ausgabe_LCD(); } else if (ausgabemodus == 2){ //Ausgabe der Werte nur über RS232 -> schnell !!Achtung!! Keine Leistungsberechnung/ausgabe if (lcdbeschr == 0){ LCD_Clr(); verz(3); LCD_WritePosString(0, 0,"RS232-Modus aktiv", 1); LCD_WritePosString(1, 0,"Displayausgabe", 1); LCD_WritePosString(2, 0,"ausgeschaltet", 1); lcdbeschr = 1; } else if (lcdbeschr == 1){ Ausgabe_RS232(); } } write = 0; //keine Ausgabe adcbesch = 0; //fertig mit ADC-Auswertung icpfertig = 0; //fertig mit ICP-Auswertung adczaehler = 0; adcspeicher = 0; TIMSK |= (1<