/**********************************************************************
 *****  INCLUDE FILE FOR HW DEFINITION IN CORE LIBRARY	          *****
 *****  (WARNING: do not change variable names				      *****
 *****                                                            *****
 *****  Name: core_lib.h                                          *****
 *****  Desc: hardware layer definitions					      *****

 *****  Ver.: 1.0                                                 *****
 *****  Date: 01/2011		                                      *****
 *****  Auth: Martin Mechacek		                              *****
 *****  Comp: ESTELAR s.r.o.									  *****
 *****                                                            *****
 *****  Copyright ESTELAR s.r.o. (c) 2010, all rights reserved    *****
 **********************************************************************/ 



#ifndef _DEF_AL20_H

#define _DEF_AL20_H



/////////////////////// IMPORTANT /////////////////////////////////////

/////  Your project must be compiled with define: AL20		  /////////	
/////  														  /////////	
/////  unit: AL20	 										  /////////	
/////  desc: sbernicova jednotka pro dve ctecky EDK2 		  /////////	

/////        na HW standartniho AL20, kdyz jeste nebylo k disposici SL20				 





/**********************************************************************
 *****  IMPLEMENTATION AREA							 			   ****
 *****  set specification according to your hardware		       ****
 *********************************************************************/ 





//========================================================================

//>> define hw pin access
sbit   _TXD     = 0xB1;         
sbit   _DE  	= 0x92;
sbit   _VRXD    = 0xB3;		

// define RS485 bus connections

// vysilani dat na sbernici probiha pouze aktivaci budice RS485

// vystup TxD je trvale v '0'

   #define RS485_DRIVER_TX_LO	  _TXD = 0					// nastavuje '0' na pin TxD - P31


// pin VRXD slouzi pro zpetny odposlech stavu sbernice pro vyhodnoceni kolize

  #define VRXD    _VRXD				// definice pinu VRXD - musi byt fyzicky propojen na RxD - P33 - INT1


// data se vysilaji pomoci signalu DE

// pokud DE=1 na sbernici se zapisuje 0 a opacne, v klidu je nastaven na Lo

  #define SET_VTXD(data) 	if(data) _DE=1; else _DE=0		// nastavuje hodnotu na pin DE - P12





//========================================================================

//>> BUS_BAUDRATE 

// 19 200 bd serial constant definifion

// konstanty BUS_FREE_TIMEOUT, BUS_WAIT_TIMEOUT jsou definovany podle rychlosti volani BusTimer()

// ostatni se musi presne odmerit osciloskopem podle rychlosti procesoru, mista pro mereni jsou oznacena ve funkci BusPutChar

//------------------------------------------------------------------------



  #define 	BUS_BAUDRATE    	19200	// prenosova rychlost na sbernici	

  #define	BUS_FREE_TIMEOUT	3		// 5 ms - pokud trva klid na lince tuto dobu, bude nastaven priznak BUS_FREE (cca 10 znaku) - 
  // !! v praxi namereno 35 ms - protoze timer 2 mel periodu 10ms
  // od verze 2.70 timer 2 zrychlen na 2ms

//  #define	BUS_WAIT_TIMEOUT	15		// doba cekani na nastaveni priznaku BUS_FREE (5x BUS_FREE_TIMEOUT)
  #define	BUS_WAIT_TIMEOUT	45		// 630/SCI_MAX_RESEND
//toto je asi nespravne...je potreba zajistit celkovy cas cekani 630ms v kombinaci s poctem opakovani SCI_MAX_RESEND

  #define 	PERIOD10us			8		// konstanta pro dobu aktivace driveru RS485 - 10 us - hodnota neni kriticka

  #define 	BITPERIOD   		34		// konstanta pro dobu trvani jednoho bitu - 50us

  #define 	BITPERIOD1   		15		// doba trvani jednoho bitu - pokud se zapisuje jednicka ve smycce je vice instrukci proto je kratsi)

										// pro rychlost 19200 je ve smycce vlozena instrukce NOP pro dosazeni presneho casovani 

										// hodnota je svazana s PERIOD10us, presne nastaveni je mozne doladit zmenou PERIOD10us (+-1)

// pro rychlost 19200 je nutno nastavit dobu jednoho bitu = 52us
// celkova doba prenosu 1 byte 520us = 10 bitu

// prodleva mezi jednotlivymi byty je cca 20us - pokud je procesor prilis rychly vlozi se prodleva 

  #define 	BYTEMARKER   		1		// doplneni prodlevy - cca 80us

	

//<< end of BUS_BAUDRATE





//========================================================================

//>> define interrupts controll

sfr _SBUF  = 0x99;
sfr _IE    = 0xA8;
sbit _RI   = 0x98;
sbit _EA   = 0xAF;       /* 0=Disable all interrupts */
sbit _IE1  = 0x8B;       /* Interrupt 1 Edge Flag */



// define macros for sci interrupt enable/disable

#define RX_InterruptEnable		{  _IE |= 0x10; }  	   			   // povol RX Interrupt
#define RX_InterruptDisable		{  _IE &= 0xEF; } 	 		 	   // zakaz RX Interrupt
#define RX_ClearFlags			{  _RI = 0; _SBUF; } 		  	   // vymazani prijijateho bytu a souvisejicich flagu


#define VRX_InterruptEnable		{  _IE |= 0x84; }  	   		   // povol VRX Interrupt - INT1
#define VRX_InterruptDisable	{  _IE &= ~0x84; }   		   // zakaz VRX Interrupt - INT1
#define VRX_ClearFlags			{  _IE1 = 0; }				   // vymazani flagu INT1 


#define ALL_InterruptDisable	{  _EA = 0; }    	// zakazat vsechna preruseni pro presne casovani odesilani na sbernici
#define ALL_InterruptEnable		{  _EA = 1; }   	// povolit vsechna preruseni pro presne casovani odesilani na sbernici



// maximalni delka celeho jednoho paketu pro prijem i odesilani
// pokud je prijat delsi paket, bude korektne obslouzen, ale data z neho nebudou zpracovana
// soucasne generuje chybu ERR_SCI_LONG do gData.SciState
// aplikace by mela odeslat chybovou zpravu
// dle nastavene hodnoty se alokuje potrebna pamet, proto je treba prihlednout k HW moznostem konkretniho zarizeni
#define MAX_MESSAGE_LEN			32	

// maximalni delka prijimaciho bufferu ve kterem se ukladaji 
// prijata data z linky nez se zpracuji jako pakety - co nejvice podle velikosti dostupne RAM
// touto hodnotou se maskuje, tedy musi to byt vzdy souvisla rada jednicek
#define RX_BUFF_SIZE			0x1ff		// 512 bytes


/////// end of IMPLEMENTATION AREA ///////////////////////////////////*/



#endif 		// __DEF_AL20



