diff --git a/driver/gnuplotscript.gp b/driver/gnuplotscript.gp index 5b0e0d3..a3f7c3e 100644 --- a/driver/gnuplotscript.gp +++ b/driver/gnuplotscript.gp @@ -11,9 +11,9 @@ set label at 4,7 'U_{GS} [V] = 480' left set label at 3,13 'U_{GS} [V] = 500' left set label at 2,22 'U_{GS} [V] = 520' left set label at 1,32 'U_{GS} [V] = 540' left -set label at 0,41 'U_{GS} [V] = 560' left -set label at 0,42 'U_{GS} [V] = 580' left -set label at 0,42 'U_{GS} [V] = 600' left +set label at 0,39 'U_{GS} [V] = 560' left +set label at 0,39 'U_{GS} [V] = 580' left +set label at 0,39 'U_{GS} [V] = 600' left unset output set terminal qt unset output diff --git a/driver/main b/driver/main index 6d56236..0cb40b6 100755 Binary files a/driver/main and b/driver/main differ diff --git a/driver/main.cpp b/driver/main.cpp index 2575520..4519a31 100644 --- a/driver/main.cpp +++ b/driver/main.cpp @@ -158,9 +158,9 @@ void testFunktionen() int main() { - testFunktionen(); + //testFunktionen(); //kennlinieZweiterQuadrant(); - //kennlinieErsterQuadrant(); + kennlinieErsterQuadrant(); std::cout << "Schluss." << std::endl; } diff --git a/driver/test_plot b/driver/test_plot index f98a2e7..e4006b1 100644 Binary files a/driver/test_plot and b/driver/test_plot differ diff --git a/firmware/B15F.elf b/firmware/B15F.elf index 7e89b34..931fc11 100755 Binary files a/firmware/B15F.elf and b/firmware/B15F.elf differ diff --git a/firmware/adu.cpp b/firmware/adu.cpp index d6eb119..3e7faff 100644 --- a/firmware/adu.cpp +++ b/firmware/adu.cpp @@ -5,23 +5,28 @@ void ADU::init() volatile // externe Referenz an AREF ADMUX = 0; - // ADC aktiviert, prescaler = 128 - ADCSRA = _BV(ADEN) | _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0); + // ADC aktiviert, Interruptbetrieb, prescaler = 128 + ADCSRA = _BV(ADEN) | _BV(ADIE) | _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0); +} + +void ADU::handleConversionComplete() volatile +{ + active = false; } uint16_t ADU::getValue(uint8_t channel) volatile { + while(active); + active = true; + // lege Kanal fest ADMUX = (ADMUX & 0xE0) | channel; // starte Konvertierung ADCSRA |= _BV(ADSC); - // warte Konvertierungszeit ab - _delay_us(13 * 1000000 * 128 / F_CPU + 1); - - // warte auf Ende - while(ADCSRA & _BV(ADSC)); + // warte auf Ende der Konvertierung + while(active); return ADCW; } diff --git a/firmware/adu.h b/firmware/adu.h index 8b63d59..521543e 100644 --- a/firmware/adu.h +++ b/firmware/adu.h @@ -2,14 +2,29 @@ #define ADC_H #include -#include -#include class ADU { public: + + /** + * Konfiguriert die ADC Register + */ void init(void) volatile; - uint16_t getValue(uint8_t) volatile; + + /** + * Behandlungsroutine für ADC interrupt + */ + void handleConversionComplete(void) volatile; + + /** + * Startet eine AD Konvertierung, wartet auf Abschluss und liefert Ergebnis + * \param channel Auswahl des ADC Kanals (0-7), Kanal 6 und 7 sind Poti R36 und R37 + */ + uint16_t getValue(uint8_t channel) volatile; + +private: + volatile bool active = false; }; #endif // ADC_H diff --git a/firmware/interrupts.cpp b/firmware/interrupts.cpp index 68319ae..d84bcb0 100644 --- a/firmware/interrupts.cpp +++ b/firmware/interrupts.cpp @@ -15,3 +15,8 @@ ISR(SPI_STC_vect) { spi.handleTransfer(); } + +ISR(ADC_vect) +{ + adu.handleConversionComplete(); +} diff --git a/firmware/spi.cpp b/firmware/spi.cpp index 1c191ed..87e005e 100644 --- a/firmware/spi.cpp +++ b/firmware/spi.cpp @@ -9,10 +9,10 @@ void SPI::init() const volatile // Konfiguriere DMUX DDRs DDRD |= _BV(DMUX1) | _BV(DMUX2) | _BV(DMUX3); - // aktiviere SPI, Master Modus, SPI Modus 0 + // aktiviere SPI, Interruptbetrieb, Master Modus, SPI Modus 0 // F_SPI = F_CPU / 2 (prescaler 2) SPCR = _BV(SPE) | _BV(MSTR) | _BV(SPIE); - SPSR = _BV(SPI2X) | _BV(SPIF); + SPSR = _BV(SPI2X); // waehle keinen SPI Slave aus setAdr(SPIADR::NONE);