Potrzebujesz pomocy w zrozumieniu mapy pamięci PIC

9

Trochę tła. Używam MPLABx z PicKit2 do programowania różnych typów zdjęć. W tej chwili jest to 16F887. Staram się trzymać łańcucha narzędzi Hi-Tech PICC Lite, ale coraz bardziej jestem niezadowolony z tego, jak niektóre rzeczy się składają. Operacje, które powinny być względnie szybkie (biorąc pod uwagę cykl instrukcji 500ns przy 8 MHz), ukończenie zajmuje do 20us. Zacząłem więc wstawiać własny kod ASM, aby sobie z tym poradzić.

Mam jednak trudności ze zrozumieniem mapy pamięci zawartej w arkuszu danych na stronie 20.

Pamięć programu rozpoczyna się o 0005 godz. Jednak strona 23 pokazuje adresy plików rejestrów specjalnego przeznaczenia, takich jak na przykład port A. Adres portu A jest wyświetlany jako „05h”.

Nie wiem, jak odróżnić lokalizację pamięci 0005h od rejestru specjalnego przeznaczenia, który znajduje się o godzinie 05h. Jak odwołać się do rejestrów specjalnego przeznaczenia?

Zrobiłem dość obszerne programowanie asemblera dla starszych układów HC11, ale to moje pierwsze przedsięwzięcie w kodowaniu PIC asm. Każda pomoc tutaj będzie mile widziana.

Michał
źródło

Odpowiedzi:

8

PIC wykorzystuje tak zwaną „architekturę Harvarda”, co oznacza, że ​​ma osobne przestrzenie adresowe na instrukcje i dane.

To, czy adres odnosi się do rejestru, czy instrukcji, zależy od kontekstu, w jakim jest używany.

Schematy w sekcji 2.1 „Organizacja pamięci programu” dotyczą pamięci programu lub przestrzeni adresowej instrukcji. Schematy w sekcji 2.2 „Organizacja pamięci danych” dotyczą rejestrów i rejestrów funkcji specjalnych lub przestrzeni adresowej pamięci danych.

Dave Tweed
źródło
Więc jeśli powiedziałbym „MOVWF 0x0005”, PIC wiedziałby, że odnoszę się do adresu 0x0005 w pamięci danych, a nie w przestrzeni programu?
Michael
@Michael: Tak. To, czy adres w instrukcji odnosi się do programu lub pamięci danych, zależy od instrukcji. Jest to opisane dla każdego kodu operacyjnego. Zasadniczo, jeśli zajmie się danymi, takimi jak MOVWF, uzyska dostęp do pamięci danych. Jeśli zajmie się adresami programu, takimi jak GOTO, uzyska dostęp do pamięci programu.
Olin Lathrop,
Dziękuję Ci. Wydaje mi się, że HC11, w którym robiłem asembler, to łuk von Neumanna. Często miałem problemy z nadpisywaniem kodu instrukcji, gdy tylko się uczyłem. Jeszcze raz dziękuję.
Michael
3

Co powiedział Dave, ale chcę również zauważyć, że pamięć programu zaczyna się od 0, a nie 5. Po zresetowaniu procesor ustawia komputer na 0 i zaczyna działać. W przypadku przerwania procesor skutecznie wywołuje połączenie do lokalizacji 4 i wyłącza bit włączania globalnego przerwania. Lokalizacja pamięci programu 5 nie jest wyjątkowa, poza tym będzie to druga instrukcja procedury przerwania, jeśli masz procedurę przerwania.

Olin Lathrop
źródło
Tak, to zrozumiałe. Miałem na myśli, że 5 to pierwszy ogólny adres instrukcji.
Michael
@Michael: Nie, to też nie to. Jak powiedziałem, nie ma nic specjalnego w lokalizacji pamięci programu 5. Etykieta pierwszego ogólnego adresu instrukcji nie ma dla niego sensu. Pierwszy adres instrukcji to 0, a 4 również jest trochę specjalny ze względu na przerwania. Reszta nie jest naprawdę wyjątkowa, a „ogólny” nie ma sensu w tym kontekście.
Olin Lathrop,
Ok, a co z pierwszym niezerowanym i nieprzerwanym adresem wektorowym? Mówię, że rozumiem, co próbujesz powiedzieć.
Michael