/* PICCOLO project
 * Copyright (c) 2009-2010 Istvan Cserny (cserny@atomki.hu)
 *
 */

#ifndef PICCOLO_4550_H
#define PICCOLO_4550_H

/** \file
 *  Ebben a header állományban a PIC18F4550 alapú PICCOLO kísérleti áramkör
 *  hardver sajátosságait definiáljuk. A konfigurációs bitek beállításaira
 *  csak abban az esetben van tényleges szükségünk, ha nem használunk bootloadert.
 *  Bootloaderes betöltésnél ugyanis a konfigurációs biteket nem írjuk felül, a
 *  bootloaderrel együtt beégetett konfigurációs beállítás marad érvényben.
 */  

    /*****************************************************************/
    /*** HARDVER beállítási opciók PIC18F4550 mintaáramköröhöz *******/
    /*****************************************************************/
		
	/*   KONFIGURÁCIÓS BITEK *****************************************/
	#if defined(PICCOLO_ALL)	            // Csak a főprogramhoz csatoljhatuk!
		#pragma config PLLDIV   = 5         // PLL osztó 20 MHz-es kristályhoz
		#pragma config CPUDIV   = OSC1_PLL2   
		#pragma config USBDIV   = 2         // órajel forrása a 96MHz PLL/2
		#pragma config FOSC     = HSPLL_HS  // HS oszcillátor és PLL az USB-hez is
		#pragma config FCMEN    = OFF       // Fail Safe Clock Monitor tiltása
		#pragma config IESO     = OFF       // Belső/külső oszcillátor tiltása
		#pragma config PWRT     = ON        // Bekapcsoláskor 62 ms várakozás
		#pragma config BOR      = ON        // Brown our Reset engedélyezve
		#pragma config BORV     = 2         // Reset szint = 2,7 V
		#pragma config VREGEN   = ON        // VUSB belső stabilizátorról megy 
		#pragma config WDT      = OFF       // Watchdog timer letiltva
		#pragma config WDTPS    = 256       // Watchdog utószámláló beállítása
		#pragma config MCLRE    = ON        // MCLR (reset) bemenet engedélyezve
		#pragma config LPT1OSC  = OFF       // T1OSC nagyobb teljesítményű üzemmód
		#pragma config PBADEN   = OFF       // PORTB<4:0> digitális I/O-ként inicializálódik
		#pragma config CCP2MX   = ON        // RC1 legyen a CCP2 kimenet
		#pragma config STVREN   = ON        // A verem túlcsordulása RESET-et okoz
		#pragma config LVP      = OFF       // Alacsonyfeszültségű programozás letiltva
		#pragma config ICPRT    = OFF       // Dedikált programozói kivezetés nincs
		#pragma config XINST    = OFF       // Extended Instruction Set
		#pragma config DEBUG    = OFF       // Háttér nyomkövetés letiltva, RB6/7 normál I/O
		#pragma config CP0      = OFF       // Kódvédelem kikapcsolva
		#pragma config CP1      = OFF
		#pragma config CP2      = OFF
		#pragma config CP3      = OFF
		#if defined(MCHPUSB_BOOTLOADER)     // A Boot blokkba csak ez a bootloader fér bele!
		    #pragma config CPB      = OFF   // Boot Blokk kódvédelem bekapcsolva
		#else 
		    #pragma config CPB      = OFF   // Boot Blokk kódvédelem kikapcsolva
		#endif
		#pragma config CPD      = OFF
		#pragma config WRT0     = OFF       // Írásvédelem kikapcsolva
		#pragma config WRT1     = OFF
		#pragma config WRT2     = OFF
		#pragma config WRT3     = OFF
		#if defined(MCHPUSB_BOOTLOADER)
		    #pragma config WRTB     = ON    // Boot Blokk írásvédelem bekapcsolva
		#else
		    #pragma config WRTB     = OFF   // Boot Blokk írásvédelem kikapcsolva
		#endif
		#pragma config WRTC     = OFF
		#pragma config WRTD     = OFF
		#pragma config EBTR0    = OFF       // Táblázatolvasás ne legyen letiltva
		#pragma config EBTR1    = OFF
		#pragma config EBTR2    = OFF
		#pragma config EBTR3    = OFF
		#pragma config EBTRB    = OFF       //Boot blokk táblaolvasás ne legyen letiltva
    #endif
	
    /*   USB érzékelők konfigurálása *********************************/
    //  A PICCOLO projekt mintaáramkörei nem támogatják az 
    //  USE_SELF_POWER_SENSE_IO tulajdonságot, ezért az alábbi
    //  sort hagyja meg kommentnek!
    //--- #define USE_SELF_POWER_SENSE_IO

    #define tris_self_power     TRISAbits.TRISA2    // Input
    #if defined(USE_SELF_POWER_SENSE_IO)
    #define self_power          PORTAbits.RA2
    #else
    #define self_power          1
    #endif

    //  A PICCOLO projekt mintaáramkörei nem támogatják az 
    //  USE_USB_BUS_SENSE_IO tulajdonságot, ezért az alábbi
    //  sort hagyja meg kommentnek!
    //--- #define USE_USB_BUS_SENSE_IO
    #define tris_usb_bus_sense  TRISAbits.TRISA1    // Input
    #if defined(USE_USB_BUS_SENSE_IO)
    #define USB_BUS_SENSE       PORTAbits.RA1
    #else
    #define USB_BUS_SENSE       1
    #endif
	
    /*******************************************************************/
    /******** Áramköri hardver elemek definiálása **********************/
    /*******************************************************************/
    #define CLOCK_FREQ 48000000

    /** LED-ek  ********************************************************/
    #define mInitAllLEDs()      LATD &= 0x00; TRISD &= 0x00;
    #define LEDport LATD
    #define LEDtris TRISD   
    #define mLED_1              LATDbits.LATD0
    #define mLED_2              LATDbits.LATD1
    #define mLED_3              LATDbits.LATD2
    #define mLED_4              LATDbits.LATD3
    #define mLED_5              LATDbits.LATD4
    #define mLED_6              LATDbits.LATD5
    #define mLED_7              LATDbits.LATD6
    #define mLED_8              LATDbits.LATD7
    
    #define mGetLED_1()         mLED_1
    #define mGetLED_2()         mLED_2
    #define mGetLED_3()         mLED_3
    #define mGetLED_4()         mLED_4
    #define mGetLED_5()         mLED_5
    #define mGetLED_6()         mLED_6
    #define mGetLED_7()         mLED_7
    #define mGetLED_8()         mLED_8

    #define mLED_1_On()         mLED_1 = 1;
    #define mLED_2_On()         mLED_2 = 1;
    #define mLED_3_On()         mLED_3 = 1;
    #define mLED_4_On()         mLED_4 = 1;
    #define mLED_5_On()         mLED_5 = 1;
    #define mLED_6_On()         mLED_6 = 1;
    #define mLED_7_On()         mLED_7 = 1;
    #define mLED_8_On()         mLED_8 = 1;
    
    #define mLED_1_Off()        mLED_1 = 0;
    #define mLED_2_Off()        mLED_2 = 0;
    #define mLED_3_Off()        mLED_3 = 0;
    #define mLED_4_Off()        mLED_4 = 0;
    #define mLED_5_Off()        mLED_5 = 0;
    #define mLED_6_Off()        mLED_6 = 0;
    #define mLED_7_Off()        mLED_7 = 0;
    #define mLED_8_Off()        mLED_8 = 0;
    
    #define mLED_1_Toggle()     mLED_1 = !mLED_1;
    #define mLED_2_Toggle()     mLED_2 = !mLED_2;
    #define mLED_3_Toggle()     mLED_3 = !mLED_3;
    #define mLED_4_Toggle()     mLED_4 = !mLED_4;
    #define mLED_5_Toggle()     mLED_5 = !mLED_5;
    #define mLED_6_Toggle()     mLED_6 = !mLED_6;
    #define mLED_7_Toggle()     mLED_7 = !mLED_7;
    #define mLED_8_Toggle()     mLED_8 = !mLED_8;
    
    /** SWITCH *********************************************************/
    #define mInitSwitch1()      TRISBbits.TRISB4=1;
    #define SW1                 PORTBbits.RB4
    #define sw2                 PORTBbits.RB4    // Just for compatibility
    
    /** I/O pin definitions ********************************************/
    #define INPUT_PIN 1
    #define OUTPUT_PIN 0

    /** POT ************************************************************/
    #define mInitPOT()          {TRISAbits.TRISA0=1;    \
                                 ADCON0=0x01;           \
                                 ADCON2=0x3C;           \
                                 ADCON2bits.ADFM = 1;}	// POT on RA0	
#endif  
/** EOF PICCOLO-4550.H *************************************************/
