/*****************************************************************************************************/ /* R U T I N E _ Z A _ K O M U N I K A C I J O _ P R E K O _ D A L L A S _ 1 _ W I R E _ V O D I L A */ /*****************************************************************************************************/ //npr. #define TOUCH_PIN PIN_C7 //mora biti izhod,uporabi FAST_IO() /* spremenjen 1998-12-30 da dela tudi ob vkljuŸenem IRQ, IRQ mora biti na 256 us in brisati bit "cakaj_irq" sedaj dela pri FAST_IO vkljuŸena tudi CRC iz read_key-[Branko Premzel] */ #define PORT_ADDR(pin) ((unsigned)(pin)/8) /*iz çtevilke pina izr.naslov porta*/ #define PORT_BIT(pin) ((pin)-PORT_ADDR(pin)*8) /*izr. stevilko bita na portu*/ /*npr bit_set(*(PORT_ADDR(TOUCH_PIN)+0x80),PORT_BIT(TOUCH_PIN)); postavi TRIS bit od TUCH_PINa*/ ////////////////////////////////////////////////////////////////////////// //// Dallas Touch Driver //// //// //// //// present = touch_present() Issues a reset and returns TRUE //// //// if the touch device is there. //// //// //// //// data = touch_read_byte() Reads one byte from a touch device. //// //// //// //// ok = touch_write_byte(data) Writes one byte to a touch device //// //// and returns TRUE if all went OK. //// //// A FALSE indicates a collision with //// //// another device. //// //// //// ////////////////////////////////////////////////////////////////////////// //// (C) Copyright 1996,1997 Custom Computer Services //// //// This source code may only be used by licensed users of the CCS C //// //// compiler. This source code may only be distributed to other //// //// licensed users of the CCS C compiler. No other use, reproduction //// //// or distribution is permitted without written permission. //// //// Derivative programs created using this software in object code //// //// form are not restricted in any way. //// //////////////////////////////////////////////////////////////////////////// #ifndef TOUCH_PIN #error ***** TOUCH_PIN ni doloŸen !!!!! #define TOUCH_PIN PIN_B0 //#bit TOUCH_PIN_BIT = 6.0 //ni potrebno; nadomeçŸeno z input(TOUCH_PIN) #endif BYTE touch_read_byte(void) { BYTE i,data; BOOLEAN rx_bit; for(i=1;i<=8;++i) { disable_interrupts(GLOBAL); // OnemogoŸi prekinitve bit_clear(*(PORT_ADDR(TOUCH_PIN)+0x80),PORT_BIT(TOUCH_PIN)); //zbriçe TRIS bit,da ni problema pri FAST_IO output_low(TOUCH_PIN); // delay_us(14); delay_us(10); //14us je bilo vŸasih predolgo in ni pravilno bral // output_float(TOUCH_PIN); bit_set(*(PORT_ADDR(TOUCH_PIN)+0x80),PORT_BIT(TOUCH_PIN)); //postavi TRIS bit da ni problema pri FAST_IO delay_us(5); rx_bit = input(TOUCH_PIN); shift_right(&data,1,rx_bit); enable_interrupts(GLOBAL); // OmogoŸi prekinitve //******** CRC ****** if ((CRC_vsota ^ rx_bit) & 1) CRC_vsota = ((CRC_vsota ^ 0x18) >> 1) | 0x80; else CRC_vsota >>= 1; //******************* delay_us(100); //pavza med biti ni Ÿasovno kritiŸna zato so dovoljeni IRQji } return(data); } BYTE touch_write_byte(BYTE data) { BYTE i; bit_clear(*(PORT_ADDR(TOUCH_PIN)+0x80),PORT_BIT(TOUCH_PIN)); //zbriçe TRIS bit,da ni problema pri FAST_IO for(i=1;i<=8;++i) { disable_interrupts(GLOBAL); // OnemogoŸi prekinitve output_low(TOUCH_PIN); delay_us(5); if(shift_right(&data,1,0)) { output_high(TOUCH_PIN); //brez veze bit_set(*(PORT_ADDR(TOUCH_PIN)+0x80),PORT_BIT(TOUCH_PIN)); //postavi TRIS bit da ni problema pri FAST_IO // if(!TOUCH_PIN_BIT) if(!input(TOUCH_PIN)) goto exit_write_ret_0; } else { output_low(TOUCH_PIN); // if(TOUCH_PIN_BIT) if(input(TOUCH_PIN)) goto exit_write_ret_0; } delay_us(55); output_high(TOUCH_PIN); enable_interrupts(GLOBAL); // OmogoŸi prekinitve delay_us(50); //pavza med biti ni Ÿasovno kritiŸna zato so dovoljeni IRQji } return(TRUE); exit_write_ret_0: enable_interrupts(GLOBAL); // OmogoŸi prekinitve return(0); } BYTE touch_present() { BOOLEAN present = 0; //da ob napaki vrne FALSE #ifdef DELAY_IRQJEV Delay_irqjev(1); //poŸaka na konec prvega irq #endif output_low(TOUCH_PIN); bit_clear(*(PORT_ADDR(TOUCH_PIN)+0x80),PORT_BIT(TOUCH_PIN)); //zbriçe TRIS bit,da ni problema pri FAST_IO #ifdef DELAY_IRQJEV Delay_irqjev(2); //500us ;med irq-ji je 256us #else delay_us(500); #endif disable_interrupts(GLOBAL); // OnemogoŸi prekinitve // output_float(TOUCH_PIN); bit_set(*(PORT_ADDR(TOUCH_PIN)+0x80),PORT_BIT(TOUCH_PIN)); //postavi TRIS bit da ni problema pri FAST_IO delay_us(8); if(!input(TOUCH_PIN)) goto exit_present_ret_false; //present je nastavljen na 0 delay_us(100); present=!input(TOUCH_PIN); exit_present_ret_false: enable_interrupts(GLOBAL); // OmogoŸi prekinitve delay_us(240); if(present) return(TRUE); else return(FALSE); }