Serwis Edukacyjny
Nauczycieli

w I-LO w Tarnowie
obrazek

  Wyjście       Spis treści       Wstecz       Dalej  

obrazek

Autor artykułu
 mgr Jerzy Wałaszek
Konsultacje:
Wojciech Grodowski
mgr inż. Janusz Wałaszek

©2026 mgr Jerzy Wałaszek

obrazek

Mikrokontrolery

Rodzina średnia PIC

PIC12F629/675

Organizacja pamięci


obrazek

Educational and Non-Profit Use of Copyrighted Material:

If you use Microchip copyrighted material solely for educational (non-profit) purposes falling under the “fair use” exception of the U.S. Copyright Act of 1976 then you do not need Microchip’s written permission. For example, Microchip’s permission is not required when using copyrighted material in: (1) an academic report, thesis, or dissertation; (2) classroom handouts or textbook; or (3) a presentation or article that is solely educational in nature (e.g., technical article published in a magazine).

https://www.microchip.com/about-us/legal-information/copyright-usage-guidelines

SPIS TREŚCI KONSERWACJA
Podrozdziały

Organizacja pamięci programu

Mikrokontrolery PIC12F629/675 posiadają 13-bitowy licznik programu potrafiący zaadresować 8K × 14-b przestrzeń pamięci programu. W mikrokontrolerach PIC12F629/675 fizycznie zaimplementowany jest tylko pierwszy obszar 1K × 14-b (0000h-03FFh). Zaadresowanie powyżej tego obszaru spowoduje przewinięcie adresu do przestrzeni 1K × 14-b. Wektor resetu znajduje się pod adresem 0000h, a wektor przerwania pod 0004h (zobacz na rys.2-1).

Rysunek 2-1 Mapa pamięci programu i stosu


do podrozdziału  do strony 

Organizacja pamięci danych

Pamięć danych (zobacz na rys.2-2) jest podzielona na dwa banki zawierające Rejestry Ogólnego Przeznaczenia (ang. General Purpose) oraz Rejestry Funkcji Specjalnych (ang. Special Function Registers). Rejestry Funkcji Specjalnych znajdują się w pierwszych 32 komórkach każdego banku. Komórki 20h-5Fh są rejestrami ogólnego przeznaczenia zaimplementowanymi jako pamięć statyczna RAM i odwzorowanymi w obu bankach. Cała pozostała pamięć jest niezaimplementowana i przy odczycie zwraca wartość 0. Bit RP0 (STATUS<5>) jest bitem wyboru banku.
Uwaga: Bity IRP i IRP1 (STATUS<7:6>) są zarezerwowane i zawsze powinny być utrzymywane w stanie 0.

Plik Rejestrów Ogólnego Przeznaczenia

Plik rejestrów (ang. register file) jest zorganizowany w mikrokontrolerach PIC12F629/675 jako 64 komórki 8-bitowe. Dostęp do każdego z tych rejestrów jest bezpośredni lub pośredni przy pomocy Rejestru Wyboru z Pliku – FSR (ang. File Select Register) (Zobacz do podrozdziału “Adresowanie Pośrednie, Rejestry INDF i FSR”).

Rejestry Funkcji Specjalnych

Rejestry funkcji specjalnych są używane przez mikroprocesor oraz funkcje peryferyjne do sterowania wybranymi operacjami mikrokontrolera (zobacz na tablicę 2-1). Rejestry te są statyczną pamięcią RAM.

Rejestry specjalne można sklasyfikować jako dwa zbiory: rdzeń oraz peryferia. Rejestry funkcji specjalnych związane z "rdzeniem" są opisane w tym rozdziale. Rejestry związane z pracą peryferiów są opisane w rozdziałach dotyczących tych peryferiów.

Rys. 2-2: Mapa pamięci danych dla PIC12F629/675

Tablica 2-1: Podsumowanie rejestrów funkcji specjalnych
Adres Nazwa Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Po POR, BOD
Bank 0
00h INDF(1) Zaadresowanie tej komórki powoduje użycie zawartości FSR do zaadresowania pamięci danych 0000 0000
01h TMR0 Rejestr modułu timera 0 xxxx xxxx
02h PCL Mniej znaczący bajt licznika programu (PC) 0000 0000
03h STATUS IRP(2) RP1(2) RP0 TO PD Z DC C 0001 1xxx
04h FSR Wskaźnik pośredniego adresu pamięci danych xxxx xxxx
05h GPIO GPIO5 GPIO4 GPIO3 GPIO2 GPIO1 GPIO0 --xx xxxx
06h Niezaimplementowane
07h Niezaimplementowane
08h Niezaimplementowane
09h Niezaimplementowane
0Ah PCLATH Bufor zapisu dla 5 górnych bitów PC ---0 0000
0Bh INTCON GIE PEIE T0IE INTE GPIE T0IF INTF GPIF 0000 0000
0Ch PIR1 EEIF ADIF CMIF TMR1IF 00-- 0--0
0Dh Niezaimplementowane
0Eh TMR1L Rejestr przechowujący dolny bajt 16-bitowego Timera 1 xxxx xxxx
0Fh TMR1H Rejestr przechowujący górny bajt 16-bitowego Timera 1 xxxx xxxx
10h T1CON TMR1GE T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON -000 0000
11h Niezaimplementowane
12h Niezaimplementowane
13h Niezaimplementowane
14h Niezaimplementowane
15h Niezaimplementowane
16h Niezaimplementowane
17h Niezaimplementowane
18h Niezaimplementowane
19h CMCON COUT CINV CIS CM2 CM1 CM0 -0-0 0000
1Ah Niezaimplementowane
1Bh Niezaimplementowane
1Ch Niezaimplementowane
1Dh Niezaimplementowane
1Eh ADRESH(3) Górne 8 bitów przesuniętego w lewo wyniku z przetwornika A/C lub 2 bity przesuniętego w prawo wyniku xxxx xxxx
1Fh ADCON0(3) ADFM VCFG CHS1 CHS0 GO/DONE ADON 00-- 0000
Adres Nazwa Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Po POR, BOD
Bank 1
80h INDF(1) Zaadresowanie tej komórki powoduje użycie zawartości FSR do zaadresowania pamięci danych 0000 0000
81h OPTION_REG GPPU INTEDG T0CS T0SE PSA PS2 PS1 PS0 1111 1111
82h PCL Dolny bajt licznika programu (ang. Program Counter, PC) 0000 0000
83h STATUS IRP(2) RP1(2) RP0 TO PD Z DC C 0001 1xxx
84h FSR Pośredni wskaźnik adresu pamięci danych xxxx xxxx
85h TRISIO TRISIO5 TRISIO4 TRISIO3 TRISIO2 TRISIO1 TRISIO0 --11 1111
86h Niezaimplementowane
87h Niezaimplementowane
88h Niezaimplementowane
89h Niezaimplementowane
8Ah PCLATH Bufor zapisu dla 5 górnych bitów PC ---0 0000
0Bh INTCON GIE PEIE T0IE INTE GPIE T0IF INTF GPIF 0000 0000
8Ch PIE1 EEIE ADIE CMIE TMR1IE 00-- 0--0
8Dh Niezaimplementowane
8Eh PCON POR BOD ---- --0x
8Fh Niezaimplementowane
90h OSCCAL CAL5 CAL4 CAL3 CAL2 CAL1 CAL0 1000 00--
91h Niezaimplementowane
92h Niezaimplementowane
93h Niezaimplementowane
94h Niezaimplementowane
95h WPU WPU5 WPU4 WPU2 WPU1 WPU0 --11 -111
96h IOC IOC5 IOC4 IOC3 IOC2 IOC1 IOC0 --00 0000
97h Niezaimplementowane
98h Niezaimplementowane
9Ah EEDATA Rejestr adresu danych pamięci EEPROM 0000 0000
9Bh EEADR Rejestr adresu danych pamięci EEPROM -000 0000
9Ch EECON1 WRERR WREN WR RD ---- x000
9Dh EECON2(1) Rejestr sterujący 2 EEPROM ---- ----
9Eh ADRESL(3) 2 dolne bity przesuniętego w lewo wyniku z przetwornika A/C lub 8 bitów wyniku przesuniętego w prawo xxxx xxxx
9Fh ANSEL(3) ADCS2 ADCS1 ADCS0 ANS3 ANS2 ANS1 ANS0 -000 1111
Legenda:   — = niezaimplementowany bit, daje odczyt ‘0’, x = stan nieznany, szare = niezaimplementowane.
Uwaga: 1: To nie jest fizyczny rejestr.
  2: Te bity są zarezerwowane i powinny być utrzymywane w stanie '0'.
  3: Tylko PIC12F675.

Rejestr STATUS

Rejestr STATUS zawiera:

Rejestr STATUS może być celem dowolnej instrukcji, jak każdy inny rejestr. Jeśli jest on celem instrukcji modyfikującej znaczniki Z, DC lub C, to zapis do tych trzech bitów jest zablokowany. Bity te są ustawiane lub zerowane zgodnie z logiką mikrokontrolera. Co więcej bity TO i PD nie są zapisywalne. Z tego powodu wynik instrukcji adresującej docelowo rejestr STATUS może nie być zgodny z przewidywaniem.

Na przykład instrukcja CLRF STATUS wyzeruje trzy górne bity i ustawi bit Z. Pozostawi rejestr STATUS w stanie 000u u1uu (gdzie u = unchanged – bez zmiany). Dlatego do zmiany zawartości rejestru STATUS zaleca się stosować tylko instrukcje BCF, BSF, SWAPF i MOVWF, ponieważ nie modyfikują one żadnego bitu rejestru STATUS. Aby uzyskać informację o innych instrukcjach nie wpływających na żaden bit w rejestrze STATUS, zobacz do rozdziału "Podsumowanie listy rozkazów".

Uwagi 1: Bity IRP i RP1 (STATUS[7:6]) nie są używane w mikrokontrolerze PIC12F629/675 i powinny być wyzerowane. Używania tych bitów nie zaleca się, ponieważ może to wpłynąć na kompatybilność z przyszłymi wersjami mikrokontrolera.
  2: Bity C i DC działają jako odpowiednio bity wyjściowe pożyczki i pożyczki od cyfry w odejmowaniu (ang. Borrow i Digit Borrow). Zobacz na instrukcje SUBLW i SUBWF.
REJESTR STATUS (ADRES: 03h lub 83h)
Zarezerw. Zarezerw. R/W-0 R-1 R-1 R/W-x R/W-x R/W-x
IRP RP1 RP0 TO PD Z DC C
b7 b6 ... b1 b0
Legenda
R = bit odczytywalny W = bit zapisywalny     U = bit niezaimplentowany, daje odczyt '0'
-n = wartość przy POR     ‘1’ = bit ustawiony ‘0’ = bit wyzerowany     x = bit o nieznanym stanie
bit 7      IRP: Ten bit jest zarezerwowany i powinien być utrzymywany w stanie ‘0’
bit 6   RP1: Ten bit jest zarezerwowany i powinien być utrzymywany w stanie ‘0’
bit 5   RP0: bit wyboru banku pamięci (używany przy adresowaniu bezpośrednim)
0 = Bank 0 (00h - 7Fh)
1 = Bank 1 (80h - FFh)
bit 4   TO: bit Time-out (przekroczenie czasu)
1 = po uruchomieniu, po instrukcjach CLRWDT i SLEEP
0 = wystąpił time-out WDT
bit 3   PD: bit Power-down (wyłączenie zasilania)
1 = po power-up (włączenie zasilania) lub po instrukcji CLRWDT
0 = po wykonaniu instrukcji SLEEP
bit 2   Z: bit zera
1 = Wynikiem operacji arytmetycznej lub logicznej jest zero
0 = Wynik operacji arytmetycznej lub logicznej jest różny od zera
bit 1   DC: bit przeniesienia/pożyczki cyfry (instrukcje ADDWF, ADDLW, SUBLW, SUBWF)
Dla pożyczki polaryzacja jest odwrócona.
1 = wystąpiło przeniesienie poza 4-ty najmłodszy bit wyniku
0 = brak przeniesienia poza 4-ty najmłodszy bit wyniku
bit 0   C: bit przeniesienia/pożyczki (instrukcje ADDWF, ADDLW, SUBLW, SUBWF)
1 = wystąpiło przeniesienie poza najstarszy bit wyniku
0 = brak przeniesienia poza najstarszy bit wyniku
Uwaga Przy pożyczce polaryzacja jest odwrócona. Odejmowanie wykonywane jest przez dodanie uzupełnienia do 2 drugiego argumentu. W instrukcjach obrotu  (RRF, RLF) bit ten jest ładowany albo najmłodszym, albo najstarszym bitem rejestru źródłowego.

Rejestr OPTION_REG

Rejestr OPTION_REG jest rejestrem do zapisu i odczytu i zawiera różne bity sterujące do konfiguracji:

Uwaga: aby uzyskać ustawienie preskalera 1:1 dla timera TMR0, przydziel preskaler do timera WDT przez ustawienie na 1 bitu PSA (OPTION[3]). Zobacz do podrozdziału  "Preskaler".
REJESTR OPTION_REG (ADRES: 81h)
R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1
GPPU INTEDG T0CS T0SE PSA PS2 PS1 PS0
b7 b6 ... b1 b0
Legenda
R = bit odczytywalny W = bit zapisywalny     U = bit niezaimplentowany, daje odczyt '0'
-n = wartość przy POR     ‘1’ = bit ustawiony ‘0’ = bit wyzerowany     x = bit o nieznanym stanie
bit 7      GPPU: bit włączający oporniki podciągające w GPIO
1 = oporniki podciągające wyłączone w porcie GPIO
0 = oporniki włączone przez indywidualne wartości zatrzasków portu GPIO
bit 6   INTEDG: bit wyboru zbocza przerwania
1 = przerwanie przy narastającym zboczu na końcówce GP2/INT
0 = przerwanie przy opadającym zboczu na końcówce GP2/INT
bit 5   T0CS: bit wyboru źródła zegarowego timera TMR0
1 = zmiana poziomu logicznego na końcówce GP2/T0CKI
0 = wewnętrzny zegar cyklu rozkazowego (CLKOUT)
bit 4   T0SE: bit wyboru zbocza źródła timera TMR0
1 = zwiększenie stanu TMR0 przy przejściu ze stanu wysokiego w niski na końcówce GP2/T0CKI
0 = zwiększenie stanu TMR0 przy przejściu ze stanu niskiego w wysoki na końcówce GP2/T0CKI
bit 3   PSA: bit przypisania preskalera
1 = preskaler przypisany do timera licznika zegarowego WDT
0 = preskaler przypisany do modułu TIMER0
bity 2-0   PS2:PS0: bity wyboru podziału preskalera
Wartość bitów Podział dla TMR0 Podział dla EDT
000
001
010
011
100
101
110
111
1 : 2    
1 : 4    
1 : 8    
1 : 16  
1 : 32  
1 : 64  
1 : 128
1 : 256
1 : 1    
1 : 2    
1 : 4    
1 : 8    
1 : 16  
1 : 32  
1 : 64  
1 : 128

Rejestr INTCON

Rejestr INTCON (ang. INTerrupt CONtrol) jest rejestrem do odczytu i zapisu, który zawiera różne bity włączające i znacznikowe dla przepełnienia rejestru TNR0, zmiany w porcie GPIO i przerwań zewnętrznych na końcówce GP2/INT.

Uwaga: bity znaczników przerwań są ustawiane przy wystąpieniu przerwania, bez względu na stan odpowiednich bitów uaktywniających lub bitu globalnego uaktywniania GIE (INTCON[7]). Oprogramowanie użytkownika powinno się, upewnić, że odpowiednie bity znaczników przerwania zostały wyzerowane przed uaktywnieniem przerwania.
REJESTR INTCON (ADRES: 0Bh lub 8Bh)
R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0
GIE PEIE T0IE INTE GPIE T0IF INTF GPIF
b7 b6 ... b1 b0
Legenda
R = bit odczytywalny W = bit zapisywalny     U = bit niezaimplentowany, daje odczyt '0'
-n = wartość przy POR     ‘1’ = bit ustawiony ‘0’ = bit wyzerowany     x = bit o nieznanym stanie
bit 7      GIE: bit globalnego uaktywniania przerwań
1 = włącza wszystkie przerwania niemaskowane
0 = wyłącza wszystkie przerwania
bit 6   PEIE: bit włączania przerwań peryferyjnych (od modułów peryferyjnych)
1 = włącza wszystkie niemaskowane przerwania peryferyjne
0 = wyłącza wszystkie przerwania peryferyjne
bit 5   T0IE: bit włączania przerwania przy przepełnieniu TMR0
1 = włącza przerwanie TMR0
0 = wyłącza przerwanie TMR0
bit 4   INTE: bit włączania przerwania zewnętrznego z końcówki GP2/INT
    1 = włącza przerwanie zewnętrzne z GP2/INT
0 = wyłącza przerwanie zewnętrzne z GP2/INT
bit 3   GPIE: bit włączania przerwania przy zmianie stanu portu(1)
1 = włącza przerwanie przy zmianie stanu portu GPIO
0 = wyłącza przerwanie przy zmianie stanu portu GPIO
bit 2   T0IF: bit znacznika przerwania przy przepełnieniu TMR0(2)
1 = rejestr TMR0 przepełnił się (musi być wyczyszczone programowo)
0 = rejestr TMR0 nie przepełnił się
bit 1   INTF: bit znacznika przerwania zewnętrznego z końcówki GP2/INT
1 = wystąpiło przerwanie zewnętrzne GP2/INT (musi być wyczyszczone programowo)
0 = przerwanie zewnętrzne GP2/INT nie wystąpiło
bit 0   GPIF: bit znacznika przerwania przy zmianie stanu portu
1 = co najmniej jedna zmiana stanu na końcówkach GP5:GP0 (musi być wyczyszczone programowo)
0 = żadna z końcówek GP5:GP0 nie miała zmiany stanu.
Uwagi 1: Rejestr IOC musi również być uaktywniony, aby uaktywnić przerwanie przy zmianie stanu.
  2: Bit T0IF jest ustawiany, gdy TIMER0 przewija się na początek. TIMER0 nie jest zmieniany podczas Resetu i powinien zostać ustawiony przed wyzerowaniem bitu T0IF.

Rejestr PIE1

Rejestr PIE1 (ang. Periferal Interrupt Enable register 1) zawiera bity uaktywniające przerwania peryferyjne (od modułów peryferyjnych mikrokontrolera).

Uwaga: Bit PEIE (INTCON[6]) musi zostać ustawiony na 1, aby włączyć przerwania peryferyjne.
REJESTR PIE1 (ADRES: 8Ch)
R/W-0 R/W-0 U-0 U-0 R/W-0 U-0 U-0 R/W-0
EEIE ADIE CMIE TMR1IE
b7 b6 ... b1 b0
Legenda
R = bit odczytywalny W = bit zapisywalny     U = bit niezaimplentowany, daje odczyt '0'
-n = wartość przy POR     ‘1’ = bit ustawiony ‘0’ = bit wyzerowany     x = bit o nieznanym stanie
bit 7      EEIE: bit włączający przerwanie przy zakończeniu zapisu do EEPROM
1 = włącza to przerwanie
0 = wyłącza to przerwanie
bit 6   ADIE: bit włączania przerwania od przetwornika A/C (tylko PIC12F675)
1 = włącza to przerwanie
0 = wyłącza to przerwanie
bity 5-4   Niezaimplementowane, dają odczyt '0'
bit 3   CMIE: bit włączający przerwanie z komparatora
1 = włącza to przerwanie
0 = wyłącza to przerwanie
bity 2-1   Niezaimplementowane, dają odczyt '0'
bit 0   TMR1IE: bit włączający przerwanie przy przepełnieniu timera TMR1
1 = włącza to przerwanie
0 = wyłącza to przerwanie

Rejestr PIR1

Rejestr PIR1 (ang. Periferal Interrupt Register 1) zawiera bity bity znacznikowe przerwań peryferyjnych (od modułów peryferyjnych mikrokontrolera).

Uwaga: Bity znacznikowe przerwań są ustawiane, gdy wystąpi warunek przerwania, bez względu na stan odpowiadających im bitów uaktywniających przerwania w rejestrze PIE1  lub stan globalnego bitu włączania przerwań GIE (INTCON[7]). Oprogramowanie użytkownika powinno upewnić się, iż odpowiedni bit znacznikowy jest wyzerowany przed uaktywnieniem danego przerwania.
REJESTR PIR1 (ADRES: 0Ch)
R/W-0 R/W-0 U-0 U-0 R/W-0 U-0 U-0 R/W-0
EEIF ADIF CMIF TMR1IF
b7 b6 ... b1 b0
Legenda
R = bit odczytywalny W = bit zapisywalny     U = bit niezaimplentowany, daje odczyt '0'
-n = wartość przy POR     ‘1’ = bit ustawiony ‘0’ = bit wyzerowany     x = bit o nieznanym stanie
bit 7      EEIF: bit znacznikowy przerwania z operacji zapisu do EEPROM
1 = operacja zapisu zakończona (musi być zerowane przez oprogramowanie)
0 = operacja zapisu nie jest zakończona lub nie zaczęła się jeszcze
bit 6   ADIF: bit znacznikowy przerwania z przetwornika A/C (tylko PIC12F675)
1 = konwersja w przetworniku A/C zakończona (musi być zerowane przez oprogramowanie)
0 = konwersja w przetworniku A/C nie jest zakończona
bity 5-4   Niezaimplementowane, dają odczyt '0'
bit 3   CMIF: bit znacznikowy przerwania z komparatora
1 = wejście komparatora zmieniło się (musi być zerowane przez oprogramowanie)
0 = wejście komparatora nie zmieniło się
bity 2-1   Niezaimplementowane, dają odczyt '0'
bit 0   TMR1IF: bit znacznikowy przerwania przy przepełnieniu TMR1
1 = rejestr TMR1 przepełnił się (musi być zerowane przez oprogramowanie)
0 = rejestr TMR1 nie przepełnił się

Rejestr PCON

Rejestr sterowania zasilaniem (ang. Power CONtrol, PCON) zawiera bity znacznikowe pozwalające rozróżnić pomiędzy:

REJESTR PCON (ADRES: 8Eh)
U-0 U-0 U-0 U-0 U-0 U-0 R/W-0 R/W-x
POR BOD
b7 b6 ... b1 b0
Legenda
R = bit odczytywalny W = bit zapisywalny     U = bit niezaimplentowany, daje odczyt '0'
-n = wartość przy POR     ‘1’ = bit ustawiony ‘0’ = bit wyzerowany     x = bit o nieznanym stanie
bity 7-2      Niezaimplementowane, dają odczyt '0'
bit 1   POR: bit stanu resetu przy włączeniu zasilania
1 = nie było tego resetu
0 = reset ten wystąpił (należy ustawić programowo na '1' po tym resecie)
bit 0   BOD: bit stanu wykrycia spadku zasilania
1 = spadek napięcia zasilającego nie wystąpił
0 = wystąpił spadek napięcia (należy ustawić programowo na '1' po tym zdarzeniu)

Rejestr OSCCAL

Rejestr kalibracyjny oscylatora (ang. OSCillator CALibration register, OSCCAL) używany jest do regulacji częstotliwości pracy wewnętrznego oscylatora 4 MHz. Zawiera 6 bitów do ustawiania częstotliwości w górę lub w dół, aby uzyskać 4 MHz.

REJESTR OSCCAL (ADRES: 90h)
R/W-1 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 U-0 U-0
CAL5 CAL4 CAL3 CAL2 CAL1 CAL0
b7 b6 ... b1 b0
Legenda
R = bit odczytywalny W = bit zapisywalny     U = bit niezaimplentowany, daje odczyt '0'
-n = wartość przy POR     ‘1’ = bit ustawiony ‘0’ = bit wyzerowany     x = bit o nieznanym stanie
bity 7-2      6-bitowa wartość ze znakiem do kalibracji oscylatora
111111 = maksymalna częstotliwość
100000 = środkowa częstotliwość
000000 = minimalna częstotliwość
bity 1-0   Niezaimplementowane, dają odczyt '0'

do podrozdziału  do strony 

PCL i PCLATH

Licznik rozkazów (ang. Program Counter, PC) jest 13-bitowy. Dolny bajt pochodzi z rejestru PCL, który jest rejestrem do zapisu i do odczytu. Górny bajt (PC[12:8]) nie jest bezpośrednio dostępny do zapisu/odczytu i pochodzi z rejestru PCLATH. Przy każdym resecie licznik rozkazów PC jest zerowany. Rys.2-3 pokazuje dwie sytuacje ładowania do PC. Górny przykład na rys.2-3 pokazuje, jak PC jest ładowany przy zapisie do PCL (PCLATH[4:0] to PCH). Dolny przykład na rys.2-3 pokazuje, jak PC jest ładowany podczas instrukcji CALL lub GOTO (PCLATH[4:3] to PCH).

Rys.2-3 Ładowanie rejestru PC w różnych sytuacjach

Wyliczane GOTO

Wyliczane GOTO jest wykonywane przez dodanie przesunięcia do PC (ADDWF PCL). Przy wykonywaniu odczytu tablicy za pomocą metody wyliczanego GOTO, należy podjąć odpowiednie środki ostrożności, jeśli komórka tablicy wychodzi poza granicę PCL (każdy 256-bajtowy blok).

STOS

Rodzina mikrokontrolerów PIC12F629/675 posiada 8-poziomowy stos zapamiętujący słowa 13-bitowe (zobacz na rys.2-1). Przestrzeń stosu jest rozdzielona od przestrzeni pamięciowej programu i danych, a wskaźnik stosu nie jest rejestrem odczytywalnym ani zapisywalnym. Licznik programu PC jest umieszczany na stosie przy wykonywaniu instrukcji CALL lub przy wystąpieniu przerwania powodującego skok. Dane ze stosu są pobierane w przypadku wykonania instrukcji RETURN, RETLW lub RETFIE. Zawartość rejestru PCLATH nie jest zmieniana podczas zapisu lub odczytu stosu.

Stos pracuje jako zapętlony bufor. Oznacza to, iż po ośmiokrotnym zapisie na stos dziewiąty zapis nadpisze wartość zapisaną jako pierwsza. Dziesiąty zapis nadpisze wartość zapisaną jako druga, itd.

Uwaga Nie ma bitów stanu oznaczających przepełnienie (próba zapisu ponad osiem razy) lub niedopełnienie (próba odczytu większą liczbę razy niż zostało zapisane) stosu.

do podrozdziału  do strony 

Adresowanie pośrednie, rejestry INDF i FSR

Rejestr INDF nie jest rejestrem fizycznym. Zaadresowanie go wywoła adresowanie pośrednie (ang. indirect addressing). Do tego właśnie celu służy ten rejestr. Dowolna instrukcja używająca rejestru INDF w rzeczywistości korzysta z danych, które wskazuje rejestr wyboru pliku (ang. File Select Register, FSR). Pośrednie odczytanie samego rejestru INDF da w wyniku 00h. Pośredni zapis do rejestru INDF jest operacją pustą (chociaż bity stanu mogą ulec zmianie). Efektywny adres 9-bitowy otrzymuje się przez połączenie 8-bitowego rejestru FSR z bitem IRP (STATUS[7]), co pokazuje poniższy rysunek.

Przykład 2-1: Adresowanie pośrednie w PIC12F629/675
        MOVLW 0x20   ;inicjuj wskaźnik
        MOVWF FSR    ;do RAM
NEXT    CLRF  INDF   ;zeruj element w RAM
        INCF  FSR    ;zwiększ wskaźnik
        BTFSS FSR,4  ;koniec?
        GOTO  NEXT   ;nie, zeruj następny element
CONTINUE             ;tak, kontynuuj

do podrozdziału  do strony 

Zespół Przedmiotowy
Chemii-Fizyki-Informatyki

w I Liceum Ogólnokształcącym
im. Kazimierza Brodzińskiego
w Tarnowie
ul. Piłsudskiego 4
©2026 mgr Jerzy Wałaszek

Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone pod warunkiem podania źródła oraz niepobierania za to pieniędzy.
Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.

Informacje dodatkowe.