HF8V HF8V ================================== | JĘZYK HAVR I PROGRAMY HAVR | ================================== Język programowania HAVR Umożliwia szybkie kompilowanie prostych programów i sterowników umieszczonych w pamięci RAM. Dotychczas został uruchomiony na systemach cyfrowych HF-6048, HF-6030 i HF-6050. Ze względu na różnice hardwarowe powyższych systemów wersje języka HAVR nieznacznie się różnią ilością dostępnych instrukcji (inne porty i rozmiary RAM). PODSTAWOWE PARAMETRY: WERSJA JĘZYKA HAVR8 : 2.38 HF-6048 ATMEGA16 HAVR8 : 3.38 HF-6030 ATMEGA8 HAVR8 : 4.38 HF-6050 ATMEGA128 HAVR8 : 4.38 HF-12258 ATMEGA64 HAVR8 : 4.38 HF-12268 ATMEGA128 HAVR8 : 4.38 HF-12269 ATMEGA64 HAVR6 : 5.40 HF-60215 ATTINY13 HAVR8 ----- ADRES STARTOWY HAVR8 : 0x100 ADRES KOŃCOWY HAVR8 : 0x1FF PRZESTRZEŃ ADRESOWA : 256 bajt (8 b) LICZNIK ROZKAZÓW : XL CZAS PRZEBIEGU PĘTLI INTERPRETERA HAVR8 : HF-6048: około 1.6 us/instrukcja (CLK=12 MHz) ILOŚĆ DOSTĘPNYCH INSTRUKCJI : HF-6048: 72 : HF-6030: 70 : HF-6050: 80 : HF-6128: 80 : HF-6158: 80 : HF-12269: 80 ILOŚĆ DOSTĘPNYCH MAKROINSTRUKCJI : 37 (tylko zewnętrzny kompilator np. FASMW) ZESTAW INSTRUKCJI HAVR8 JEST NIEKOMPATYBILNY Z HAVR6 HAVR6 ----- ADRES STARTOWY HAVR6 : 0x60 ADRES KOŃCOWY HAVR6 : 0x9F PRZESTRZEŃ ADRESOWA : 64 bajt (6 b) LICZNIK ROZKAZÓW : XL CZAS PRZEBIEGU PĘTLI INTERPRETERA HAVR6 : HF-60215: .../instrukcja (CLK=8 MHz) ILOŚĆ DOSTĘPNYCH INSTRUKCJI : HF-60215: 58 ILOŚĆ DOSTĘPNYCH MAKROINSTRUKCJI : 37 (tylko zewnętrzny kompilator np. FASMW) ZESTAW INSTRUKCJI HAVR6 JEST NIEKOMPATYBILNY Z HAVR8 REJESTRY SYSTEMOWE HAVR: ========================================================================================= A r16 rejestr główny, wiele instrukcji przyjmuje i zwraca tu parametry B r17 rejestr roboczy 2, drugi rejestr w niektórych instrukcjach algebraicznych C r18 rejestr roboczy 3, licznik (DBNE/LOOP) D r19 rejestr roboczy 4 E r20 rejestr roboczy 5 ========================================================================================= ADRESOWANIE HAVR8 posiada tylko jeden sposób adresowania: adresowanie 8-bitowe, absolutne, bardzo łatwe do kompilacji. Z tego powodu nie ma potrzeby obliczania adresów. LICZNIK ROZKAZÓW Jako licznik rozkazów HAVR6/8 przyjęty został rejestr indeksowy X. O ile jądro systemu operacyjnego może używać tego indeksu to wskazane jest aby sterowniki systemowe które mogą być użyte w programach HAVR zwracały ten rejestr nienaruszony. W razie próby użycia indeksu X przez instrukcję ST0 lub WRI zwracany jest błąd 0xDC (HAVR_PC_VIOLATION). INSTRUKCJE HAVR8 ========================================================================================================================================== INSTRUKCJA KOD PARAM OPIS (typ parametru) UWAGI ========================================================================================================================================== START 0xAA 0 Musi być umieszczony na początku programu END 0x00 0 Musi być umieszczony na końcu programu LDA 0x01 1 Ładuje rejestr A LDB 0x02 1 Ładuje rejestr B LDC 0x03 1 Ładuje rejestr C LDD 0x04 1 Ładuje rejestr D LDE 0x05 1 Ładuje rejestr E PHA 0x06 0 Odkłada rejestr A na stos PPA 0x07 0 Ściąga rejestr A ze stosu PHB 0x08 0 Odkłada rejestr B na stos PPB 0x09 0 Ściąga rejestr B ze stosu PHC 0x0A 0 Odkłada rejestr C na stos PPC 0x0B 0 Ściąga rejestr C ze stosu PHD 0x0C 0 Odkłada rejestr D na stos PPD 0x0D 0 Ściąga rejestr D ze stosu PHE 0x0E 0 Odkłada rejestr E na stos PPE 0x0F 0 Ściąga rejestr E ze stosu NOP 0x10 0 Nie wykonuje żadnej instrukcji RPA 0x11 0 Odczytuje PORTA, dana jest wystawiana w rejestrze A [**] RPB 0x12 0 Odczytuje PORTB, dana jest wystawiana w rejestrze A [*] RPC 0x13 0 Odczytuje PORTC, dana jest wystawiana w rejestrze A RPD 0x14 0 Odczytuje PORTD, dana jest wystawiana w rejestrze A [**] WPA 0x15 0 Zapisuje PORTA, dana musi być załadowana do rejestru A [**] WPB 0x16 0 Zapisuje PORTB, dana musi być załadowana do rejestru A [*] WPC 0x17 0 Zapisuje PORTC, dana musi być załadowana do rejestru A WPD 0x18 0 Zapisuje PORTD, dana musi być załadowana do rejestru A [**] ADD 0x19 0 Dodaje rejestry A i B, (A<- A + B) SUB 0x1A 0 Odejmuje rejestry A i B, (A<- A - B) AND 0x1B 0 Wykonuje AND na rejestrach A i B, (A<-A AND B) OR 0x1C 0 Wykonuje OR na rejestrach A i B (A<-A OR B) XOR 0x1D 0 Wykonuje XOR na rejestrach A i B (A<-A XOR B) NEG 0x1E 0 Wykonuje NEG na rejestrze A (A<- NEG A) NOT 0x1F 0 Wykonuje NOT na rejestrze A (A<- NOT A) LSL 0x20 0 Wykonuje LSL rejestrze A (A<- LSL A) LSR 0x21 0 Wykonuje LSR na rejestrze A (A<- LSR A) DEC 0x22 0 Wykonuje zmniejszenie o 1 rejestru A (A<- (A-1)) INC 0x23 0 Wykonuje zwiększenie o 1 rejestru A (A<- (A+1)) INT 0x24 1 Przerwanie softwarowe, procedura z tabeli procedur I2CRD 0x25 0 Odczyt magistrali szeregowej I2C, wy: A I2CIT 0x26 0 Inicjacja magistrali szeregowej I2C I2CST 0x27 1 Start magistrali szeregowej I2C I2CWR 0x28 1 Zapis do magistrali szeregowej I2C I2CSP 0x29 0 Zakończenie nadawania na magistrali szeregowej I2C KBD 0x2A 0 Czeka na wciśniecie klawisza i zwraca jego kod w rejestrze A CPBNE 0x2B 2 ComPare, Branch if Not Equal , - porównuje byte z rejestem A, skacze pod wskazany adres jeśli nierówne CALL 0x2C 1 Wywołanie funkcji RET 0x2D 0 Powrót z funkcji DBNE, LOOP 0x2E 1 Decrease, Branch if Not Equal - zmniejsza rejestr C o 1 i skacze pod wskazany adres jeśli rejestr C jest różny od zera JMP 0x2F 1 Skok pod adres podprogramu HAVR GOTO 0x30 2 Skok pod adres pamięci programu FLASH , DEL20U 0x31 0 Delay 20us DEL100U 0x32 0 Delay 100us DEL1M 0x33 0 Delay 1ms ST0 0x34 1 Ładuje komórkę pamieci RAMSEG0 z rejestru A DEL10M 0x35 0 Delay 10ms DEL50M 0x36 0 Delay 50ms DEL100M 0x37 0 Delay 100ms DEL200M 0x38 0 Delay 200ms DEL500M 0x39 0 Delay 500ms DEL1 0x3A 0 Delay 1s DBG 0x3B 0 Wyświetla HAVR PC, rejestry A-E i zatrzymuje wykonanie programu aż do wciśnięcia dowolnego klawisza z klawiatury WRT 0x3C 1 Wyświetla tekst z pamięci programu HAVR, tekst musi być ograniczony zerem WRS 0x3D 1 Zapisuje kod zwracany przez program HAVR pod adres RAMSEG0 0xE2 (inaczej 0 zwracane jest domyślnie), INS 0x3E 0 Wprowadza bajt w formacie hex, wy: A DSP 0x3F 0 Wyświetla bajt w formacie hex, we: A LD0 0x40 1 Odczytuje RAMSEG0 do rejestru A WRI 0x41 2 Zapisuje obszar RAMSEG0, , UWAGA: adresy 0x1A i 0x1B nie mogą być użyte LD 0x42 1 Ładuje komórkę RAMSEG1 wskazaną przez adres do rejestru A ST 0x43 1 Składuje rejestr A pod wskazany adres RAMSEG1 LD2 0x44 1 Ładuje komórkę RAMSEG2 wskazaną przez adres do rejestru A ST2 0x45 1 Składuje rejestr A pod wskazany adres RAMSEG2 LD3 0x46 1 Ładuje komórkę RAMSEG3 wskazaną przez adres do rejestru A ST3 0x47 1 Składuje rejestr A pod wskazany adres RAMSEG3 CPBLO 0x48 2 ComPare, Branch if LOwer , - porównuje byte z rejestem A, skacze pod wskazany adres jeśli mniejszy INSTRUKCJE TYLKO W HF-6050 (ATMEGA64, ATMEGA128 i większe) RPE 0x49 0 Odczytuje PORTE, dana jest wystawiana w rejestrze A [***] RPF 0x4A 0 Odczytuje PORTF, dana jest wystawiana w rejestrze A [***] WPE 0x4B 0 Zapisuje PORTE, dana musi być załadowana do rejestru A [***] WPF 0x4C 0 Zapisuje PORTF, dana musi być załadowana do rejestru A [***] LDX 0x4D 2 Ładuje komórkę RAM wskazaną przez 16-bitowy adres do rejestru A, , [***] STX 0x4E 2 Składuje rejestr A do komórki RAM wskazanej przez 16-bitowy adres, , [***] ========================================================================================================================================== <> - parametr wymagany [*] - instrukcja niedostępna w HF-6048 (port systemowy) [**] - instrukcja niedostępna w HF-6030 (port systemowy) [***]- instrukcja dostępna tylko w HF-6050 i wersjach 4.xx STATYSTYKA INSTRUKCJI (wersja dla HF-6048) =========================== ROZMIAR INSTR % =========================== 1 bajtowe 47 67% 2 bajtowe 21 29% 3 bajtowe 3 4% =========================== RAZEM: 71 100% =========================== 2/3 instrukcji jest jednobajtowa co daje bardzo wydajny kod. MAKROINSTRUKCJE HAVR ==================== Makroinstrukcje działają tylko w makroasemblerze HAVR. Pozwalają ma uproszczenie pisania kodu. Preferowany asembler FASMW ver. 1.47. ========================================================================================================================================== INSTRUKCJA KOD PARAM OPIS (typ parametru) UWAGI ========================================================================================================================================== CLRA 0100 0 Zeruje rejestr A CLRB 0200 0 Zeruje rejestr B CLRC 0300 0 Zeruje rejestr C CLRD 0400 0 Zeruje rejestr D CLRE 0500 0 Zeruje rejestr E MOVAB 0807 0 Przesuwa daną z rejestru B do A MOVAC 0A07 0 Przesuwa daną z rejestru C do A MOVAD 0C07 0 Przesuwa daną z rejestru D do A MOVAE 0E07 0 Przesuwa daną z rejestru E do A MOVBA 0609 0 Przesuwa daną z rejestru A do B MOVBC 0A09 0 Przesuwa daną z rejestru C do B MOVBD 0C09 0 Przesuwa daną z rejestru D do B MOVBE 0E09 0 Przesuwa daną z rejestru E do B MOVCA 060B 0 Przesuwa daną z rejestru A do C MOVCB 080B 0 Przesuwa daną z rejestru B do C MOVCD 0C0B 0 Przesuwa daną z rejestru D do C MOVCE 0E0B 0 Przesuwa daną z rejestru E do C MOVDA 060D 0 Przesuwa daną z rejestru A do D MOVDB 080D 0 Przesuwa daną z rejestru B do D MOVDC 0A0D 0 Przesuwa daną z rejestru C do D MOVDE 0E0D 0 Przesuwa daną z rejestru D do D MOVEA 060F 0 Przesuwa daną z rejestru A do E MOVEB 080F 0 Przesuwa daną z rejestru B do E MOVEC 0A0F 0 Przesuwa daną z rejestru C do E MOVED 0C0F 0 Przesuwa daną z rejestru D do E POPALL 0F0D0B0907 0 Ściąga ze stosu wszystkie rejestry PUSHALL 06080A0C0E 0 Odkłada na stos wszystkie rejestry SERA 01FF 0 Ustawia rejestr A SERB 02FF 0 Ustawia rejestr B SERC 03FF 0 Ustawia rejestr C SERD 04FF 0 Ustawia rejestr D SERE 05FF 0 Ustawia rejestr E //SPI0 01##2430 1 Protokół komunikacyjny SPI0 <##:byte> UWAGA: SYSTEM DEPENDENT! //SPI3 01##2431 1 Protokół komunikacyjny SPI3 <##:byte> UWAGA: SYSTEM DEPENDENT! FOR 8 bajt 2 Pętla FOR licznik w C, dekrementacja , XCHGAB 06080709 0 Zamienia rejestry A i B XCHGAC 060A070B 0 Zamienia rejestry A i C XCHGAD 060C070D 0 Zamienia rejestry A i D XCHGAE 060E070F 0 Zamienia rejestry A i E XCHGBA 06080709 0 Zamienia rejestry B i A XCHGBC 080A090B 0 Zamienia rejestry B i C XCHGBD 080C090D 0 Zamienia rejestry B i D XCHGBE 080E090F 0 Zamienia rejestry B i E XCHGCA 060A070B 0 Zamienia rejestry C i A XCHGCB 080A090B 0 Zamienia rejestry C i B XCHGCD 0A0C0B0D 0 Zamienia rejestry C i D XCHGCE 0A0E0B0F 0 Zamienia rejestry C i E XCHGDA 060C070D 0 Zamienia rejestry D i A XCHGDB 080C090D 0 Zamienia rejestry D i B XCHGDC 0A0C0B0D 0 Zamienia rejestry D i C XCHGDE 0C0E0D0F 0 Zamienia rejestry D i E XCHGEA 060E070F 0 Zamienia rejestry E i A XCHGEB 080E090F 0 Zamienia rejestry E i B XCHGEC 0A0E0B0F 0 Zamienia rejestry E i C XCHGED 0C0E0D0F 0 Zamienia rejestry E i D TYLKO HF-6030: PORT0_WRT 411C##24B3 1 Zapis do PORT0 (SLOT A), <##> - dana do zapisania PORT1_WRT 411D##24B4 1 Zapis do PORT1 (SLOT A), <##> - dana do zapisania ========================================================================================================================================== ADRESY SYSTEMOWE: ========================================================================================================================================== 0x00 ENTRY_POINT konieczny Wykonanie programu zaczyna się zawsze od adresu 0, musi tu być kod START 0xAA 0x80 FUNC_SEG opcjowalny Typowy adres przechowywania funkcji (0x80-0xCF) 0xD0 DATA_SEG opcjowalny Typowy adres przechowywania danych (0xD0-0xEB) 0xEC EXTRA_CODE_SEGMENT opcjowalny Adres bloku RAMSEG w którym znajduje się dodatkowy segment kodu (zero jeśli nie ma) 0xED EXTRA_DATA_SEGMENT opcjowalny Adres bloku RAMSEG w którym znajduje się dodatkowy segment danych (zero jeśli nie ma) 0xEE HAvR_VERSION_L konieczny Wersja kompilatora HAVR (minor) 0xEF HARDWARE_COMPAT konieczny Informacja o kompaktybilności hardwarowej 0xF0 FILE_NAME opcjowalny Adres nazwy pliku kompatybilny z systemem plików THFS. Nazwa pliku może mieć maksymalnie 15 bajtów plus terminator 0 (0xF0-0xFF) Jeśli nazwa pliku nie jest używana pod adres 0xF0 musi być zapisane 0 i zakres 0xF1-0xFF może być wtedy użyty do przechowywania kodu lub danych. ========================================================================================================================================== Informacja o kompaktybilności hardwarowej programu (offset 0xEF) ================================================================ 0x00 nieustalona 0x13 HF-60215 0x28 HF-6128 0x30 HF-6030 0x40 wersja 4.xx 0x48 HF-6048 0x50 HF-6050 0x58 HF-6158 0x68 HF-12268 0x69 HF-12269 0x78 HF-6030 + HF-6048 0x80 HF-6030 + HF-6050 0x98 HF-6050 + HF-6048 0xFF wszystkie systemy ================================================================ BŁĘDY SYSTEMOWE (nadawane i wpisywane do HAVR_ERROR_DEVICE adres 0xE1): =============================================================================================================================== 0x00 NIE MA BŁĘDU zwracany przy poprawnym wykonaniu programu 0x1C HAVR_COMPILER_SUCCESS Kompilacja zakończyła się sukcesem 0xCF HAVR_COMPILATION_FAILURE Kompilacja zakończyła się niepowodzeniem 0xDC HAVR_PC_VIOLATION w instrukcji WRI lub ST0 został użyty adres licznika rozkazów HAVR (0x1A-0x1B) 0xE1 NO_HAVR_PROGRAM załadowany do FTA plik nie jest programem HAVR 0xE2 NO_HAVR_OPCODE błędna instrukcja HAVR 0xEC EXTERNAL_HARDWARE_ERROR_CABLING może być użyty do wykrywania błędów zewnętrznego hardwaru 0xFF UNDEFINED_ERROR zarezerwowane na nieokreślony błąd =============================================================================================================================== SPOSOBY KOMPILACJI PROGRAMÓW HAVR: ================================= 1/ Wbudowany kompilator (uruchomiony w HF-6030, HF-6048, HF-6050) - szybkość kompilacji 2/ Zewnętrzny makroassembler FASMW - najbardziej rozbudowany i wygodny w użyciu 3/ Wprowadzanie kodu maszynowego do RAM - możliwe ale niepraktyczne OBSŁUGA WBUDOWANEGO KOMPILATORA w HF-6030: ========================================= Uruchomienie [VFC]. Po uruchomieniu kompilator nadaje znacznik i czeka na podanie adresu startowego, przy pierwszej kompilacji należy zawsze podać adres 00, kompilator automatycznie przydziela kod START na tej pozycji i kompilator podaje bieżący adres 01. Następnie należy podać żądany mnemonik i nacisnąć SEND. Jeśli kompilator nie jest stanie znaleźć żądanego mnemonika nadaje oraz kod błędu E2, adres nie jest zwiększany. W przeciwnym wypadku allokowany jest kod i kompilator podaje bieżący adres. Jeśli instrukcja ma parametry nadawany jest znacznik

i kompilator czeka na wartość hex. Kompilację kończy podanie mnemonika END. Kompilator potwierdza poprawność kompilacji. Po zakończeniu sesji można bez ograniczeń dopisywać kod w wolnych adresach lub nadpisując istniejący kod (wskazane jest nie wciskanie klawisza RESET ponieważ w niektórych przypadkach może to uszkodzić komórki RAM, choć zwykle RAM jest nienaruszony po resecie). Program HAVR można zapisać funkcją [S] w bieżąco wybranej pamięci (DRIVE1-DRIVE4). Kody maszynowe HAVR można odsłuchać funkcją [V61] a stringi ASCII funkcją [V4A]. Zapis stringów ASCII funkcja [V40]. Znaczniki: - podaj adres - kompilacja zakończona sukcesem

- podaj parametr - podany mnemonik nie znaleziony Wykrywanie błędów Poza błędami syntaktycznymi wbudowany kompilator nie wykrywa żadnych innych błędów w odróżnieniu od makrokompilatora FASMW i interpretera. OBSŁUGA WBUDOWANEGO KOMPILATORA w HF-6048: ========================================= Wybrać funkcję [F03] i wcisnąć ENTER. Po uruchomieniu kompilator podaje do wybrania adres startowy asemblacji, przy pierwszej kompilacji należy pozostawić podany adres 0x00, kompilator automatycznie przydziela kod START na tej pozycji. Instrukcje wybiera się przyciskami UP i DWN i zatwierdza ENTER. Po zakończeniu kompilacji (kodem END) można zapamiętać adres końcowy i przy kolejnym uruchomieniu kompilatora kontynuować od tego miejsca. Sektor danych i FILE_NAME można zapisać funkcją WRT_RAM. Wykrywanie błędów Poza błędami syntaktycznymi wbudowany kompilator nie wykrywa zadnych innych błędów w odróżnieniu od makrokompilatora FASMW i interpretera. URUCHAMIANIE PROGRAMÓW HAVR =========================== SYSTEM HF-6030 ============== Program należy najpierw załadować do pamięci RAMSEG1 (FTA) z pamięci masowej [L] lub skompilować [VFC]. Uruchomianie programu [G]. [G] - wykonaj program HAVR [L] - załaduj FTA z bieżącego DRIVE [S] - zachowaj FTA na bieżącym DRIVE [VFC] - uruchom kompilator HAVR Wykrywanie błędów ----------------- W obecnej wersji interpreter HAVR wykrywa następujące błędy: 0xDB HAVR_BAD_HARDWARE_VERSION zła wersja hardwaru dla tego zestawu instrukcji HAVR 0xDC HAVR_PC_VIOLATION w instrukcji ST0 lub WRI został użyty adres licznika rozkazów HAVR (0x1A-0x1B) 0xE1 NO_HAVR_PROGRAM załadowany do FTA plik nie jest programem HAVR 0xE2 NO_HAVR_CODE dany bajt nie jest poprawnym opkodem HAVR Przy braku błędu interpreter domyślnie zwraca kod 0x00. Kod zwracany można też wymusić za pomocą instrukcji WRS. SYSTEM HF-6048 ============== Program należy najpierw załadować z pamięci [F29] lub skompilować [F03]. Uruchomianie programu [F04]. FUNKCJA 04 - wykonaj program HAVR FUNKCJA 29 - załaduj FTA z EEPROM FUNKCJA 30 - zachowaj FTA w EEPROM Wykrywanie błędów ----------------- W obecnej wersji interpreter HAVR wykrywa następujące błędy: 0xDB HAVR_BAD_HARDWARE_VERSION zła wersja hardwaru dla tego zestawu instrukcji HAVR 0xDC HAVR_PC_VIOLATION w instrukcji ST0 lub WRI został użyty adres licznika rozkazów HAVR (0x1A-0x1B) 0xE1 NO_HAVR_PROGRAM załadowany do FTA plik nie jest programem HAVR 0xE2 NO_HAVR_CODE dany bajt nie jest poprawnym opkodem HAVR Przy braku błędu interpreter domyślnie zwraca kod 0x00. Kod zwracany można też wymusić za pomocą instrukcji WRS. ====================================================================================== NIL SK NIL SK NIL SK NIL SK NIL SK NIL SK NIL SK NIL SK NIL SK NIL SK NIL SK ======================================================================================