분류 전체보기246 atmega 328p PWM & timer counter (5) 실습 Fast PWM 나는 Fast PWM 의 COMmx 1:0 = 3 경우를 실습 해보겠다. OCnx 가 토글된 값이 나옴으로 OCR0A 가 작을수록 LED 가 밝아 진다. cli(); // 인터럽트 안일어남 sei(); // 인터럽트 일어남 잘 쓰이는 함수 void setup() { Serial.begin(9600); //PORTD = PORTD|(1 2021. 7. 27. atmega 328p PWM & timer counter (4) 실습 (Normal mode) 1. Normal Mode 1 초마다 13pin 에 출력을 주는 코드를 만들어 보자 cpu 클럭수는 16Mhz 이고 기본 분주비는 64 로 사용하겠다. 일단 1 ms 마다 overflow 가 발생하도록 하기 위해서는 위의 그름을 보면 n = 250 이여야 한다. 따라서 초기 값은 6 으로 해주면 6 - 255 =249 255 -> 0 으로 바뀔때 overflow 인터럽트가 동작하므로 딱 250 클럭이 된다. 즉 1초마다 불빛이 들어 오기 위해서는 1000 번 overflow 가 발생하면 된다. 추가 셋팅 timer0 의 경우 아두이노에서 pwm 용으로 사용하기 위해서 overflow 인터럽를 에다가 정의 해 놨다 때문에 ISR()을 사용할 경우 중복 정의 오류가 발생한다. 때문에 에서 overflow 인.. 2021. 7. 27. atmega 328p PWM & timer counter (3) mode 각가의 모드에 대한 개념을 알려주는 포스팅이다. 어떠한 레지스터가 set 되고 clear 되는지 등은 데이타시트를 참고하기 바란다. 각 모드별 인터럽트 발생 주파수 또한 데이타 시트를 보고 알아서 하기 바란다. 4가지 모드가 존재 1. Normal 2. CTC 3. Fast PWM 4. PWM, phase correct 1. Normal 카운터가 항상 상향 카운터로만 존재하고, 카운터가 도주애에 클리어 되는 일이 없다. 때문에 overflow 인터럽트만 존재 할 수 있으며 , 초기의 TCNTn 값을 0 이 아닌 다른 값으로 초기화 할 수있다. 즉 overflow 인터럽트가 발생했을때 인터럽트에서 TCNTn 값을 조절 하여서 인터럽트 발생 시간을 조절 할 수 있다. 다음 포스팅에서 가장 간단한 Normal.. 2021. 7. 27. atmega 328p PWM & timer counter (2) 구조 및 레지스터 atmega 328 의 경우 8bit 2 개 16bit 1개의 카운터를 가진다. 이 카운터에 대해 공부해보자 카운터 클럭 다이아그램 카운터/타이머의 인터럽트 간단하게 카운터/ 타이머는 클럭의 숫자를 세는 일은 한다. 아두이노는 이러한 카운터/타이머를 이용해서 pwm 을 생성하기도 하고 , 우리는 이를 이용해서 다양한 기능을 구현 할 수 도 있다. 위의 다이아 그램을 보면 clk(Tn) 클럭이 들어가는 것을 알 수 있다. 이렇게 들어온 클럭을 TCNTn 에서 카운트 한다 .( 8bit 인경우 0 ~ 255 를 왔다리 갔다리 한다. ) 아두이노는 2가지 종류의 인터럽트를 사용해서 카운터/타이머를 사용하는데 첫번째는 Timer/Counter overflow인터럽트 이다. : TCNTn 에 계속 클럭수를 카운트.. 2021. 7. 27. atmega 328p PWM & timer counter (1) 분주비 , 타이머 vs 카운터 1. 분주비란 (프리스케일) 모든 cpu 는 클럭을 가진다. 만약 이 클럭을 기준으로 타이머/카운터를 사용하게 된다면 cpu는 너무 많은 일을 하게 된다. 때문에 타이머/ 카운터의 경우 이 클럭수를 특정한 단위로 묶어서 관리한다 이 묶음 수를 분주비 (프리스케일) 이라고 한다. 아두이노 우노의 경우 16Mhz 의 크리스탈을 사용하기 때문에 8 bit 카운터를 사용할 경우 1 클럭은 1 / 16 Mhz = 0.0625 us 이고 8bit 카운터가 가득 차는 시간은 255*0.0625 = 16us 이다. 즉 1 / 16us = 62500 즉 1초에 62500 번 overflow 인터럽트가 발생한다 이는 cpu 에게 너무 큰 부담을 주기 때문에 보통 분주비를 이용해서 클럭수를 조절해 준다. 출처: https:.. 2021. 7. 27. 함수 (def) def smart(): print("지옥으로 키티") smart() 함수 만들기 def 를 사용하면 된다. def smart(temp): print("지옥으로 키티"+str(temp)) return "aaaa" print(smart(1)) return , temp 인자 , 사용 가능 가변인수 *ints def intsum(*ints): sum = 0 for num in ints : sum +=num return sum print(intsum(1,2,3,4,5,76)) 2021. 7. 26. 2021-07-26 프로젝트의 경로를 확인해 보자 파이썬의 위치를 알 수 있다. ord() : 유니코드의 숫자를 알려준다. 컬랙션 (list) list 는 여러가지 타입을 한꺼번에 사용 가능하다. 배열처럼 인덱스로 접근 가능 type 으로 다른 타입인것을 알 수 있다. 2021. 7. 26. ISR() 분석 - 전처리문 분석 #define ISR() 문 분석을 통해서 #define 전처리 언어에 대해서 공부해보자 interrrup.h 안에 있는 ISR() 정의 #ifdef __cplusplus # define ISR(vector, ...) extern "C" void vector (void) __attribute__ ((signal,__INTR_ATTRS)) __VA_ARGS__; \ void vector (void) #else # define ISR(vector, ...) \ void vector (void) __attribute__ ((signal,__INTR_ATTRS)) __VA_ARGS__; \ void vector (void) #endif 1. extern "C" C++ 문법 네임맹글링 ( Name Mangling.. 2021. 7. 20. i/o register 0x0(0x20)메모리 주소의 의미 (기본기) 주소를 보면 0x0(0x20) 같이 이상한 2가지 주소가 존재한다. 왜 이런식으로 주소를 사용하는지 생각해 보자 1. 하버드 구조의 특징 2. virtual 메모리 방식 1.하버드 구조 아두이노는 코드가 담기는 flash 메모리와 다양한 주메모리 역활을 하는 sram 2가지 메모리를 가진다 이러한 방식의 구조를 하버드 구조라고 한다. 이는 아두이노 와 같이 8bit cpu 에서 처럼 표현할 수 있는 메모리 주소가 적을데 많은 양의 메모리를 다룰 때 효율적이다. 또한 코드에서 명령을 읽어 들이고 메모리에서 변수를 가지고와서 처리를 동시에 할 수 있음으로 속도 면에서도 우월한 장점을 가지고 있다. 하지만 flash 메모리 도 0x0 번지를 가지고 sram 또한 0x0 번지를가진다. 그렇다면 cpu에게 어떻게.. 2021. 7. 20. 이전 1 ··· 13 14 15 16 17 18 19 ··· 28 다음