/* Expozice.C AT89C2051 (Krystal 12 MHz) P1.0-3 - vstup přepínače P1.4-7 - vstup DIL - další funkce Cyklus při dlouhé expozici: začáná se pauzou mezi expozicema. V rámci pauzy může být předsklopení zrcátka, potom následuje expozice, která trvá zvolený čas. Potom se vše opakuje pauzou. Cyklus při krátké expozici: začíná krátkým sepnutím, poté trvá pauza o nastavené délce. Potom se vše opakuje. Není žádná krátká pauza ani předsklopení zrcátka. */ #define in_predsklopeni P1_4 // vstup: 0=predsklopeni zrcatka, není při in_dlouha_exp=1 (krátké exp.) #define in_dlouha_exp P1_5 // vstup: 0=dlouhá expozice, sepnutí trvá celou expozici a potom je krátká pauza; // 1=sepnutí je jen kratka_exp a není pauza ani předsklopení zrcátka #define in_piezo P1_6 // vstup: 0=aktivni piezosirenka #define out_LED P3_4 // kontrolní LED, aktivní v 0 #define out_piezo P3_0 // piezosirénka, aktivní v 0 #define out_expozice P3_5 // výstup na expozici foťáku, aktivní v 0 #define FREK 3035 // 65535-(1000000/FREK/2) , kde FREK je pozadovana frekvence v Hz #define FREK2 16 // kolik je tiku pocitadla do 1 sekundyv Hz #define pauza 5 // pauza 5s mezi expozicemi, v této době není aktivní out_expozice #define upozorneni 5 // upozorneni 5s před koncem expozice #define predsklopeni 2 // doba předsklopení zrcátka, musí být menší než pauza, protože je v rámci pauzy #define kratka_exp 5 // doba v sec/FREK2 - kratká expozice (na předsklopení zrcatka nebo krátká expozice) #include unsigned long int pocitadlo; // počítalodlo vteřin/FREK2 unsigned long int v_budik; // zvolený čas unsigned char v_predsklopeni; // 0=predsklopeni zrcatka unsigned char v_dlouha_exp; // 0=dlouhá expozice, sepnutí trvá celou expozici, jinak je sepnutí jen 1s unsigned char v_piezo; // 0=aktivni piezosirenka unsigned char pauza0; // totožné s pauza unsigned char predsklopeni0; // totožné s predsklopeni void nacti_DIL (void) { v_predsklopeni=in_predsklopeni; // vstup: 0=predsklopeni zrcatka v_piezo=in_piezo; // vstup: 0=aktivni piezosirenka v_dlouha_exp=in_dlouha_exp; // 0=dlouhá expozice, sepnutí trvá celou expozici, jinak je sepnutí jen 1s if (v_dlouha_exp==0) { // s pauzou pauza0=pauza; predsklopeni0=predsklopeni; } else { // bez pauzy pauza0=0; predsklopeni0=0; } } void nacti_vstupy (void) { unsigned char prepinac; // přepínač frekvencí unsigned long int budik_pole[16]={3,10,20,30,60,90,120,180,240,300,360,480,600,900,1200,1800}; prepinac=15-(P1 & 15); // načtení přepínače v_budik=budik_pole[prepinac]; // čas expozice nacti_DIL(); } void kontrola_casu (void) { // obsluha preruseni od casovace0 unsigned int sekundy; unsigned char setiny; // šestnáctiny sekundy unsigned char out_piezo0; // pomocný unsigned char out_expozice0; // pomocný sekundy=pocitadlo/FREK2; setiny=pocitadlo%FREK2; out_LED=setiny%FREK2; // blikání po 1s out_piezo0=1; // pípání při 1/4, 1/2, 3/4, 1/1 minuty if ((sekundy%60==15 && setiny==0) || (sekundy%60==30 && (setiny==0 || setiny==4)) || (sekundy%60==45 && (setiny==0 || setiny==4 || setiny==8)) || (sekundy%60==0 && (setiny==0 || setiny==4 || setiny==8 || setiny==12))) out_piezo0=0; // pípání - upozornění před koncem expozice if (sekundy>=v_budik-upozorneni && setiny<=4) out_piezo0=0; // pípání při pauze po skončení expozice if (sekundy>=v_budik) out_piezo0=0; /* if (setiny<=1) out_piezo0=0; else out_piezo0=1; */ // standardní expozice if (v_dlouha_exp==0) // sepnutí celou dobu expozice (noční fotografování) if (sekundy=v_budik+pauza0-predsklopeni0) if (sekundy==v_budik+pauza0-predsklopeni0 && setiny=v_budik+pauza0) { // pauza pocitadlo=0; nacti_vstupy(); } // aktivace výstupů out_expozice=out_expozice0; if (v_piezo==0) // 0=aktivni piezosirenka out_piezo=out_piezo0; // když se měníl přímo port, tak bylo na zvuku slyšet else out_piezo=1; } /***************************************************************************/ /***************************************************************************/ /***************************************************************************/ // obsluha preruseni od casovace0 void timer (void) interrupt 1 { EA=0; // zakázání přerušení TH0=FREK/256; TL0=FREK%256; EA=1; // povolení přerušení pocitadlo++; kontrola_casu(); } /***************************************************************************/ /***************************************************************************/ /***************************************************************************/ // inicializace a nekonečná smyčka void main (void) { EA=0; // zakázání přerušení TMOD=1; // casovac0 v modu1 TH0=FREK/256; TL0=FREK%256; ET0=1; TR0=1; P3=255; // všechny výstupy neaktivní v_budik=100; // jakékoliv, ihned se přečtou správné nacti_DIL(); pocitadlo=v_budik*FREK2; // počítalo vteřin - začíná pauzou po ukončení expozice EA=1; // povolení přerušení while (1) {} }