亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? iso.c

?? AVR ISO9141 OBDII Souce code
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*************************************************************************
**  AVR ISO 9141/14230-2 Interface
**  by Michael Wolf
**
**  Released under GNU GENERAL PUBLIC LICENSE
**
**  contact: webmaster@mictronics.de
**  homepage: www.mictronics.de
**
**  Revision History
**
**  when         what  who			why
**
**************************************************************************/
#include <avr/io.h>
#include <avr/signal.h>
#include "iso.h"

/* 
**--------------------------------------------------------------------------- 
** 
** Abstract: ISO hardware setup
** 
** 
** Parameters: none
** 
** 
** Returns: none
** 
** 
**--------------------------------------------------------------------------- 
*/ 
void iso_hardware_init(void)
{
	ISO_INIT_LED_DIR |= _BV(ISO_INIT_LED_OUT);  // make LED pin output
	bus_init_led_off();  // LED off
	
	ISO_K_LINE_DIR |= _BV(ISO_K_LINE_OUT);  // make K line output an output
	iso_k_high();  // set K line high
	
	ISO_K_LINE_DIR &=~ _BV(ISO_K_LINE_IN); // make K line input an input
	
	ISO_K_LINE_DIR |= _BV(ISO_L_LINE_OUT);  // make L line output an output
	iso_l_high();  // set L line high
}


/* 
**--------------------------------------------------------------------------- 
** 
** Abstract: Wait for ISO bus idle
** 
** Parameters: none
** 
** Returns: none
** 
**--------------------------------------------------------------------------- 
*/ 
void iso_wait_idle(void)
{
	timer1_start(T1_PRESCALER);
	while(TCNT1 < TIME_W5_MIN)	// wait for minimum bus idle time
	{
		if(!is_k_in_high()) timer1_set(0);	// restart timer1 when bus not idle
	}
}


/* 
**--------------------------------------------------------------------------- 
** 
** Abstract: 5 Baud bus init routine
** 
** 
** Parameters: Address byte
** 
** 
** Returns: Error code
** 
** 
**--------------------------------------------------------------------------- 
*/ 
char iso_5_baud_init(unsigned char addr)
{
	bus_init_led_off();  // turn off indication LED
	iso_wait_idle();	// wait for bus idle time
  
	unsigned char inv_addr = ~addr;	// store inverse address
	unsigned char bit_cnt;
	for(bit_cnt = 0; bit_cnt < 10; ++bit_cnt)
	{	
		/* Start bit */
		if( bit_cnt == 0)
		{
			iso_k_low();  // force K line low
			iso_l_low();  // force L line low
		}
		/* Stop bit */
		else if ( bit_cnt == 9 )
		{
			iso_k_high();  // force K line high
			iso_l_high();  // force L line high
		}
		/* Addr bit */
		else
		{
			if( addr & 1 )  // check addr LSB and set lines
			{
				iso_k_high();  // force K line high
				iso_l_high();  // force L line high			
			}
			else
			{
				iso_k_low();  // force K line low
				iso_l_low();  // force L line low			
			}
			
			addr >>= 1;  // next bit
		}
	
		timer1_set(0);
		while(TCNT1 < TIME_5_BAUD_BIT)	// hold bit level
		{
			if(is_k_out_high() && is_k_in_high()) // check for bus errors
			{
				return ISO_RETURN_CODE_BUS_ERROR;	// error, bus collision!
			}
		}
		
	}  // end for loop

	/* transmit 5 baud addr complete, wait for response now */
	SETBIT(iso_glob.uart_status, AUTOBAUD);  // detect baud rate from synch pattern
	iso_uart_init();  // init iso uart

	// wait W1_MAX for synch pattern
	timer1_set(0);
	while(TCNT1 < TIME_W1_MAX)
	{
		if( CHECKBIT(iso_glob.uart_status, RDY) )
		{
			CLEARBIT(iso_glob.uart_status, RDY);
			if( iso_glob.uart_buffer != 0x55)
				return ISO_RETURN_CODE_INIT_ERROR;  // end if synch pattern is not correct

			// wait W2_MAX for keybyte 1
			timer1_set(0);
			while(TCNT1 < TIME_W2_MAX)
			{
				if( CHECKBIT(iso_glob.uart_status, RDY) )
				{				
					CLEARBIT(iso_glob.uart_status, RDY);
					iso_glob.keybyte1 = iso_glob.uart_buffer;  // store keybyte 1

					// wait W3_MAX for keybyte 2
					timer1_set(0);
					while(TCNT1 < TIME_W3_MAX)
					{
						if( CHECKBIT(iso_glob.uart_status, RDY) )
						{				
							CLEARBIT(iso_glob.uart_status, RDY);
							iso_glob.keybyte2 = iso_glob.uart_buffer;  // store keybyte 2

							timer1_set(0);	
							while(TCNT1 < TIME_W4_MIN);  // wait W4_MIN
							iso_uart_putc(~iso_glob.keybyte2);  // send keybyte 2 inverse to bus

							// wait W4_MAX for inverse address from bus
							timer1_set(0);
							while(TCNT1 < TIME_W4_MAX)
							{
								if( CHECKBIT(iso_glob.uart_status, RDY) )
								{				
									CLEARBIT(iso_glob.uart_status, RDY);
									if(iso_glob.uart_buffer != inv_addr)
										return ISO_RETURN_CODE_INIT_ERROR;  // end if inverse addr is not correct
									// else
									bus_init_led_on();  // indicate successful bus init
									return ISO_RETURN_CODE_OK; // init complete and OK
							
								}  // end if flag RDY wait for inverse address
							}  // end while TIME_W4_MAX
							return ISO_RETURN_CODE_INIT_ERROR;    // end with error if inverse addr timeout

						}  // end if flag RDY wait for keybyte2
					}  // end while TIME_W3_MAX
					return ISO_RETURN_CODE_INIT_ERROR;    // end with error if keybyte2 timeout

				}  // end if flag RDY wait for keybyte1
			}  // end while TIME_W2_MAX
			return ISO_RETURN_CODE_INIT_ERROR;  // end with error if keybyte1 timeout

		}  // end if flag RDY wait for synch pattern
	}  // end while TIME_W5_MAX
	return ISO_RETURN_CODE_INIT_ERROR;  // end with error if synch pattern timeout
}


/* 
**--------------------------------------------------------------------------- 
** 
** Abstract: fast bus init routine
** 
** 
** Parameters: none			
** 
** 
** Returns: Error code
** 
** 
**--------------------------------------------------------------------------- 
*/
char iso_fast_init(void)
{
	bus_init_led_off();  // turn off indication LED
	iso_wait_idle();	// wait for bus idle time

	iso_glob.uart_n_baud = N_10400;  // set baud rate to 10,4kBaud

	// send fast init wakeup pattern
	iso_k_low();
	iso_l_low();

	timer1_start(T1_PRESCALER);
	while(TCNT1 < TIME_TiniL);  // force L and K line 25ms low
	
	iso_k_high();
	iso_l_high();

	timer1_start(T1_PRESCALER);
	while(TCNT1 < TIME_TiniH);  // force L and K line 25ms high

  /* send StartCommRequest message */
	unsigned char start_comm[4] = {0xC1, 0x33, 0xF1, 0x81};
		
	if( iso_send_msg(start_comm, sizeof(start_comm)) != ISO_RETURN_CODE_OK)
		return ISO_RETURN_CODE_BUS_ERROR;
    
	unsigned char time_count = 0;		
  unsigned int cnt = 0;
	unsigned char iso_msg_buf[10];
	unsigned char *iso_msg_pntr;

	do
  {
    iso_msg_pntr = &iso_msg_buf[0];  // reset pointer
		/*
			Run this loop until we received a valid response frame, or response timed out
      response timeout is P2 max = 50ms
      This loop will run a maximum of 12 times, because iso_recv_msg() has its own
      timeout of 4ms
    */
		cnt = iso_recv_msg(iso_msg_buf);  // receive ISO respond
    cnt -= 1; // exclude checksum

    // check for error free response and valid checksum
    if( !(cnt & 0x8000) && (iso_checksum(iso_msg_buf, cnt) == *(iso_msg_pntr+cnt) ) )
    {
      // check if StartCommPositiveResponse message
      if(*(iso_msg_pntr+cnt-3) == 0xC1)
      {
        iso_glob.keybyte1 = *(iso_msg_pntr+cnt-2);  // store keybyte 1
        iso_glob.keybyte2 = *(iso_msg_pntr+cnt-1);  // store keybyte 2
        bus_init_led_on();  // indicate successful bus init
				return ISO_RETURN_CODE_OK; // init complete and OK
      }
    }

		++time_count;

  } while(time_count < TIME_FASTINIT_P2_MAX);

  return ISO_RETURN_CODE_INIT_ERROR;
}


/* 
**--------------------------------------------------------------------------- 
** 
** Abstract: This routine coordinates the transmition and reception of bits. This 
**           routine is automatically executed at a rate equal to the baud-rate. When
**           transmitting, this routine shifts the bits and sends it. When receiving,
**           it samples the bit and shifts it into the buffer.
** 
** 
** Parameters: none
** 
** 
** Returns: status register flags (uart_status)
**          BUSY  This bit indicates whenever the UART is busy
**          TD  Transmit Data. Set when the UART is transmitting
**          RDR  Receive Data Ready. Set when new data has arrived
** 
** 
**--------------------------------------------------------------------------- 
*/
SIGNAL(SIG_OVERFLOW0)
{
  TCNT0 = iso_glob.uart_reload;  // load timer0 for 1 bitlength
	--iso_glob.uart_bit_cnt;  // start bit allready send

  /* transmit section */
  if( CHECKBIT(iso_glob.uart_status, TD) )    // check for transmit in progress

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品色噜噜| 亚洲欧美二区三区| 久久久久久9999| 亚洲天堂av一区| 亚洲综合丝袜美腿| 国产一区二区在线视频| 成年人国产精品| 6080国产精品一区二区| 国产精品网站一区| 国产人成亚洲第一网站在线播放| 亚洲同性同志一二三专区| 日本女人一区二区三区| 韩国精品在线观看| 欧美日韩一区二区三区不卡| 久久久不卡影院| 亚洲成人福利片| av欧美精品.com| 久久久久亚洲蜜桃| 天天色综合成人网| 99精品视频在线免费观看| 日韩欧美国产精品| 亚洲第一av色| 色婷婷综合激情| 欧美成人精品福利| 亚洲成a人片综合在线| 成人性生交大片免费看在线播放| 91精品国产一区二区三区| 亚洲日本韩国一区| 成人丝袜18视频在线观看| 日韩精品一区二区三区四区| 亚洲一二三专区| www.欧美.com| 国产精品久久久久三级| 手机精品视频在线观看| 色婷婷一区二区三区四区| 国产欧美日韩在线| 国产精品一区二区果冻传媒| 91精品国产综合久久国产大片| 亚洲日本欧美天堂| 99久久免费视频.com| 日本一区二区视频在线| 亚洲国产视频一区二区| av在线播放不卡| 中文字幕制服丝袜成人av | 亚洲最色的网站| 成人妖精视频yjsp地址| 久久久久一区二区三区四区| 韩国精品久久久| 精品福利av导航| 精品一区二区三区免费视频| 精品播放一区二区| 亚洲国产综合91精品麻豆| 在线观看亚洲专区| 国产精品久久久久久久久晋中| 日韩成人av影视| 日韩欧美在线综合网| 日韩av在线发布| 欧美性感一区二区三区| 亚洲一区二区黄色| 欧美一卡二卡在线| 亚洲va欧美va人人爽| 欧美一区二区三区在线电影| 亚洲在线免费播放| 欧美一级高清片| 成人午夜伦理影院| 午夜成人免费电影| 国产日产欧产精品推荐色| 欧洲亚洲国产日韩| 国产一区二区三区免费在线观看| 中文字幕中文字幕在线一区| 777奇米四色成人影色区| 岛国av在线一区| 亚洲国产一区二区视频| 国产欧美一区二区精品久导航| 欧美亚男人的天堂| 国产69精品久久99不卡| 亚洲第一激情av| 国产精品热久久久久夜色精品三区| 欧美视频中文字幕| 粉嫩高潮美女一区二区三区| 亚洲成av人在线观看| 国产精品污www在线观看| 777色狠狠一区二区三区| 99re8在线精品视频免费播放| 日韩精品亚洲专区| 一区二区三区国产豹纹内裤在线| 亚洲精品在线免费播放| 欧美久久一二三四区| 99这里都是精品| 国产一区二区三区在线看麻豆| 亚洲国产精品久久久久秋霞影院 | 福利电影一区二区| 美女一区二区在线观看| 一二三区精品福利视频| 中文一区二区在线观看| 精品国产凹凸成av人导航| 欧美日韩精品福利| 在线观看一区二区视频| 成人97人人超碰人人99| 福利91精品一区二区三区| 精品综合久久久久久8888| 亚洲bt欧美bt精品| 亚洲综合视频网| 亚洲视频一二三| 国产精品不卡视频| 18成人在线观看| 中文字幕精品—区二区四季| 久久先锋影音av鲁色资源网| 日韩午夜在线观看视频| 91麻豆精品国产91久久久久久| 欧美亚洲另类激情小说| 色婷婷久久久久swag精品| 91玉足脚交白嫩脚丫在线播放| 成人国产精品免费观看动漫| 成人在线综合网| www.成人在线| 91热门视频在线观看| 9i在线看片成人免费| 99免费精品视频| 色综合久久久久久久久久久| 色综合久久久久综合99| 欧美午夜在线观看| 欧美日韩一级片网站| 欧美精品三级在线观看| 91精品啪在线观看国产60岁| 日韩精品一区在线| 久久久久久免费网| 国产精品―色哟哟| 亚洲精品久久嫩草网站秘色| 亚洲第一激情av| 精品一区二区三区在线播放视频| 国内精品久久久久影院色| 粉嫩蜜臀av国产精品网站| 一本色道久久综合精品竹菊| 欧美日本在线视频| 精品美女在线播放| 中文字幕不卡一区| 亚洲欧美日韩久久| 日本欧美一区二区| 国产一区啦啦啦在线观看| 99国产精品久久久久久久久久 | 国产乱码精品一区二区三| 成人综合激情网| 欧洲一区二区三区在线| 欧美电视剧在线看免费| 欧美精品一区二区三区蜜桃视频| 国产精品美女久久久久久久| 午夜视频一区二区三区| 激情综合网av| 在线观看国产精品网站| 精品国产乱码久久久久久久久| 国产精品美女久久福利网站| 亚洲大片一区二区三区| 久久66热re国产| 日本韩国精品在线| 久久亚洲一区二区三区明星换脸| 国产精品久久久久永久免费观看| 亚洲成a人片在线观看中文| 国产成人综合自拍| 欧美日韩黄色一区二区| 国产午夜精品一区二区| 亚洲国产日日夜夜| 成人精品一区二区三区四区| 欧美丰满少妇xxxbbb| 国产精品理论片| 麻豆久久久久久| 欧美视频日韩视频| 国产精品卡一卡二卡三| 日本欧美一区二区三区乱码| 99re视频精品| 国产色产综合色产在线视频| 青青草国产精品97视觉盛宴| 91丨porny丨蝌蚪视频| 国产亚洲一区二区三区四区| 调教+趴+乳夹+国产+精品| 91丝袜呻吟高潮美腿白嫩在线观看| 日韩欧美123| 亚洲第一狼人社区| 91色在线porny| 国产精品国产a级| 国产乱人伦偷精品视频不卡| 91精品国产综合久久久久久漫画| 日韩毛片精品高清免费| 成人一级片网址| 国产日韩av一区| 国产一区二区调教| 精品国免费一区二区三区| 日日夜夜免费精品| 欧美私模裸体表演在线观看| 有坂深雪av一区二区精品| 99久久er热在这里只有精品66| 久久久久国产精品麻豆ai换脸| 九九精品一区二区| 欧美激情在线一区二区三区| 狠狠色丁香久久婷婷综| 日韩精品一区二区三区在线播放| 日本一不卡视频| 日韩精品一区二区三区四区视频| 日本亚洲天堂网| 日韩免费电影网站|