/*******************************************************************************
 *
 *                    3 axis CNC vezérlő
 *
 * 0x0   - 0x7FF        Microchip USB Bootloader szükséges!!!!
 * 0x800 - 0x829        vektorok
 * 0x82A - 0x7FFF       3 axis CNC vezérlő program
 *
 *******************************************************************************
 * FileName:        io_cfg.h
 * Dependencies:    INCLUDES részben található 
 * Processor:       PIC18
 * Compiler:        C18 2.30.01+
 * Company:         @DESIGN Software & Hardware (nem valós társaság)
 *
 * L I C E N S E
 *
 * This project is distributed under GPLv3
 * (C)2013 Nyárfádi Gábor gabor@nyarfadi.hu
 *
 * Author               Date           Comment
 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * Nyárfádi Gábor       2013.06.26.    Első kiadás
 ******************************************************************************/

/*******************************************************************************
 * -io_cfg.h-
 * I/O konfigurációs fájl
 * Lábkisztás és funkciók beállítása 
 * változók létrehozása és kezelése
 ******************************************************************************/

#ifndef IO_CFG_H
#define IO_CFG_H

/** I N C L U D E S ***********************************************************/
#include "typedefs.h"

/** B E M E N E T E K *********************************************************/

#define InitAllIn()	      	TRISB = 0b11110111; //PORTB bemenet
                                                    //egy kivételével "RB3"
/*******************************************************************************
 * A léptetéshez két jel kell a "step" vagyis a lépés parancs, és a
 * "dir" azaz a lépés irány.
 ******************************************************************************/
#define Step_x                  PORTBbits.RB0
#define Step_y                  PORTBbits.RB1
#define Step_z                  PORTBbits.RB2
#define Dir_x			PORTBbits.RB5
#define Dir_y			PORTBbits.RB6
#define Dir_z			PORTBbits.RB7
// step jel érzékelét jelz? bitek és azok törlése
#define Step_x_flag		INTCONbits.INT0IF
#define Step_y_flag		INTCON3bits.INT1IF
#define Step_z_flag		INTCON3bits.INT2IF
#define	Clear_x_flag()		Step_x_flag=0;
#define Clear_y_flag()		Step_y_flag=0;
#define Clear_z_flag()		Step_z_flag=0;
// a BootLoader -t?l örökölt kapcsoló
#define Bootsw			PORTBbits.RB4

/** K I M E N E T E K *********************************************************/
// kimenetek konfigurálása egy lépésben
#define InitAllOut()  		LATA=0x00; TRISA=0x00; LATC=0x00; TRISC=0x00; LATBbits.LATB3=0; TRISBbits.TRISB3=0;
/*******************************************************************************
 * A motorokat vezérl? kimenetek fázisonként. A változók deklarálásánál 
 * létre hozzuk ugyan ezen a néven csak nagy betükkel a kiírandó értéket
 * tároló biteket, és a kiírást.
 ******************************************************************************/
#define x_a			LATAbits.LATA0
#define x_a_                    LATAbits.LATA1
#define x_b			LATAbits.LATA2
#define x_b_                    LATAbits.LATA3

#define y_a			LATAbits.LATA4
#define y_a_                    LATAbits.LATA5
#define y_b			LATCbits.LATC0
#define y_b_                    LATCbits.LATC1

#define z_a			LATCbits.LATC2
#define z_a_                    LATCbits.LATC7
#define z_b			LATCbits.LATC6
#define	z_b_                    LATBbits.LATB3

/** V A R I A B L E S *********************************************************/
//interrupt engedélyezés és tiltás
#define GIEenable()		INTCONbits.GIE=1;
#define GIEdisable()            INTCONbits.GIE=0;

//STATUS.C törlése
#define clrc()			STATUSbits.C=0;

//motor fázis értékek
#pragma udata
/*******************************************************************************
 * Egy 32 bites változóban vannak a fázisok elmentve. A "DWORD" típus
 * lehetöséget ad ugyan annak a változónak a részenkénti (byte és bit)
 * írására és olvasására is (typedefs.h).
 ******************************************************************************/
ram DWORD x_mot; //x axis motor értékek
ram DWORD y_mot; //y axis motor értékek
ram DWORD z_mot; //z axis motor értékek
/*******************************************************************************
 * Minden motor minden fázisa egy byte értékben kezelhetö. Ez az érték-
 * adásnál igen fontos, hogy lássuk az összes fázist külön-külön.
 ******************************************************************************/
#define X_A1                    x_mot.byte0
#define X_A2                    x_mot.byte1
#define X_B1                    x_mot.byte2
#define X_B2        		x_mot.byte3
#define Y_A1            	y_mot.byte0
#define Y_A2    		y_mot.byte1
#define Y_B1            	y_mot.byte2
#define Y_B2                    y_mot.byte3
#define Z_A1                    z_mot.byte0
#define Z_A2            	z_mot.byte1
#define Z_B1            	z_mot.byte2
#define Z_B2                    z_mot.byte3

/*******************************************************************************
 * Minden motor pillanatnyi fázis értéke az elsö bithez van rendelve.
 * A kimenetnek ugyan ez a neve, csak kisbetükkel.
 ******************************************************************************/
#define X_A			x_mot.Byte0.b0
#define X_A_                    x_mot.Byte1.b0
#define X_B			x_mot.Byte2.b0
#define X_B_            	x_mot.Byte3.b0
#define Y_A			y_mot.Byte0.b0
#define Y_A_                    y_mot.Byte1.b0
#define Y_B			y_mot.Byte2.b0
#define Y_B_            	y_mot.Byte3.b0
#define Z_A			z_mot.Byte0.b0
#define Z_A_                    z_mot.Byte1.b0
#define Z_B			z_mot.Byte2.b0
#define Z_B_                    z_mot.Byte3.b0
/*******************************************************************************
Unipoláris léptető motorokhoz ezzel a vezérlővel két (három) típusú
vezérlés valósítható meg. Csak folyamatos (nem PWM) vezérlést tud
létrehozni a kapcsolás. Ez esetben bekapcsolás után rögtön a fázis
vezérlő (pl.:x_a_) első azaz nulladik helyértékén lévő érték jele-
nik meg az adott fázis kimenetén. A main() föggvénybe beírtam mind a
három típus inicializáló kódját, de csak egyet kell egyszerre elindí-
tani, ellenkező esetben az utolsó parancs hajtódik végre.

Lássuk az elsőt: Wave egyfázisú léptető vezérlés. Nemhasználatos mivel
igen gyenge a hatásfoka.
*******************************************************************************/
#define Wave_vez() X_A1 = 0x88;X_A2 = 0x44;X_B1 = 0x22;X_B2 = 0x11;Y_A1 = 0x88;Y_A2 = 0x44;Y_B1 = 0x22;Y_B2 = 0x11;Z_A1 = 0x88;Z_A2 = 0x44;Z_B1 = 0x22;Z_B2 = 0x11;
/*******************************************************************************
 A FULL vezérlés: egyszerre két tekercs van gerjesztve. Itt a leg-
 erösebb a motor, de a gyári adatlapon szereplö értéken.
 ******************************************************************************/
#define Full_vez() X_A1 = 0xCC;X_A2 = 0x33;X_B1 = 0x66;X_B2 = 0x99;Y_A1 = 0xCC;Y_A2 = 0x33;Y_B1 = 0x66;Y_B2 = 0x99;Z_A1 = 0xCC;Z_A2 = 0x33;Z_B1 = 0x66;Z_B2 = 0x99;
/*******************************************************************************
 A HALF lépés: Fél lépéseket a teljes 8 biten lehet csak ábrázolni.
 A nevében is szereplö "fél" lépés érték a gyári fele. Az ereje az
 egyész lépések (Wave és Full) között van kb 1,5.
 ******************************************************************************/
#define Half_vez() X_A1 = 0xC1;X_A2 = 0x1C;X_B1 = 0x70;X_B2 = 0x07;Y_A1 = 0xC1;Y_A2 = 0x1C;Y_B1 = 0x70;Y_B2 = 0x07;Z_A1 = 0xC1;Z_A2 = 0x1C;Z_B1 = 0x70;Z_B2 = 0x07;
/*******************************************************************************
 * A kimenet beállítása motoronként egy lépés.
 ******************************************************************************/
#define x_mot_write()     x_a=X_A; x_a_=X_A_; x_b=X_B; x_b_=X_B_;
#define y_mot_write()     y_a=Y_A; y_a_=Y_A_; y_b=Y_B; y_b_=Y_B_;
#define z_mot_write()     z_a=Z_A; z_a_=Z_A_; z_b=Z_B; z_b_=Z_B_;
/*******************************************************************************
 * A léptetés a carryn keresztül történik. Mivel egyszerre csak 16 biten lehet
 * léptetni, két részben kell a teljes 32 bites fázis értéket léptetni.
 ******************************************************************************/
#define x_step_right()  clrc();x_mot.word0>>=1;if (STATUSbits.C) x_mot.word0 |= 0x8000;clrc();x_mot.word1>>=1;if (STATUSbits.C) x_mot.word1 |= 0x8000;
                        //lépjünk jobbra és pótoljuk a bitet
#define x_step_left()   clrc();x_mot.word0<<=1;if (STATUSbits.C) x_mot.word0++;clrc();x_mot.word1<<1;if (STATUSbits.C) x_mot.word1++;
                        //lépjünk balra és pótoljuk a bitet

#define y_step_right()  clrc();y_mot.word0>>=1;if (STATUSbits.C) y_mot.word0 |= 0x8000;clrc();y_mot.word1>>=1;if (STATUSbits.C) y_mot.word1 |= 0x8000;
                        //lépjünk jobbra és pótoljuk a bitet
#define y_step_left()   clrc();y_mot.word0<<=1;if (STATUSbits.C) y_mot.word0++;clrc();y_mot.word1<<1;if (STATUSbits.C) y_mot.word1++;
                        //lépjünk balra és pótoljuk a bitet

#define z_step_right()  clrc();z_mot.word0>>=1;if (STATUSbits.C) z_mot.word0 |= 0x8000;clrc();z_mot.word1>>=1;if (STATUSbits.C) z_mot.word1 |= 0x8000;
                        //lépjünk jobbra és pótoljuk a bitet
#define z_step_left()   clrc();z_mot.word0<<=1;if (STATUSbits.C) z_mot.word0++;clrc();z_mot.word1<<1;if (STATUSbits.C) z_mot.word1++;
                        //lépjünk balra és pótoljuk a bitet

/** U S B *********************************************************************/


#endif //IO_CFG_H
