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
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.
Założenia do zadania:
częstotliwość pracy 5 … 50 Hz co 0.2 Hz
zadawanie częstotliwości wyjściowej z potencjometry P2
częstotliwość startowa 5 Hz
zadawanie prądu
klawisz 3 - zwiększanie
klawisz 4 - zmniejszanie
start pracy urządzenia - naciśnięcie klawisza 1
stop pracy urządzenia - naciśnięcie klawisza 2
wyświetlacz: na górze `Izad=0.__'
na dole `F=__._Hz', i sygnalizacja stanu pracy: `start' lub `stop'.
sterowanie tyrystorami:
wyjścia portu PA0 … PA5 dla tyrystorów T1 … T6, sterowane za pomocą układu TPC (grupa 0 i 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
Schematy blokowe ilustrujące działanie programu:
Rys. 1. Algorytm inicjalizacji stanowiska
Rys. 2. Algorytm programu głównego
Rys. 3. Algorytm podprogramu BIN_BCD (po lewej) i BIN_BCD_IZAD (po prawej)
Rys. 4. Algorytm podprogramu przetwornika AC
Rys. 5. Algorytm podprogramu STER_TYR (po lewej) i STOP_STER_TYR (po prawej)
Rys. 6. Algorytm podprogramu obsługi przerwania PRZER_IMIA (po lewej), PRZERWANIE_TIMER2 (środek) oraz obsługi INICJALIZACJA_PRZERWAN
Rys. 7. Algorytm obsługi klawiatury
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.
Przebiegi czasowe ilustrujące działanie programu:
Rys. 8. Przebiegi na „górnych” tyrystorach
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