편집 기록

편집 기록
  • 프로필 정영훈님의 편집
    날짜2019.11.11

    i2c통신 공부중인데헤더파일 코드가 이해가잘안됩니다.


    read부분만가지고 왔는데 이해가 잘안됩니다

    typedef union{
        uint8_t byte;
        struct
        {
            uint8_t bit0 : 1,
            bit1 : 1,
            bit2 : 1,
            bit3 : 1,
            bit4 : 1,
            bit5 : 1,
            bit6 : 1,
            bit7 : 1;
        };
    } IOREG8;
    
    
    #define SFR_MEM8(addr)  (*(volatile IOREG8 *) (addr))
    #define PINA_REG    SFR_MEM8(0x39)
    #define DDRA_REG    SFR_MEM8(0x3A)
    #define PORTA_REG   SFR_MEM8(0x3B)
    
    #define F_CPU 16000000UL
    
    #include "delay_asm.h"
    #include <util/delay.h>
    
    void I2c_Port_Init(){
        DDRA_REG.bit0 = 1; // 0 SDA 1 SCL 
        DDRA_REG.bit1 = 1; // 0 SDA 1 SCL
        PORTA_REG.bit0 = 1;
        PORTA_REG.bit1 = 1;
    }
    
    void Read_Sequence(unsigned char MPU_Addres,unsigned char Register_Addres ,char* Pin){
        volatile unsigned char data = MPU_Addres;
        volatile unsigned char Data;
    
        PORTA_REG.bit0 = 0; //125NS
        _delay_us(1);
        //cycle_7(1);           //875ns + 125ns = 1ms
        PORTA_REG.bit1 = 0; //125ns
        //cycle_2(1);           //125 + 250 = 375nscycle_us(149);
        _delay_us(1);
    
        //cycle_us(149);
        _delay_us(149);
        PORTA_REG.bit0 = ((data >>6) & 0x01);//125ns
        //cycle_3(1);           // 125+ 375 = 500ns
        _delay_us(1);
        PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
        //cycle_8(1);
        _delay_us(1);           // 625ns + 1us = 1.625us
        PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
        _delay_us(100);//cycle_us(100); 
    
    
        _delay_us(149);//cycle_us(149);
        PORTA_REG.bit0 = ((data >>5) & 0x01);//125ns
        _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
        PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
        _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
        PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
        _delay_us(100);//cycle_us(100);
    
        _delay_us(149);//cycle_us(149);
        PORTA_REG.bit0 = ((data >>4) & 0x01);//125ns
        _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
        PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
        _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
        PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
        _delay_us(100);//cycle_us(100);
    
        _delay_us(149);//cycle_us(149);
        PORTA_REG.bit0 = ((data >>3) & 0x01);//125ns
        _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
        PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
        _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
        PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
        _delay_us(100);//cycle_us(100);
    
        _delay_us(149);//cycle_us(149);
        PORTA_REG.bit0 = ((data >>2) & 0x01);//125ns
        _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
        PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
        _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
        PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
        _delay_us(100);//cycle_us(100);
    
        _delay_us(149);//cycle_us(149);
        PORTA_REG.bit0 = ((data >>1) & 0x01);//125ns
        _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
        PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
        _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
        PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
        _delay_us(100);//cycle_us(100);
    
        _delay_us(149);//cycle_us(149);
        PORTA_REG.bit0 = ((data) & 0x01);//125ns
        _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
        PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
        _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
        PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
        _delay_us(100);//cycle_us(100);
        //address 끝
    
        _delay_us(149);
        PORTA_REG.bit0 = 0;//125ns
        //cycle_3(1);           // 125+ 375 = 500ns
        _delay_us(1);
        PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
        //cycle_8(1);           // 625ns + 1us = 1.625us
        _delay_us(1);
        PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
        cycle_us(100);      // 1cycle           //address 끝
    
        // w mode
    
        _delay_us(149);//cycle_us(149);
        DDRA_REG.bit0  = 0;     //125ns
        PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
        _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
        if(PINA_REG.bit0 == 1){
            tx_char('d');
            return;
        }
        PORTA_REG.bit1 =  0;    //1.625+0.125 =1.750us
        _delay_us(100);//cycle_us(100);
        tx_char('c');
        //ack 신호
    
        DDRA_REG.bit0  = 1; // 0 SDA 1 SCL
        data = Register_Addres;
    
    
        _delay_us(149);
        PORTA_REG.bit0 = ((data >> 7) & 0x01);//125ns
        //cycle_3(1);           // 125+ 375 = 500ns
        _delay_us(1);
        PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
        //cycle_8(1);
        _delay_us(1);           // 625ns + 1us = 1.625us
        PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
        _delay_us(100);//cycle_us(100);
    
        _delay_us(149);
        PORTA_REG.bit0 = ((data >>6) & 0x01);//125ns
        _delay_us(1);
        PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
        _delay_us(1);           // 625ns + 1us = 1.625us
        PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
        _delay_us(100);//cycle_us(100);
    
    
        _delay_us(149);//cycle_us(149);
        PORTA_REG.bit0 = ((data >>5) & 0x01);//125ns
        _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
        PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
        _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
        PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
        _delay_us(100);//cycle_us(100);
    
        _delay_us(149);//cycle_us(149);
        PORTA_REG.bit0 = ((data >>4) & 0x01);//125ns
        _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
        PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
        _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
        PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
        _delay_us(100);//cycle_us(100);
    
        _delay_us(149);//cycle_us(149);
        PORTA_REG.bit0 = ((data >>3) & 0x01);//125ns
        _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
        PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
        _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
        PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
        _delay_us(100);//cycle_us(100);
    
        _delay_us(149);//cycle_us(149);
        PORTA_REG.bit0 = ((data >>2) & 0x01);//125ns
        _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
        PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
        _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
        PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
        _delay_us(100);//cycle_us(100);
    
        _delay_us(149);//cycle_us(149);
        PORTA_REG.bit0 = ((data >>1) & 0x01);//125ns
        _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
        PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
        _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
        PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
        _delay_us(100);//cycle_us(100);
    
        _delay_us(149);//cycle_us(149);
        PORTA_REG.bit0 = ((data) & 0x01);//125ns
        _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
        PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
        _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
        PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
        _delay_us(100);//cycle_us(100);
    
        //Register address
    
        _delay_us(149);//cycle_us(149);
        DDRA_REG.bit0  = 0;     //125ns
        PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
        _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
        if(PINA_REG.bit0 == 1){
            tx_char('f');
            return;
        }
        tx_char('v');
        PORTA_REG.bit1 =  0;    //1.625+0.125 =1.750us
        _delay_us(100);//cycle_us(100);
    
        //ack신호
    
        DDRA_REG.bit0 = 1;
    
        PORTA_REG.bit0 = 1; //125
    
        cycle_us(148);
        PORTA_REG.bit1 = 1;     // 125n
        _delay_us(2);
        PORTA_REG.bit0 = 0; //125NS
        _delay_us(2);
        //cycle_7(1);           //875ns + 125ns = 1ms
        PORTA_REG.bit1 = 0; //125ns
        //cycle_2(1);           //125 + 250 = 375nscycle_us(149);        
        cycle_us(2);
        //Start re
    
        data = MPU_Addres;
    
        _delay_us(149);
        PORTA_REG.bit0 = ((data >>6) & 0x01);//125ns
        //cycle_3(1);           // 125+ 375 = 500ns
        _delay_us(1);
        PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
        //cycle_8(1);
        _delay_us(1);           // 625ns + 1us = 1.625us
        PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
        _delay_us(100);//cycle_us(100);
    
    
        _delay_us(149);//cycle_us(149);
        PORTA_REG.bit0 = ((data >>5) & 0x01);//125ns
        _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
        PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
        _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
        PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
        _delay_us(100);//cycle_us(100);
    
        _delay_us(149);//cycle_us(149);
        PORTA_REG.bit0 = ((data >>4) & 0x01);//125ns
        _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
        PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
        _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
        PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
        _delay_us(100);//cycle_us(100);
    
        _delay_us(149);//cycle_us(149);
        PORTA_REG.bit0 = ((data >>3) & 0x01);//125ns
        _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
        PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
        _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
        PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
        _delay_us(100);//cycle_us(100);
    
        _delay_us(149);//cycle_us(149);
        PORTA_REG.bit0 = ((data >>2) & 0x01);//125ns
        _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
        PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
        _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
        PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
        _delay_us(100);//cycle_us(100);
    
        _delay_us(149);//cycle_us(149);
        PORTA_REG.bit0 = ((data >>1) & 0x01);//125ns
        _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
        PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
        _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
        PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
        _delay_us(100);//cycle_us(100);
    
        _delay_us(149);//cycle_us(149);
        PORTA_REG.bit0 = ((data) & 0x01);//125ns
        _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
        PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
        _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
        PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
        _delay_us(100);//cycle_us(100);
        //address 끝
    
        _delay_us(149);
        PORTA_REG.bit0 = 1;//125ns
        _delay_us(1);
        PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
        _delay_us(1);
        PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
        cycle_us(100);      // 1cycle           //address 끝
    
        // r mode
        // MPU6050 ADDRESS
    
        _delay_us(149);//cycle_us(149);
        DDRA_REG.bit0  = 0;     //125ns
        PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
        _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
        if(PINA_REG.bit0 == 1){
            tx_char('g');
            return;
        }
        tx_char('b');
        PORTA_REG.bit1 =  0;    //1.625+0.125 =1.750us
        _delay_us(100);//cycle_us(100);
    
        // ACK
    
        cycle_us(149);
        PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
        cycle_8(1);         // 625ns + 1us = 1.625us
        Data |= (PINA_REG.bit0 << 7); 
        PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
        cycle_us(100);
    
        cycle_us(149);
        PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
        cycle_8(1);         // 625ns + 1us = 1.625us
        Data |= (PINA_REG.bit0 << 6);
        PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
        cycle_us(100);
    
        cycle_us(149);
        PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
        cycle_8(1);         // 625ns + 1us = 1.625us
        Data |= (PINA_REG.bit0 << 5);
        PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
        cycle_us(100);
    
        cycle_us(149);
        PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
        cycle_8(1);         // 625ns + 1us = 1.625us
        Data |= (PINA_REG.bit0 << 4);
        PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
        cycle_us(100);
    
        cycle_us(149);
        PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
        cycle_8(1);         // 625ns + 1us = 1.625us
        Data |= (PINA_REG.bit0 << 3);
        PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
        cycle_us(100);
    
        cycle_us(149);
        PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
        cycle_8(1);         // 625ns + 1us = 1.625us
        Data |= (PINA_REG.bit0 << 2);
        PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
        cycle_us(100);
    
        cycle_us(149);
        PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
        cycle_8(1);         // 625ns + 1us = 1.625us
        Data |= (PINA_REG.bit0 << 1);
        PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
        cycle_us(100);
    
        cycle_us(149);
        PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
        cycle_8(1);         // 625ns + 1us = 1.625us
        Data |= (PINA_REG.bit0);
        PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
        cycle_us(100);
    
        DDRA_REG.bit0 = 1;
        PORTA_REG.bit0 = 0;
    
        cycle_us(149);
        PORTA_REG.bit0 = 1;     // 125+ 500ns = 625ns
        cycle_8(1);         // 625ns + 1us = 1.625us
        PORTA_REG.bit1 = 1;
        cycle_3(1);
        PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
        cycle_3(1);
        PORTA_REG.bit0 = 0;
        cycle_us(100);
    
        // notack   
    
        cycle_us(149);
        PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
        cycle_8(1);         // 625ns + 1us = 1.625us
        PORTA_REG.bit0 = 1;
        cycle_3(1);
        cycle_us(101);
    
        *Pin  = Data;
    
        // P
    }
    
  • 프로필 알 수 없는 사용자님의 편집
    날짜2019.11.11

    i2c통신 공부중인데헤더파일 코드가 이해가잘안됩니다.


    read부분만가지고 왔는데 이해가 잘안됩니다

    typedef union{ uint8_t byte; struct { uint8_t bit0 : 1, bit1 : 1, bit2 : 1, bit3 : 1, bit4 : 1, bit5 : 1, bit6 : 1, bit7 : 1; }; } IOREG8;

    define SFR_MEM8(addr) (*(volatile IOREG8 *) (addr))

    define PINA_REG SFR_MEM8(0x39)

    define DDRA_REG SFR_MEM8(0x3A)

    define PORTA_REG SFR_MEM8(0x3B)

    define F_CPU 16000000UL

    include "delay_asm.h"

    include

    void I2c_Port_Init(){ DDRA_REG.bit0 = 1; // 0 SDA 1 SCL DDRA_REG.bit1 = 1; // 0 SDA 1 SCL PORTA_REG.bit0 = 1; PORTA_REG.bit1 = 1; }

    void Read_Sequence(unsigned char MPU_Addres,unsigned char Register_Addres ,char* Pin){ volatile unsigned char data = MPU_Addres; volatile unsigned char Data;

    PORTA_REG.bit0 = 0; //125NS
    _delay_us(1);
    //cycle_7(1);           //875ns + 125ns = 1ms
    PORTA_REG.bit1 = 0; //125ns
    //cycle_2(1);           //125 + 250 = 375nscycle_us(149);
    _delay_us(1);
    
    //cycle_us(149);
    _delay_us(149);
    PORTA_REG.bit0 = ((data >>6) & 0x01);//125ns
    //cycle_3(1);           // 125+ 375 = 500ns
    _delay_us(1);
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    //cycle_8(1);
    _delay_us(1);           // 625ns + 1us = 1.625us
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100); 
    
    
    _delay_us(149);//cycle_us(149);
    PORTA_REG.bit0 = ((data >>5) & 0x01);//125ns
    _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100);
    
    _delay_us(149);//cycle_us(149);
    PORTA_REG.bit0 = ((data >>4) & 0x01);//125ns
    _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100);
    
    _delay_us(149);//cycle_us(149);
    PORTA_REG.bit0 = ((data >>3) & 0x01);//125ns
    _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100);
    
    _delay_us(149);//cycle_us(149);
    PORTA_REG.bit0 = ((data >>2) & 0x01);//125ns
    _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100);
    
    _delay_us(149);//cycle_us(149);
    PORTA_REG.bit0 = ((data >>1) & 0x01);//125ns
    _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100);
    
    _delay_us(149);//cycle_us(149);
    PORTA_REG.bit0 = ((data) & 0x01);//125ns
    _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100);
    //address 끝
    
    _delay_us(149);
    PORTA_REG.bit0 = 0;//125ns
    //cycle_3(1);           // 125+ 375 = 500ns
    _delay_us(1);
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    //cycle_8(1);           // 625ns + 1us = 1.625us
    _delay_us(1);
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    cycle_us(100);      // 1cycle           //address 끝
    
    // w mode
    
    _delay_us(149);//cycle_us(149);
    DDRA_REG.bit0  = 0;     //125ns
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
    if(PINA_REG.bit0 == 1){
        tx_char('d');
        return;
    }
    PORTA_REG.bit1 =  0;    //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100);
    tx_char('c');
    //ack 신호
    
    DDRA_REG.bit0  = 1; // 0 SDA 1 SCL
    data = Register_Addres;
    
    
    _delay_us(149);
    PORTA_REG.bit0 = ((data >> 7) & 0x01);//125ns
    //cycle_3(1);           // 125+ 375 = 500ns
    _delay_us(1);
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    //cycle_8(1);
    _delay_us(1);           // 625ns + 1us = 1.625us
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100);
    
    _delay_us(149);
    PORTA_REG.bit0 = ((data >>6) & 0x01);//125ns
    _delay_us(1);
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    _delay_us(1);           // 625ns + 1us = 1.625us
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100);
    
    
    _delay_us(149);//cycle_us(149);
    PORTA_REG.bit0 = ((data >>5) & 0x01);//125ns
    _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100);
    
    _delay_us(149);//cycle_us(149);
    PORTA_REG.bit0 = ((data >>4) & 0x01);//125ns
    _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100);
    
    _delay_us(149);//cycle_us(149);
    PORTA_REG.bit0 = ((data >>3) & 0x01);//125ns
    _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100);
    
    _delay_us(149);//cycle_us(149);
    PORTA_REG.bit0 = ((data >>2) & 0x01);//125ns
    _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100);
    
    _delay_us(149);//cycle_us(149);
    PORTA_REG.bit0 = ((data >>1) & 0x01);//125ns
    _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100);
    
    _delay_us(149);//cycle_us(149);
    PORTA_REG.bit0 = ((data) & 0x01);//125ns
    _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100);
    
    //Register address
    
    _delay_us(149);//cycle_us(149);
    DDRA_REG.bit0  = 0;     //125ns
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
    if(PINA_REG.bit0 == 1){
        tx_char('f');
        return;
    }
    tx_char('v');
    PORTA_REG.bit1 =  0;    //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100);
    
    //ack신호
    
    DDRA_REG.bit0 = 1;
    
    PORTA_REG.bit0 = 1; //125
    
    cycle_us(148);
    PORTA_REG.bit1 = 1;     // 125n
    _delay_us(2);
    PORTA_REG.bit0 = 0; //125NS
    _delay_us(2);
    //cycle_7(1);           //875ns + 125ns = 1ms
    PORTA_REG.bit1 = 0; //125ns
    //cycle_2(1);           //125 + 250 = 375nscycle_us(149);        
    cycle_us(2);
    //Start re
    
    data = MPU_Addres;
    
    _delay_us(149);
    PORTA_REG.bit0 = ((data >>6) & 0x01);//125ns
    //cycle_3(1);           // 125+ 375 = 500ns
    _delay_us(1);
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    //cycle_8(1);
    _delay_us(1);           // 625ns + 1us = 1.625us
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100);
    
    
    _delay_us(149);//cycle_us(149);
    PORTA_REG.bit0 = ((data >>5) & 0x01);//125ns
    _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100);
    
    _delay_us(149);//cycle_us(149);
    PORTA_REG.bit0 = ((data >>4) & 0x01);//125ns
    _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100);
    
    _delay_us(149);//cycle_us(149);
    PORTA_REG.bit0 = ((data >>3) & 0x01);//125ns
    _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100);
    
    _delay_us(149);//cycle_us(149);
    PORTA_REG.bit0 = ((data >>2) & 0x01);//125ns
    _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100);
    
    _delay_us(149);//cycle_us(149);
    PORTA_REG.bit0 = ((data >>1) & 0x01);//125ns
    _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100);
    
    _delay_us(149);//cycle_us(149);
    PORTA_REG.bit0 = ((data) & 0x01);//125ns
    _delay_us(1);//cycle_3(1);          // 125+ 375 = 500ns
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100);
    //address 끝
    
    _delay_us(149);
    PORTA_REG.bit0 = 1;//125ns
    _delay_us(1);
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    _delay_us(1);
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    cycle_us(100);      // 1cycle           //address 끝
    
    // r mode
    // MPU6050 ADDRESS
    
    _delay_us(149);//cycle_us(149);
    DDRA_REG.bit0  = 0;     //125ns
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    _delay_us(1);//cycle_8(1);          // 625ns + 1us = 1.625us
    if(PINA_REG.bit0 == 1){
        tx_char('g');
        return;
    }
    tx_char('b');
    PORTA_REG.bit1 =  0;    //1.625+0.125 =1.750us
    _delay_us(100);//cycle_us(100);
    
    // ACK
    
    cycle_us(149);
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    cycle_8(1);         // 625ns + 1us = 1.625us
    Data |= (PINA_REG.bit0 << 7); 
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    cycle_us(100);
    
    cycle_us(149);
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    cycle_8(1);         // 625ns + 1us = 1.625us
    Data |= (PINA_REG.bit0 << 6);
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    cycle_us(100);
    
    cycle_us(149);
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    cycle_8(1);         // 625ns + 1us = 1.625us
    Data |= (PINA_REG.bit0 << 5);
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    cycle_us(100);
    
    cycle_us(149);
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    cycle_8(1);         // 625ns + 1us = 1.625us
    Data |= (PINA_REG.bit0 << 4);
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    cycle_us(100);
    
    cycle_us(149);
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    cycle_8(1);         // 625ns + 1us = 1.625us
    Data |= (PINA_REG.bit0 << 3);
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    cycle_us(100);
    
    cycle_us(149);
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    cycle_8(1);         // 625ns + 1us = 1.625us
    Data |= (PINA_REG.bit0 << 2);
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    cycle_us(100);
    
    cycle_us(149);
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    cycle_8(1);         // 625ns + 1us = 1.625us
    Data |= (PINA_REG.bit0 << 1);
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    cycle_us(100);
    
    cycle_us(149);
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    cycle_8(1);         // 625ns + 1us = 1.625us
    Data |= (PINA_REG.bit0);
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    cycle_us(100);
    
    DDRA_REG.bit0 = 1;
    PORTA_REG.bit0 = 0;
    
    cycle_us(149);
    PORTA_REG.bit0 = 1;     // 125+ 500ns = 625ns
    cycle_8(1);         // 625ns + 1us = 1.625us
    PORTA_REG.bit1 = 1;
    cycle_3(1);
    PORTA_REG.bit1 = 0; //1.625+0.125 =1.750us
    cycle_3(1);
    PORTA_REG.bit0 = 0;
    cycle_us(100);
    
    // notack   
    
    cycle_us(149);
    PORTA_REG.bit1 = 1;     // 125+ 500ns = 625ns
    cycle_8(1);         // 625ns + 1us = 1.625us
    PORTA_REG.bit0 = 1;
    cycle_3(1);
    cycle_us(101);
    
    *Pin  = Data;
    
    // P
    

    }