##타이머

ATMega 128에서는 4개의 타이머가 존재한다.

각 타이머는 0, 1, 2, 3과 같은 번호를 가지고 있으며, 이 번호는 나중에 레지스터를 할당할 때 사용된다. (ex, TCCR0)

이 중 0, 2번 타이머는 8비트 타이머이고 ATMega 128기준 7372800Hz를 갖는다.

그리고 나머지 1, 3번 타이머는 16비트 타이머이다.


타이머는 보통 세개~네개 정도의 레지스터만 선언해주면 사용이 가능하다. (interrupt 헤더파일은 선언해 주어야 한다.)


TCNTn(Timer/CouNTer register)

 이름에서 보이듯이 직접 타이머를 카운트하는 레지스터이다. 0~255의 값을 가질 수 있으며 만약 이 값을 우리가 임의대로 수정하면, 이후 타이머는 수정된 값 이후부터 더하고, 초기화 되어도 수정된 값으로 초기화가 된다.


OCRn (Timer/Counter Output Compare register n)

 아래에서 설명할 CTC모드와 고속 PWM 모드에서 사용되는 레지스터. 0~255사이의 값을 가지며 타이머의 속도를 조절할 수 있는 역할을 한다.


TCCRn(Timer/Counter Control Register n)

 사실상 타이머를 사용하는데 가장 중요한 레지스터이다.

 구조는 8비트로 | FOCn | WGMn1 | WGMn0 | COMn1 | COMn0 | CSn2 | CSn1 | CSn0 | 이며,

 FOCn(Force Output Compare n)과 COMn0, COMn1(Compare match Output Mode n)은 고급 제어에서 이용되며, 가장 단순하게 타이머 용도로만 사용할 정도면 WGM과 CS만 이해하여도 크게 문제가 없다.

 따라서 이번 포스팅에서는 WGM과 CS에 대해서만 설명한다.

 1) WGMn1 WGMn0 (Waveform Generation Mode n)

WGM의 경우 CS와 다르게 그 위치가 8비트 상에서 연속되어 있지 않으므로, 정확한 위치 확인이 필요하다.

아래 진리표의 경우 WGMn1 WGMn0 순으로 작성된 것으로, 실제 레지스터에 적용시에는 그 구조를 파악하여 정확히 써주어야 한다.

0 0 : 일반 (0~255->0~255) => TCNT레지스터의 값이 0부터 255까지 차례로 증가한 뒤 TOV라는 레지스터로 값이 다 찼다는 결과를 주고 다시 0으로         초기화 된 뒤 255까지 다시 올라가는 방식이다.

0 1 : 위상정정 PWM(Pulse Width Modulation) (0~255~0~255) => TCNT레지스터의 값이 0부터 255까지 차례로 증가한 뒤 일반 모드와는 다르게         바로 0으로 초기화 되는 것이 아니라, 0까지 값을 하나씩 줄여가는 방식이다. 0으로 줄은 상태에서 TOV값이 리턴된다. 물론 0이 되면 다시 값이         1씩 증가한다.

1 0 : CTC(Compare Timer on Compare match) (0~OCRn->0~OCRn) => 다른 방식들과는 다르게 0부터 OCRn 레지스터에 저장된 값까지만 증가하고,         OCRn(Timer/Counter Output Compare register n)레지스터 값과 TCNT레지스터의 값이 동일해지면 TOV를 반환하고 0으로 다시 초기화 된다.

1 1 : 고속 PWM (0~255->0~255) => TCNT레지스터의 값이 0부터 255까지 차례로 증가한 뒤 TOV라는 레지스터로 값이 다 찼다는 결과를 주고 다시         0으로 초기화 된 뒤 255까지 다시 올라가는 방식이다. 일반 모드와 다르게 고속 PWM은 0부터 255까지 증가하지만 OCRn값이 있다면, 그         시기에 즉시 OCn(Output Compare n)값을 리턴한다.

 2) CSn2 CSn1 CSn0 (Clock Select)

프리스케일러(free scaler)라고도 불리며, 분주기라고도 불린다. 이 세 비트의 상태에 따라서 한 클럭마다 신호를 발생할 것인지, 아니면 그것보다 낮은 클럭으로 신호를 발생할 것인지 선택이 가능하다.

0 0 0 : 정지

0 0 1 : 7372800(클럭상태)

0 1 0 : 7372800/8 = 921600(921600클럭으로 돌아가는 것과 같은 상태)

0 1 1 : 7372800/32

1 0 0 : /64

1 0 1 : /128

1 1 0 : /256

1 1 1 : /1024 => 약 71ms로 동작


TIMSK(Timer/Counter Interrupt MaSK register)

 TIMSK = 0x01;로 선언하면 overflow 인터럽트를 Enable한다.


TIFR(Timer/Counter Interrupt Flag Register)

 TOV 발생 시에 기록하는 레지스터.

 TIFR = 0xFF;로 선언하면 첫 인터럽트 시작이 0이 된다.


Sei(); <= 인터럽트 인에이블 함수


SIGNAL(SIG_OVERFLOW0) <= 타임 인터럽트 서비스 루틴


SIGNAL(SIG_OUTPUT_COMPARE0) <= OCR모드일 때 인터럽트 서비스 루틴



* 타이머 조작

1) TCNT를 직접 설정하는 방법 : 한번 설정 시 TCNT부터 255까지 증가

2) 프리스케일러 조작

3) CTC모드로 조작 : OCRn 설정시 0부터 OCRn까지 증가

##인터럽트

AVR에서 인터럽트를 제어하려면 네가지 선언과 한가지 include, 한가지 함수만 사용할 수 있으면 된다.


1. 4가지 선언

 1) 포트개방

 2) EICRA/B

 3) EIMSK

 4) SREG


1) 포트개방

ATMega 128에서는 D0~3번 포트 그리고 E4~7번 포트로만 인터럽트 신호를 받을 수 있다. 따라서 이에 해당하는 포트를 개방시켜주어야 한다.

DDR로 포트개방시 1은 출력 0은 입력을 뜻하므로, DDRD = 0x00; 등으로 선언해 주면 D포트에서 입력을 받겠다는 명령이 된다.

2) EICRA/B (External Interrupt Control Register A/B, 외부 인터럽트 제어 레지스터)

EICR 레지스터는 8비트로 2개 비트씩 한 쌍을 이룬다. 예를 들어, PD0에 대하여 01 00의 두개 비트를 가진다. 그리고 두개의 비트의 조합에 따라

EICRA

00 Low Level

01 예약

10 INT 하강에지

11 INT 상승에지

EICRB

00 Low Level

01 논리변화

10 INT 하강에지

11 INT 상승에지

와 같은 동작을 수행한다.


구조는 다음과 같다.                                      1bit 2bit 3bit 4bit 5bit 6bit 7bit 8bit

EICRA(외부인터럽트 0~3 트리거 설정 [PD0~3]) : | 31 | 30 | 21 | 20 | 11 | 10 | 01 | 00 |

EICRB(외부인터럽트 4~7 트리거 설정 [PE4~7]) : | 71 | 70 | 61 | 60 | 51 | 50 | 41 | 40 |


예를 들어, PD0에 대해서 상승에지에 인터럽트를 감지하고 싶다면

EICRA = 0b00000011; 이라고 선언해주면 된다.

3) EIMSK(External Interrupt MaSK, 외부 인터럽트 마스크 레지스터)

8비트이며 각 포트에서 발생한 인터럽트를 Enable할 것인지(수용할 것인지), Disable할 것인지(무시할 것인지) 판단하는 레지스터이다.

구조는 EIMSK : | INT7 | INT6 | INT5 | INT4 | INT3 | INT2 | INT1 | INT0 | 이다.

예를 들어, PD0에서 발생하는 인터럽트를 수용할 것이라면

EIMSK = 0b00000001;로 선언해주면 된다.

4) SREG(Status REGister, 상태 레지스터)

8비트이며 각 비트는 현재 CPU의 상태를 나타내준다.

최상위 I 비트가 1이 아닌 경우 인터럽트를 받지 않기 때문에, 1로 강제로 세팅해준다.

구조는 SREG : | I | T | H | S | V | N | Z | C |

I 글로벌인터럽트

T storage

H half carry

S sign

V overflow

N negative

Z zero

C carry

즉, SREG |= 0b10000000; 이며, 다른 레지스터와 다르게 원래 SREG와 or 연산을 시키는 이유는 SREG자체가 상태레지스터로 현재 프로그램이외에 다른 상태를 나타낼 수 있기 때문이다.


*) EIFR(Interrupt Flag Register)라는 것도 있는데, EIMSK와 비슷하게 각 자리가 Interrupt 포트와 매치된다. 이 레지스터는 각 포트에서 인터럽트가 발생하였는지 표시하는 레지스터이다.


2. 한가지 인클루드

#include<avr/interrupt.h>

인터럽트를 사용하려면 이 헤더파일을 인클루드 시켜주어야 한다.


3. 한가지 함수

ISR(INT4_vect)

이 함수는 INT4 포트에서 입력되는 인터럽트 신호가 있으면 작동되는 함수이다.

메모장에서는 찾기, 찾아바꾸기 시 엔터(개행문자, 줄바꿈)를 찾지 못함


한글에서는 '^n'이라는 것으로 엔터를 찾아내거 찾아서 바꿀 수 있음

1. 새 탭을 연다

2. 주소창에

data:text/html, <body contenteditable style="font: 1.5rem/1 monospace;max-width:75rem;margin:0 auto;padding:5rem;">

이것을 그대로 붙여넣는다

3. 그 탭은 바로 글자를 입력하여 쓸 수 있는 텍스트창이 되었다

4. 자주 쓰고 싶으면 즐겨찾기를 해 놓는다

5. 저장기능은 없으므로 저장힐 필요가 있을 때 내용을 복사하여 다른 매체에 붙여넣기 하거나

1) 크롬에서는 오른쪽 상단의 메뉴 아이콘(점 3개 모양)을 클릭한 다음, '도구 더보기'에서 ‘페이지를 다른이름으로 저장’을 선택하면 된다. 나중에 메모를 브라우저에서 열어 볼 수 있다.

2) 파이어폭스에서는 탭을 텍스트로 저장하는 기능을 보유하고 있다. 파이어폭스의 메뉴 아이콘을 클릭하고, ‘페이지 저장’을 클릭한다. 탐색기 창이 열리면 '파일 형식' 드롭다운 메뉴에서 ‘텍스트 파일’을 선택. 이러면 텍스트 파일로 저장된 것이므로 다음에 해당 메모를 열 때는 일반 메모장에서도 열린다.

6. 저 위의 주소에서 색깔별로 각각, 글자크기, 줄간격, 최대 가로 길이, 상하좌우 여백이다. 각자 자신의 취향대로 바꾸어서 쓸 수 있다.

요새 워낙에 문서 뷰어(.pdf, .hwp 등)들이 잘 발달되어있고, 말단기기들(태블릿 피씨 등)도 잘 발달되어 있고 해서, 개인적으로는 집에서 모든 문서를 없애는 방향으로 가고 있다.


그래서 집에 프린터를 없애 버렸는데(사실 복합기는 필요 없고, 프린터만 따로 있는거면 사겠는데, 요새 오히려 복합기가 훨씬 싸고, 단순 프린터가 가격이 훨씬 비싸다... 이 무슨...) 왕왕 프린트를 할 필요가 생긴다.


진짜로 물리적으로 프린트 할 일이 있으면, PC방에 가서 프린트하면 되는데(장당 말도 안되게 받기는 하는데, 프린터 유지비와 초기 구입비를 생각해보면 괜찮은 것 같다) 문제는 프린트 했다가 다시 스캔해야 하는 경우이다.


이 경우에 윈도우즈 자체에서 pdf로 저장하거나 xps로 저장하거나 one note로 보내는 등 여러가기 방법을 제공하는데, 문제는 우리나라 공공기관들이다.

(특히 민원24...)


우리나라 공공기관들은 이렇게 문서로 직접 저장하는 것을 막고 있고, 또한 문서로 직접저장 이외에도 공유프린터 등도 사용이 불가하다.(이 프린터들을 선택하면 출력 불가 프린터라고 나온다.)

[여러 대학에서 출력하는 것도 비슷할 것이다. 이번에 모교에서 출력해보았는데, xps는 에러가 났고, one note로 보내기도 에러가 났다. 결국 1000원을 그냥 버리게 되었다. 정말 진짜... 그냥 바로 spool로 갈 껄)


그래서 한동안 인터넷에서 돌아다녔던 것이 paperless프린터를 깔고, 통합 프린터 드라이버를 깔아서 두 개를 연동하여 출력을 통합 프린터 드라이버로 하면(이것은 출력가능이다) 여기서 자동으로 페이퍼리스 프린터로 넘겨주며, 자동으로 문서로 저장되는 시스템이다.


하지만


이 시스템을 사용해 보려고 정말 많은 노력을 해 보았는데, 모든 프로그램 설치가 그러하듯, 잘 안됐다.


한 몇시간 여기에 투자하고, '아 정말 답은 없는 건가'하고서 절망하고 있을 때, 그 설치한 통합 프린터 드라이버로 출력을 걸면, 컴퓨터 내에 spool파일이 생기는데, 이것을 빼내볼 수는 없을까 생각했는데... 있었다!!!


이제부터 그 방법을 설명한다.


윈도10 기준인데, 7도 다를 바 없는 것으로 보이는 바, 현재 있는 모든 윈도에서 사용 가능하다고 보인다.


1. 통합 프린터 드라이버를 깐다.(본인의 경우 hp 공식홈페이지에서 깔았다.) -> 이것을 깔면 장치 중에 'HP Universal Printing PS'라는 것이 생긴다.

2. 여러 인쇄가 필요한 경우로 가보자.(문서로 저장이 불가능한 경우 또는 공유프린터로 출력이 불가능한 경우. 가령 주민등록등본출력 등)

3. 일단 인쇄를 누르기 전에 'C:\Windows\System32\spool' 경로로 이동해준다. 여기서 우리가 앞으로 복사해야 할 폴더는 'PRINTERS' 폴더이다.

4. 인쇄 페이지에서 'HP Universal Printing PS'를 선택하고 출력을 눌러준다.

5. 처리가 완료됨과 동시에 띄워놓은 'C:\Windows\System32\spool'창에서 'PRINTERS' 폴더를 빠르게 복사하여(ctrl+c) 아무데나 붙여넣는다(ctrl+v). 여기서 '빠르게'하는 이유는, 어떤 상황에서는 spool파일이 오랫동안 남아있는데, 어떤 경우에서는 인쇄가 완료되자마자 사라지기 때문이다. (특히, 프린터가 응답없음이나, 인쇄를 취소하게 되면 무조건 적으로 삭제된다.)

6. 그렇게 복사한 'PRINTERS' 폴더안에 *.SPL 파일이 있으면 성공이다.

7. 이제 이 spool파일을 보기 위한 뷰어가 필요하다. 여기서 spool file을 뜯어볼 수 있는 방법은 보통 두가지다. 한가지는 뷰어를 이용하는 방법(이 안에도 요새 사용되는 뷰어가 2가지 있다), 두번째는 스풀 파일을 다시 프린트하여(새로운 프린터라 보면 된다.) pdf로 저장하는 방법(이것을 파일프린트라 한다.)

1) [뷰어] SPLview v1.0.2.3 (다운로드 링크 : http://www.lvbprint.de/html/splviewer1.html)

2) [뷰어] SplViewer v0.1 (다운로드 링크 : http://splviewer.sourceforge.net/)

3) [파일프린트] PrintFile (다운로드 링크 : https://lerup.com/printfile/)

개인적으로는 2번을 추천하는데, 그 이유는 파일프린트 방식은 뭔가 개인적으로 설정이 조금 힘들었다. 그리고 뷰어 방식 중에서 첫번째 SPLview는 개인적으로 파일이 안열렸다. 그래서 가장 단순하게 쓸 수 있는 SplViewer를 추천한다. (다만 에러가 나면 2->1->3 순으로 시도하면 그 중 하나는 될 것이다.)

이후의 단계는 2번을 기준으로 설명한다.

8. 파일을 설치하였으면 바탕화면에 바로가기가 생겼을수도, 안생겼을 수도 있다.(본인은 안생겼는데, 혹여나 생길수도 있다.) 바탕화면에 생겼으면 그것을 열어서 이용하면 되고, 생기지 않았으면 'C:\Program Files (x86)\SplViewer'로 들어가 준다.(혹시 32비트 컴퓨터는(x86) 그냥 Program Files (x86) 대신 Program Files로 들어가면 된다.

9. *.SPL파일을 'C:\Program Files (x86)\SplViewer' 폴더 안에있는 splviewer.exe에 드래그 앤 드롭하면(드래그 해서 splviewer.exe에 가져다 되면, 커서에 (+)가 추가된다.) 바로 이미지 미리보기 형태로 spool파일이 나타난다. 왼쪽 위에 '파일'을 눌러 '복사본 만들기'를 하고 원하는 위치에 저장하면 *.tiff방식으로 저장이 된다.

10. tiff파일을 pdf로 바꾸고 싶다면 (https://tiff2pdf.com/ko/) 사이트에서 변경이 가능하다.

11. tiff파일을 jpg로 바꾸고 싶다면 (https://tiff2jpg.com/ko/) 사이트에서 변경이 가능하다.


이 과정을 지나면 따라! 나에게 pdf 혹은 jpg파일이 내 컴퓨터로 출력되었다.

윈도우즈에서 torchvision 깔기(with 파이토치(pytorch)깔기)


윈도우즈에서 파이토치(pytorch) 깔기는 굉장히 쉽다.


아나콘다 받아서 설치하고 -> 아나콘다 프롬프트를 실행시키고 ->

(엔비디아(nvidia) 계열 그래픽카드(gpu) 사용 시) conda install -c peterjc123 pytorch

(그 외 그래픽카드 혹은 cpu만으로 사용 시) conda install -c peterjc123 pytorch-cpu


끝!


확인할 수 있는 방법은 jupytor notebook을 켜거나 그냥 아나콘다 프롬프트에서 python입력해서 python 인터프리터 창으로 들어가서

import torch

실행해서 에러가 없으면 설치 성공!


근데 문제는 딥러닝을 조금 더 공부해서 cnn(convolutional neural network)으로 넘어가게 되면 torchvision이 필요하게 되는데, 이게 설치하는 방법이 구글링을 해봐도 잘 안나온다.


바로 아나콘다 클라우드에 

conda install -c anaconda torchvision

이라는 명령어가 나오기는 하는데, 윈도우즈에서 돌리면 채널이 없다고 나온다!


홈페이지 들어가 보았더니 osx와 linux만 지원한다고 한다.


그러면 윈도우즈에서는 깔 수가 없는 것인가?

아니다!


pip 명령어를 사용하면 아주 쉽게 깔 수 있다.


pip install torchvision


끝.


위와 같이 import torchvision 해서 에러가 안나면 제대로 깔렸다고 볼 수 있다.


만약 pip에서 에러가 나면 이전 포스팅인 pip에러 수정하는 방법에 대해서 확인해보자!

윈도우즈(windows)에서 아나콘다(anaconda)를 깐 뒤 아나콘다 프롬프트(anaconda prompt)에서 pip명령을 쳐서 뭘 설치하려고 하면 화면 가득 빨간 글씨가 가득 뜨며 설치가 안되는 경우가 있다.

(진짜 빨간글씨가 우루루루루루 나오는데, 조금 소름끼친다)


그리고 그 문장의 제일 마지막은

pip._vendor.pkg_resources.RequirementParseError: Invalid requirement, parse error at "'; extra '"

이걸로 끝난다.


구글에서 열심히 구글링 해 본 결과 이것은 testpath 패키지? 가 문제가 되어 pip를 망가뜨렸다는 것인데, 그럼 어디 한번 이것을 고쳐보자.


처음 하는 것이라 정말 한참 걸렸는데, 정말 쉽다.


아나콘다 프롬프트에서

conda install 'testpath>=0.4.2'

이 명령어를 쳐주자.

아마 커서가 내려가서 깜빡일 텐데 엔터 한번 더 쳐주자.

그러면 설치가 끝나고, 이렇게 설치가 끝난 상태에서 pip install다시 하면 제대로 실 행 이 됩 니 다.


문제 해결!


보니까 testpath버전이 0.4 아래에서 이런 문제가 발생하는 것 같은데, 0.4.2 버전에서 이 문제를 수정하였다고 한다.

홈 트레이닝 운동 기록 15일차


개인적인 기록이므로 편하게 기록합니다.


* 모두 10회씩 진행하였다.

* 매 푸시업 전 30초 휴식

푸시업 -> high knee -> 크로스 레그 크런치 -> 푸시업 -> 점프 스쿼트 -> 공중자전거 -> 푸시업 -> 버피 -> 누워서 다리 차기 -> 푸시업 -> 사이드 스텝 -> 러시안 트위스트 -> 푸시업 -> 팔벌려뛰기 -> 엉덩이 들기 -> 푸시업 -> 발꿈치 들고 스쿼트 -> 사이드 플랭크 -> 푸시업 -> 무릎 굽혀 팔벌려 뛰기 -> 다리 올리고 크런치 -> 푸시업 -> 제자리 점프 -> 플랭크


쉬지않고 쭉 돌면 30분 이내로 운동이 끝난다.


또 다시 운동 강도를 높여 보았다. 약 28분이 걸렸고, 30분 이내로 끝내기 위해 쉬는시간 30초를 많이 반납했다.

13일과 14일차에 운동을 하지 못하였는데, 다행히도 스케쥴 상 13일이 쉬는 타임이어서 죄책감이 덜했다.

오랜만에 땀이 날 정도로 운동을 했다.

홈 트레이닝 운동 기록 12일차


개인적인 기록이므로 편하게 기록합니다.


* 모두 10회씩 진행하였다.

* 매 푸시업 전 30초 휴식

푸시업 -> 버피 -> 다리 올리고 크런치 -> 푸시업 -> 사이클 스플릿 런지 -> kickout -> 푸시업 -> 팔벌려 높이 뛰기 -> 레그 리프트 -> 푸시업-> 높이 뛰기 -> 러시안 트위스트 -> 푸시업 -> 버피 -> 사이드 플랭크 -> 푸시업 -> Split Squat -> Hip Raise


쉬지않고 쭉 돌면 30분 이내로 운동이 끝난다.


오늘은 세트 구성이 짧아 일찍 끝났다.

다행히도 오늘은 늦잠 잔 날이라 운동이 빨리 끝나며 후에 스케쥴에 영향을 주지 않았다!

운동 기록 11일차


*개인적인 기록이므로 편하게 기록합니다.


그제와 더불어 11일차에 운동 스케쥴이 있지만, 아침부터 수업이 있어서 운동을 못하였다...


앞으로 11월 중순까지는 화, 목은 운동 하기 힘들 것 같고, 주말에는 가끔씩 시험 때문에 못할 것 같다...ㅠㅠ

+ Recent posts