#include <reg515.sfr>
#include <lcd.h>
unsigned char x;
unsigned int liczba, licznik = 0, impulsy, n, i, kierunek = 1, hall;
void czekaj(unsigned int n);
unsigned char tablicaP1[6] = {222,219,249,237,231,246}; //wartosci dla zmiennej P1
unsigned char tablicaH[6] = {3,1,5,4,6,2}; //hallotrony, sprawdzanie
aktualnego polozenia wirnika
_interrupt 5 void int_T2(void) //funkcja cykliczna, obsługuje przerwanie nr 5
{
TF2 = 0;
hall = P4 & 7; // odczytanie `pozycji hallotronu'
for (i = 0; i < 6; i++)// petla lokalizujaca jego indeks
w tablicy hallotronow
{
if (tablicaH[i] == hall)
n = i; // n -> index w tablicy
}
if(kierunek == 1)
{
if(n == 5) //jesli koniec tablicy, wracamy do
pierwszego ustawienia z tabeli
{
P1 = tablicaP1[0];
n = 0;
}
Else // w przeciwnym wypadku bierzemy nastepne
{
P1 = tablicaP1[n+1];
}
}
if(kierunek == 0) // analogicznie w drugim kierunku
{
if(n == 0)
{
P1 = tablicaP1[5];
n = 5;
}
else
{
P1 = tablicaP1[n-1];
}
}
}
int main()
{
init();
liczba = 0;
T2R1 = 1;
T2I0 = 1;
EAL = 1;
ET2 = 1;
CRCH = 0;
CRCL = 0;
while(1)
{
x = get_char();
if((x >= 48) && (x <= 57))
{
liczba = 10 * liczba + (x - 48);
put_char(x);
}
if(x == 'e')
{
put_instr(0x01);
czekaj(20000);
if(liczba < 100) liczba = 100; //blokada minimalnej
predkosci
if(liczba > 600) liczba = 600; //-`'- maksymalnej
impulsy = 1000000/liczba;
CRCL = -impulsy;
CRCH = -(impulsy >> 8);
liczba = 0;
}
if(x == 'p') // strzalka w prawo, zmiana kierunku poruszania sie wirnika, globalna zmienna z kierunkiem {
kierunek = 1;
}
if(x == 'l') // strzalka w lewo, analogicznie
{
kierunek = 0;
}
czekaj(20000);
}
return 0;
}
void czekaj(unsigned int n) //funkcja opozniajaca
{
int i;
for(i = 0; i < n; i++){ }
}