Ismerkedés a PIC-kel

A cím egy kicsit túlzás, mert valójában volt már dolgom vele a szakdolgozatomban. A valódi ismerkedés ott történt, de sajnos idő hiányában akkor inkább az elmélettel foglalkoztam, mintsem a valódi fejlesztéssel. :(

Így hát bekerült a fiókba egy időre a PIConNET2-es panelom, amely a PICdem.NET-re épül. Illetve a PICkit2 Programozóm/Debuggerem.

A legjobb módszer szerintem az ismerkedéshez kitalálni egy egyszerű feladatot, amelyet apránként véghez is viszünk. Én is, mint sokan mások, LED villogtatással kezdtem. :)

Lássuk csak miből is áll a PIConNET2. Van a lapkán egy PIC18F4620-I/PT, amelyhez kötelező letölteni a datasheetjét, enélkül nem tudjuk programozni. (Legalábbis nekem nem menne. :) ) Továbbá van rajta egy Realtech RTL8019-es ethernet vezérlő és egy EEPROM, amelyeket egyelőre nem piszkálom. Szükség lehet még a nyák sematikus ábrájára, illetve a top overlayre is. (Utóbbinak mi a magyar megfelelője?)

PIC programozóknak az MPLAB IDE A fejlesztő környezet, ezért ezt fel kell telepíteni. Sajnos csak Windowsos verziója van. :( Viszont tudunk vele fejleszteni, programozni, debuggolni. C fordító nem jár hozzá, csak ASM (mpasm), de letölthetjük a honlapjáról a fizetős C18 C fordítót. (Talán 60 napos próbaverzió, vagy diák, vagy valami hasonló..)

Ezek után már azt gondolná az ember, hogy minden készen áll a fejlesztéshez, de nem. A PICkit2-t össze kell kötni valahogy a panelon található (jóval drágább) ICD feltöltőhöz kialakított hellyel. Egy tüskesor ide, egy RJ11 oda, kicsi forrasztás, kész is. Persze nem ilyen egyszerű az élet, mert a PICkit2 USB-ről nem tud elég áramot felvenni a programozáshoz. (Jobb ha nem tudjátok mennyi idő volt erre rájönni..) Így kell egy külső tápot is forrasztani hozzá. Egy egyszerű adaptert használtam fel, amelyet biztos, ami biztos egy TS7805-tel stabilizáltam 5V-ra. (A bemeneti és kimeneti kondit nem elfelejteni! :) )

Hurrá! Működik! Lássuk hová érdemes két LED-et kötni. Ideális helynek tűnik a PIC Digital I/O port jobb felső sarka. RB5,RB7,GND,GND. Használhatnánk egy földet is, de így szebb. :) Hamar otthagytam az MPLAB-ot és a Windows környezetet is, áttérve Linuxra, bár itt a debugger funkciót nem tudom használni, azonban ha jobban megnézzük a datasheetet (16. oldal) az RB7-es láb egyben PGD (In-Circuit Debugger and ICSP programming data pin) is. Azaz debug módban használhatatlan.

Szóval nézzük milyen eszközeink vannak Linuxon. Elsőként itt a gputils, amellyel remekül tudunk assembly programokat fordítani, linkelni. Aztán ott az sdcc, ezzel pedig C-ben írt programjainkat alakíthatjuk szép hexa kóddá. Remek, de mivel tudjuk a végeredményt feltölteni? Szerencsére a Microchip megkímélt bennünket és kiadott egy unsupported forrást erre a célra. Megvan minden! Mehet a fejlesztés!

Számomra sokkal egyszerűbb C-ben fejleszteni, ezért először abban írtam a programjaimat, majd folyamatosan megírtam hozzá az assemblys kvázi megfelelőjét, már csak tanulási célzattal is. Mielőtt belekezdenénk a konkrét feladat lekódolásába be kell állítanunk a PIC konfigurációját (datasheet 249. oldal). Egyelőre csak az oszcillátort és az mcleart állítjuk be ízlésünknek megfelelően, a többi fícsört gyakorlatilag kikapcsolhatjuk.

Szoftverfejlesztési feladat a következő. Négy állapot változik. Az egyik led fokozatosan gyulladjon ki, majd hozzá a másik is, aztán előbbi fokozatosan aludjon ki, végül a másik is. A két állapot közötti várakozási idő folyamatosan csökkenjen, illetve a fokozatosság is gyorsuljon. Majd egy idő után kezdje az egészet előröl csak a másik leddel. Természetesen a legfőbb szempont az esztétikusság volt. :)

Mi kell ehhez a programhoz? Például tudni az I/O portot programozni. PORTB beállítása a megfelelő regiszterek segítségével (datasheet 94. oldal). Végiggondolni, hogyan lehet fokozatos felgyulladást, kialvást elérni. Mivel digitális kimenetről van szó, nem lehet a feszültséget fokozatosan emelni vagy csökkenteni, tehát nem marad más mint ki-be kapcsolni, méghozzá gyorsan. Logikusan ha egy rövid szakaszt vizsgálunk, minél tovább van bekapcsolt állapotban annál világosabbnak érzékeljük. Aztán az sem árt, ha tudjuk hogyan lehet várakozni egy utasítás, állapot után. NOP paranccsal egy utasítást (4 órajel ciklust) hagyunk ki. Ez egy 40 MHz-es (PLL-lel - fáziszárt hurokkal, azaz 4x10) oszcillátor esetén nagyon rövid idő (0,1us). Remek lehetőség volna sleep módba kapcsolni a PIC-et és a timer1-et használni ébresztő megszakításra, de sajnos a panelról lemaradt a timer1 külső oszcillátora. :( Tehát a legjobb lehetőségünk írni egy 8, egy 16 és egy 24 bites számlálót. Hívás előtt csak be kell adni a kiindulási értéket, és máris van egy megfelelő hosszúságú várakoztatónk. Persze mi a csudának sajátot írni, ha már van egy kész az sdcc-sek jóvoltából? Nem kell, bár először írtam egyet, később már a külsőt használtam.

Minden további magyarázat nélkül íme a két jól működő forrás. C-ben a hozzá tartozó make szkripttel. (Fordít,linkel,feltölt,elindít.) Assembly-ben a hozzá tartozó make szkripttel.

Szuper most már tudok karácsonyfa villogtatót készíteni. Már érdemes volt élnem.

Bármiféle kérdést, javaslatot, kritikát szívesen fogadok, csak bátran. Ha valami hülyeséget írtam, akkor pedig főképpen. :)

Hozzászólások

Következő PIC-es posztomban számítógépről soros porton keresztül vezérelhető LCD-t fogok megvalósítani. Már ha kedvem és időm úgy tartja, hogy valaha elkészülök vele. (Egy hete áll a projekt. :( )

Amúgy ezek képkeretek USB mass storagekent is mennek. Potkijelzonek az alabbi formaban lehet hasznalni:
Kijelzo USBre feldug. Kijelzo atvalt adatkapcsolat modba. USB mass storagekent felismeres, mountolas. Aktualis megjelenitendo kep feltolt jpegben (generalashoz jol hasznalhato a convert). Utana USB port lekapcs. Ha jo a kepkeret akkor a memoriaban levo elso kepet kinyomja a kijelzore.
Ezt egy scriptbe konnyeden le lehet generalni egyetlen hatranya, hogy rendszeresen irja a kepkeret memoriajat es lassu.
A nagyobb 5-7 colos keretek altalaban tudnak mar prezentacio modot, ami azt jelenti, hogy direktben lehet usbn kerestul kikuldeni kepeket.
--
"Maradt még 2 kB-om. Teszek bele egy TCP-IP stacket és egy bootlogót. "

Egy icipici kulcstartóm van, és azon kellett fw-t cserélni, majd lehetett is használni, folymatosan kiteszi az uj képet, akár még videót is lehet mplayer-el.
Felismeri USB-MSD-ként de nem tudok rá másolni semmit, csak "saját programja tudna".
Majd még visszafejtem a fw-t, mert most még választani kell induláskor hogy usb mode legyen, ne pedig töltés.
google: st2205, lcd4linux

Ez tetszik, érdekelnek az ilyen kütyük. Későb írsz esetleg más (!PIC) mikrovezérlőkről is?

Szeretnék írni, mert az azt jelentené, hogy járt már a kezemben, és tanultam belőle. Ha sikerül beszereznem egy dsp-t, vagy egy fpga-t, akkor számíthatsz rá. Utóbbi van is az egyik műegyetemista barátomnak. Lehet hogy kölcsön fogom kérni és megírom neki a beadandóját. :)

Vagy ha másképp nem is, most leginkább ilyenekkel szeretnék foglalkozni következő munkahelyemen. Remélhetőleg akkor sok minden meg fog fordulni kezeim között.

Linux alatt történő PICezésre a legalkalmasabb a piklab ez egy univerzális IDE, amelyikben szabadon állíthatja az ember a toolchaintől (sdcc, gputils, jal, jal v2, ccs, c18, cc5x, BoostBasic, BoostC++, stb. )kezdve a programozó és debugoló eszközökig mindent.
--
"Maradt még 2 kB-om. Teszek bele egy TCP-IP stacket és egy bootlogót. "

+1

Teljesen igazad van. Jól kifelejtettem az írásból, pedig kipróbáltam, tetszett. Sajnos a feltöltőmet rosszul kezelte. Honlapon ez áll: "# PICkit2 only with firmware version 1.x (osccal regeneration and firmware upload supported)." Gondolom a 2.60-as firmware-t kellett volna downgradeelnem...

Egyébként nem csak ez maradt ki az írásból, hanem például, hogy az összes assembly utasítása elolvasható az eszköz datasheetjén. Vagy az, amikor összehasonlítom a C-ből keletkező hexát az assemblyből keletkezőjével. Magáról a forrásról is írhattam volna, mit miért úgy oldottam meg. No nem baj, majd ha valakit érdekel, majd kérdez. :)

Ez egy tök jó bejegyzés, köszi! :)

-----
"Egy jó kapcsolatban a társunkat az ő dolgában kell támogatni, nem a miénkben."