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

j s jarin.hw na gmail.com
Sobota Leden 12 13:55:56 CET 2013


Pre zaciatok mozete skusit nejaky mensi PIC, trebars PIC12F1501.
Datasheet k nemu ma len 278 stran :-)
Ono tie datasheety su dost ukecane. Aj z toho 484 stranoveho
datasheetu budu podstatnu cast (90%) tvoria popisy periferii, ktore
zatial nepouzivate, resp. rozsiahle specifikacie elektrickych
parametrov.

Pokial Vam ale 16Fxxx vyhovuju, nic Vam nebrani pouzivat ich. Len som
Vas chcel upozornit na problemy, o ktore sa mnohi (vratane mna) uz
popalili a stale su aktualne.

Prechod na tie PIC16F1xxx sa da zjednodusit pouzivanim C kompilatora.
Napriklad XC8 od Michrochipu - tam je clovek usetreny mnohych
intimnych detailov tej-ktorej rodiny MCU. Pripade prechodu PIC16Fxxx -
> PIC16F1xxx zacnete pouzivat LAT registre a vytestovat sa z vacsej
programovej a datovej pamate, pripadne novych periferii.

J.


Dňa 12. január 2013 13:47, Kručinský Ladislav
<ladislav.krucinsky na linde-mh.cz> napísal/a:
> Děkuji moc za informace,
> pohled na to je samozřejmě pochopitelný od Vás jako od profesionála ale já jsem si mezitím snažil prolízt jeden datasheet a už ten počet stránek (484...) mně zarazil. Já jakožto příležitostný bastlíř a ne-programátor jsem se naučil v potu tváře programovat tu základní řadu, zatím jsem nenarazil na problém, který bych s ní nepokryl. Třeba se dostanu k tomu, že sáhnu po té "enhanced mid range". Děkuji za odkaz, jdu si ho prolistovat.
>
> 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 1:38 PM
> To: HW-news
> Subject: Re: Stránkování u PIC 16F676
>
> 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
> _______________________________________________
> 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