Re: Stránkování u PIC 16F676

j s jarin.hw na gmail.com
Sobota Leden 12 13:38:25 CET 2013


RMW (Read-Modify-Write) je proces pri ktorom instrukcia precita
hodnotu registru (sirky 1B), zmeni hodnotu niektoreho bitu a zapise
naspat cely byte.
Napriklad bsf je typicka RMW instrukcia - aplikujme ju na nejaky
register, napriklad INDF.

    movlw 0xC0
    movwf INDF
    bsf INDF,3

pred instrukciou bsf ma INDF hodnotu 0xC0. MCU urobi to, ze sa
nasmeruje na INDF, vezme si jej hodnotu, celych osem bitov - teda
hodnotu 0xC0, do nejakeho svojo interneho registra, tam si zmeni ten
jeden bit, v tom internom registri je teraz osembitova hodnota 0xC8,
potom sa obsah toho osembitoveho registra prekopiruje naspat do INDF.
Teoreticky je toto uplne dobry a korektny sposob - az na IO porty.
Vezmime si kod a predpokladajme, ze na PORTA nie je pripojene
absolutne nic. Hole piny.

    bsf PORTA,0
    bsf PORTA,1

Ak je na zaciatku PORTA nulovy, tak prva instrukcia bsf urobi toto:
A, prekopiruje sa hodnota PORTA do interneho registra - teraz je tu 0x00
B, v internom registri sa nastavi nulty bit - teraz je v nom 0x01
C, prekopiruje sa hodnota registra do PORTA - 0x01 ide na PORTA
Druha instrukcia urobi toto
A, prekopiruje sa hodnota PORTA do interneho registra - teraz je tu 0x01
B, v internom registri sa nastavi prvy bit - teraz je v nom 0x03
C, prekopiruje sa hodnota registra do PORTA - 0x03 ide na PORTA
Hura, na pinoch 0 a 1 mame vysoku uroven, ako ocakavame.

Ale teraz vezmime ten isty kod ale PORTA0 a PORTA1 budu zatazene
kondikmi, povedzme 1uF, aby to bol poriadny overkill pre
demonstrovanie RMW problemu.
Ak je na zaciatku PORTA nulovy, tak prva instrukcia bsf urobi toto:
R, prekopiruje sa hodnota PORTA do interneho registra - teraz je tu 0x00
M, v internom registri sa nastavi nulty bit - teraz je v nom 0x01
W, prekopiruje sa hodnota registra do PORTA - 0x01 ide na PORTA
Lenze - IO pin sa snazi nabijat kapacitu 1uF a tato kapacita sa nabija
z 20mA pinu pomaly. Ked instrukcie idu hned po sebe, pri rychlosti
20MHz je to 200ns po sebe. Za tu dobu sa kondik nabil trebars na 0,1V.
Lenze toto napatie znamena, ze citanie z PORTA da na tomto pine
logicku nulu, aj ked pred chvilou sme tam zapisali jednotku.
R, prekopiruje sa hodnota PORTA do interneho registra - stale sa cita 0x00
M, v internom registri sa nastavi prvy bit - teraz je v nom 0x02
W, prekopiruje sa hodnota registra do PORTA - 0x02 ide na PORTA
Toto je problem. Urobili sme bsf na dvoch pinoch, ale jednotka je len
na jednom z nich.

Ak dame medzi zapisy oneskorenie, situacia je ina

    bsf PORTA,0
    call delay_100ms
    bsf PORTA,1

Ak je na zaciatku PORTA nulovy, tak prva instrukcia bsf urobi toto:
R, prekopiruje sa hodnota PORTA do interneho registra - teraz je tu 0x00
M, v internom registri sa nastavi nulty bit - teraz je v nom 0x01
W, prekopiruje sa hodnota registra do PORTA - 0x01 ide na PORTA
IO pin sa snazi nabijat kapacitu 1uF a tato kapacita sa nabija z 20mA
pinu pomaly. Ale kedze ma dost casu na jeho nabitie, povedzme tych
100ms, tak sa kapacita nabije na 4,5V a to sa vyhodnoti ako logicka 1
R, prekopiruje sa hodnota PORTA do interneho registra - uz sa cita 0x01
M, v internom registri sa nastavi prvy bit - teraz je v nom 0x03
W, prekopiruje sa hodnota registra do PORTA - 0x03 ide na PORTA
Voila, RMW problem je ako-tak vyrieseny.

Dospelejsie MCU (PIC16F1xxx alebo PIC18 a vyssie) maju LAT register a
PORT register. Citanie z LAT registra nevracia aktualnu hodnotu z IO
portu, ale poslednu zapisanu hodnotu, takze sa strati principialna
cesta k RMW problemom, ak sa LAT registre pouzivaju na vystup hodnot a
PORT na citanie hodnot.
Pripadne sa da softwarovo emulovat LAT pomocou shadow registra.
Alebo ina softwarova cesta - strukturovanie programu tak, aby sa
nezapisovalo na PORT kade-tade bez ladu a skladu, ale v istej faze
vykonavania programu. Ked program bezi v nejakom stavovom stroji, tak
v jednom docasnom stave, ktory sa moze vyvolavat povedzme raz za
milisekundu, sa na zaklade flagov nastavencyh v tych castiach
programu, ktore chcu operovat s IO pinmi, vysklada hodnota a ta sa
cela strci do PORT registra naraz.
Toto je dovod, preco sa PICka v tejto primitivnej forme (bez LAT
registra) pouzivaju desatrocia, ale s trochou programatorskej stabnej
kultury a poznania internej funkcie MCU s tym nie su problemy. Ale o
poznanie jednoduchsie je pouzivat novsie MCU.

PIC16F1xxx su supersetom (po nasom - nadmnozinou?) PIC16Fxxx.
Obsahuju navyse mnohe instrukcie z rady PIC18, napriklad priamu volbu
banky registrov, ale maju aj moznost linearneho adresovania v datovej
pamati s pre/post inkrementaciou a dekrementaciou ukazovatela, okrem
toho maju vacsiu adresovatelnu oblast FLASH a RAM (a modely s vacsou
pamatou sa aj vyrabaju, trebars PIC16F1519), spominany LAT register,
niektore modely maju DAC (16F1783), USB (16F1455), poriadny interny
oscilator, vacsinou viac AD kanalov (a vobec, lepsi AD prevodnik)
alebo viac PWM kanalov a vacsinou aj mensiu spotrebu. Su tam este
nejake dalsie drobne vychytavky (LPBOR, LPWDT, FVR, TIM), ale zalezi
na aplikacii, ci ich vyuzijete.
Okrem toho su lacnejsie.
Skuste sa este pozriet sem
http://www.microchip.com/stellent/groups/SiteComm_sg/documents/DeviceDoc/en542713.pdf

J.


2013/1/12 Kručinský Ladislav <ladislav.krucinsky na linde-mh.cz>:
> Pane J.
> díky za připomínky, pochopitelně mám stránku s adresováním porostudovanou a pokrytou poznámkami, jenom jsem se chtěl ujistit, že to chápu správně.
> Mohl byste mi (když už jste se mne tak laskavě ujal) vysvětlit co je to problém RMW na IO portech ?
> Je někde popsán (jednoduše a stručně) rozdíl mezi PICy 16Fxxx a 16F1xxx ? Používá se tam stejná instrukční sada ?
> Chápu že je nejlepší si stáhnout datasheet (už jdu na to) ale aspoň laicky - v čem jsou lepší ?
> Děkuji za trpělivost
> Zdravím
> Kručinský
>
> -----Original Message-----
> From: hw-list-bounces na list.hw.cz [mailto:hw-list-bounces na list.hw.cz] On Behalf Of j s
> Sent: Saturday, January 12, 2013 12:43 PM
> To: HW-news
> Subject: Re: Stránkování u PIC 16F676
>
> Ked sa pozrieme do datasheetu
> http://ww1.microchip.com/downloads/en/devicedoc/40039e.pdf na stranu 19, najdeme tam popisane manipulacie s PC - v zasadne sa deju tromi
> sposobmi:
> 1, Inkrementacia po vykonani instrukcie - to je elementarny jasny sposob, ktory na tej predmetnej strane nie je explicitne popisany, preto som s nim zacal :-) 2, Instrukcia, ktora ma PCL ako ciel - teda napriklad Vase "computed goto" instrukcie addwf, PCL,f - tam je sirka zapisu do PCL iba 8 bitov. Pretoze PC ma 13 bitov, hornych 5 bitov musi ist z dolnych piatich bitov PCLATH registra, ktory je treba manualne naplnit. To pokryva AN556, napriklad.
> 3, Instrukcia GOTO alebo CALL - tu sa obsluhuje 11 bitov z instrukcneho slova a horne dva bity musite nastavit v bitoch 3 a 4 registra PCLATH. Teda pred skokom (alebo call-om) cez 2kB blok musite tieto bity adekvatne nastavit.
>
> Pokial nemusite inak, je lepsie vyhnut sa PIC16Fxxx ak ich treba programovat v assembleri. Bud pouzite PIC18F (kde tieto problemy defacto odpadaju) alebo aspon PIC16F1xxx, ktore su mimochodom lacnejsie nez stare PIC16Fxxx. Kompatibilita na asm urovni je velmi dobra, pinova kompatibilita bezproblemova.
> Okrem toho Vam tym odpadne trebars RMW problem na IO portoch, ktorym trpeli PIC16Fxxx kvoli absencii LAT registrov.
>
> A vobec, PIC16Fxxx mam rad na programovanie v assembleri a to len preto, ze je to taka moja osobna sado-maso uchylka. Mam na nich "najazdenych" pomerne dost, no nedokazem si predstavit, ze by som ich v dnesnej dobe nasadil do normalnej aplikacie - vyssie rady umoznuju programovat bez toho, aby clovek drzal v hlave vsetky ich nectnosti a myslel na to, kde ich treba obist/opravit.
>
> J.
>
>
>
> 2013/1/12 Kručinský Ladislav <ladislav.krucinsky na linde-mh.cz>:
>> Hezký vídend přeji.
>>
>> Při psaní programu pro PIC 16F676 je potřeba hlídat stránkování paměti instrukcí (přechody z 0x0FF na 0x100 atd) a obsluhovat ten stav tak jak je popsáno v AN556 pouze pro počítané skoky (čtení tabulky)  nebo mně to může zradit i v jiných částech programu ?
>> Nebo jinak řečeno: napíšu program, zkompiluju a prohlédnu si v listingu do kterých částí padly přechody mezi stránkami. Když tam není žádná oblast do které se skáče pomocí modifikace registru PCL (addwf PCL,f nebo movwf PCL,f) tak nehrozí riziko ?
>>
>> Děkuji za pomoc
>> Kručinský
>>
>> _______________________________________________
>> HW-list mailing list  -  sponsored by www.HW.cz Hw-list na list.hw.cz
>> http://list.hw.cz/mailman/listinfo/hw-list
>>
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz Hw-list na list.hw.cz http://list.hw.cz/mailman/listinfo/hw-list
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list


Další informace o konferenci Hw-list