NPN PNP트랜지스터

NPN 트랜지스터 : N-P-N형 반도체를 적층한 반도체, 이때 베이스만


'업무 > 임베디드' 카테고리의 다른 글

CANoe 관련 - Panel 생성, DB 경로 설정  (0) 2019.03.22
자동차 방향지시등 (깜빡이) 점멸 시간  (0) 2018.11.12
풀업저항, 풀다운저항 16.01.26  (0) 2018.05.11
DMA 16.01.26  (0) 2018.05.11
와치독 타이머 16.01.11  (0) 2018.05.11

풀업저항, 풀다운저항

풀업저항 : 스위치가 OFF된 평상시에 원하는 부분 A HIGH상태를 유지하도록 해주는 저항

 


, 스위치가 ON되어 있으면 전류가 그라운드로 흐르게 되므로 A LOW상태.

스위치가 저항인거야. A부분에 저항이 있어서 전류가 분기되는 지점에서 저항이 없는 쪽으로 흐르게되는거..

그리고 스위치가 OFF되어 있을 때에는 전류가 A로 흐르기 때문에 A HIGH상태.

평상시 상태는 OFF이므로, 평상시 플로팅 상태가 되지 않고 항상 HIGH

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

풀다운저항 : 스위치가 OFF된 평상시에 A LOW 상태를 유지하도록 해주는 저항


스위치가 ON된 상태에서는 A에 전류가 흘러 HIGH상태.

스위치가 OFF된 상태에서는 A는 접지와 연결되어있으므로 무조건 LOW 상태.

따라서, 풀다운 저항을 사용하면 평상시 소자를 LOW상태로 유지할 수 있게 되어 플로팅 상태가 되지 않음.

 

 

*플로팅 상태 : HIGH LOW인지 정확히 알지 못하는 상태.

따라서 풀업, 풀다운 저항을 통해 플로팅 상태가 되지 않게 해주어야 함.


'업무 > 임베디드' 카테고리의 다른 글

자동차 방향지시등 (깜빡이) 점멸 시간  (0) 2018.11.12
NPN PNP트랜지스터 16.01.26  (0) 2018.05.11
DMA 16.01.26  (0) 2018.05.11
와치독 타이머 16.01.11  (0) 2018.05.11
레지스터 용어 정리 15.06.15  (0) 2018.05.11

DMA

Direct Memory Access

CPU와 상관없이 전송하는 방법.

데이터를 전송하는 방법은 크게 두가지.

1)데이터를 버퍼에 담아서 cpu에 이를 전달해서 전송하는 방법

2)Cpu거치지 않고 바로 데이터 실어 보내는 방법 :이게 DMA



      DMA를 사용하지않고 직접 Access (느림)

CPU -----------------------------------------------> Memory/ device


CPU--------------DMA를 통함 ---------------------> Memory/ device

                            DMAC (빠름)


'업무 > 임베디드' 카테고리의 다른 글

NPN PNP트랜지스터 16.01.26  (0) 2018.05.11
풀업저항, 풀다운저항 16.01.26  (0) 2018.05.11
와치독 타이머 16.01.11  (0) 2018.05.11
레지스터 용어 정리 15.06.15  (0) 2018.05.11
Fujitsu MCU UART Register 정리 15.06.12  (0) 2018.05.11

와치독 타이머

특징 : MCU 내부 클럭 사용

역할 : 일정시간마다 IO PORT Reset시켜, 프로그램이 오작동하게 될 경우 오작동에서 벗어나게 해준다.->안정성 향상

부가 설명 : 모든 Task가 제 때 응답가능한지 Check해서, 문제가 있을 경우 CPUReset시킨다. 모든 Task 관리가능

Ex) Priority가 높은 녀석들이 계속 일을 해대서 Priority가 낮은 Task에게 순서가 잘 오지 못하는 상황

Ex) 어떤 Resource에 대해서 Mutex를 잘못 걸어서 교착 상태에 빠졌다던가 해서 System Lock up이 되거나 하면 System을 다시 원상 복구 시켜야 되는데 그게 참 어려우니까, 간단하게 System Reset

->Hardware적인 Timer를 두고서 그 Timer Expire되면 (모래시계의 모래가 다 떨어지면) System Reset 시켜 버리는 거구요, Expire 되기 전에 (모래 시계가 다 떨어지기 전에) 모든 Task가 정상적으로 나 살아 있다는 Report를 받으면 Timer Reset (처음 값으로 설정)해서 다시 모래 시계가 떨어지도록 하는 System


'업무 > 임베디드' 카테고리의 다른 글

풀업저항, 풀다운저항 16.01.26  (0) 2018.05.11
DMA 16.01.26  (0) 2018.05.11
레지스터 용어 정리 15.06.15  (0) 2018.05.11
Fujitsu MCU UART Register 정리 15.06.12  (0) 2018.05.11
fujitsu mcu register 정리 15.06.12  (0) 2018.05.11

와치독

와치독 : 시스템 안전장치의 일정

컴퓨터의 오작동을 감지하고 복구하기 위해 쓰이는 전자타이머.

와치독에게 적절한 신호를 주지 않으면 CPU를 리셋해버림.

적절한 신호 : 컨트롤이 running out of 해버리거나, 와치독타이머가 리셋요청을 할 때


MICOM [mb96356] specification

종류

클럭속도

특징 / 기능

cpu

56MHz

16비트 코어/ 17.9ns 마다 싸이클

서브시스템 클럭

32kHz

 

내부 RC 클럭

100kHz, 2MHz

 

채널 가능 개수

개수

특징 / 기능

CAN 인터페이스

5

2.0A, 2.0B

외부 인터럽트

16

 

DMA

16

 

UART

10

 

I2C

2

400kbit

ADC

Analog신호 40개입력 가능

 

리로드 타이머

6

16비트

ICU (Input Capture unit)

12

16비트

OCU(Oupt Capture unit)

12

16비트

Free Running timer

4

16bit

programmable pulse generator

20

 

CLOCK TIMER

독자적으로 3

 

왓치독 타이머

 

 

알람 비교기(comparators)

 

2

기타

 

 

queue 실행 구조

8BYTE

 

저전력소비

13개 모드

(different Run, Sleep, Timer modes, Stop mode)

-CMOS(씨모스, 상보형 모스[금속 산화막 반도체]) 동작기술 소비전력 : 0.18

          씨모스 : 채널이 다른 모스[MOS] 집적 회로를 짜맞추어 구성한 칩.

          동작속도는 늦지만, 소비전력이 매우 적다.

-모든 포트는 pull up resistor

*EMI : Electronic Magnetic Interface[전자 방해 잡음] : 다른 기기의 전자기 수신기능에 장애 주는것


 
unsigned short in_cksum(u_short *addr, int len)

{

    int         sum=0;        // 총 합계.

    int         nleft=len;    // 인자로 받은 len.

    u_short     *w=addr;      // 인자로 받은 addr의 주소를 저장.

    u_short     answer=0;     // 최종적으로 리턴되는 값.

 

    // nleft만큼 sum *w의 값을 더함.

    while (nleft > 1){

        sum += *w++;

        nleft -= 2;

    }

 

    // nleft가 홀수라서 값이 남을 경우 추가로 더해줌.

    if (nleft == 1){

        *(u_char *)(&answer) = *(u_char *)w ;

        sum += answer;

    }

 

    sum = (sum >> 16) + (sum & 0xffff);  // 상위 16비트와 하위 16비트를 더함.

    sum += (sum >> 16);                  // carry bit 값을 더함.

    answer = ~sum;                       // 값을 반전 시킴.

    return(answer);                      // 리턴.

}

 

 

 

USHORT checksum(USHORT *buffer, int size)

    {

        unsigned long cksum=0;

 

        while(size >1) {

            cksum += *buffer++;

            size -= sizeof(USHORT);

        }

  

        if(size ) {

            cksum += *(UCHAR*)buffer;

        }

        cksum = (cksum >> 16) + (cksum & 0xffff);

        cksum += (cksum >>16);

        return (USHORT)(~cksum);

    }

checksum을 하고자 하는 패킷 데이타의 포인터값을 USHORT *buffer에 넣어주시고, 해당 데이타 총 사이즈를 size에 넣어주시면

됩니다...그러면 checksum값이 USHORT 형으로 리턴되는데 그 값을 패킷에 있는 해당 checksum 필드에 넣어주시면 됩니다...

u_short ip_sum_calc( u_short len_ip_header, u_short * buff )

{

        u_short word16;

        u_int sum = 0;

        u_short i;

        // make 16 bit words out of every two adjacent 8 bit words in the packet

        // and add them up

        for( i = 0; i < len_ip_header; i = i+2 )

        {

                word16 = ( ( buff[i]<<8) & 0xFF00 )+( buff[i+1] & 0xFF );

                sum = sum + (u_int) word16;

        }

        // take only 16 bits out of the 32 bit sum and add up the carries

        while( sum >> 16 )

                sum = ( sum & 0xFFFF ) + ( sum >> 16 );

        // one's complement the result

        sum = ~sum;

       

        return ((u_short) sum);

}

void main()

{

    unsigned short chksum;

        u_short ipdata[20];     //checksum 계산할기위한 버퍼

        ip_header *myih;

        char *ptr;

 

    myih = (ip_header*)malloc(sizeof(myih));

        ptr = (char*)myih;

        printf("\n");

    // IP 패킷에 대한 정보들을 저장한다.

    myih->ip_header_len=0x5;

    myih->ip_version = 0x4;

    myih->ip_tos = 0x0;

    myih->ip_total_length = ntohs(0x30);

    myih->ip_id = htons(0x00);

    myih->ip_frag_offset = 0;

    myih->ip_more_fragment = 0;

    myih->ip_dont_fragment = 1;

    myih->ip_reserved_zero =0;

    myih->ip_frag_offset1 =0;

    myih->ip_ttl = 0x3c;

    myih->ip_protocol = 0x06;

    myih->ip_checksum = 0;

    myih->ip_srcaddr.S_un.S_addr = inet_addr(src_ip);

    myih->ip_destaddr.S_un.S_addr = inet_addr(dest_ip);

    //모든 정보를 세팅하고 체크섬을 구한다.

        int i;

        // 1byte 단위 값을 2바이트 배열에 저장함

        for (= 0; i < 20; i ++) {

                ipdata[i] = *(unsigned char*)ptr++;

    }

        myih->ip_checksum = ip_sum_calc(20, ipdata);

        printf("checksum = %x\n",myih->ip_checksum);

}

 

 

 

 

 

 

 

 

 

char Check_CheckSum(char check_data[])//체크섬 확인함수

{

          command = RX2_BUFFER[10];

          while(stop)

          {

                   if(check_data[i]=='*')

                   {

                             return check_data[i+1];

                             stop = 0;

                             break;

                   }

                   i++;

          }

          return 'a';

}

 

char Check_Sum(char check_data[])//checksum 게산 함

{

          char checksum = 0x00;

          int step= 1;

          int str=1;

 

          while(step)

          {

                   if(check_data[str]==' ')//*가 나오면 체크섬 게산 종료

                   {

                             step = 0;

                             break;

                   }

                   else

                   {

                             checksum = checksum ^ check_data[str];

                             str++;

                   }

          }

          return checksum;

         

}


UART  터미널 문자 출력 예제

#define F_CPU 16000000L

#include <avr/io.h>
#include <util/delay.h>


int main(void)
{
    DDRA = 0xFF;
    
    UCSR1A = 0x00;
    UCSR1B = 0x18; // RX/TX Complete Interrupt Enable
    UCSR1C = 0x06; // asynchronous mode, no parity, one stop bit, 8bit char, rising clock polarity
    
    UBRR1H = 0x00; // USART baud rate, 
    UBRR1L = 0x08; // 요 다섯줄은 반드시 들어가야한다. (UART 설정이므로)

    
    PORTA = 'A';
    
    while(1) {
         UDR1 = PORTA;
        _delay_ms(1000);
        
        if(PORTA >= 'Z'){
            PORTA = 'A';
        }else{
            PORTA++;
        }
    }
    return 0;
}

[출처] 매우 간단한 UART 출력 예제|작성자 퍼플브라운

 


+ Recent posts