/* Belichtungszeitgeber für Kameras Durch Menü verschiedene Auslösefunktionen wählbar (zB.: Intervall, HDR, Uhrzeit, Sensor, ...) exponenzielle Einstellung der Belichtungszeiten Anzeige: LCD (16 Zeichen, 2 Zeilen) Bedienung über 5 Tasten: [1] Menü auf, [2] wählen rechts, [3] Menü ab, [4] wählen links, [5] auslösen/starten/ok by Erik Herkenrath (19.06.2010 begonnen) */ //Header-Dateien #include #include #include "LCD/lcd.h" #include #include //#include //nur falls delays verwendet werden //#include //nur falls Zugriff auf den Flash //globale Variablendeklarationen typedef struct { uint16_t mseconds; uint8_t seconds; uint8_t minutes; uint8_t hours; } TIME; //Zeitformat für Warte- und Uhrzeiten (Wartezeit: nur eine Einheit beschreiben: ms | s | m | h) volatile TIME internTime; //interne Uhr volatile TIME expositionTime; //durch Auslösen übergebene Belichtungszeit (0 = nicht gestartet/beendet) TIME exposed = {0, 0, 0, 0}; //vergangene Belichtungszeit TIME lzbTime = {0, 0, 1, 0}; //Belichtungszeit Langzeitbel. volatile uint8_t state = 0; //Zustand des Zustandsautomaten uint8_t secondsCounter = 0; //Zwischenzähler für interne Uhr (zählt jede ms) volatile uint8_t buttonCounter = 0; //zählt wie lange eine Taste gedrückt wurde volatile uint8_t button = 0; //zuletzt gedrückte Taste (kleine Nr. = hohe Priorität) char string [10]; //String zur Ausgabe über das LCD-Display //static uint8_t flash_variable PROGMEM = 0; //im FLASH gespeicherte Variable (initialisierung) //... = pgm_read_byte(&flash_variable); //(auslesen) //Funktionen void init() { //interne Zeit zurück setzen internTime.seconds = 0; internTime.minutes = 0; internTime.hours = 0; //LCD-Display initialisieren lcd_init(LCD_DISP_ON_CURSOR); lcd_clrscr(); /* //Timer1 initialisieren TCCR1B = (1< 1 ms) TCCR2 = (1<"Kabelausloeser" switch (button) { // case 1: state = printState(); break; case 2: state = 11; printState(); break; case 3: state = 20; printState(); break; case 4: state = 19; printState(); break; // case 5: state = printState(); break; } break; case 11: //Hauptmenü>"Langzeitbel." switch (button) { // case 1: state = printState(); break; case 2: state = 12; printState(); break; case 3: state = 21; printState(); break; case 4: state = 10; printState(); break; case 5: expositionTime = lzbTime; break; } break; case 12: //Hauptmenü>"Intervall" switch (button) { // case 1: state = printState(); break; case 2: state = 19; printState(); break; case 3: state = 22; printState(); break; case 4: state = 11; printState(); break; // case 5: state = printState(); break; } break; case 19: //Hauptmenü>"Uhr" switch (button) { // case 1: state = printState(); break; case 2: state = 10; printState(); break; case 3: state = 29; printState(); break; case 4: state = 11; printState(); break; // case 5: state = printState(); break; } break; case 20: //"Kabelausloeser">"Verzoeg" switch (button) { case 1: state = 10; printState(); break; // case 2: state = printState(); break; // case 3: state = printState(); break; // case 4: state = printState(); break; // case 5: state = printState(); break; } break; case 21: //"Langzeitbel.">"Bel.Zeit" switch (button) { case 1: state = 11; printState(); break; case 2: lzbTime = incrementTime_exp(lzbTime); printExTime(lzbTime); break; // case 3: state = printState(); break; case 4: lzbTime = decrementTime_log(lzbTime); printExTime(lzbTime); break; // case 5: state = printState(); break; } break; case 22: //"Intervall">"Periode" switch (button) { case 1: state = 12; printState(); break; // case 2: state = printState(); break; // case 3: state = printState(); break; // case 4: state = printState(); break; // case 5: state = printState(); break; } break; case 29: //"Uhr">"Stunde:" switch (button) { case 1: state = 19; printState(); break; // case 2: state = printState(); break; // case 3: state = printState(); break; // case 4: state = printState(); break; // case 5: state = printState(); break; } break; default: break; } } return 0; } //Interrupts ISR (TIMER2_COMP_vect) //löst jede ms aus { //Belichtung if (!(compareTime_zero(expositionTime))) //Belichtungszeit übergeben? (also: Belichtung gestartet) { if (compareTime_zero(exposed)) //Belichtung gerade erst gestartet? { // Funktion: Spiegel auslösen lcd_clrscr(); lcd_puts("t:"); printExTime(expositionTime); } if (exposed.mseconds == 0) //jede volle Sekunde { // if (Spiegel gelöst) //bis 1 s nach Ende // { printState(); exposed = resetTime(exposed); expositionTime = resetTime(expositionTime); // } // else // { printTime_s(exposed); //gibt jede Sekunde die vergangene Belichtungszeit in 1. Zeile aus // } } if (compareTime(exposed, expositionTime)) //Belichtungszeit erreicht { // Funktion: Spiegel lösen } exposed = incrementTime_ms(exposed); //exposed entspricht nun der NÄCHSTEN Millisekunde } //interne Uhr secondsCounter ++; if (secondsCounter == 1000) { secondsCounter = 0; incrementTime_s(); //interne Uhrzeit wird 1s hochgezählt } //Tastenentprellung if ((secondsCounter % 10) == 0) //alle 10 ms, falls keine aktive Belichtung { if (!(PIND & (1<