Escolar Documentos
Profissional Documentos
Cultura Documentos
wiczenie nr 1: 1-Wire
1.1
Cel wiczenia
Celem wiczenia byo zapoznanie si z zasad dziaania magistrali 1-Wire. Naszym zadaniem
byo odczytanie unikalnego, 64-bitowego numeru identykacyjnego ukadu DS18B20, zapisanego
w wewntrznej pamieci ROM.
1.2
Wykonanie wiczenia
W celu wykonania wiczenia naleao zmodykowa plik bazowy napisany w jzyku C. Przede
wszystkim naleao nawiza komunikacj z urzdzeniem poprzez cykliczne wysyanie komendy
odczytu numeru seryjnego. Poniej fragment kodu odpowiadajcy za inicjalizacj:
int i=0;
DQ=0;
for(;i<30;i++)
{
_delay_us10();
}
Inicjalizacja polega na wymuszeniu na linii stanu niskiego przez co najmniej 480s, po czym
nastpuje oczekiwanie na odpowied ukadu slave :
DQ=1;
for( i=0 ; i<50 ; i++ )
{
_delay_us10();
}
Oczekiwanie polega na utrzymaniu stanu wysokiego. Jeli na linii urzdzenie slave wymusi stan
niski, oznacza to jego obecno.
Po udanej inicjalizacji nastpuje wysanie polecenia odczytania numeru id, co jest rwnowane
wysaniu kodu 33h:
one();
one();
zero();
zero();
one();
one();
zero();
zero();
Naley przy tym pamita, e wysyanie komendy zaczyna si od najmodszego bitu. Nastpnie
nastpuje procedura odczytu wysanej wartoci przez ukad slave:
void readROM( int licznik )
{
DQ=0;
_delay_us2();
DQ=1;
_delay_us10();
_delay_us10();
_delay_us10();
_delay_us10();
_delay_us10();
_delay_us10();
if( DQ == 1 )
{
tablica[licznik] = 1;
}
else
tablica[licznik] = 0;
}
}
Odczyt polega na wymuszeniu stanu niskiego na linii na czas od 1 do 15 s, po czym wymuszeniu stanu wysokiego na min 45s, w taki sposb, aby caa procedura nie trwaa krcej ni 60s.
Po upywie tego czasu odczytujemy warto sygnau DQ. Wszystkie odczytane wartoci zapisujemy do tablicy. Nastpnie tablica ta zostaje przekazana do funkcji, ktra odpowiedzialna jest za
wywietlenie zapisanych w niej znakw:
void kod2bin( )
{
int i=0;
char znak[2];
for( ; i<64 ; i += 4)
{
bin = tablica[i]+tablica[i+1]*10+tablica[i+2]*100+tablica[i+3]*1000;
znak[0] = bin2hex();
znak[1] = '\0';
lcd_printxy_c1((i+1)/2,2,znak);
}
}
return
return
return
return
'F';
'E';
'D';
'C';
case
case
case
case
case
case
case
case
case
case
case
case
1011
1010
1001
1000
0111
0110
0101
0100
0011
0010
0001
0000
:
:
:
:
:
:
:
:
:
:
:
:
return
return
return
return
return
return
return
return
return
return
return
return
'B';
'A';
'9';
'8';
'7';
'6';
'5';
'4';
'3';
'2';
'1';
'0';
}
return 'Z';
}
1.3
Podsumowanie
Wykonanie wiczenia nie udao si w caoci. Mylimy, e gwnym powodem byo nie zachowanie odpowiednich ram czasowych w trakcie odczytu danych urzdzenia slave. Na oscyloskopie
otrzymywalimy same jedynki, tzn. slave nie utrzymywa stanu niskiego na linii przez odpowiedni
czas.
2
2.1
wiczenie nr 2: LabView
Cel wiczenia
2.2.1
Wykonanie wiczenia
Realizacja PWM
dziaa !
2.2.2
Realizacja enkodera
Podobnie jak w przypadku generatora PWM, logika odpowiadajca za odczyt sygnaw z enkodera
pocztkowo zaprojektowana zostaa na komputerze, a nastpnie przeniesiona na ukad FPGA:
2.2.3
Panel operatorski
dziaania logiki. Na wykresie wywietlane s dwie fale, A oraz B, enkodera, poniej natomiast
zliczona warto.
2.3
Podsumowanie
wiczenie nr 3: Xilinx
Cel wiczenia
Celem wiczenia byo zrealizowanie logiki odpowiadajcej za sterowanie silnikiem za pomoc sygnau z generatora PWM, nastpnie odczyt sygnaw z dwu enkoderw. Kocowym zadaniem
byo stworzenie ukadu nadnego.
3.2
Wykonanie wiczenia
else
PWM <= '0';
end if;
if (Okres = "111111111111") then
Okres <= "000000000000";
end if;
Wypenienie sygnau zostao zapisywane do 12-bitowej wartoci, ktrej 4 najstarsze bity mona
byo regulowa poprzez zmian przecznikw hebelkowych znajdujcych si na ukadzie FPGA.
Druga cz, odpowiadajca za sczytywanie wartoci z ekondera:
A := Enc1_A & A(0);
B := Enc1_B & B(0);
C := Enc2_A & C(0);
D := Enc2_B & D(0);
temp := A & B;
temp2 := C & D;
if( temp = "1000" or temp = "1110" or temp = "0111" or temp = "0001" ) then
enkoder1 := enkoder1 + 1;
end if;
if( temp = "0010" or temp = "1011" or temp = "1101" or temp = "0100" ) then
enkoder1 := enkoder1 - 1;
end if;
if( temp2 = "1000" or temp2 = "1110" or temp2 = "0111" or temp2 = "0001" ) then
enkoder2 := enkoder2 + 1;
end if;
if( temp2 = "0010" or temp2 = "1011" or temp2 = "1101" or temp2 = "0100" ) then
enkoder2 := enkoder2 - 1;
end if;
...
A(0) :=
B(0) :=
C(0) :=
D(0) :=
A(1);
B(1);
C(1);
D(1);
Na podstawie obu czci kodu, staralimy si wykona ukad nadny, ktrego czci kodu zamieszczamy poniej:
wzmocnienie := "00000001";
...
uchyb := enkoder1 + enkoder2;
...
if( uchyb < 0 ) then
Dir <= '1';
else
Dir <= '0';
end if;
...
if (Okres = "111111111111") then
Okres <= "000000000000";
Wypelnienie <= uchyb*wzmocnienie;
end if;
3.3
Podsumowanie
Udao nam si zrealizowa generator PWM oraz logik odpowiadajc za odczyt enkoderw, natomiast ukad nadny nie dziaa do koca poprawnie. Mylimy, e powodem bdnego dziaania
bya le dobrana zmiana kierunku.
4
wiczenie nr 4: ADC
4.1
Cel wiczenia
4.2.1
Wykonanie wiczenia
Sinus 8-bitowy
MOV
MOV
MOV
MOV
DACCON, #11111111b
;ustawienie na 8-bit
DAC0L, #00000000b
;wyzerowanie wartoci wyjciowej z przetwornika
DAC0H, #00000000b
DPTR, #Sin8bit
;ustawienie wskanika na pocztek tablicy sinus
MOV R1, #0
LOOP:
CLR A
MOVC A, @A+DPTR
INC DPL
MOV DAC0L,A
MOV R1,DPL
CJNE R1,#64, LOOP
MOV DPTR, #Sin8bit
AJMP LOOP
4.2.2
Sinus 12-bitowy
DACCON, #01111111b
DAC0L, #00000000b
DAC0H, #00000000b
DPTR, #Sin12bit
;konfiguracja na 12-bit
;ustawienie na pocztek tablicy 12-bitowego sin
MOV R1,#0
LOOP:
CLR A
MOVC A,@A+DPTR
MOV DAC0H, A
INC DPTR
CLR A
MOVC A, @A+DPTR
MOV DAC0L, A
INC DPTR
; 2 inkrementacja wskanika
INC R1
MOV A,R1
CJNE R1, #64, LOOP
MOV DPTR, #Sin12bit
MOV R1,#0
LJMP LOOP
4.2.3
10
LOOP
oraz
MOV DAC1H, A
MOV
MOV
MOV
MOV
MOV
MOV
DACCON, #01111111b
DAC1H, #00000000b
DAC0H, #00000000b
DAC1L, #00000000b
DAC0L, #00000000b
DPTR, #Sin12bit
MOV R1,#48
MOV R4,#64
MOV R2,#00
MOV R3,#32
;dwa rejestry R1 i R4 su do
;wchodzenia do etykiet
;dwa rejestry R2 i R3 odpowiadaj
;za przesunicie wskanika w tablicy
LOOP:
CLR A
MOV A,R2
MOVC A,@A+DPTR;
MOV DAC0H,A
CLR A
MOV A,R3
MOVC A,@A+DPTR;
MOV DAC1H,A
INC DPTR
CLR A
MOV A,R2
MOVC A,@A+DPTR
MOV DAC0L,A
CLR A
MOV A,R3
MOVC A,@A+DPTR
MOV DAC1L,A
INC DPTR
11
DEC R1
DEC R4
CLR A
MOV A,R1
JZ LOOP1
MOV A,R4
JZ LOOP2
LJMP LOOP
LOOP1:
MOV
MOV
MOV
MOV
DPTR, #Sin12bit
R3,#00
R2,#96
R1,#64
LJMP LOOP
LOOP2:
MOV DPTR, #Sin12bit
MOV R3,#32
MOV R2,#00
MOV R4,#64
MOV R1,#48
LJMP
4.3
LOOP
Podsumowanie
12