//================================= // PREVODNIK FREKVENCE 300Hz NA 140Hz // se zachovanim stridy signalu 5% az 95% //================================= // video: http://youtu.be/_TKqROSn0F0 // Vyznam jednotlivych vyvodu procesoru ATtiny13A: // PB0 = pin 5 = IN - nepouzito (MOSI) // PB1 = pin 6 = IN - nepouzito (MISO) // PB2 = pin 7 = IN - nepouzito (SCK) // PB3 = pin 2 = IN - vstupni signal (300Hz) // PB4 = pin 3 = OUT - vystupni signal (140Hz) // PB5 = pin 1 = IN - nepouzito (RESET) // VCC = pin 8 = napajeni +5V // GND = pin 4 = napajeni GND //=================================================================================================== #define F_CPU 9600000 // nastaveni vnitrni frekvence procesoru na 9.6 MHz #include int main (void) { int high_in = 0; // doba trvani logicke "1" ve vstupnim signalu v poctech cyklu hlavni smycky int low_in = 0; // doba trvani logicke "0" ve vstupnim signalu v poctech cyklu hlavni smycky int pamet_high_out = 0; // vypoctena doba trvani logicke "1" ve vystupnim signalu (aktualizuje se po kazde sestupne hrane vstupniho signalu) int pamet_low_out = 0; // vypoctena doba trvani logicke "0" ve vystupnim signalu (aktualizuje se po kazde vzestupne hrane vstupniho signalu) int odpocet_vystupu = 0; // pri generovani vystupniho signalu se v teto promenne pocita, jak dlouho (kolik cyklu) ma jeste trvat nastavena uroven int stav_vystupu = 0; // pomocna promenna pro zapamatovani stavu vystupu byte dalsi_hrana = 0; // promenna, ktera se meni pri kazde (vzestupne i sestupne) hrane vstupniho signalu DDRB = 0b00010000; // nastaveni smeru signalu na portu B ("1" = vystup ; "0" = vstup) - PB4=vystup 140Hz PORTB = 0b00000000; // bez pull-upu while (1) // nekonecna hlavni smycka { // ============== vzorkovani vstupniho signalu ============== if ((PINB & 0b00001000) == 8 && dalsi_hrana == 1) // prvni "1" vzorek po urovni "0" vstupniho signalu (prave nastala vzestupna hrana vstupniho signalu) { pamet_low_out = (15 * low_in) / 7; // prepocet na delku trvani vystupni logicke "0" (300Hz / 140Hz * delka trvani vstupni "0") - zaokrouhleno na INT ! low_in = 0; // vynuluje se pocitadlo delky "0" ve vstupnim signalu (vypoctena delka vystupni "0" uz je v pameti) dalsi_hrana = 0; // bude se cekat na sestupnou hranu } if ((PINB & 0b00001000) == 0 && dalsi_hrana == 0) // prvni "0" vzorek po urovni "1" vstupniho signalu (prave nastala sestupna hrana vstupniho signalu) { pamet_high_out = (15 * high_in) / 7; // prepocet na delku trvani vystupni logicke "1" (300Hz / 140Hz * delka trvani vstupni "1") - zaokrouhleno na INT ! high_in = 0; // vynuluje se pocitadlo delky "1" ve vstupnim signalu (vypoctena delka vystupni "1" uz je v pameti) dalsi_hrana = 1; // bude se cekat na vzestupnou hranu } if ((PINB & 0b00001000) == 0) // vstupni signal je v "0" { low_in ++; // pocitadlo trvani "0" ve vstupnim signalu } else // vstupni signal je v "1" { high_in ++; // pocitadlo trvani "1" ve vstupnim signalu } // ============================================================================ // ============== generovani vystupniho signalu ============== if (odpocet_vystupu == 0 && stav_vystupu == 1) // kdyz odpocet vystupniho signalu dosahne cisla 0 a na vystupu byla nastavena "1" ... { PORTB &= 0b11101111; // ... vystupni signal se preklopi na "0" ... stav_vystupu = 0; // ... pomocna promenna, ktera si pamatuje stav vystupu se prepne do 0 odpocet_vystupu = pamet_low_out; // ... a z pameti se zjisti delka trvani nasledujici "0" } if (odpocet_vystupu == 0 && stav_vystupu == 0) // kdyz odpocet vystupniho signalu dosahne cisla 0 a na vystupu byla nastavena "0" ... { PORTB |= 0b00010000; // ... vystupni signal se preklopi na "1" ... stav_vystupu = 1; // ... pomocna promenna, ktera si pamatuje stav vystupu se prepne do 1 odpocet_vystupu = pamet_high_out; // ... a z pameti se zjisti delka trvani nasledujici "1" } odpocet_vystupu --; // ============================================================================ } // konec nekonecne smycky }