목록전기전자/Atmega128 (9)
제민

Analog Digital Converter 아날로그 신호를 디지털로 바꿔주는 장치이다. 학교에서는 주로 가변저항 값을 읽어오는데 사용할 것으로 보인다. Atmega에는 PF0 ~ PF7까지 8개의 ADC가 존재한다. ADC 관련 레지스터 1. ADMUX 레지스터가 굉장히 간단하게 구성되어 있다. 하위 5비트는 사용할 ADC를 선택하는 부분인데, 0이면 00000, 1이면 00001 이런 식으로 설정해준다. 2. ADCSRA ADEN는 A/D Converting Enable(1) /Disable(0) 을 결정한다. (1) ADSC는 1이면 Start Conversion, 끝나면 0이 된다. (1) ADFR는 Free Running mode로 동작하게 한다. (1) ADIF는 변환이 끝나면 1이 되고 아니..

CLK란 HIGH와 LOW의 주기가 같은 펄스이다. PWM은 그림과 같이 펄스 폭을 변조하는 것을 말한다. 그러면 Atmega에서 이런 펄스를 어떻게 만들어내는지 그림으로 간단하게 알아보자. 그림만으로도 Atmega가 어떤 원리로 PWM 출력파형을 만들어내는지 이해할 수 있다. 이전에 사용했던 타이머 카운터 인터럽트에서의 CTC(비교) 모드와 마찬가지로 OCRn를 설정하면 TCNTn가 카운트를 하고, 카운트가 OCRn이 되면 무언가 동작한다. 그림에서는 TCNTn==OCR0에 RST가 된다. COMn1 COMn0 1 | 0 | OCR0 = TCNT0면 OcCn 출력값을 CLR, TCNT가 0이면 SET 1 | 1 | 같아지면 출력값을 SET, TCNT가 0이면 CLR 즉 1 0을 써야 한다. 분주비는 앞..

여기가 조금 어려운 부분이다. 외부 인터럽트까진 간단했어도 이 파트부터는 조금 머리를 써야 한다. 타이머/카운터 인터럽트의 사용 목적은 정확한 시간을 사용하기 위함이다. _delay_ms(); 의 가장 큰 단점은 실행되는 동안 CPU가 정지한다는 점이다. 타이머 인터럽트를 사용하면 이 단점을 극복할 수 있다. 아트메가에는 0, 1, 2, 3의 4개의 타이머/카운터 인터럽트가 존재한다. 0 2는 8Bit, 1 3은 16Bit이다.우린 8Bit만 사용할 것이므로 0과 2만 사용한다. 후에 나오는 n에는 0과 2만 들어간다고 생각하면 된다. 타이머 인터럽트는 4개의 동작 모드를 가진다. 1. 일반 모드 (Normal) 2. 비교 모드 (CTC) 3. 위상 변조 (Phase Correct PWM) 4. 고속 P..

IC 7447 : 디코더 IC로, A~D 입력에 0~15의 신호를 넣으면 output에 신호를 준다. 산업기사에 나오므로 핀맵을 꼭 외워야 한다. 숫자 파싱하기 Array FND의 Dynamic Driving을 위해선 n자리 숫자를 n개의 배열에 한 자리씩 저장해야 한다. 그렇게 해서 각 자리에 맞는 FND의 전원선에 HIGH를 주고, 그 자리에 맞는 숫자를 Array FND에 보내주는 작업을 반복하면 숫자가 동시에 떠있는 것으로 보인다. int arr[2]={0,}; //파싱한 숫자 저장 void parseNum(int number){ int idx=0; while(number){ arr[idx++]=(number%10); number/=10; } } Array FND에 숫자 출력하기 PortD가 FN..
ISR이란 Interrupt Service Routine의 줄임말 main 함수 내의 프로그램 실행 중 인터럽트가 발생하면 ISR이 동작하며 main 함수 내의 동작을 잠시 미루고 ISR을 실행한다. 외부 인터럽트 레지스터 SREG : 인터럽트의 사용 여부를 저장. - 최상위 비트가 1이면 enable, 0이면 disable - sei() = (SREG=0b10000000;) EIMSK (External Interrupt Mask) - 인터럽트를 사용할 핀을 1로 해준다. - DDRX로 입력 포트 설정할 때 썼던 값의 bitwise not (~)을 해주면 편하다. EICRA, EICRB : 인터럽트를 언제 시킬건지 결정 - A는 D0 ~ D3 를 설정 - EICRA = 0b D3 D2 D1 D0 (각 포..
dx 배열과 방향을 나타내는 dir 변수로 버튼 하나로 왔다 갔다 하는 기능을 구현했다. #define F_CPU 16000000 #include #include unsigned char btn,state=0; int flag1=0,flag2=0,flag3=0,flag4=0; int cnt=-1; int dir=0; //0이면 앞, 1이면 뒤 int dx[2]={1,-1}; int curSW=0; void Reset(){ //초기화 함수 for(int i=0;i
이번에는 토글 스위치를 만들고, 응용해볼 것이다. 1. 토글 스위치로 LED ON/OFF #define F_CPU 16000000 #include int main(void){ DDRA = 0xFF; DDRC = ~0x0F; int flag=0; int state=0; while(1){ int btn=~(PINC)&0x0F; //PINC의 하위 4비트를 읽어옴 if(btn&0x01){ //PINC의 0번이 1이면 if(flag==0){ state=!state; //상태를 반전시킴 flag=1; } } else flag=0; if(state) PORTA=0x01; //상태가 1이면 A포트의 0번 HIGH else PORTA=0x00; //아니면 LOW } } 아두이노에서 했던 것과 똑같다. flag를 이용해..
일단 시작하기에 앞서서 되도록 B포트를 입력으로 사용하지 말라는 것을 기억하자. 1. 푸시버튼으로 LED 1개 켜기 #define F_CPU 16000000 #include #include int main(void){ DDRA = 0x01; //출력 DDRC = ~0x01; //입력 while (1){ PORTA = ~PINC; } } DDRX = 0b 0000 0000 X에는 포트가 온다. (A,B,C,D,E,F,G) 0b는 binary, 2진수를 의미한다. 0x로 10진수 표현을 할 수도 있다. 입력으로 사용할 핀에 0을 적어준다. ex)0번 핀을 입력으로 사용한다. 0b 1111 1110 ex)모든 핀을 입력으로 사용한다. ~0xFF NOT 연산을 사용해 0을 1로, 1을 0으로 만들면 편하다. P..
일단 기본적인 코드의 틀을 알아보자. #include int main(void){ while (1) { } } 아트메가 프로그래밍도 아두이노와 크게 다르지 않다. 이 단원에서는 단순한 출력만을 다루려고 한다. 1. LED 한 개 제어하기 #define F_CPU 16000000 //CPU의 Frequency를 결정 #include //Atmega 기본 라이브러리 #include //delay 함수를 사용하기 위한 라이브러리 int main(void){ DDRA = 0xFF; //핀의 상태를 결정 while (1){ PORTA=0x01; _delay_ms(1000); PORTA=0x00; _delay_ms(1000); } } F_CPU는 항상 적어줘야 한다는 것을 잊지 말자. DDRX = 0b 0000 0..