#include // hlavickovy soubor popisujici mikrokontroler #include // knihovna potrebna pro preruseni #include int posunmotor1 (int pol) //funkce posunuti smerem 1 { switch (pol) { case 0b10010000: pol = 0b00001001; //z a1 do b1 break; case 0b00001001: pol = 0b01100000; //z b1 do a2 break; case 0b01100000: pol = 0b00000110; //z a2 do b2 break; case 0b00000110: pol = 0b10010000; //z b2 do a1 break; default: break; } PORTC = pol; return pol; } int posunmotor2 (int pol) //funkce posunuti smerem 2 { switch (pol) { case 0b10010000: pol = 0b00000110; //z a1 do b2 break; case 0b00001001: pol = 0b10010000; //z b1 do a1 break; case 0b01100000: pol = 0b00001001; //z a2 do b1 break; case 0b00000110: pol = 0b01100000; //z b2 do a2 break; default: break; } PORTC = pol; return pol; } int automatic (int pol) //funkce automatickeho nastaveni { int m, n; int p[13][3]; int *up; //sejmuti vsech hodnot while (bit_is_set(PIND,4)) //posunuti motoru na zacatek { pol = posunmotor1 (pol); } PORTB = 0b10000000; //vypni obe rele for (m = 0; m<13; m++) { if (!bit_is_set(PIND,5)) { p[m][0] = sejminapeti (m,0); //zaznam vsech hodnot pro vypnuta rele pol = posunmotor2 (pol); } } while (bit_is_set(PIND,4)) //posunuti motoru na zacatek { pol = posunmotor1 (pol); } PORTB = 0b11000000; //zapni jedno rele for (m = 0; m<13; m++) { if (!bit_is_set(PIND,5)) { p[m][1] = sejminapeti (m,1); //zaznam vsech hodnot pro jedno rele pol = posunmotor2 (pol); } } while (bit_is_set(PIND,4)) //posunuti motoru na zacatek { pol = posunmotor1 (pol); } PORTB = 0b11100000; //zapni obe rele for (m = 0; m<13; m++) { if (!bit_is_set(PIND,5)) { p[m][2] = sejminapeti (m,2); //zaznam vsech hodnot pro obe rele pol = posunmotor2 (pol); } //ejmipoli(p) sejmipole(int *p) } up = &p[0][0]; //ulozeni adresy p[0][0] do ukazatele up //zpracovani vysledku int v,i,j; for (n = 0; n<3; n++) { for (m = 0; m<13; m++) { if ( p[m][n]>v) { v = p[m][n]; //nejvetsi hodnota napeti i = m; //jeji souradnice m j = n; //jeji souradnice n } } } while (bit_is_set(PIND,4)) //posunuti motoru na zacatek { pol = posunmotor1 (pol); } switch (j) //nastaveni souradnice n { case 0: PORTB = 0b10000000; //vypni obe rele break; case 1: PORTB = 0b11000000; //zapni jedno rele break; case 2: PORTB = 0b11100000; //zapni obe rele break; default: break; } for (m = 0; m<=i; m++) //nastaveni souradnice m { pol = posunmotor2 (pol); //posun motor na max napeti } return pol; while(1) //nekonecna smycka { if (!bit_is_set(PINB,6)) { pol = manual (pol); //prepnuti na manualni rizeni } } } int sejminapeti (int m, int n, int *up) //funkce zaznamu hodnoty napeti { ADCSRA = (1<