logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

PIC16F84 - Rejestr konfiguracyjny dziwny adres po kompilacji

prociomen007 23 Wrz 2012 16:39 1314 5
REKLAMA
  • #1 11340560
    prociomen007
    Poziom 18  
    Posty: 706
    Pomógł: 1
    Ocena: 30
    Witam, pracuje nad symulatorem dla układu PIC16F84. Do kompilacji kodu (który ma trafić do symulatora) używam MPLAB. Nie mogę jednak zrozumieć czemu taki zapis w kodzie:

    
    list p=16F84, r=hex
    #include p16f84.inc
    __config b'11111111111111
    


    Powoduje utworzenie w pliku wyjściowym linijki:

    :02400E00FF3F72

    Analizując ją mamy tutaj do czynienia z instrukcją 2 bajtową która ma zostać zapisana w adresie 400E. Przecież to jest jakaś bzdura bo układ ten pamięci programu ma tylko 1K. Adres taki dziesiętne oznaczał by potrzebę wystąpienia 16398 komórki pamięci. Czy ktoś może powiedzieć dlaczego pojawia się taka rozbieżność. Nawet jeśli przyjąć że rejestr konfiguracyjny zaczyna się od adresu 2000h i kończy na 3FFFh to liczba 400E jest przesadą.
  • REKLAMA
  • #2 11344962
    Krauser
    Poziom 26  
    Posty: 508
    Pomógł: 124
    Ocena: 12
    Wszystko jest w porządku. Musisz tylko wiedzieć, że to o czym mówisz 1k, 2000h i 3FFFh nie dotyczy bajtów tylko 14-bitowych słów np. 0x3FFF to takie słowo. Oczywiście dla programatora nie jest istotne to, że tylko 14 bitów z 16 jest wykorzystanych. Podsumowując 400E to adres bajtu, a nie słowa i dzielisz przez 2 i masz 2007h.
  • REKLAMA
  • #3 11347557
    prociomen007
    Poziom 18  
    Posty: 706
    Pomógł: 1
    Ocena: 30
    Dzięki tych informacji mi brakowało rzeczywiście dzielenie adresu po kompilacji przez 2 załatwia sprawę. Pozwolę sobie zapytać jeszcze czy dobrze rozumiem podział pamięci w tym mikrokontrolerze. Mamy tutaj 1K komórek pamięci programu ( adresy od 0000h do 3FFh). Reszta aż do 1FFFh fizycznie nie jest zaimplementowana i odwołanie się do nich będzie skutkować dostępem do komórek z przedziału do 3FFh. Komórek od adresów 2000h do 3FFFh nie można adresować z kodu programu mamy tam umieszczony rejestr konfiguracyjny. Przy czym wykorzystuje on tylko komórki do 2007h a reszta jest fizycznie nie zaimplementowana.
  • REKLAMA
  • #4 11351243
    Krauser
    Poziom 26  
    Posty: 508
    Pomógł: 124
    Ocena: 12
    Tak, ale tylko adres 2007h jest używany w tym mikrokontrolerze.
  • REKLAMA
  • #5 11351408
    prociomen007
    Poziom 18  
    Posty: 706
    Pomógł: 1
    Ocena: 30
    Mam jeszcze jednak jedno pytanie. Zastanawiam się skąd mikro-kontroler wie do jakiego banku odwołać się po rejestr STATUSU. (chodzi rzecz jasna o pamięć RAM). Załóżmy że otrzymuje on instrukcje: WYZERUJ ADRES. Jak wiadomo do adresu doklejone zostaną dwa bity z rejestru statusu aby zdecydować o wyborze banku. (inaczej mówiąc aby złożyć kompletny 8 bitowy adres) Pytanie tylko skąd mikrokontroler wie z jakiego banku wziąć rejestr STATUSU skoro decyduje o tym sam rejestr STATUSU. Powstaje przez to takie masło maślane. Rejestr taki znajduje się pod adresem 0x03h (pierwszy bank) i 0x83h (drugi bank).
  • #6 11352454
    Krauser
    Poziom 26  
    Posty: 508
    Pomógł: 124
    Ocena: 12
    Instrukcja CLRF (i wiele innych) operuje na adresach 00h do 7Fh zatem adres STATUSu to 03h. STATUS pomimo, że ma dwa adresy to jest to ten sam rejestr. Zrobiono tak, aby był on dostępny w każdym z banków. Twórca uznał, że ten rejestr i jeszcze parę innych będą często używane i dlatego są dostępne niezależnie od wybranego banku.
REKLAMA