S jakým PIC začít? Jak je to se vzájemnou kompatibilitou?

Snazil som sa ist od zaciatku a nic nepreskakovat. Je to ta zdlhavejsia cesta, viac nabita suchou a nudnou teoriou, ale je efektivnejsia.
Problemy zaciatocnikov velmi dobre poznam, pretoze uz niekolki presli mojimi rukami a velmi dobre viem, kolko skod moze napachat nejaka super “kniha”, kde je vsetko “uplne fantasticky” vysvetlene. Preto uprednostnujem skor “spartansky” pristup, bez zbytocnych veci okolo, ktore cloveka odvadzaju od skutocnych problemov. To je aj dovod, preco som neodporucal nijaku knihu, ale zahlbit sa do studia datasheetov a aplikacnych poznamok.

Nevravim, ze ta kniha od z mikroe je zla, praveze vyzera byt vcelku schopna, takze ak Vladimirovi vyhovuje takyto styl, tak to budem samozrejme respektovat.

Ale stale plati, ze ta knizka ide na veci opacne ako je moj “pedagogicky system” - teda ide smerom zvonku dnu, od konkretneho k abstraktnemu, od vystupu k vstupu, od dosledkov k pricinam…

No nech je to ako chce, budem rad ak Vladimirovi budem moct nejak pomoct v jeho badani okolo PIC MCU, vela zdaru :slight_smile:

Ahoj Jaromir, dakujem, no bohuzial tie knihy uz mam precitane a vsetko z nich aj postavene a vsetko funguje. Teraz by som sa chcel zahlbit hlbsie ako vysvetluju knihy ( a najhorsie ze je to vzdy o jednom konkretnom procesore). Uz som zase trochu pokrocil, hodne som za dva dni nastudoval. Ale ak by si mal chut tak by si mohol poradit s tymito riadkami a podrobne ich rozobrat a vysvetlit, stale mam problemy s configuraciou.
" __CONFIG _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__CONFIG _CONFIG2, _WRT_OFF & _BOR21V"
Dakujem, Vladimir…

Zdravím Jaromíra.
Nebudu zapřádat debaty na toto téma, je to zbytečné. Doufám, že se necítíš nijak napadán a ani to tak nebylo myšleno. Vím, že knih je moc a v různé kvalitě. Základem je vždy datasheet výrobce a dodatečné opravné chybovníky. Na to jsem i Vladimíra v příspěvku upozornil. Mě publikace od MikroE vyhovuje pro svou názornost, proto jsem ji Vladimírovi doporučil.

K Vladimírovi.
Konfigurační slova PICů jsou v základu velmi podobná a společná rodinám mikroprocesorů. Bývají doplněna dle specifické konfigurace daného švábu, jeho hardware. Předpokládám, že se zabýváš 16F887. Tomu odpovídá i Tvůj dotaz. Posílám Ti v příloze datasheet procesoru a odkazuji Tě na studium bloku 14., a specielně 14.1, kde se popisuje konfigurační slovo a jeho implementace. Config je nutno používat obezřetně, protože můžeš zablokovat procesor tak, že se do něj nedostaneš, Hlavně _CP, což je pojistka proti nežádoucímu vyčtení kódu. Je třeba hlídat nastavení oscilátoru přes _OSC… V datasheetu je to vše perfektně popsané. Měla by to pro Tebe být k danému procesoru základní dokumentace na stole pro vážnější práci, jinak doporučuji ke stolu kýblík na vyteklé nervy.
Pokud si s tím nebudeš vědět rady, tak se ozvi.
887.pdf (5.92 MB)

No takze s tou konfiguraciou sa to ma takto.

Konfiguracne bity je mnozina bitov, ktore patra do FLASH pamati MCU. Tento kusok FLASH-ky nie je v priestore, z ktoreho sa da vykonavat program, ale v separatnom, ktory sluzi len na to, aby sa po resete MCU interna logika MCU “pozrela” na tieto hodnoty a podla toho nastavila to co treba - oscilator, BOR, WDT atd… Toto nastavenie je zakladnym nastavenim MCU, su to veci, ktore sa nemozu alebo nedaju menit programom - napriklad nastavenie oscilatoru.
Preto je treba tieto konfiguracne bity nejak specifikovat.
Najlepsie je to urobit tak, ze pri kompilacii zdrojoveho kodu bude mat assembler v zdrojovom kode aj toto nastavenie, toto sa uchova aj v binarnej podobe strojoveho kodu (.hex subor) a program na natiahnutie tejto binarnej podoby strojoveho kodu pri “vypalovani” do MCU rovno “vypali” aj konfiguracne bity.
Takze tolko pozadie problemu.

Pozrite sa do datasheetu PIC16F887. V kapitole 14.1, teda pokial mame ten isty datasheet, je uvedeny vyklad dvoch konfiguracnych slov, kazde ma 14 bitov - tak ako ma aj kazdy iny riadok FLASH pamate PIC16F.
Povedzme, ze chceme nastavit oscilator na typ INTOSC (vnutorny oscilator), WDT zakazat, PWRT povolit, MCLR nastavit ako externy reset a vsetko ostatne disablovat, resp. zakazat. Co znamena WDT, BOR atd je uvedene v datasheete a ak neviete, najprv sa pozrite tam.
Z toho vyplyva, ze je treba ako konfiguracne slovo 1 (CONFIG1) nastavit hodnotu 0bxx00000011100101 kde xx su nepodstatne hodnoty nepodsatnych bitov.
Bolo by dost nepohodlne specifikovat niekde v zdrojaku, aby assembler ulozit na tu a tu adresu toto konkretne slovo (0bxx00000011100101), hoci je to mozne. Assembler ponuka moznost zadat to trosku logickejsie - cez direktivu __CONFIG.
Tato dirketiva nerobi nic ine, nez len vezme argument a ulozi ho na spravnu adresu (adresu konfiguracneho slova).
Teda ked zadate __CONFIG CONFIG1, 0x0005 tak jednoducho do konfiguracneho slova CONFIG1 zada hondotu 0x0005 nech je to uz cokolvek.
Ak zadame __CONFIG _CONFIG1,0b0000000011100101 tak do CONFIG1 da hodnotu, ktora zodpoveda nasim nastaveniam tak, ako som ich specifikoval predtym.

Na zaciatku Vasho zdrojoveho kodu mate iste napisane #include “p16F887.inc” alebo nieco velmi podobne.
Je zahodno pozriet sa do tohto suboru. Pokial mate MPLAB instalovany tam kde sa ponuka, tak je ten subor tu C:\Program Files\Microchip\MPASM Suite a vola sa p16F887.inc.
Su v nom vsetky definicie, s ktorymi pracuje assembler. Pretoze on v zasade netusi, co znamena MOVWF PORTA, pretoze PORTA nie je ani nazov instrukcie, ani navestie ani nic podobne. Jedine z tohto suboru vycita, ze PORTA je to iste ako 0x0005, takze assembler to cele pochopi ako MOVWF 5 a je spokojny.

Na konci tohto suboru su vyznamy mnemonickych kodov pre konfiguracne bity. Napriklad _XT_OSC je H’3FF9’ (hexadecimalna hodnota) alebo _BOR_OFF je H’3CFF’.
Ak vyrobite logicky sucin (AND, znacka &, priklad 0x07 & 0x0E = 0x06) tychto dvoch hodnot, dostanete hodnotu konfiguracneho slova, ktore zodpoveda nastavenemu XT oscilatoru a vypnutemu BOD, s ostatnymi bitmi nastavenymi do hodonty 1.
Teda ak si dame dokopy
_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF & _LVP_OFF & _DEBUG_OFF, mali by sme dostat hodnotu 0bxx00000011100101. Nekontroloval som to, ale malo by to byt tak :slight_smile:
Cize ked napisete
__CONFIG _CONFIG1, _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF & _LVP_OFF & _DEBUG_OFF
date dokopy dve veci, ktore som Vam vysvetlil uz predtym.

Takze, vzdy ked mam ist robit projekt, tak

1, si vezmem ceruzku a papier, otvorim si datasheet na konfiguracnych bitoch a podla datasheetu vypisem si hodnotu kazdeho jedneho parametra, ktory chcem nastavit.
Napriklad,
oscilator - vnutorny, RA6 a RA7 su IO piny (INTOSCIO)
WDT - vypnuty (OFF)
PWRT - zapnuty (ON)

2, vedla toho si vypisem mnemonicke kody konfiguracnych bitov podla .inc suboru, napriklad p16F887.inc
_INTRC_OSC_NOCLKOUT
_WDT_OFF
_PWRTE_ON

3, dam to vsetko dokopy
__CONFIG _CONFIG1, _INTRC_OSC_NOCLKOUT & _WDT_OFF & … …

V kroku 2 predpokladam, ze je zrejme, ze INTOSCIO je to, co je v .inc suobre pomenovane ako _INTRC_OSC_NOCLKOUT. Chce to trosku intuicie.

4, skuska spravnosti: stlacim F10, cim prebehne build. Ak nie je v zdrojaku nikde chyba, teda vysledok je BUILD SUCCEDED, tak idem na MPLAB -> Configure -> Configuration bits a vidim, ze v tomto okne si mozem overit spravnost svojho nastavenia.
Poznamka: configuracne bity sa v danom okienku nenastavia, ak neprebehne spravne assembler - teda ak je chyba niekde inde, alebo v konfiguracii samotnej, tak sa hodnoty neupdatuju.


Toto je najjednoduchsi zdrojak s kompletnou inicializaciou konfiguracneho slova CONFIG1

#include "p16F887.inc"

	__CONFIG _CONFIG1,_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON &  _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF & _LVP_OFF & _DEBUG_OFF

	nop
	end

Ak vidite, nerobi to nic, iba ze to assembler “pozuje”.
Skuste si to zassemblovat a pozriet sa na okno konfiguracnych bitov.

Viac napovedy ku knofiguracnym slovam najdete na MPLAB -> Help -> Topics -> MPASM assembler -> Search a zadajte do hladania “__CONFIG”.


Domaca uloha:
1, Pochopte a dorobte konfiguraciu pre CONFIG2 PIC16F887
2, Najdite PIC, ktore ma len jedno konfiguracne slovo, skuste si urobit jednoduchy zdrojak pre taketo PIC s jeho konfiguraciou. Staci taky ako som tu ukazal ja, len konfiguracia, nop a end.

=============================================
EDIT:
Este k tym konfigurakom.
Ak pracujete len v MBLAB-e, teda mate napriklad PicKit2, ktory pouzivate ako programator, resp. debugger priamo z MPLAB-u (teda nie cez PicKit2 program), je mozna aj jednoduchsia cesta.
Ist na MPLAB -> Configure -> Configuration bits, odskrtnut volbu tu, ze su konfiguracne bity nastavene v zdrojovom kode a nastavit ich “rucne”.

Toto ma vsak jednu velku nevyhodu - toto nastavenie je len sucastou projektu, nie vsak .hex suboru.
Teda pokial programujete rovno PicKit-om z MPLAB-u. tak Vam to pojde, ale ak date niekomu .hex subor a on sa ho bude snazit napalit do svojho PIC akymkolvek programovadlom, tak tam nie konfiguracne bity nebudu obsiahnute.

Cize vy si to zjednodusite, ale takto je to principialne nie celkom spravne. Jediny “koser” sposob je ten komplikovanejsi, teda specifikovat konfiguracne bity cez __CONFIG direktivu v zdrojovom kode.

Nie, necitim sa byt napadany, v ziadnom pripade som to tak nechapal.
Na potrebe datasheetu sa zhodneme vsetci, ale ako tak citam prispevky na tomto fore… vsetci nie su asi naozaj vsetci. Preto to zdoraznujem stale dokola.
Inak sa samozrejme nemame o com hadat :wink:

Diky Pepino, pokial si odpisal tak som sa tam akosi prekopal a nieco dokonca i pochopil. ale mam otazku (dilemu) ako a kedy a preco nastavit interny osc. a preco ext osc. a co je lepsie??.. to som zatial jaksi nepochopil. ked chcem naprik. pouzit INTOSC 4 MHz ako mam postupovat, a naopak ked chcem pouzit EXTOSC 20MHz ako mam postupovat… dakujem …

To dilema za Tebe nevyřeším já. Musíš si stanovit priority, zda budeš používat externí krystal nebo oscilátor se kterým můžeš šlapat až do 20MHz, což může být v některých aplikacích nepostradatelné a nebo používat interní oscilátor, se kterým můžeš maximálně do 8 MHz. Nedá se říci, která varianta je lepší. Záleží na projektu. Externí zabere piny, ale má vyšší frekvenci a externí kondy. Interní nemá bižuterii okolo, ušetří piny a další hardware. Jde použít jen do osmi MHz. Sám vidíš, že toto za Tebe nerozhodnu. 4 MHZ jsou používané v int. oscilátoru defaultně. Rozhodni se sám.

Pepino, tak tu sme si trochu nerozumeli, nechcem taketo veci riesit, ci 4 MHz alebo 20 MHz, ale mal som namysli konfiguraciu , ako vyzera pri internom a ako pri externom… dakujem…

Tady máš datasheet: PIC16F887

Jak nastavit typ oscilátoru najdeš v tom datasheetu v kapitole 14 konkrétně strana 212

3 bity pojmenovaný jako FOSC udávají jaký oscilátor se použije.

Režimy LP, XT a HS se týkají externího krystalu. Rozlišuje se to podle rychlosti.
LP je pomalej krystal s nízkým příkonem, rychlosti nevím. Takový zástupce pro představu je 32,684kHz
XT je klasickej krystal od nevím kolika do cca 4MHz
HS je rychlej krystal nad 4MHz

PAk tam máš 2 režimy interního oscilátoru

  1. INTOSC - interní oscilátor, kmitočet vydělený 4 je na výstupu RA6, RA7 je klasickej I/O pin
  2. INTOSCIO - vnitřní oscilátor, výstupy RA6 a RA7 jseu klasické I/O

Takhle je to v tom konfuguračním registru.
V assembleru to budeš zapisovat takto:
Samosebou to musíš zahrnout mezi ostatní pojistky

_LP_OSC
_XT_OSC
_HS_OSC
_EC_OSC

_INTOSCIO
_INTOSC

To je celej fígl. Úplně stejný jako u PIC16F690

Když si nastavíš krystalovej oscilátor tak tě už nic nezajímá, prostě tam buchneš krystal kondenzátory a jede to.

Interní oscilátor musíš nastavit, jak se dozvíš v datasheetu kapitola 4, přesně to je strana 63, je tam blokově jak je oscilátor udělanej. Z toho se ti to snad líp pochopí než o tom psát.
Nastavuje se to v registru OSCCON.
Kmitočet si vybereš tak, že na začátek programu se přepneš do BANKY1, do registru W si pomocí MOVLW natáhneš co potřebuješ, to zapíšeš pomocí MOVWF OSCCON, tam kde to má být.

A to je celý pane :smiley:

Já nemám rád dlouhý čtení z monitoru, takže mám důležitý věci z datasheetu vytisknutý, není špatn si to jednou přečíst aspoń tak dobře jako čteš třeba noviny.
Naporpvé to třeba nepobereš, ale jak nad tím zapřemýšlíš tak ti spousta věcí dojde a pak už pro tebe nebude problém přelétávát z jednoho PICu na druhej.

Když si zvládl naprogramovat hry na Spectru v assembleru (hluboká poklona) tak toto taky hravě zvládneš.

Teď na to koukám a celkem jsem se rozepsal.

niekde je aj preklad 16F877 do ceskeho jazyka…niektore veci su rovnake niektore nie ale pre pochopenie a lachsiu orientaciu doporucujem stiahnut…len neviem najst odkaz…ale asi je aj niekde tu na fore.

Zrovna v tomto případě mu bude překlad na nic, 16F877 nemá interní oscilátor.

Jinak české překlady některých datasheetů jsou tady na fóru ke stažení.

Dakujem panove vsetky zucastnenym v tomto vlakne-Petrovi, Atlanovi, Billymu, Pepinovi a Jaromorovi za rady , uz mam v tom o moc jasnejsie aj vdaka vam. Samozrejme ze datasheet mam uz od zaciatku a cital som ho uz stokrat, a citam ho stale. No viete ako sa hovori, nikedy je lepsie raz vidiet ako stokrat pocut. Vlastne som pomaly na to poprichadzal neustalym citanim dokola programov a datasheetu. Som teraz doma a ine na praci nemam, tak ze som hodne pochopil a to aj vdaka vam. (Inak pracujem ako technolog-programator NC a CNC strojov) A teraz by som chcel len tak pre kontrolu aby ste sa vyjadrili: Chcem pouzit INT oscilator o 4 MHz , teda mam toto: __CONFIG _CONFIG1, _INTOSCIO …

a v registri OSCCON mam B’01100001’ …tak ze je to takto spravne??
Dakujem…

jj interni OSC na 4MHz

__CONFIG    _CONFIG1, _INTRC_OSC_NOCLKOUT



    	bsf     	STATUS,RP0  	; select Register Bank 1
	MOVLW	b'01100000'	;OSCILATOR 4Mhz
	MOVWF	OSCCON
    	bcf     	STATUS,RP0  	; back to Register Bank 0

akorat sem nak pochopil funkci bitu OSCCON/SCS :question:

Pozor na vec - 887 a 877!

SCS bit umoznuje prepnut sa na interny oscilator aj ked nie je zvoleny ako hlavnhy clock.
Napriklad mate zvoleny HS ako hlavny clock v konfiguracnych bitoch, ale pocas behu programu sa mozete prehodit na INTOSC.
Moze sa to hodit napriklad za ucelom zmensenia spotreby.

Potom tomuto ale nerozumiem : _INTRC_OSC_NOCLKOUT ??
A ten OSCCON ja mam vzdy standartne nastaveny na ‘01100000’ tak ho nemusim nastavovat , alebo musim??

OSCCON je defaultne nastavenej na 4MHz, treba nastavit jen _INTRC_OSC_NOCLKOUT

takze by mohl nastat problem ?
priklad:
nastaveno HS na 20MHz, OSCCON/SCS = 1 , takze by to nebezelo na 20MHz ale na 4MHZ(default) z interniho ?

_INTRC_OSC_NOCLKOUT = pouzit interni oscilator bez vystupu na RA6/OSC2/CLKOUT delenej 4

101 = INTOSC oscillator: CLKOUT function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN 100 = INTOSCIO oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN

Ja som si myslel ze nato tam mam v CONFIGU1 prave toto “INTOSCIO”

da se pouzit oboji , ja pouzivam _INTRC_OSC_NOCLKOUT

_INTRC_OSC_NOCLKOUT          EQU     H'3FFC'
_INTRC_OSC_CLKOUT            EQU     H'3FFD'
_INTOSCIO                    EQU     H'3FFC'
_INTOSC                      EQU     H'3FFD'

Neviem ci je to problem.
Je to vlastnost, ktora dava moznostiam clockovania toho MCU velku flexibilitu.

Neviem preco by sa SCS malo same od seba nastavit do jednotky, defaultne je v nule a pokial aj neznaly uzivatel nebude zasahovat do toho, co nepozna, tak nijaky problem nenastane.