본문 바로가기

하드웨어, 펌웨어

(9)
[Atmega128] 타이머? 분주? 주기? 계산 방법! (Normal 모드) 1. 인터럽트 주기를 계산하려면? Timer/Counter 에서 인터럽트 주기를 계산하려면 이 타이머가 몇 비트인지를 알아야 해요! 저는 Timer/Counter 0, 즉 8비트 환경이라고 설정하고 설명해드릴게요. 2. Normal 모드 8비트 타이머의 경우, TCNT값이 255가 넘어가면 오버플로우 인터럽트가 발생하게 돼요. 즉, TCNT값의 범위는 0~255에요. 시스템 클럭이 16MHz라고 한다면 이 것을 몇분주로 나눌건지 TCCR0에서 설정해주어야 해요. 64분주로 한다면 16MHz / 64 = 250,000Hz가 됩니다. 여기서 250,000Hz는, 1초에 250,000번 깜빡거리겠다는 뜻이에요. 1 / 250,000을 하면 결과는 0.000004초가 나오죠? 여기에서 *1000을 하면 mill..
[Atmega128] 타이머/카운터의 동작, 회로 8비트 Timer/Counter의 회로 8비트 Timer/Counter, 즉 Timer/Counter 0과 Timer/Counter 2는 위와 같은 회로로 되어있어요. 빨간색 네모를 보시면, 클럭을 공급해주는 TOSC1과 TOSC2, 그리고 clk이 있어요. 시스템 클럭 단자이든, 외부에서 공급 클럭 단자이든 상관없이 모든 클럭이 프리스케일러(분주기)를 거쳐 간다는 것을 알 수 있어요! 빨간색 네모에 있는 TCNTn은 카운트의 값을 세주는 곳이에요. 일정 시간마다 카운트를 더하다가, 255가 넘게 되면 오른쪽에 있는 TOVn에서 오버플로우가 일어났다고 알려주고, 이 때 Overflow 인터럽트가 일어나게 됩니다! (8비트 타이머이기 때문에 255까지 셀 수 있어요) 주황색 네모에 있는 OCRn에는 255..
[Atmega128] 타이머/카운터란? 타이머/카운터란? Atmega128에는 8비트 타이머, 16비트 타이머가 있는데요, 8비트에는 Timer/Counter 0, Timer/Counter 2 16비트에는 Timer/Counter 1, Timer/Counter 3 이렇게 총 4개의 Timer/Counter가 Atmega128 안에 내장되어 있어요! Timer/Counter 0, Timer/Counter 2 8비트 타이머이기 때문에 기본적으로 타이머를 센 갯수가 2의 8승이 될 때 인터럽트가 발생해요. (256개) 내부 인터럽트이기 때문에 클럭이 꼭 필요하고, 이 클럭을 넣어주는 핀이 각각 TOSC1(Timer/Counter 0)과 T2(Timer/Counter 2)에요. Timer/Counter 0 분주기는 카운터 0, 1, 2, 3중 가장 ..
[Atmega128] 외부 인터럽트 사용법 외부 인터럽트를 사용하는 순서 외부 인터럽트를 사용하려면, 우선 순서대로 세팅을 해주어야 오류가 나지 않아요! 1. EIMSK - EIMSK 레지스터에서 자기가 사용하려는 외부 인터럽트 비트를 1로 설정해주어요. 2. EICRA, EICRB - EICRA, EICRB 레지스터에서 Falling edge, Rising edge, LOW level과 같은 트리거를 설정해주어야 해요. 3. SREG SREG 레지스터는 위에 초기 설정이 다 끝난 후에 마지막으로 값을 넣어주는 것이 안전해요. 제일 위에 비트, 즉 7번째 비트를 1로 넣어주면 모든 인터럽트가 활성화 된답니다!
[Atmega128] 외부 인터럽트 제어 레지스터 외부 인터럽트 제어 레지스터가 하는 일? 외부 인터럽트를 제어하려면, 5개의 레지스터가 필요해요. 이 레지스터들은 각각 역할이 다 다릅니다. 간단하게 말하자면, 동작 모드 설정, 동작 여부 설정, 발생 여부 설정등을 하는 곳이에요. 외부 인터럽트 제어 레지스터 1. EICRA External Interrupt Control Register A 의 약자에요. INT 0번 핀부터 INT 3번 핀 까지의 동작을 제어할 수 있는 레지스터에요! (Atmega328은 INT 0번 핀과 1번 핀밖에 제어하지 못하니, 차이점 꼭 알아두시길 바래요) 0~1번 비트는 INT 0번 핀, 2~3번 비트는 INT 1번 핀, 4~5번 비트는 INT 2번 핀, 6~7번 비트는 INT 3번 핀을 설정하는 비트에요. (n은 0~3번 ..
[Atmega128] 외부 인터럽트 인터럽트란? 인터럽트란, 어떠한 일을 일시적으로 중단하는 것을 의미합니다. 즉, 프로그램 상에서는 "프로그램을 실행 중 어떠한 조건이나 신호가 들어오면 프로그램을 일시정지하고 특정 코드를 수행한다" 라고 이해할 수 있습니다. 그러한 특정 코드들이 저장되는 곳을 ISR 루틴이라고 합니다. 외부 인터럽트란? 위에 사진이 Atmega128에 있는 외부 인터럽트 소스들의 정보에요. Atmega128에는 8개의 INT 핀이 있는데요, 이 핀에 입력된 신호에 따라서 인터럽트가 발생하는 것을 외부 인터럽트라고 해요! 외부 인터럽트가 발생하는 시점 외부 인터럽트는 세 가지 경우에서 발생할 수 있어요. 1. rising edge 전기 신호가 LOW에서 HIGH로 올라갈 때, 이 시점을 rising edge라고 해요. 즉..
[Atmega128] I/O포트의 입력? I/O 포트의 특정 비트 입력값 조회 I/O 포트에 들어오는 입력값들 중 하나의 레지스터의 특정 비트만 입력값을 받아내고 싶다면 & 연산자를 이용하면 돼요. PIND 레지스터에 0 0 1 0 1 1 0 0 이렇게 값이 들어와 있고 2번 비트만 검사하고 싶다면 int num = PIND & 0x04; 이러한 방법으로 받아올 수 있어요! PIND(0 0 1 0 1 1 0 0) 0x04(0 0 0 0 0 1 0 0) 이 두개를 &연산으로 취하면 두 개의 비트 모두 1일 때에 결과 값이 1이 나오므로, 0x04라는 값이 num에게 저장됩니다. 만약 PIND의 2번 비트가 0이었다면, num에게는 0x00이라는 값이 저장되었겠죠. if문을 활용한 예시 PINC의 4번 비트가 HIGH일 때, PORTC의 3번 비트..
[Atmega128] 비트 단위의 출력? SRAM의 구조? 위에 사진에 보이는 것이 Atmega128에 있는 SRAM 구조에요. 여기에서 64 I/O Registers 라고 써져있는 부분에서만 비트 단위로 조작이 가능해요. 원래 레지스터의 비트별 설정을 하려면 (레지스터주소).(비트번호) 로 설정을 할 수 있어요. 하지만 위에 사진을 보면서 일일이 레지스터 주소를 입력하기엔 버겁죠.. 그래서 mega128.h 헤더파일을 가져오면 (레지스터이름).(비트번호)로 설정을 할 수 있게 됩니다! ex) PORTA.7