Falownik(6), Sprawka, uP biskup


0x01 graphic

POLITECHNIKA ŚLĄSKA W GLIWICACH

WYDZIAŁ ELEKTRYCZNY

Katedra Energoelektroniki, Napędu Elektrycznego i Robotyki

CYFROWE METODY I UKŁADY STEROWANIA PRZEKSZTAŁTNIKÓW ENERGOELEKTRONICZNYCH

Temat zadania:

STEROWNIK 3-FAZOWEGO FALOWNIKA PRĄDU

Wykonali: Adam CZUDAJ

Norbert MATYJA

Grupa: KSS - mgr

Sekcja: III

Prowadzący: dr inż. Tomasz BISKUP

  1. Cel ćwiczenia:

Nabycie umiejętności z zakresu programowania układu sterownika 3-fazowego falownika prądu oraz poszerzenie wiadomości i zasad z zakresu programowania w Asemblerze układów peryferyjnych systemu mikroprocesorowego.

  1. Założenia do zadania:

klawisz 3 - zwiększanie

klawisz 4 - zmniejszanie

na dole `F=__._Hz', i sygnalizacja stanu pracy: `start' lub `stop'.

wyjścia portu PA0 … PA5 dla tyrystorów T1 … T6, sterowane za pomocą układu TPC (grupa 0 i 1)

  1. Listing programu:

$iohevb.h ;deklaracje rejestrow sterujacych

$mon_wys.inc ;procedury obslugi wyswietlacza

COL 132

JMP EQU 5a000000H ;kod rozkazu skoku BRA

;---------------------------------------------------------------------------------------------------------------------------------------

; Ustawienie zastepczej tablicy wektorow przerwan

;---------------------------------------------------------------------------------------------------------------------------------------

ASEG 40000H

;reset

DC.L START + JMP ;Vector no. 0. POCZATEK PROGRAMU POD ETYKIETA: start

;Reserved for System Use

DS.L 1 ;Vector no. 1.

DS.L 1 ;Vector no. 2.

DS.L 1 ;Vector no. 3.

DS.L 1 ;Vector no. 4.

DS.L 1 ;Vector no. 5.

DS.L 1 ;Vector no. 6.

;NMI

DS.L 1 ;Vector no. 7. Wektor przerwania niemaskowalnego NMI

;Trap instruction

DS.L 1 ;Vector no. 8.

DC.L START + JMP ;Vector no. 9.

DC.L START + JMP ;Vector no. 10.

DC.L START + JMP ;Vector no. 11.

DC.L START + JMP ;Vector no. 12. IRQ0

DC.L START + JMP ;Vector no. 13. IRQ1

DC.L START + JMP ;Vector no. 14. IRQ2

DC.L START + JMP ;Vector no. 15. IRQ3

DC.L START + JMP ;Vector no. 16. IRQ4

DC.L START + JMP ;Vector no. 17. IRQ5

DC.L START + JMP ;Vector no. 18. IRQ6

DC.L START + JMP ;Vector no. 19. IRQ7

;Internal Interrupts

DC.L START + JMP ;Vector no. 20. Wektor przerwania watchdog timer

DC.L START + JMP ;Vector no. 21. Wektor przerwania CMI (compare match)

DS.L 1 ;Vector no. 22.

DS.L 1 ;Vector no. 23.

DC.L PRZER_IMIA + JMP ;Vector no. 24. Wektor przerwania IMIA0

DC.L START + JMP ;Vector no. 25. Wektor przerwania IMIB0

DC.L START + JMP ;Vector no. 26. Wektor przerwania OVI0

DS.L 1 ;Vector no. 27.

DC.L START + JMP ;Vector no. 28. Wektor przerwania IMIA1

DC.L START + JMP ;Vector no. 29. Wektor przerwania IMIB1

DC.L START + JMP ;Vector no. 30. Wektor przerwania OVI1

DS.L 1 ;Vector no. 31.

DC.L PRZERWANIE_TIMER2 + JMP ;Vector no. 32. Wektor przerwania IMIA2. Petla glowna 1 ms

DC.L START + JMP ;Vector no. 33. Wektor przerwania IMIB2

DC.L START + JMP ;Vector no. 34. Wektor przerwania OVI2

DS.L 1 ;Vector no. 35.

DC.L START + JMP ;Vector no. 36. Wektor przerwania IMIA3. PWM

DC.L START + JMP ;Vector no. 37. Wektor przerwania IMIB3

DC.L START + JMP ;Vector no. 38. Wektor przerwania OVI3

DS.L 1 ;Vector no. 39.

DC.L START + JMP ;Vector no. 40. Wektor przerwnaia IMIA4

DC.L START + JMP ;Vector no. 41. Wektor przerwania IMIB4

DC.L START + JMP ;Vector no. 42. Wektor przerwania OVI4

DS.L 1 ;Vector no. 43.

DC.L START + JMP ;Vector no. 44. Wektor przerwania DEND0A

DC.L START + JMP ;Vector no. 45. Wektor przerwania DEND0B

DC.L START + JMP ;Vector no. 46. Wektor przerwania DEND1A

DC.L START + JMP ;Vector no. 47. Wektor przerwania DEND1B

DC.L 1 ;Vector no. 48.

DC.L 1 ;Vector no. 49.

DC.L 1 ;Vector no. 50.

DC.L 1 ;Vector no. 51.

DS.L 1 ;Vector no. 52. Wektor przerwania ERI0

DS.L 1 ;Vector no. 53. Wektor przerwania RXI0

DC.L START + JMP ;Vector no. 54. Wektor przerwania TXI0

DC.L START + JMP ;Vector no. 55. Wektor przerwania TEI0

DC.L START + JMP ;Vector no. 56. Wektor przerwania ERI1

DC.L START + JMP ;Vector no. 57. Wektor przerwania RXI1

DC.L START + JMP ;Vector no. 58. Wektor przerwania TXI1

DC.L START + JMP ;Vector no. 59. Wektor przerwania TEI1

DC.L START + JMP ;Vector no. 60. Wektor przerwania ADI

ASEG 40400H

;---------------------------This segment should reside somewhere in the user's code---------------------------------------

START:

nop ;Wykonaj pusty rozkaz

MOV.B #0FBH,R0L ;Przenies bajt o wartosci #0FBH do mlodszej czesci rejestru R0 (R0L)

MOV.B R0L,@ABWCR ;Ustaw szerokosc szyny danych dla poszczegolnych obszarow (strona 128)

MOV.B #0FH,R0L ;Przenies bajt o wartosci #0FH do mlodszej czesci rejestru R0 (R0L)

MOV.B R0L,@ASTCR ;Ustaw 3 stanowy cykl na szynie, cs6-2stanowy (strona 129)

MOV.B #0F3H,R0L ;Przenies bajt o wartosci #0F3H do mlodszej czesci rejestru R0 (R0L)

MOV.B R0L,@WCR ;Ustaw 3 wait-y na sztywno (strona 130)

MOV.B #0FH,R0L ;Przenies bajt o wartosci #0FH do mlodszej czesci rejestru R0 (R0L)

MOV.B R0L,@WCER ;Odblokuj wait na EEPROM, cs3

MOV.B #0FFH,R0L ;Przenies bajt o wartosci #0FFH do mlodszej czesci rejestru R0 (R0L)

MOV.B R0L,@PBDDR ;Ustaw port B jako wyjscia (strona 299)

MOV.B #0FFH,R0L ;Przenies bajt o wartosci #0FFH do mlodszej czesci rejestru R0 (R0L)

MOV.B R0L,@PADDR ;Ustaw port A jako wyjscia (strona 291)

MOV.B #0AAH,R0L ;Przenies bajt o wartosci #0AAH do mlodszej czesci rejestru R0 (R0L)

MOV.B R0L,@PADR ;Ustaw wartosc poczatkowa portu @PADR na wartosc #0AAH

MOV.B #55H,R0L ;Przenies bajt o wartosci #055H do mlodszej czesci rejestru R0 (R0L)

MOV.B R0L,@PBDR ; Ustaw wartosc poczatkowa portu @PBDR na wartosc #55H

MOV.B #0,R0L ;Przenies bajt o wartosci #0 do mlodszej czesci rejestru R0 (R0L)

MOV.B R0L,@STAN_STEROWNIKA ;Wyzeruj @STAN_STEROWNIKA

MOV.W #1000,R0 ;Przenies slowo o wartosci #1000 do rejestru R0

MOV.W R0,@LICZ_1SEK ;Przenies zawartosc rejestru R0 do @LICZ_1SEK

BSR INICJALIZACJA_WYSW ;Wywolaj INICJALIZACJA_WYSW. Ustawia wyswietlacz ;zgodnie z procedura zawarta w instrukcji i pliku ;mon_wys.inc

BSR INICJALIZACJA_PRZERWAN ;Wywolaj INICJALIZACJA_PRZERWAN

MOV.B #00h,R0H ;Przenies bajt o wartosci #00H do starszej czesci rejestru R0 (R0H)

BSR GOTO_X_Y ;Wywolaj GOTO_X_Y. Ustawia kursor na wyswietlaczu w pozycji

;wskazanej przez rejestr R0H

MOV.L #Izad,ER1 ;Przenies dlugie slowo bedace lancuchem znakow o wartosci #Izad ;do rejestru ER1

BSR WYSLIJ_TEKST ;Wywolaj WYSLIJ_TEKST. Wyprowadza lancuch znakow o ;adresie poczatkowym ER1 na wyswietlacz

MOV.B #40h,R0H ;Przenies bajt o wartosci #40H do starszej czesci rejestru R0 (R0H)

BSR GOTO_X_Y ;Wywolaj GOTO_X_Y. Ustawia kursor na wyswietlaczu w pozycji

;wskazanej przez rejestr R0H

MOV.L #Fzad,ER1 ;Przenies dlugie slowo bedace lancuchem znakow o wartosci #Fzad

;do rejestru ER1

BSR WYSLIJ_TEKST ;Wywolaj WYSLIJ_TEKST. Wyprowadza lancuch znakow o

;adresie poczatkowym ER1 na wyswietlacz

MOV.B #0,R0L ;Przenies bajt o wartosci #0 do mlodszej czesci rejestru R0 (R0L)

MOV.B R0L,@stan_pracy ;Przenies zawartosc mlodszej czesci rejestru R0 (R0L) do

;@stan_pracy w celu ustawienia aktualnego stanu pracy na wartosc ;0 odpowiadajaca stopowi

MOV.B #0,R0L ;Przenies bajt o wartosci #0 do mlodszej czesci rejestru R0 (R0L)

MOV.B R0L,@Index_tablicy ;Przenies zawartosc mlodszej czesci rejestru R0 (R0L) do

;@Zmnien_licz w celu wyzerowania indeksu tablicy

MOV.W #5,R2 ;Przenies slowo o wartosci #5 do rejestru R2.

MOV.W R2,@WARTOSC_ZAD ;Przenies zawartosc rejestru R2 do @WARTOSC_ZAD

BSR BIN_BCD ;Wywolaj BIN_BCD

MOV.W #5,R0 ;Przenies slowo o wartosci #5 do rejestru R0

MOV.W R0,@WARTOSC_IZAD ;Przenies zawartosc rejestru R0 do @WARTOSC_IZAD

BSR BIN_BCD_IZAD ;Wywolaj BIN_BCD_IZAD

;---------------------------PETLA GLOWNA ------------------------------------------------------------------------------------

PETLA_GLOWNA:

MOV.L #STAN_STEROWNIKA,ER0 ;Przenies wartosc #STAN_STEROWNIKA do rejestru

;ER0. Sluzy odmierzeniu 1 ms

BTST #7,@ER0 ;Testuj bit #7 rejestru ER0. Jezeli bit zerem to Z=1

BEQ PETLA_GLOWNA ;Jezeli porownanie spelnione (Z=1) to przejdz do

;PETLA_GLOWNA

BCLR #7,@ER0 ;Skasuj sygnalizacje bitu #7 rejestru ER0

MOV.W @LICZ_1SEK,R0 ;Przenies zawartosc @LICZ_1SEK do rejestru R0. Obsluga ;klawiatury

MOV.W @LICZ_1SEK,R2 ;Przenies zawartosc @LICZ_1SEK do rejestru R2. ;Obsluga potencjometru

DEC.W #1,R0 ;Dekrementuj o wartosc #1 zawartosc rejestru R0

MOV.W R0,@LICZ_1SEK ;Przenies zawartosc rejestru R0 do @LICZ_1SEK.

;Zapamietanie nowej wartosci @LICZ_1SEK

BNE PETLA_GLOWNA ;Jezeli porownanie niespelnione (Z=0) to przejdz do

;PETLA_GLOWNA

MOV.W #100,R0 ;Przenies wartosc #100 do rejestru R0

MOV.W R0,@LICZ_1SEK ;Przenies wartosc R0 do @LICZ_1SEK

;---------------------------Obsluga wywolanie------------------------------------------------------------------------------------

BSR BIN_KLAW ;Wywolaj podprogram BIN_KLAW

BSR OBSLUGA_AC ;Wywolaj podprogram OBSLUGA_AC

BRA PETLA_GLOWNA ;Przejdz do PETLA_GLOWNA

;---------------------------Przetwarzanie liczby 3 cyfrowej i umieszczanie na wyswietlaczu------------------------------

BIN_BCD:

MOV.B #100,R3L ;Przenies wartosc #100 do mlodszej czesci rejestru R3 (R3L)

DIVXU.B R3L,R2 ;Podziel zawartosc rejestru R2 przez zawartosc mlodszej czesci rejestru R3

;(R3L). Wynik w mlodszej czesci rejestru R2 (R2L)

ADD.B #30H,R2L ;Dodaj wartosc #30H do zawartosci mlodszej czesci rejestru R2 (R2L).

;Wartosc #30H ze wzgledu na potrzebne przesuniecie w tablicy znakow kodu ;ASCII

MOV.B R2L,@cyfra3 ;Przenies zawartosc mlodszej czesci rejestru R2 (R2L) do @cyfra3

MOV.B R2H,R2L ;Przenies zawartosc starszej czesci rejestru R2 (R2H) do mlodszej czesci

;rejestru R2 (R2L)

MOV.B #0,R2H ;Wyzeruj starsza czesc rejestru R2 (R2H)

MOV.B #10,R3L ;Przenies wartosc #10 do mlodszej czesci rejestru R3 (R3L)

DIVXU.B R3L,R2 ;Podziel zawartosc rejestru R2 przez zawartosc mlodszej czesci rejestru R3

;(R3L). Wynik w mlodszej czesci rejestru R2 (R2L)

ADD.B #30H,R2L ;Dodaj wartosc #30H do zawartosci mlodszej czesci rejestru R2 (R2L).

;Wartosc #30H ze wzgledu na potrzebne przesuniecie w tablicy znakow kodu ;ASCII

MOV.B R2L,@cyfra2 ;Przenies zawartosc mlodszej czesci rejestru R2 (R2L) do @cyfra2

ADD.B #30H,R2H ;Dodaj wartosc #30H do zawartosci starszej czesci rejestru R2 (R2H).

;Wartosc #30H ze wzgledu na potrzebne przesuniecie w tablicy znakow kodu ;ASCII

MOV.B R2H,@cyfra1 ;Przenies zawartosc mlodszej czesci rejestru R2 (R2L) do @cyfra2I

MOV.B #42H,R0H ;Przenies bajt o wartosci #42H do starszej czesci rejestru R0 (R0H)

BSR GOTO_X_Y ;Wywolaj GOTO_X_Y. Ustawia kursor na wyswietlaczu w pozycji

;wskazanej przez rejestr R0H

MOV.B @cyfra3,R0H ;Przenies zawartosc @cyfra3 do starszej czesci rejestru R0 (R0H)

BSR PUT_CHAR ;Wywolaj PUT_CHAR. Wyprowadza na wyswietlacz znak ktorego kod

;ASCII znajduje sie w starszej czesci rejestru R0 (R0H)

MOV.B @cyfra2,R0H ;Przenies zawartosc @cyfra2 do starszej czesci rejestru R0 (R0H)

BSR PUT_CHAR ;Wywolaj PUT_CHAR. Wyprowadza na wyswietlacz znak ktorego kod

;ASCII znajduje sie w starszej czesci rejestru R0 (R0H)

MOV.B #45H,R0H ;Przenies bajt o wartosci #45H do starszej czesci rejestru R0 (R0H)

BSR GOTO_X_Y ;Wywolaj GOTO_X_Y. Ustawia kursor na wyswietlaczu w pozycji

;wskazanej przez rejestr R0H

MOV.B @cyfra1,R0H ;Przenies zawartosc @cyfra1 do starszej czesci rejestru R0 (R0H)

BSR PUT_CHAR ;Wywolaj PUT_CHAR. Wyprowadza na wyswietlacz znak ktorego kod ;ASCII znajduje sie w starszej czesci rejestru R0 (R0H)

RTS ;Powrot z podprogramu

BIN_BCD_IZAD:

MOV.B #100,R1L ;Przenies wartosc #100 do mlodszej czesci rejestru R1 (R1L)

DIVXU.B R1L,R0 ;Podziel zawartosc rejestru R0 przez zawartosc mlodszej czesci rejestru R1

;(R1L). Wynik w mlodszej czesci rejestru R0 (R0L)

ADD.B #30H,R0L ;Dodaj wartosc #30H do zawartosci mlodszej czesci rejestru R0 (R0L).

;Wartosc #30H ze wzgledu na potrzebne przesuniecie w tablicy znakow ;ASCII

MOV.B R0L,@cyfra3I ;Przenies zawartosc mlodszej czesci rejestru R0 (R0L) do @cyfra3I

MOV.B R0H,R0L ;Przenies zawartosc starszej czesci rejestru R0 (R0H) do mlodszej czesci

;rejestru R0 (R0L)

MOV.B #0,R0H ;Wyzeruj starsza czesc rejestru R0 (R0H)

MOV.B #10,R1L ;Przenies wartosc #10 do mlodszej czesci rejestru R1 (R1L)

DIVXU.B R1L,R0 ;Podziel zawartosc rejestru R0 przez zawartosc mlodszej czesci rejestru R1

;(R1L). Wynik w mlodszej czesci rejestru R0 (R0L)

ADD.B #30H,R0L ;Dodaj wartosc #30H do zawartosci mlodszej czesci rejestru R0 (R0L).

;Wartosc #30H ze wzgledu na potrzebne przesuniecie w tablicy znakow ;ASCII

MOV.B R0L,@cyfra2I ;Przenies zawartosc mlodszej czesci rejestru R0 (R0L) do @cyfra2I

ADD.B #30H,R0H ;Dodaj wartosc #30H do zawartosci starszej czesci rejestru R0 (R0H).

;Wartosc #30H ze wzgledu na potrzebne przesuniecie w tablicy znakow ;ASCII

MOV.B R0H,@cyfra1I ;Przenies zawartosc starszej czesci rejestru R0 (R0H) do @cyfra1I

MOV.B #07H,R0H ;Przenies bajt o wartosci #07H do starszej czesci rejestru R0 (R0H)

BSR GOTO_X_Y ;Wywolaj GOTO_X_Y. Ustawia kursor na wyswietlaczu w pozycji

;wskazanej przez rejestr R0H

MOV.B @cyfra2I,R0H ;Przenies zawartosc @cyfra2I do starszej czesci rejestru R0 (R0H)

BSR PUT_CHAR ;Wywolaj PUT_CHAR. Wyprowadza na wyswietlacz znak ktorego kod

;ASCII znajduje sie w starszej czesci rejestru R0 (R0H)

MOV.B @cyfra1I,R0H ;Przenies zawartosc @cyfra2I do starszej czesci rejestru R0 (R0H)

BSR PUT_CHAR ;Wywolaj PUT_CHAR. Wyprowadza na wyswietlacz znak ktorego kod

;ASCII znajduje sie w starszej czesci rejestru R0 (R0H)

RTS ;Powrot z podprogramu

;---------------------------Obsluga AC---------------------------------------------------------------------------------------------

OBSLUGA_AC:

MOV.B #00110010B,R2L ;Przenies wartosc #00110010B do mlodszej czesci rejestru R2 (R2L)

MOV.B R2L,@ADCSR ;Przenies zawartosc mlodszej czesci rejestru R2 (R2L) do rejestru

;@ADCSR. Ustaw AD Control Status Register (strona 538)

MOV.B @ADDRCH,R2L ;Odczytaj zawartosc rejestru @ADCSR do mlodszej czesci rejestru ;R2 (R2L)

EXTU.W R2 ;Wyzeruj starsza czesc rejestru R2 (R2H)

EXTU.L ER2 ;Wyzeruj starsza czesc rejestru ER2 (E2)

MOV.W #225,R3 ;Przenies wartosc #225 do rejestru R3

MULXU.W R3,ER2 ;Pomnoz zawartosc rejestru R2 z zawartoscia rejestru R3. Wynik

;zostaje zapisany w ER2

MOV.W #255,R3 ;Przenies wartosc #255 do rejestru R3

DIVXU.W R3,ER2 ;Podziel zawartosc rejestru ER2 przez zawartosc rejestru R3. Wynik ;zostaje zapisany w R2, reszta w E2

ADD.W #25,R2 ;Dodaj wartosc #25 do zawartosci rejestru R2

MOV.B #2,R3L ;Przenies wartosc #2 do mlodszej czesci rejestru R3 (R3L)

MULXU.B R3L,R2 ;Pomnoz zawartosc rejestru R2 z zawartoscia mlodszej czesci

;rejestru R3 (R3L). Wynik zostaje zapisany R2

MOV.W R2,@WART_AC ;Przenies zawartosc rejestru R2 do @WART_AC. Zapamietanie

;nowej wartosci z przetwornika AC

MOV.W @WARTOSC_ZAD,R3 ;Przenies zawartosc @WARTOSC_ZAD do rejestru R3

CMP.W R3,R2 ;Porownaj zawartosc rejestru R3 z zawartoscia rejestru R2

BEQ KONIEC_AC ;Jezeli porownanie spelnione to przejdz do KONIEC_AC

MOV.W R2,@WARTOSC_ZAD ;W przeciwnym wypadku przenies zawartosc rejestru R2 do

;@WARTOSC_ZAD. Zapamietanie nowej wartosci ;@WARTOSC_ZAD

BSR BIN_BCD ;Wywolaj BIN_BCD

KONIEC_AC:

RTS ;Powrot z podprogramu

;---------------------------Obsluga klawiatury------------------------------------------------------------------------------------

BIN_KLAW:

MOV.B @KLAW,R0L ;Przenies zawartosc @KLAW przechowujacej adres aktualnie

;aktywnego klawisza do mlodszej czesci rejestru R0 (R0L)

CMP.B #7EH,R0L ;Porownaj wartosc #7EH z zawartoscia mlodszej czesci rejestru R0 (R0L)

BEQ STARTZ ;Jezeli porownanie spelnione to przejdz do STARTZ

CMP.B #7DH,R0L ;Porownaj wartosc #7DH z zawartoscia mlodszej czesci rejestru R0 (R0L)

BEQ STOPZ ;Jezeli porownanie spelnione to przejdz do STOPZ

CMP.B #7BH,R0L ;Porownaj wartosc #7BH z zawartoscia mlodszej czesci rejestru R0 (R0L)

BEQ PLUS ;Jezeli porownanie spelnione to przejdz do PLUS

CMP.B #77H,R0L ;Porownaj wartosc #77H z zawartoscia mlodszej czesci rejestru R0 (R0L)

BEQ MINUS ;Jezeli porownanie spelnione to przejdz do MINUS

RTS ;Powrot z podprogramu

STARTZ:

MOV.B @stan_pracy, R0L ;Przenies zawartosc @stan_pracy do mlodszej czesci rejestru R0

CMP.B #1,R0L ;Porownaj wartosc #1 z zawartoscia mlodszej czesci rejestru R0 (R0L)

BEQ KONIEC ;Jezeli porownanie spelnione to przejdz do KONIEC

MOV.B #1,R1L ;W przeciwnym wypadku przenies warosc #1 do mlodszej czesci rejestru R1

MOV.B R1L,@stan_pracy ;Przenies mloda sza czesci rejestru R1 (R1L) do @stan_pracy.

;Zapamietanie nowego stanu pracy.

MOV.B #4BH,R0H ;Przenies wartosc #4BH do starszej czesci rejestru R0 (R0H)

BSR GOTO_X_Y ;Wywolaj GOTO_X_Y. Ustawia kursor na wyswietlaczu w pozycji

;wskazanej przez rejestr R0H

MOV.L #NAPIS_START,ER1 ;Przenies dlugie slowo bedace lancuchem znakow o wartosci

;#NAPIS_START do rejestru ER1

BSR WYSLIJ_TEKST ;Wywolaj WYSLIJ_TEKST. Wyprowadza lancuch znakow o

;adresie poczatkowym ER1 na wyswietlacz

BSR STER_TYR ;Wywolaj podprogram STER_TYR realizujacy obsluge sterowania

;tyrystorami

RTS ;Powrot z podprogramu

STOPZ:

MOV.B @stan_pracy, R0L ;Przenies zawartosc @stan_pracy do mlodszej czesci rejestru R0

CMP.B #0,R0L ;Porownaj wartosc #0 z zawartoscia mlodszej czesci rejestru R0

BEQ KONIEC ;Jezeli porownanie spelnione to przejdz do KONIEC

MOV.B #0,R1L ;W przeciwnym wypadku przenies warosc #0 do mlodszej czesci rejestru R1

MOV.B R1L,@stan_pracy ;Przenies mlodsza czesci rejestru R1 (R1L) do @stan_pracy.

;Zapamietanie nowego stanu pracy.

MOV.B #4BH,R0H ;Przenies wartosc #4BH do starszej czesci rejestru R0 (R0H)

BSR GOTO_X_Y ;Wywolaj GOTO_X_Y. Ustawia kursor na wyswietlaczu w pozycji

;wskazanej przez rejestr R0H

MOV.L #NAPIS_STOP,ER1 ;Przenies dlugie slowo bedace lancuchem znakow o wartosci

;#NAPIS_STOP do rejestru ER1

BSR WYSLIJ_TEKST ;Wywolaj WYSLIJ_TEKST. Wyprowadza lancuch znakow o

;adresie poczatkowym ER1 na wyswietlacz

BSR STOP_STER_TYR ;Wywolaj podprogram STOP_STER_TYR realizujacy zatrzymanie

;obslugi sterowania tyrystorami

RTS ;Powrot z podprogramu

PLUS:

MOV.W @WARTOSC_IZAD,R0 ;Przenies zawartosc @WARTOSC_IZAD do rejestru R0

CMP.W #0,R0 ;Porownaj wartosc #0 z zawartoscia rejestru R0. Porownanie z dolna

;granica przedzialu wynoszaca 0

BEQ KONIEC ;Jezeli porownanie spelnione to przejdz do KONIEC

INC.W #1,R0 ;W przeciwnym wypadku inkrementuj o wartosc #1 zawartosc

;rejestru R0

CMP.W #100,R0 ;Porownaj wartosc #100 z zawartoscia rejestru R0. Porownanie z

;gorna granica przedzialu wynoszaca 100

BEQ KONIEC ;Jezeli porownanie spelnione to przejdz do KONIEC

MOV.W R0,@WARTOSC_IZAD ;W przeciwnym wypadku przenies zawartosc rejestru R0 do

;@WARTOSC_IZAD. Zapamietanie nowej wartosci zadanej pradu

BSR BIN_BCD_IZAD ;Wywolaj BIN_BCD_IZAD

RTS ;Powrot z podprogramu

MINUS:

MOV.W @WARTOSC_IZAD,R0 ;Przenies zawartosc @WARTOSC_IZAD do rejestru R0

CMP.W #100,R0 ;Porownaj wartosc #100 z zawartoscia rejestru R0. Porownanie z

;gorna granica przedzialu wynoszaca 100

BEQ KONIEC ;Jezeli porownanie spelnione to przejdz do KONIEC

DEC.W #1,R0 ;W przeciwnym wypadku dekrementuj o wartosc #1 zawartosc

;rejestru R0

CMP.W #0,R0 ;Porownaj wartosc #0 z zawartoscia rejestru R0. Porownanie z dolna

;granica przedzialu wynoszaca 0

BEQ KONIEC ;Jezeli porownanie spelnione to przejdz do KONIEC

MOV.W R0,@WARTOSC_IZAD ;W przeciwnym wypadku przenies zawartosc rejestru R0 do

;@WARTOSC_IZAD. Zapamietanie nowej wartosci zadanej pradu

BSR BIN_BCD_IZAD ;Wywolaj BIN_BCD_IZAD

RTS ;Powrot z podprogramu

KONIEC:

RTS ;Powrot z podprogramu

;---------------------------Procedura inicjalizacji systemu przerwan----------------------------------------------------------

INICJALIZACJA_PRZERWAN:

BCLR #2,@ITU_TSTR ;Zatrzymaj licznik 2 (strona 319)

MOV.B #10100011B,R0L ;Przenies wartosc #10100011B do mlodszej czesci rejestru R0 (R0L)

MOV.B R0L,@ITU_TCR2 ;Ustaw zrodlo zerowania przez GRA i preskaler/8 (strona 334)

MOV.W #2000,R0 ;Przenies wartosc #2000 do rejestru R0

MOV.W R0,@ITU_GRA2 ;Przenies zawartosc rejestru R0 do rejestru @ITU_GRA2 w celu

;ustawnienia wartosci zerowania

MOV.B #10001000B,R0L ;Przenies wartosc #10001000B do mlodszej czesci rejestru R0 (R0L)

MOV.B R0L,@ITU_TIOR2 ;Ustaw funkcje GRB i GRA w rejestrze @ITU_TIOR (strona 337)

MOV.B #11111001B,R0L ;Przenies wartosc #11111001B do mlodszej czesci rejestru R0 (R0L)

MOV.B R0L,@ITU_TIER2 ;Odblokuj przerwanie od operacji porownania z kanalem A (str. 341)

BSET #2,@ITU_TSTR ;Odblokuj prace licznika 2

ANDC #7FH,CCR ;Wpisz #7FH do rejestru kodu

RTS ;Powrot z podprogramu

STER_TYR:

BCLR #0,@ITU_TSTR ;Zatrzymaj licznik 0 (strona 319)

MOV.B #10001000B,R0L ;Przenies wartosc #10001010B do mlodszej czesci rejestru R0 (R0L)

MOV.B R0L,@ITU_TIOR0 ;Ustaw funkcje GRB i GRA w rejestrze @ITU_TIOR (strona 337).

;Licznik 0 dokonuje porownania z GRA

MOV.W @WART_AC,R1 ;Odczytaj zawartosc @WART_AC i przenies do rejetru

;pomocniczego R1

MOV.L #1666667,ER0 ;Przenies wartosc #1666667 do rejetru ER0

DIVXU.W R1,ER0 ;Podziel zawartosc rejestru ER0 przez wartosc zapisana w rejestrze

;R1. Wynik w R0

MOV.W R0,@ITU_GRA0 ;Przenies wynik dzielenia do rejestru @ITU_GRA0 w celu

;ustawnienia wartosci zliczania

MOV.B #10100011B,R0L ;Przenies wartosc #10100011B do mlodszej czesci rejestru R0 (R0L)

MOV.B R0L,@ITU_TCR0 ;Ustaw zrodlo zerowania przez GRA i preskaler 8 (strona 334)

MOV.B #11111001B,R0L ;Przenies wartosc #11111001B do mlodszej czesci rejestru R0 (R0L)

MOV.B R0L,@ITU_TIER0 ;Odblokuj przerwanie od operacji porownania z kanalem A (str. 341)

MOV.B #0,R1L ;Wyzeruj mlodsza czesc rejestru R1 (R1L)

MOV.B R1L,@PADR ;Ustaw wartosc poczatkowa portu @PADR na wartosc 0. @PADR

;przechowuje dane wyjsciowe TPC

MOV.B #00111111B,R0L ;Przenies wartosc #00111111B do mlodszej czesci rejestru R0 (R0L)

MOV.B R0L,@PADDR ;Ustaw funkcje pinow portu A na 6 wyjsc

MOV.B R0L,@TPC_NDERA ;Odblokuj wyjsciowe grupy 0 i 1 ukladu TPC

MOV.B #11110000B,R0L ;Przenies wartosc #11110000 do mlodszej czesci rejestru R0 (R0L)

MOV.B R0L,@TPC_TPCR ;Ustaw bity w rejestrze @TPC_TPCR. Ustawienie grupy 0 i grupy 1

BSET #0,@ITU_TSTR ;Odblokuj prace licznika 0 (strona 319)

RTS ;Powrot z podprogramu

STOP_STER_TYR:

BCLR #0,@ITU_TSTR ;Zatrzymaj licznik 0 (strona 319)

MOV.B #0,R1L ;Wyzeruj mlodsza czesc rejestru R1 (R1L)

MOV.B R1L,@PADDR ;Ustaw funkcje pinow portu A na wejscia

MOV.B #11111000B,R0L ;Przenies wartosc #11111000B do mlodszej czesci rejestru R0 (R0L)

MOV.B R0L,@ITU_TIER0 ;Zablokuj przerwanie od operacji porownania z kanalem A (str. 341)

MOV.B #11111111B,R0L ;Przenies wartosc #11111111 do mlodszej czesci rejestru R0 (R0L)

MOV.B R0L,@TPC_TPCR ;Ustaw bity w rejestrze @TPC_TPCR. Anulowanie ustawienia

;grupy 0 i grupy 1 (strona 794)

MOV.W #0,R0 ;Wyzeruj zawartosc rejestru R0

MOV.W R0,@ITU_GRA0 ;Przenies zawartosc rejestru R0 do rejestru @ITU_GRA0 w celu

;jego wyzerowania

BSET #0,@ITU_TSTR ;Odblokuj prace licznika 0 (strona 319)

RTS ;Powrot z podprogramu

;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

;---------------------------PODPROGRAMY OBSLUGI PRZERWAN------------------------------------------------------

;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

;---------------------------Podprogram od licznika 2-----------------------------------------------------------------------------

PRZERWANIE_TIMER2:

PUSH.L ER0 ;Odloz na stosie zawartosc rejestru ER0

MOV.B @ITU_TSR2,R0L ;Odczytaj zawartosc rejestru @ITU_TSR2 do mlodszej czesci

;rejestru R0 (R0L) (strona 339)

MOV.B #0F8H,R0L ;Przenies wartosc #0F8H do mlodszej czesci rejestru R0 (R0L)

MOV.B R0L,@ITU_TSR2 ;Skasuj sygnalizacje przerwania

MOV.L #STAN_STEROWNIKA,ER0 ;Przenies wartosc #STAN_STEROWNIKA do rejestru ER0

BSET #7,@ER0 ;Zasygnalizuj ze minela 1 ms poprzez ustawienie #7 bitu

POP.L ER0 ;Odczytaj ze stosu zawartosc rejestru ER0

RTE ;Powrot z podprogramu obslugi przerwania

;---------------------------Koniec podprogramu od licznika 2------------------------------------------------------------------

PRZER_IMIA:

PUSH.L ER0 ;Odloz na stosie zawartosc rejestru ER0

PUSH.L ER1 ;Odloz na stosie zawartosc rejestru ER1

MOV.B @ITU_TSR0,R0L ;Odczytaj zawartosc rejestru @ITU_TSR0 do mlodszej czesci

;rejestru R0 (R0L) (strona 339)

MOV.B #0F8H,R0L ;Przenies wartosc #0F8H do mlodszej czesci rejestru R0 (R0L)

MOV.B R0L,@ITU_TSR0 ;Skasuj sygnalizacje przerwania

MOV.W @WART_AC,R1 ;Przenies ostatnio zachowana wartosc odczytana z przetwornika AC

;do rejestru R1

MOV.L #1666667,ER0 ;Przenies wartosc #1666667 do rejestru ER0

DIVXU.W R1,ER0 ;Podziel zawartosc rejestru ER0 przez zawartosc rejestru R1. Wynik

;w R0

MOV.W R0,@ITU_GRA0 ;Przenies wynik zapisany w R0 i uaktualnij wartosc w rejestrze

;@ITU_GRA0

MOV.B @Index_tablicy,R0L ;Odczytaj aktualny indeks tablicy (@Index_tablicy) i zapisz go w

;mlodszej czesci rejestru R0 (R0L)

EXTU.W R0 ;Wyzeruj starsza czesc rejestru R0

EXTU.L ER0 ;Wyzeruj starsza czesc rejestru ER0

MOV.B @(Tab_tyr,ER0),R1L ;Tryb adresowania polegajacy na odczytaniu adresu poczatku tablicy

;i dodaniu do niego aktualnej wartosci indeksu tablicy

;Odczytaj z wyliczonego adresu aktualnej komorki tablicy jej

;zawartosc i przepisz do mlodszej czesci rejestru R1 (R1L)

MOV.B R1L,@TPC_NDRA1 ;Ustaw kolejne dane wyjsciowe wczesniej odczytane z tablicy

INC.B R0L ;Inkrementuj o 1 zawartosc mlodszej czesci rejestru R0 (R0L)

MOV.B R0L,@Index_tablicy ;Uaktualnij wartosc zmniennej @Index_tablicy

CMP.B #00001100b,R0L ;Porownaj wartosc #12 z zawartoscia mlodszej czesci rejestru R0

BEQ ZEROWANIE ;Jezeli porownanie spelnione przejdz do ZEROWANIE. Jezeli nie

;spelnione wykonuj program dalej

POP.L ER1 ;Odczytaj ze stosu zawartosc rejestru ER1

POP.L ER0 ;Odczytaj ze stosu zawartosc rejestru ER0

RTE ;Powrot z podprogramu obslugi przerwania

ZEROWANIE:

MOV.B #0,R1L ;Wyzeruj zawartosc mlodszej czesci rejestru R1 (R1L)

MOV.B R1L,@Index_tablicy ;Wyzeruj zawartosc zmniennej @Index_tablicy

POP.L ER1 ;Odczytaj ze stosu zawartosc rejestru ER1

POP.L ER0 ;Odczytaj ze stosu zawartosc rejestru ER0

RTE ;Powrot z podprogramu obslugi przerwania

;---------------------------DANE W PAMIECI STALEJ------------------------------------------------------------------------

NAPIS_STOP: DC.B 'STOP $'

NAPIS_START: DC.B 'START$'

Izad: DC.B 'Izad=0.$'

Fzad: DC.B 'f= . Hz$'

Tab_tyr: DC.B 00100010B, 00100010B, 00100001B, 00100001B, 00010001B,

00010001B, 00010100B, 00010100B, 00001100B, 00001100B, 00001010B,

00001010B

;******************************************************************************************

;---------------------------DEKLARACJE URZADZEN WE/WY---------------------------

; lstout+

KLAW EQU 020001H ;wejscia klawiatury

;b0 - weklaw1

;b1 - weklaw2

;b2 - weklaw3

;b3 - weklaw4

;b4 - weklaw5

;b5 - weklaw6

;b6 - weklaw7

ASEG 060000H ;OBSZAR eeprom-A DO ADRESU A1FFFFH

BAJT_0 DS.B 1 ;przykladowa deklaracja bajtu w obszarze pamieci EEPROM

;******************************************************************

;DEKLARACJE DANYCH W PAMIECI RAM

ASEG 0FEF20H ;ram wewnetrzny ( w obszarze 0fef20h do 0fff0fh)

STAN_STEROWNIKA DS.B 1 ;b7-'1'-minela 1 ms

cyfra3 DS.B 1 ;Deklaracja cyfry 3 dla f

cyfra2 DS.B 1 ;Deklaracja cyfry 2 dla f

cyfra1 DS.B 1 ;Deklaracja cyfry 1 dla f

cyfra3I DS.B 1 ;Deklaracja cyfry 3 dla pradu

cyfra2I DS.B 1 ;Deklaracja cyfry 2 dla pradu

cyfra1I DS.B 1 ;Deklaracja cyfry 1 dla pradu

stan_pracy DS.B 1 ;Deklaracja zmiennej przechowujacej informacje o stanie pracy

EVEN

LICZ_1SEK DS.W 1 ;Licznik 1 sekundowy

WARTOSC_ZAD DS.W 1 ;Wartosc zadana dla f

WARTOSC_IZAD DS.W 1 ;Wartosc zadana dla pradu

Index_tablicy DS.W 1 ;Deklaracja zmiennej przechowujacej informacje o indeksie tablicy

WART_AC DS.W 1 ;Deklaracja zmiennej przechowujacej informacje o wartosci z przetwornika AC

END

  1. Schematy blokowe ilustrujące działanie programu:

0x01 graphic

Rys. 1. Algorytm inicjalizacji stanowiska0x01 graphic

Rys. 2. Algorytm programu głównego

0x01 graphic

Rys. 3. Algorytm podprogramu BIN_BCD (po lewej) i BIN_BCD_IZAD (po prawej)

0x01 graphic

Rys. 4. Algorytm podprogramu przetwornika AC

0x01 graphic

Rys. 5. Algorytm podprogramu STER_TYR (po lewej) i STOP_STER_TYR (po prawej)


0x01 graphic

Rys. 6. Algorytm podprogramu obsługi przerwania PRZER_IMIA (po lewej), PRZERWANIE_TIMER2 (środek) oraz obsługi INICJALIZACJA_PRZERWAN


0x01 graphic

Rys. 7. Algorytm obsługi klawiatury


  1. Opis działania programu:

Zadaniem zawartym w projekcie było zaprogramowanie układu bazującego na mikrokontrolerze Renesas (Hitachi) H8/3048F do sterowania i regulacji 3-fazowym falownikiem prądu. Pierwszym krokiem był restart oraz przygotowanie układu mikrokontrolera do pracy. Wyprowadzono zgodnie z założeniami projektu zadane napisy na odpowiednich polach wyświetlacza (rys.1.). Następnie wywołano podprogramy realizujące główne zadanie (rys.2.).

Podprogramy BIN_BCD oraz BIN_BCD_IZAD (rys.3.) realizują zamianę wartości z kodu heksadecymalnego na kod dziesiętny oraz zapewniają poprawne wypisanie otrzymanych wyników na wyświetlaczu.

Podprogram BIN_KLAW (rys.7.) realizuje obsługę klawiatury składającej się w zadaniu z 4 przycisków odpowiadających kolejno za START, STOP sterowania tyrystorów oraz za zwiększanie i zmniejszanie wartości zadawanego prądu. Klawisz STARTZ wywołuje podprogram STER_TYR (rys.5.), który steruje tyrystorami w sposób sekwencyjny poruszając się za pomocą zmiennej globalnej @Index_tablicy po utworzonej wcześniej tablicy @Tab_tyr. Tablica ta utworzona została z 12 elementów (po 2 takie same elementy) wybieranych w sposób nieprzerwany kolejno po sobie. Liczba 12 elementów tablicy związana jest z ograniczeniem maksymalnej wartości jaką można wpisać do rejestru @ITU_GRA (rejestr 16-bitowy, 65536). Sekwencja przełączeń tyrystorów realizowana jest za pomocą przerwania od układu ITU, którego częstotliwość zależna jest zgodnie z założeniami od potencjometru P2. Podprogram obsługi przetwornika AC przedstawiono na rys.4. W podprogramie tym zrealizowano ograniczenie minimalnej i maksymalnej częstotliwości oraz, zmianę co 0.2 Hz. Zwiększając wartość zadawaną z przetwornika AC zwiększa się aktualna wartość częstotliwości wyjściowej tyrystorów. Klawisz STOPZ wywołuje podprogram STOP_STER_TYR (rys.5.), który zatrzymuje działanie podprogramu STER_TYR sterowanego za pomocą układu TPC.

  1. Przebiegi czasowe ilustrujące działanie programu:

0x01 graphic

Rys. 8. Przebiegi na „górnych” tyrystorach

0x01 graphic

Rys. 9. Przebiegi na tyrystorze 1 (żółty), 3 (fiolet) i 6 (zielony)

Zmierzone przebiegi rzeczywiste zamieszczono na powyższych rysunkach. Otrzymane przebiegi zgadzają się z założeniami wstępnymi opracowanymi na podstawie wiadomości teoretycznych. Rys.8. przedstawia przebiegi na „górnych” tyrystorach. Przebiegi te są przesunięte względem siebie o 120º. Częstotliwość zmierzona za pomocą oscyloskopu odpowiadała zadanej częstotliwości z potencjometru, która wynosiła 50Hz. Rys.9. przedstawia przebiegi z dwóch górnych tyrystorów (żółty, fioletowy) oraz jednego dolnego (zielony). Przebieg na zaworze dolnym jest przesunięty o 60º względem górnego(żółtego). Przesunięcie to zapobiega występowaniu zwarć doziemnych w falowniku.

2



Wyszukiwarka

Podobne podstrony:
Falownik-sprawko, Politechnika Poznańska (PP), Elementy i układy automatyzacji maszyn, Laboratorium,
falownik MSI, Sprawka, silniki
Tranzystorowy falownik rownolegly, Sprawka, energoelektronika
Ćwiczenie 19 97, Ogrodnictwo, Ogrodnictwo UP Wro, ROK I, semestr I, agrofizyczka, sprawka
napiecie powierzchniowe 97-2003, Ogrodnictwo, Ogrodnictwo UP Wro, ROK I, semestr I, agrofizyczka, s
Sprawko z oznaczania chlorków w wodzie, UP Wrocław, IŚ I SEM, Chemia
S up prezentacja 1 dobˇr przekroju
Biskupin
falowniki wentylatory
El sprawko 5 id 157337 Nieznany
LabMN1 sprawko
biskupi sad dduchowny w opolu
All Flesh Must Be Eaten Two Rotted Thumbs Up
Budowa samolotow PL up by dunaj2
Obrobka cieplna laborka sprawko
Ściskanie sprawko 05 12 2014
1 Sprawko, Raport wytrzymałość 1b stal sila
Jak korzystać ze zdolności parapsychicznych [up by Esi]
Instrukcja do ćw 06 Sterowanie pracą silnika indukcyjnego za pomocą falownika

więcej podobnych podstron