'[HARDWARE]/기타'에 해당되는 글 14건

  1. 2009.09.26 INTERRUPT를 이용한 NEC 리모콘 수신제어
  2. 2009.09.26 도선의 규격 AWG
  3. 2009.09.26 MAC address 구입
2009. 9. 26. 15:27

/************************************************************************/

/*        Project  :

/*        CPU     : PIC16F676

/*        Crystal  : 20MHz

/*        Compiler: HI-TECH

/*        2008. 10. xx

/*

/*        written by nooriry

/*                                                                                                      

/*************************************************************************/

 

#include          <pic.h>

 

__CONFIG       ( MCLRDIS & PWRTDIS & WDTDIS & HS );

 

unsigned char Custom_code_upper, Custom_code_lower;

unsigned char Data_code_upper, Data_code_lower;

unsigned char Code;

unsigned char Power_flag;

unsigned char signal_in;

unsigned char ratio;

 

#define IR_in               RA2      // remocon input

#define Pw_bt             RA3      // 프론트의 버튼입력

#define LED                RC2     // for test

#define Debug             RC3     // for test

#define Pw_1000CT      RC5     // main B/D 전원 제어

#define ON                 1

#define OFF                0

#define Nec_code        1

#define NG_code         0

 

void delay_time( unsigned int del )

{

           unsigned int i;

           for( i=0; i < del; i++);

}

 

unsigned char Check_header( void )

{

           while( ( IR_in == 0 ) && ( ratio < 107 ) );         

           // HIGH가 되거나 11ms 이하만 대기, high 까지의 TMR0를 가지고 아래로 이동

                    

           if( ( ratio > 78 ) && ( ratio        < 98 ) )          

           // 9ms LOW NEC Signal start를 확인 (8ms~10ms)

           {

                     ratio = 0;

                               

                     while( ( IR_in == 1 ) && ( ratio < 59 ) );

                     // LOW가 되거나 6ms 이하만 대기

                                                               

                     if( ( ratio > 0 ) && ( ratio < 54 ) )        

                     // 4.5ms HIGH NEC Signal을 확인 (3.5ms~5.5ms)

                     {

                                ratio = 0;

                                return Nec_code;        

                                // 9ms LOW NEC format임을 확인

                     }

                     else

                     {

                                ratio = 0;

                                return NG_code;

                     }

           }

 

           else

           {

                     ratio = 0;

                     return NG_code;

           }

}

 

void Code_record( void )

{

           unsigned char code_bit, code_position;

          

           while( ( IR_in == 0 ) && ( ratio < 29 ) );

           // HIGH가 시작 되거나 3ms 이하만 대기

          

           ratio = 0;         // timer reset

          

           for( code_position=0; code_position<4; code_position++ )

           // 여기부터 high 구간만 계산한다.

           {        

                     for( code_bit=0; code_bit<8; code_bit++ )        // 8bit LSB

                     {

                                while( ( IR_in == 1 ) && ( ratio < 29 ) );

                                // low가 시작 될 때 까지 대기

                                                                                    

                                if( ( ratio >= 4 ) && ( ratio <= 6 ) )      

                                // target is 0.565ms (0.45 ~ 0.65ms)

                                {

                                          Code <<= 1;

                                          Code &= 0b11111110;

                                }

                                else if( ( ratio >= 15 ) && ( ratio <= 17 ) )       

                                // target is 1.68ms (1.55 ~1.75ms)

                                {

                                          Code <<= 1;

                                          Code |= 0b00000001;

                                }

 

                                while( ( IR_in == 0 ) && ( ratio < 29 ) );

                                // HIGH가 시작 되거나 3ms 이하만 대기

          

                                ratio = 0;         // timer reset

                     }

 

                     switch( code_position )

                     {

                                case 0: Custom_code_upper = Code;

                                          break;

                                case 1: Custom_code_lower = Code;

                                          break;

                                case 2: Data_code_upper = Code;

                                          break;

                                case 3: Data_code_lower = Code;

                                          break;

                     }        

           }

          

           delay_time(10);

 

}

 

void Pwr_ctrl ( void )

{        

           if( ( Custom_code_upper== 0x10 ) && ( Custom_code_lower== 0xEF ) &&

                     ( Data_code_upper== 0x08 ) && (Data_code_lower== 0xF7 ) )

           {

                     if( Power_flag == 0 )

                     {

                                Pw_1000CT= ON;

                                Power_flag = 1;

                     }

                     else if( Power_flag == 1)

                     {

                                Pw_1000CT= OFF;

                                Power_flag = 0;

                     }

           }

}

 

void System_initialize( void )

{

           ANSEL = 0b00000000;  // analog pin -> digital pin

          

 

           //OPTION = 0b00000111;

           // Global PORTA pull up enable, falling edge int, prescaler(1:256)

           OPTION = 0b00000000;

           //Global PORTA pull up enable, falling edge int, prescaler(1:8)

           // prescaler : Fosc/4 * 2 = 0.4us

           //               : 0.4us * 256 = 0.1024ms (1 ratio)

 

 

           INTCON = 0b00000000;

           // Disable global int, RA2/INT and clear TMR0 flag, RA2/INT flag

 

           // Port A

           TRISA2 = 1;     // RA2 is input

           //TRISA3 = 1;   // RA3 is input

           WPUA = 0b11111111;   // enable pull up

 

           // Port C

           TRISC2 = 0;     // RC2 is output

           TRISC3 = 0;     // RC3 is output

           TRISC5 = 0;     // RC5 is output

}

 

void main(void)

{

           System_initialize();

 

           Power_flag = 0;

 

           signal_in = 0;

 

           Pw_1000CT = OFF;      // B/D initial status

 

           INTE = 1;                    // enable RA2/INT int

           GIE = 1;                                // enable global int

          

           T0IE = 1;                    // enable TMR0 overflow interrupt

          

           while(1)

           {

                     if(signal_in)

                     {

                                ratio = 0;

                                                    

                                if( Check_header() == Nec_code )

                                {

                                          Code_record();

                               

                                          Pwr_ctrl();

                               

                                          delay_time( 5000 );

 

                                          Code = 0x00;

                               

                                          Custom_code_upper = 0x00;

                               

                                          Custom_code_lower = 0x00;

                               

                                          Data_code_upper = 0x00;

                               

                                          Data_code_lower = 0x00;

                                }

                                signal_in = 0;

                     }

           }

}

 

void interrupt isr_event(void)

{

           if(T0IF)

           {

                     ratio++;

                     T0IF = 0;

           }

 

          

           if(INTF)

           {

                     signal_in = 1;

                     INTF = 0;         // must be cleared before re-enabling

           }

}

 

 

Posted by nooriry
2009. 9. 26. 13:34

미국을 비롯한 나라들에서 사용하는 wire gauge system으로 American Wire Gauge의 약자이다.
비철금속의 전기를 통하는 선들에게 적용되며 철재 산업에선 이 체계를 사용하지 않는다.
AWG의 번호는 선의 지름과 연관이 있으며 이 번호를 알면 지름을 구해낼 수 있다.

선의 지름을 구하는 공식은 다음과 같다.

n : AWG number
AWG의 숫자가 클수록 선의 지름은 작아진다.

아래의 표는 AWG의 번호들에 대하여 DC또는 AC의 주파수가 60Hz 일때의  resistance, 허용가능 전류와
꼬을때의 최선의 감김수를 나타낸다
.

[출처]
WIKIPEDIA

Posted by nooriry
2009. 9. 26. 13:27

MAC address가 무엇인지는 많이들 알고 계실것이다.
이더넷에 필요한 하드웨어주소? 간략히 이정도만 알고 있어도 90% 맞지 않나 싶다
.
MAC
은 Ethernet과 Bluetooth device에 사용되는 전 세계에서 유니크한 주소인데
 중복된 주소가 발생하면
안 된다
.

그러면 이
MAC은 어디서 구하는가
?
혹시 IEEE라고 들어보셨는지 모르겠다. 땜쟁이라면 자세히는 몰라도 IEEE라는 단체에 대해서 얼추
감은 잡고 있을것이다
.

그렇다. MAC IEEE에서 구매하는 것이다
.

IEEE
에서 MAC을 구입하면 약 천육백만개를 준다
.
알다시피 MAC
XX:XX:XX
:XX:XX:XX의 형식으로써 8bit 6개의 단위로 나눠져 있다.
이 중에서 IEEE는 앞의 3자리를 장비제조사에 할당하고 돈을 받는다. 3자리를 OUI 라고 하며
Organizationally Unique Identifier의 약자이다
.
즉 우리 회사에서 MAC을 구입하여 OUI
00:0
E:2D를 할당 받았고 이에 우리 회사는 뒷 3자리인
파란색의
XX:XX:XX
를 장비에 할당하여 제품을 판매하게 된다.
그러면 00:00:00부터 FF:FF:FF까지 총 16,777,216개의 장비에 할당할 수가 있다
.

MAC address의 가격은 다음의 표와 같다.

천 육백만개에 $1,650 이며 IEEE의 홈 페이지에서 OUI가 검색되지 못하게 하는 private service를
이용하면 $2,000 이 더 추가된다.

참고로 IEEE 홈페이지에 들어가면 어느 회사가 어느 OUI를 사용하는지 바로 검색할 수가 있다.
http://standards.ieee.org/develop/regauth/oui/public.html

'Search for'에서 OUI를 검색할 수도 있고 바로 아래의 'Download a copy'를 클릭하면 전체 리스트를
볼 수있다.

제 아이폰의 MAC을 검색해보니 Apple社로 되어있는게 확인되네요. ... Cupertino


Posted by nooriry