Serwis Edukacyjny
w I-LO w Tarnowie
obrazek

Materiały dla uczniów liceum

  Wyjście       Spis treści       Wstecz       Dalej  

obrazek

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

©2024 mgr Jerzy Wałaszek
I LO w Tarnowie

obrazek

Mikrokontrolery

Rodzina podstawowa PIC

PIC10F200/202/204/206

Pamięć

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
Podrozdziały

obrazek

Organizacja pamięci

Pamięci mikrokontrolerów PIC10F200/202/204/206 są zorganizowane w dwie oddzielne przestrzenie adresowe: pamięć programu i pamięć danych. Z powodu ograniczonej ilości bitów przeznaczonych na adres (5 bitów) w kodzie instrukcji pamięć danych jest dostępna jako 32-bajtowe banki wybierane rejestrem FSR (ang. File Select Register).

Organizacja pamięci programu w PIC10F200/204

Układy PIC10F200/204 posiadają 9-bitowy licznik programu PC, który może zaadresować 512 12-bitowych słów w przestrzeni pamięci programu. W mikrokontrolerach tylko pierwsze 256 słów (0000h-00FFh) są fizycznie zaimplementowane (zobacz na poniższy rysunek). Zaadresowanie słowa leżącego powyżej adresu 00FFh spowoduje przewinięcie wokół pierwszych 256 słów w przestrzeni adresowej.

Wektor resetu znajduje się pod adresem 0000h (zobacz na rysunek). Komórka pod adresem 00FFh zawiera wartość kalibracyjną wewnętrznego oscylatora zegarowego. Tej wartości nie powinno się nigdy zapisywać.

Mapa pamięci programu i stos w mikrokontrolerach PIC10F200/204

Organizacja pamięci programu w PIC10F202/206

Układy PIC10F202/206 posiadają 10-bitowy licznik programu PC który może zaadresować 1014 12-bitowych słów w przestrzeni pamięci programu.

Jedynie pierwsze 512 12-bitowych słów jest fizycznie zaimplementowane w mikrokontrolerach PIC10F202/206 (zobacz na rysunek poniżej). Zaadresowanie słowa pamięci powyżej tej granicy spowoduje przewinięcie adresu wokół pierwszych 512 słów. Rzeczywisty wektor resetu znajduje się pod adresem 0000h (patrz: rysunek). Słowo o adresie 01FFh zawiera wartość kalibracyjną oscylatora zegarowego. Wartość ta nie powinna nigdy być zmieniana.

Mapa pamięci programu i stos w mikrokontrolerach PIC10F202/206

Organizacja pamięci danych

Pamięć danych RAM złożona jest z jednobajtowych rejestrów. Z tego powodu pamięć danych dla danego układu określona jest przez jego plik rejestrów (ang. register file). Plik rejestrów podzielony jest na dwie grupy o różnych funkcjach: rejestry o funkcjach specjalnych (ang. Special Function Registers, SFR) oraz rejestry ogólnego przeznaczenia (ang. General Purpose Registers, GPR). W skład rejestrów o funkcjach specjalnych wchodzą: rejestr TMR0 (ang. Timer 0), dolny bajt licznika programu PCL (ang. Program Counter Low byte), rejestr znaczników stanu STATUS, rejestr we/wy GPIO i rejestr wyboru pliku FSR (ang. File Select Register). Dodatkowo rejestry o specjalnych funkcjach są używane do sterowania konfiguracją portu we/wy oraz opcjami preskalera.

Mapa Pliku Rejestrów w PIC10F200/204

1. Rejestr wirtualny.
2. Tylko PIC10F204. W PIC10F200
niezaimplementowane, daje odczyt zero.
3. Niezaimplementowane, daje odczyt zero.

Mapa Pliku Rejestrów w PIC10F202/206

1. Rejestr wirtualny.
2. Tylko PIC10F206. W PIC10F202
niezaimplementowane, daje odczyt zero.

Dostęp do pliku rejestrów jest albo bezpośredni, albo pośredni poprzez rejestr FSR. Więcej na ten temat znajdziesz w dalszej części rozdziału.


Na początek:  podrozdziału   strony 

Rejestry o specjalnych funkcjach

Rejestry o specjalnych funkcjach (ang. Special Function Registers, SFRs) są rejestrami wykorzystywanymi przez mikroprocesor oraz funkcje peryferyjne do sterowania pracą układu.

Rejestry SFR można sklasyfikować na dwie grupy. Rejestry SFR powiązane z funkcjami "rdzenia" są opisane w tym rozdziale. Natomiast rejestry skojarzone z działaniem cech peryferyjnych są opisane w rozdziałach dotyczących każdej cechy peryferyjnej.

Podsumowanie rejestrów o specjalnych funkcjach w PIC10F200/202/204/206
Adres Nazwa Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Wartość przy
resecie przy
włączeniu
00h INDF Używa zawartości FSR do adresowania pamięci danych (rejestr wirtualny) xxxx xxxx
01h TMR0 8-bitowy zegar/licznik czasu rzeczywistego w PIC10F200/202 xxxx xxxx
01h TMR0 8-bitowy zegar/licznik czasu rzeczywistego w PIC10F204/206 xxxx xxxx
02h(1) PCL Dolne 8 bitów licznika programu PC 1111 1111
03h STATUS GPWUF CWUF(5) TO PD Z DC C 00-1 1xxx(3)
04h FSR Wskaźnik pośredni pamięci danych 111x xxxx
05h OSCCAL CAL6 CAL5 CAL4 CAL3 CAL2 CAL1 CAL0 FOSC4 1111 1110
06h GPIO GP3 GP2 GP1 GP0 ---- xxxx
07h(4) CMCON0 CMPOUT COUTEN POL CMPT0CS CMPON CNREF CPREF CWU 1111 1111
N/A TRISGPIO Rejestr sterujący we/wy ---- 1111
N/A OPTION GPWU GPPU T0CS T0SE PSA PS2 PS1 PS0 1111 1111
Legenda   – = niezaimplementowany, odczyt daje ‘0’; x = nieznany.
Uwagi: 1. Górny bajt licznika rozkazów PC nie jest bezpośrednio dostępny.
  2. Inne resety (nie związane z włączaniem zasilania) obejmują reset zewnętrzny poprzez MCLR, reset od timer licznika zegarowego i reset od wybudzenia przy zmianie stanu końcówki.
  3. Zobacz do podrozdziału "Reset".
  4. Tylko PIC10F204/206.
  5. Tylko PIC10F204/206. W innych mikrokontrolerach ten bit jest zarezerwowany i nie powinien być używany.

Na początek:  podrozdziału   strony 

Rejestr STATUS

Ten rejestr zawiera arytmetyczny stan jednostki arytmetyczno logicznej ALU oraz status resetu.

Jak każdy inny rejestr STATUS może być rejestrem docelowym każdej instrukcji odwołującej się do pamięci danych. Jeśli STATUS jest rejestrem docelowym instrukcji wpływającej na znaczniki Z, DC lub C, to zapis do tych trzech bitów zostaje zablokowany. Wymienione bity są ustawiane lub zerowane zgodnie z logiką układu. Co więcej, bity TO i PD są niezapisywalne. Dlatego wynik instrukcji po zapisie rejestru STATUS może być inny od zamierzonego.

Na przykład CLRF STATUS wyzeruje górne trzy bity i ustawi bit Z, pozostawiając rejestr STATUS jako 000u u1uu (gdzie u = niezmienione). Z tego powodu do zmiany rejestru STATUS zaleca się jedynie instrukcje BCF, BSF i MOVWF. Instrukcje te nie wpływają na bity Z, DC i C w rejestrze STATUS.

Rejestr STATUS
Adres b7 b6 b5 b4 b3 b2 b1 b0
03h GPWUF CWUF(1) TO PD Z DC C
  R/W-0 R/W-0 U-1 R-1 R-1 R/W-x R/W-x R/W-x
Legenda:   R = bit odczytywalny; W = bit zapisywalny; U = bit niezaimplementowany, daje odczyt ‘0’; -n = wartość przy resecie przy włączaniu; ‘1’ = bit jest ustawiony; ‘0’ = bit jest wyzerowany; x = stan bitu nieznany
Uwaga: 1. Ten bit jest używany w PIC10F204/206. Dla kompatybilności kodu, nie używaj tego bitu w PIC10F200/202.
Bit Opis
bit 7 GPWUF: Bit resetu z GPIO:
1 = Reset z powodu wybudzenia z uśpienia przy zmianie stanu końcówki
0 = Po włączeniu zasilania lub po innym resecie
bit 6 CWUF: bit(1) znacznika wybudzenia przy zmianie od komparatora
1 = Reset z powodu wybudzenia z uśpienia przez zmianę w komparatorze
0 = Po włączeniu zasilania lub po innym resecie
bit 5 Zarezerwowane. Nie używaj, gdyż może to wpłynąć na kompatybilność z przyszłymi układami.
bit 4 TO: Bit przekroczenia czasu
1 = Po włączeniu zasilania, instrukcji CLRWDT lub instrukcji SLEEP
0 = Licznik zegarowy zliczył do końca swojego okresu
bit 3 PD: Bit wyłączenia zasilania
1 = Po włączeniu 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 z cyfry (dla instrukcji ADDWF i SUBWF)
ADDWF:
1 = Wystąpiło przeniesienie z czwartego najmłodszego bitu wyniku
0 = Nie było przeniesienia z czwartego najmłodszego bitu wyniku
SUBWF:
1 = Nie było pożyczki do czwartego najmłodszego bitu wyniku
0 = Wystąpiła pożyczka  do czwartego najmłodszego bitu wyniku
bit 0 C: bit przeniesienia/pożyczki (dla instrukcji ADDWF, SUBWF oraz instrukcji RRF, RLF)
ADDWF
1 = Wystąpiło przeniesienie
0 = Nie było przeniesienia
SUBWF:
1 = Nie było pożyczki
0 = Wystąpiła pożyczka
RRF lub RLF:
Ładowany odpowiednio najmłodszym lub najstarszym bitem argumentu

Na początek:  podrozdziału   strony 

Rejestr OPTION

Rejestr OPTION ma długość 8-bitów i jest rejestrem tylko do zapisu, który zawiera różne bity sterujące konfiguracją preskalera timera 0 i timera licznika zegarowego oraz samego timera 0.

Przez wykonanie instrukcji OPTION zawartość rejestru roboczego W jest przesyłana do rejestru OPTION. Reset ustawia bity OPTION[7:0]

Rejestr OPTION
Adres b7 b6 b5 b4 b3 b2 b1 b0
NA GPWU GPPU T0CS T0SE PSA PS2 PS1 PS0
  W-1 W-1 W-1 W-1 W-1 W-1 W-1 W-1
Legenda:   R = bit odczytywalny; W = bit zapisywalny; U = bit niezaimplementowany, daje odczyt ‘0’; -n = wartość przy resecie przy włączaniu; ‘1’ = bit jest ustawiony; ‘0’ = bit jest wyzerowany; x = stan bitu nieznany
Uwagi: 1. Jeśli bit TRIS jest ustawiony na 0, to wybudzanie przy zmianie stanu oraz funkcje oporników podciągających są wyłączone dla danej końcówki (tj. TRIS anuluje sterowanie bitami GPPU i GPWU).
  2. Jeśli bit T0CS jest ustawiony na 1, to anuluje on funkcję TRIS na końcówce T0CKI.
Bit Opis
bit 7 GPWU: Bit włączenia wybudzania przy zmianie stanu końcówki (GP0, GP1, GP3)
1 = Wyłączone
0 = Włączone
bit 6 GPPU: Bit włączania słabych oporników podciągających (GP0, GP1, GP3)
1 = Wyłączone
0 = Włączone
bit 5 T0CS: Bit wyboru źródła zegara dla Timera 0
1 = Zbocze sygnału na końcówce T0CKI (unieważnia TRIS na końcówce T0CKI)
0 = Zbocze wewnętrznego zegara cyklu rozkazowego, FOSC/4
bit 4 T0SE: Bit wyboru zbocza źródłowego dla Timera 0
1 = Zwiększenie przy przejściu z 1 na 0 na końcówce T0CKI
0 = Zwiększenie przy przejściu z 0 na 1 na końcówce T0CKI
bit 3 PSA: Bit przypisania preskalera
1 = Preskaler przypisany do timera licznika zegarowego (WDT)
0 = Preskaler przypisany do Timera 0
bity 2:0 PS[2:0]: Bity wyboru współczynnika podziału w preskalerze
Stan
bitów
Podział dla
Timera 0
Podział dla
WDT
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

Na początek:  podrozdziału   strony 

Rejestr OSCCAL

Rejestr kalibracyjny oscylatora (ang. Oscillator Calibration register, OSCCAL) jest używany do kalibracji wewnętrznego, precyzyjnego oscylatora 4MHz. Do kalibracji wykorzystywane jest siedem bitów.
Uwaga:   Wymazanie mikrokontrolera wymaże również zaprogramowaną wcześniej wartość kalibracyjną dla wewnętrznego oscylatora. Dlatego wartość tę należy odczytać przed wymazaniem układu, aby mogła być poprawnie zaprogramowana później.
Rejestr OSCCAL
Adres b7 b6 b5 b4 b3 b2 b1 b0
05h CAL6 CAL5 CAL4 CAL3 CAL2 CAL1 CAL0 FOSC4
  W/R-1 W/R-1 W/R-1 W/R-1 W/R-1 W/R-1 W/R-1 W/R-0
Legenda:   R = bit odczytywalny; W = bit zapisywalny; U = bit niezaimplementowany, daje odczyt ‘0’; -n = wartość przy resecie przy włączaniu; ‘1’ = bit jest ustawiony; ‘0’ = bit jest wyzerowany; x = stan bitu nieznany.
Bit Opis
bity 7:1 CAL[6:0]: Bity kalibracyjne oscylatora
0111111 = maksymalna częstotliwość
•••
0000001
0000000 = częstotliwość środkowa
1111111
•••
1000000 = minimalna częstotliwość
bit 0 FOSC4: Bit włączania wyjścia INTOSC/4(1)
1 = wyjście INTOSC/4 na GP2
0 = GP2/T0CKI/COUT na GP2
Uwaga: 1. Zastępuje rejestry sterujące GP2/T0CKI/COUT po uaktywnieniu

Na początek:  podrozdziału   strony 

Licznik programu PCL

W czasie wykonywania instrukcji licznik programu (ang. Program Counter, PC) zawiera adres następnej do wykonania instrukcji w programie. Wartość PC jest zwiększana o jeden w każdym cyklu rozkazowym, o ile instrukcja nie zmienia PC.

W przypadku instrukcji GOTO bity 8:0 licznika PC są dostarczane przez słowo instrukcji GOTO. Rejestr dolnych bitów licznika rozkazów PCL (ang. Program Counter Low) odwzorowuje bity PC[7:0].

Dla instrukcji CALL lub dowolnej innej, gdzie rejestrem docelowym jest PCL, bity 7:0 licznika rozkazów są dostarczane przez słowo instrukcji. Jednakże bit PC[8] nie pochodzi z tego słowa instrukcji, lecz jest zawsze zerowany.

Instrukcje modyfikujące PCL to MOVWF PC, ADDWF PC i BSF PC,5.

Rejestr PCL
Adres b7 b6 b5 b4 b3 b2 b1 b0
02h PC7 PC6 PC5 PC4 PC3 PC2 PC1 PC0
  W/R-1 W/R-1 W/R-1 W/R-1 W/R-1 W/R-1 W/R-1 W/R-1
Legenda:   R = bit odczytywalny; W = bit zapisywalny; U = bit niezaimplementowany, daje odczyt ‘0’; -n = wartość przy resecie przy włączaniu; ‘1’ = bit jest ustawiony; ‘0’ = bit jest wyzerowany; x = stan bitu nieznany
Uwaga: 1. Ponieważ bit PC[8] jest zerowany w instrukcji CALL oraz dowolnej innej, która modyfikuje PCL, to wszystkie wywołania podprogramów lub skoków wyliczanych są ograniczone do pierwszych 256 adresów każdej strony pamięci (o rozmiarze 512 słów).

Ładowanie PC

Efekty resetu

Rejestr PC jest ustawiany przy resecie, co oznacza, że PC adresuje ostatnią komórkę w pamięci programu (tj. instrukcję ładującą do akumulatora W wartość kalibracyjną oscylatora). Po wykonaniu instrukcji MOVLW XX licznik programu PC ulega przewinięciu i wskazuje adres 0000h (zawierający wektor resetu), po czym mikroprocesor rozpoczyna wykonywanie kodu użytkownika.


Na początek:  podrozdziału   strony 

Stos

Układy PIC10F200/204 posiadają 2-poziomowy, 8-bitowy stos sprzętowy. W układach PIC10F202/206 stos jest 9-bitowy. Stos składa się z dwóch rejestrów STACK1 i STACK2. Rejestr STACK1 jest tzw. szczytem stosu (ang. Top Of Stack, TOS). Na stosie są umieszczane adresy powrotne z podprogramu. Instrukcja CALL najpierw przesyła bieżącą zawartość rejestru STACK 1 do rejestru STACK 2, po czym na zwolnionym w ten sposób miejscu umieszcza bieżącą zawartość licznika programu PC. Musimy pamiętać, że w momencie wykonywania instrukcji licznik programu PC jest zawsze zwiększany o 1 w takcie Q1, aby w takcie Q4 pobrać nakładkowo następną instrukcję. Zatem licznik programu PC zawiera adres kolejnej instrukcji w programie za instrukcją CALL. Jest to adres powrotny z podprogramu i adres ten jest właśnie umieszczany na szczycie stosu TOS. Po tej operacji instrukcja CALL wpisuje do ośmiu młodszych bajtów PC adres zawarty w jej kodzie (bit PC[8] jest przy tym zerowany, co wyjaśniliśmy wcześniej). Następnie mikroprocesor wykonuje instrukcję pustą NOP, a w tym czasie zostaje załadowana nakładkowo instrukcja spod nowego adresu i rozpoczyna się wykonywanie kodu podprogramu. Ponieważ stos zbudowany jest tylko z dwóch rejestrów, to może on zapamiętać tylko dwa ostatnie adresy powrotne. Jeśli zostanie wykonane kolejno więcej niż dwie instrukcje CALL, to adres powrotny z trzeciej, czwartej ... instrukcji CALL nie będzie zapamiętany na stosie – programista musi brać to ograniczenie pod uwagę przy pisaniu programu. Jeśli potrzebujesz więcej miejsca na stosie, pomyśl o mocniejszym mikrokontrolerze PIC.

Instrukcja powrotu z podprogramu RETLW pobiera zawartość rejestru STACK1 i umieszcza ją w PC, a następnie kopiuje zawartość STACK2 do STACK 1. Po tej operacji oba rejestry stosu zawierają ten sam adres. Zatem wykonanie kolejnych instrukcji RETLW spowoduje zawsze powrót do adresu za poprzednią instrukcją CALL.

Poniżej przedstawiamy operacje wykonywane przy dostępie do stosu sprzętowego

CALL k: PC ← PC + 1
STACK2 ← STACK1
STACK1 ← PC
PC ← k
NOP

NOP: instrukcja pusta powoduje pobranie rozkazu spod nowego adresu i umieszczenie go w rejestrze instrukcji. W następnym cyklu rozkazowym rozkaz zostanie zdekodowany i wykonany – innymi słowy mikroprocesor rozpocznie wykonywanie podprogramu o adresie k.

RETLW k: W ← k
PC ← STACK1
STACK1 ← STACK2
NOP

NOP: pełni tę samą rolę, co w instrukcji CALL, powoduje pobranie nakładkowo następnej instrukcji, co przy zmienionym liczniku programu PC oznacza powrót do miejsca wywołania i wykonywanie instrukcji za rozkazem CALL. Zwróć uwagę, iż oba rejestry stosu STACK1 i STACK2 zawierają ten sam adres, który był w STACK2.

W rejestrze STATUS nie ma znaczników informujących o przepełnieniu/niedopełnieniu stosu (zapis na stos więcej niż dwóch adresów powrotnych/odczyt ze stosu więcej niż dwóch adresów powrotnych).


Na początek:  podrozdziału   strony 

Rejestry INDF i FSR

Rejestr INDF nie jest fizycznym rejestrem. Zaadresowanie w instrukcji rejestru INDF faktycznie adresuje rejestr, którego adres jest zawarty w rejestrze FSR (Rejestr FSR jest wskaźnikiem). W ten sposób procesor PIC realizuje adresowanie pośrednie (ang. indirect addressing).

Adresowanie pośrednie

Załóżmy, iż rejestr 09h zawiera wartość A5h, a rejestr 0Ah zawiera wartość B9h:

Odczyt pośredni rejestru INF samego siebie (FSR = 0) zwróci 00h. Zapis pośredni do rejestru INDF nie powoduje żadnego działania (chociaż operacja może wpłynąć na znaczniki w rejestrze STATUS).

Poniżej znajduje się prosty program zerujący komórki 10h...1Fh w pamięci RAM przy pomocy adresowania pośredniego.

         MOVLW 0x10  ;Ustawienie wskaźnika
         MOVWF FSR   ;do pamięci RAM
NEXT     CLRF INDF   ;Zerowanie rejestru INDF
         INCF FSR,F  ;Zwiększenie wskaźnika
         BTFSC FSR,4 ;Koniec?
         GOTO NEXT   ;NIE, zerowanie dalej
CONTINUE
         :           ;TAK, kontynuacja
         :

FSR jest 5-bitowym rejestrem, który używany jest razem z rejestrem INDF do pośredniego adresowania obszaru pamięci danych. Bity FSR[4:0] są używane do wyboru adresu pamięci danych od 00h do 1Fh.

Uwaga: 1. Nie używaj banków pamięci RAM w PIC10F200/202/204/206. Bity FSR[7:5] nie są zaimplementowane i dają odczyt 1..

Na początek:  podrozdziału   strony 

Zespół Przedmiotowy
Chemii-Fizyki-Informatyki

w I Liceum Ogólnokształcącym
im. Kazimierza Brodzińskiego
w Tarnowie
ul. Piłsudskiego 4
©2024 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.