Szervó motor vezérlés. Csíkozozott fólia az optokapuk közt két tranyóval/tengely. A tranyó -> PORTB.7 B tranyó -> PORTB.6 C tranyó -> PORTB.5 D tranyó -> PORTB.4 Változik a PORTB tartalma -> interrupt. Ehhez kell az alábbiakat megtenni: INTCON.0 azaz INTCON.RBIE bit 1-re állításával engedélyezem a PORTB által generált megszakítást. INTCON2.0 azaz INTCON2.RBIP bittel lehet a megszakítás prioritását beállítani. Ha ez a bit 1: akkor a megszakítás prioritása magas, ha 0 akkor alacsony. Hogy ennek mi a lényege nem tudom, majd rájövök, ha szükség lesz rá. Rendszer felálláskor eltárolja a két opto állapotát két 8 bites változóba: x_opto_elozo, y_opto_elozo Kitalálom mi volt az előző állapot: Ha nem egy akkor kivonok belőle egyet, ha egy akkor meg %11-re (3)-ra állítom be. x_opto_elozo2, y_opto_elozo_2 Igen tudom memóriapazarlás, de lusta vagyok a sok osztogatásra. A pozíciókat is tárolni kell valamiben: két előjeltelen 4 bites int változóban. x_pos, és y_pos Szóval jön a megszakítás: A PORTB tartalma megváltozott, szóval az optok mozdultak. A két kapu adatait szétszedem két 8 bites változóba legyen mondjuk x_opto, y_opto Ugye ezek állapota vagy binárisan 10 azaz 2 vagy bináris 01 azaz 1 vagy bináris 00 azaz 0. Szóval valami ilyesmi történik a balról jobbra ( pozitív irányba történő) elmozduláskor: 1. lépés >>>>>>>>>>>>>>>>>>>>>>>>>>> a szalag haladási iránya -|<|- -|<|- infra diódák @@ @@@@@@@@@@@@@@@@ jelek a szalagon ____ _____ | | | | fototranyók | | | | zárva nyitva tehát az állapot: 10 2 2. lépés >>>>>>>>>>>>>>>>>>>>>>>>>>> a szalag haladási iránya -|<|- -|<|- infra diódák @@@@@@@@ @@@@@@@@@@@ jelek a szalagon ____ _____ | | | | fototranyók | | | | nyitva zárva tehát az állapot: 01 1 3. lépés >>>>>>>>>>>>>>>>>>>>>>>>>>> a szalag haladási iránya -|<|- -|<|- infra diódák @@@@@@@@@@@@@@@@@ jelek a szalagon ____ _____ | | | | fototranyók | | | | nyitva nyitva tehát az állapot: 00 0 4. lépés >>>>>>>>>>>>>>>>>>>>>>>>>>> a szalag haladási iránya -|<|- -|<|- infra diódák @@ @@@@@@@@@@@@@@@@ jelek a szalagon ____ _____ | | | | fototranyók | | | | zárva nyitva tehát az állapot: 10 2 Tehát amint láthatjuk az alábbi értékeket kapjuk sorban amikor a szalag balról jobbra halad: binárisan: decimálisan: irány 00 0 | 10 2 | 01 1 | 00 0 | 10 2 | 01 1 | 00 0 | 01 2 V Tehát térjünk vissza a megszakításra: Szóval bejött az optotól a jel, jó esetben megfelelő a két bit értéke. Ha mindhkettő 1 akkor a változó értéke 3 azt jelenti, hogy a szalag elszakadt, mindkét tranyó telibe zár. Lehet küldeni a PC-nek a szalaghiba üzenetet. Na szóval megállapítjuk, az adott értéket. switch(x_opto) { case 0: if (x_opto_elozo == 1 && x_opto_elozo2 == 2) { x_pos += 1; // megfelel a növekvő bitmintának a kapott érték, léptünk. } elseif(x_opto_elozo = 2 && x_opto_elozo2 == 1) { x_pos -= 1; // megfelel a csökkenő bitmintának a kapott érték, léptetünk }; break; case 1: if (x_opto_elozo == 2 && x_opto_elozo2 == 0) { x_pos += 1; // megfelel a növekvő bitmintának a kapott érték, léptünk. } elseif(x_opto_elozo = 0 && x_opto_elozo2 == 2) { x_pos -= 1; // megfelel a csökkenő bitmintának a kapott érték, léptetünk }; break; case 2: if (x_opto_elozo == 0 && x_opto_elozo2 == 1) { x_pos += 1; // megfelel a növekvő bitmintának a kapott érték, léptünk. } elseif(x_opto_elozo = 1 && x_opto_elozo2 == 0) { x_pos -= 1; // megfelel a csökkenő bitmintának a kapott érték, léptetünk }; break; case 3: ;break; // hibaüzenet. }; x_opto_elozo2 = x_opto_elozo; x_opto_elozo = x_opto; Szóval ezzel megtörtént a pozíció beállítása, boldogok vagyunk, várjuk a következő interruptot. Lassan el kell kezdeni tűnődni az adatok áramlását illetően. Ugye az adatküldést a PC kezdeményezi. Első byte a parancs bájt. A követkető bájt az adatcsomag mérete. Az adatcsomag első bájtja a hibakódot fogja tartalmazni. Kocsiberagadt, stb. A második bájt a wip bájt. Ha ez 255 a gép dolgozik, ne zavard. Ha 0 akkor jöhet az új parancs. Majd még visszatérünk rá. Nézzük milyen parancsokra lesz szükségünk: 0: "FW" - lekérdezi a kütyü firmware verzióját. Kiválóan alkalmas arra, hogy megnézzük él e a panel. Az adattömbben nem utazik semmi odafelé, visszafelé pedig az első két byteban utazik a firmware fő és alverziószáma. 1: "GOTO" - a kocsi elküldése adott X és Y koordinátákra. Az adatcsomag valahogy így fog kinézni: X.HB, X.LB, Y.HB, Y.LB 2: "HOME" - A kocsi nullpontra küldése. Előtte a szívófej, és a mozgatófej autómatikusan feleemelkedik, nehogy végigszántsuk a készülő nyáklemezt. 3: "SMDTEKER_X" - Az smd ellenállat tárolókat ezzel a fejjel lehet tekergetni. Ugyebár az SMD ellenállat tárolók vagy az x vagy az y tengellyel párhuzamosak. Jelen esetben az X tengellyel párhuzamos tárolóból fogunk vacsizni. Ez esetben tehát tudnunk kell az adott tekercs pozícióját az y tengelyen. A tekercseket mindig ugyanabba a pozícióba fogjuk forgatni, tehát a vezetőlyukak mindig ugyanazt az x koordinátát fogják felvenni. Elvileg. Tehát a parancs végrehajtása a következő képpen fog zajlani. Megkapja a tároló y koordinátáját, megkapja az elméleti vezetőlyuk x koordinátát. Elhajtja a kocsi tüskéjét erre a koordinátapárra. Ott leteszi a tüskét, és letolt tüskével mozdul lyuktávolságnyit az x tengely mentén. Ezáltal immár az eddigi üres helyen ott fog mosolyogni a kívánt alkatrész. A tüskét a biztonság kedvéért felhúzzuk. Tehát az adatcsomag: X.HB; X.LB; Y.HB; Y.LB; lyuktávolság.HB, lyuktávolság.LB 4: "SMDTEKER_Y" - Nem írom le még egyszer, ugyanaz, mint az "SMDFORDIT_X" csak a tengelyek fordulnak. 5: "SMDFELSZED" Adunk két koordinátát, ahol a terv szerint az alkatrész van a szalagon. Értelem szerűen kikalkulálható a lyuktávolság feléből, és a vezetőlyuk elméletileg koordinátájából, és a szalag pozíciójából. Ez a PC szoftver dolga. A vas elmegy az adott pozícióra, leengedi a fejet, bekapcsolja a mágnesszelepet, felhúzza a fejet. Beállít egy "part_in" bitet. Adatcsomag: X.HB; X.LB; Y.HB; Y.LB; 6: "SMDLETESZ" Adott két koordináta, elmegy odaáig, leteszi az alkatrészt. Csak akkor csinálja, ha van a szájában cuccos, azaz ha a "part_in" bit egy. Letétel után a bitet nullázzuk.