블로그 이미지
송시혁

calendar

1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

Notice

Tag

Recent Post

Recent Comment

Recent Trackback

Archive

2013. 10. 17. 08:48 임베디드/Arm2567SAM


cStart. 소스 파일에서 주석문을 제외하고 제일 처음에 vector table을 만나게 된다.


ldr 명령어는 레지스터에 해당주소를 저장하는 레지스터?(말이 이상함)



위 빨간네모를 보면 pc(program counter)에 reset_handler에 주소를 가지게 된다.

reset_handler는 아래와 같다.



위 그림에서 또 다시 pc에 _low_level_init에 주소를 가진다. 이제 부터 추적, 추적을 해서 복잡하게 될것이다.


_low_level_init은 아래그림과 같다.




ldr 명령어로 레지스터 r2 아래그림의 라벨을 따르고 있다. 그전에 알아야 할것은 arm은 레지스터가 총 r0~

r15까지 16개의 레지스터가 있다. 그중에서 r0~r12까지는 일반 레지스터이다. r13~r15까지는 특정 레지스터이다.

설명은 위의 그림의 주석으로 설명함.



이 그림에서 2개의 .word ~~~~가 있다. 

ldmia 명령어에 의해서 r0=lowlevel_init

r1=TOP_OF_MEMORY를 가르키게 된다. 그리고 그것을 통째로 r2가 가르키는 것이다.



위의 그림보다 더 길지만, 자세하게 하지않으므로 생략. init함수에서 우리가 확인 하는 것은 주파수체배기 18MHz정도 되는 주파수를 48MHz로 증폭하는 소스이다. (하드웨어 회로도 구성되어 있으며 그것을 동작하기 위한 함수라는 것만 확인

하면 되겠다.)



다음은 TOP_OF_MEMORY를 추척해보면 다음과 같은 그림이 나온다.


위의 헤더파일 200000과 10000이 정의되어 있다. 이 주소를 더하면 0x210000이 된다. 즉, sram의 

주소 시작주소이다.








다음은 메모리 map이다. 아래 그림처럼 SRAM영역은 0X0020000부터 0X002FFFF로 되어있다.

그러나 부팅 CODE에 의해서 0X210000이 된다.






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

4월 relay 정리  (0) 2013.06.02
4월 LED정리  (0) 2013.05.31
4월 17일 LCD문자입력함수 만들기  (0) 2013.05.30
4월 16일 CMD_Write와 DATA_write함수 만들기  (0) 2013.05.28
5월 27일 LCD에 한글이름 찍기  (0) 2013.05.27
posted by 송시혁
2013. 9. 16. 18:42 임베디드/Atmega






usart에 관한 다이어그램. 검은색 굵은 선은 bus라고 생각한다. 여기서는 굵은 선(화살)로 표시되었으나

8개의 bus선으로 이루어져 있다. 대문자 'A'를 생각해보자. 65의 아스키코드값을 갖는 'A'는 65를 2진수로

변환하여 해당숫자가 버스선을 타고 데이터가 이동된다. 


저기서 주목할 부분은 UDR이다. UDR(tx), UDR(rx)는 화살표는 한 방향 밖에 없다. 말 그대로 transmit는 전송이니,

입력에 해당,  receive는 수신이라 읽는(수신)밖에 되지 않으므로 화살표의 방향이 하나뿐이다.



레지스터


아래는 수신부와 송신부의 관한 레지스터이다. 저번에도 언급했지만, 레지스터는 2개이나, 같은 주소를 가진다.

보통은 송신부와 수신부의 주소가 나누어져(arm의 경우)있으나, atmega는 그렇지 않다. 



a컨트롤 레지스터 부분이다. 

비트 하나하나를 살표보자.  


비트 7번은 수신이 완료되었을 때 이 비트에 1로 채워진다. 


비트 6번은 송신이 완료되었을 때 이 비트에 1로 채워진다. 


비트 5번은 data레지스터가 비워져 있을 때 1로 채워진다. 이 레지스터가 중심이 된다. 


우리가 쓰는 usart는 한 번에 한 비트씩 밖에 보낼 수 없다. 그래서 데이터 1110 0101의 데이터를 보내고자 한다면,

1을 먼저 보내고 ....마지막, 0, 1을 보내게 된다. 근데 문제점이 생긴다. 앞선 데이터가 1을 보내고 다음데이터 0을 보내야 한다고 가정했을 때, 앞선 데이터 1이 하이퍼터미널과 같은 수신하는 입장에서 데이터를 들고가서 비워져야 한다.

그러나, 들고 가기도 전에 0이 들어온다면, 앞에 데이터 1은 날아가버리고 그자리에 0이라는 데이터가 덮어써버린다.

그렇기 때문에 이 5번비트에 1이 들어왔는지 확인하여 데이터를 전송하거나, 수신하게끔 만든다.


이것은 레지스터 b이다. 같은 역할을 하는 레지스터이나, 기능이 많아서 추가된 레지스터. 참고로 control register는

3개가 존재한다.



앞서서 언급했듯이 비트3은 데이터를 덮었을때, 1이 되는 비트

비트 2는 패리티비트 이것은 패리티 비트에 이상이 생겼을 때 1이 되는 비트이므로 이것은 아래 레지스터설정 부분과도

연관이 있다. 짝수, 홀수, 사용하지 않음으로 보통 나뉜다. 


10001110이라는 비트가 존재한다고 가정. 짝수 패리티로 설정했다면, 이것은 1이 짝수개인지 검사하여 틀리면, 나머지 9번째 비트에 0또는 1을 넣는다. 지금 10001110은 짝수개이므로 , 9번째 비트는 0이 된다. 홀수개이면, 9번째 비트에 1을 넣어 전송한다. 즉, 패리티 비트를 사용하게 된면, 실제로 8비트가 아니라 9비트가 전송하게 되는 셈이다. 








 b컨트롤 레지스터






비트 7은 수신 완료인터럽트이다. 수신이 완료되면, 1이 된다.

비트 6은 송신 완료인터럽트이다. 송신이 완료되면, 1이 된다.




5번비트는 데이터 레지스터 인터럽트이다. 





이것은 비동기로 쓸건지 동기로 쓸건지 usart모드를 설정하는 부분. 우리는 비동기 usart를 사용할 예정.

따라서 해당비트에 0을 넣는다. 



위 그림은 짝수 패리티로 할 것인지, 홀수 패리티로 설정할 것인지 설정하는 부분. 필자는 짝수 패리티를 위하여

UPM01=1, UPM00=0으로 설정함.


이 비트는 문자비트 크기를 의미한다. 8bit로 설정하기 위해 위 그림과 같이 각각 UCSZ02=0, UCSZ01=1, UCSZ00=1로 설정.








































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

7월 24일 오실로스코프를 이용한 시간 지연.  (0) 2013.07.24
atmega adc컨버젼  (0) 2013.06.12
6월 3일 usart  (0) 2013.06.11
5월 30일 lcd에 숫자를 출력하는 함수.  (0) 2013.06.10
5월 31일 atmega timer  (0) 2013.06.03
posted by 송시혁
2013. 7. 24. 16:27 임베디드/Atmega


아래는 atmega led를 깜박이는 소스이다. 이 소스에서 완성.

이 방법은 timer counter를 이용하지 않고 시간을 지연하기 위한 것. 시간의 지연시키는 것을 모니터링

하기 위해 오실로스코프를 사용하였다. 




#define DDRA    (*((volatile unsigned char *)0x21))//DDRA 
define PORTA  (*((volatile unsigned char *)0x22))//atmegat의 portA부분의 주소를 정의. 데이터시트 참고



void my_msdelay(unsigned int uiMs);//함수 원형.

int main(void)
{
  volatile unsigned int iCnt2;
  volatile unsigned int iCnt1;
  
  DDRA= 0xFF;//8비트 모두 활성화.
  PORTA=0xFF;//8비트 모두 활성화.


  while(1)                                   
  {
          my_msdelay(1000);//delay 함수 인자를 m/s단위의 시간.

//    for(iCnt1=0;iCnt1<790;iCnt1++);//0.001초지연.                                                 
      //for(iCnt2=0;iCnt2<10;iCnt2++);
    
    PORTA=0x00;//A의 0을 넣어 led를 끄게 하기 위한 코드. 위아래코드가 while문에 의해 반복되면서 led를 깜박인다.
 
    my_msdelay(1000);
    //for(iCnt1=0;iCnt1<790;iCnt1++);
      //for(iCnt2=0;iCnt2<10;iCnt2++);
    PORTA=0xFF;


  }
  while(1);  
  return 0;
}     



void my_msdelay(unsigned int uiMs)//인자 uiMs는 말그대로 m/s단위의 시간을 뜻함. 
{
        volatile unsigned int iCnt;
        while(uiMs>0)
        {
                --uiMs;
                for(iCnt=0;iCnt<792;++iCnt);//0.001초지연. 인자로 1000을 받는다면 1000번 실행한다. 이것이 1초가 된다. 
        }
        
                
                
}
              
원래 반복문에서 for문은 이중for문이 2개가 존재하였다. 하나는 LED꺼진 상태와 켜진 상태.

  for(iCnt1=0;iCnt1<790;iCnt1++);//0.001초, 즉, 1ms로 맞추기 위하여 숫자를 최대한 낮추어가면 맞춘다.
파형의 high,low값을 맞추는 작업이다. 위아래 보이는 숫자는 790은 어느정도 맞춘 상태.

    //for(iCnt1=0;iCnt1<790;iCnt1++);
     
                        

그리고 함수 my_msdelay함수를 만들어 위에 셋팅한 for문을 비교한다. 
그러면 아래와 같은 코드가 된다.


my_msdelay(1);
//for(iCnt=0;iCnt<790;++iCnt);my_msdelay(1)함수와 맞추기 위해서 주석처리.
       //
for(iCnt=0;iCnt<1000;++iCnt) 이 부분은 필요없으로 주석처리.


for(iCnt=0;iCnt<790;++iCnt);
     //
for(iCnt=0;iCnt<100;++iCnt); 이 부분은 필요없으로 주석처리.

my_msdelay(unsigned int uims)
{
      volatile unsigned int iCnt;
      while(uims>0)
      {
         
 --uims;//while문을 탈출하기 위하여 증감한다. 예를 들어 uims가 3인 경우 아래 for문이 3번 돌고 while문이
                    //탈출된다.
         
for(iCnt=0;iCnt<790;++iCnt);//ATMEGA는 16비트이므로 최대 수치가 65535이다 그냥 단순히 for문만을
                                              //돌리면 최대치가 넘어서 제대로 출력을 할 수 없으므로 while문을 썼다.
        

       }
}

아니면 변수 iCnt를 long형으로 바꾸는 방법도 있다. 































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

9월 16일 usart복습  (1) 2013.09.16
atmega adc컨버젼  (0) 2013.06.12
6월 3일 usart  (0) 2013.06.11
5월 30일 lcd에 숫자를 출력하는 함수.  (0) 2013.06.10
5월 31일 atmega timer  (0) 2013.06.03
posted by 송시혁
2013. 6. 12. 09:09 임베디드/Atmega







ADMUX에 REFS0, REFS1는 기준전압을 설정하는 부분이다.








AVCC는 아래그림과 같이 아날로그 공급 전압이다. 이것을 설정하기

위해서는 아래 표를 보고 REFS0, REFS1를 설정해주면 된다.


(0<<REFS1)|(1<<REFS0)






ADLAR를 0으로 설정한다면, 변환결과를 컨버터 데이터 레지스터의 우측으로 끝을

맟춘다. 1이면, 좌측끝이다. 여기서는 littel endian을 사용하므로 우측 끝으로

만든다.











MUX5에 1을 사용하기 위한 1차 과정이다. 이것을 설명하면 다음과 같다.(0X1F를 사용하는 이유는

MUX0~4까지 존재하므로 5비트를 사용하기 때문이다.)


UiCH가 0인 경우 


0000 0000

0001 1111 이 &되어


0000 0000 이 된다.


UiCH가 1인 경우 


1111 1111


0001 1111 &연산


0001 1111 그대로 나온다. 




ADCSRB 



16진수 20은 0010 0000(2진수)이므로 6번째 자리에 있는 1을 오른쪽으로 5번 밀면,

가장 우측 자리에 1이 들어간다. 그렇게 된다며, 0000 0001이된다.

그리고 이것을  MUX5에 1을 넣기 위해서 왼쪽으로 민다. 


0001 1111인 경우도 마찬가지이다. 시프트 연산에 의하여 0001 1111이

0000 0001이 된다. 여기서 MUX5로 왼쪽으로 밀면, MUX5자리에 1이 넣어진다.








이 레지스터에서 MUX5부분에 1을 넣는다. MUX는 아날로그 입력 채널을 선택한다.


ADTS0~2까지는 자동 트리거 모드를 설정하는 부분이다. 자동 트리거는 쓰지 않으므로 생략한다.






ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(0<<ADPS0);


ADCSRA는 컨버터의 동작, 상태를 표시한는 레지스터


ADEN는 1로 설정시 컨버터에 모든 동작이 허용

ADPS2~0까지의 비트는 분주비 클럭으 설정하는 비트이다.

오차가 가장 적은 64로 설정한다.

 





ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(0<<ADPS0);


ADCSRA는 컨버터의 동작, 상태를 표시하는 레지스터


ADEN는 1로 설정시 컨버터에 모든 동작이 허용

ADPS2~0까지의 비트는 분주비 클럭으 설정하는 비트이다.

오차가 가장 적은 64로 설정한다.

 

ADCSRA레지스터가 끝이 난다며, 컨버터 변환을 시작한다.

ADSC의 1을 넣으면, 컨버터의 변환을 시작하게 하는 레지스터이다.

ADCSRA=ADCSRA|(1<<ADSC); 


ADCSRA=ADCSRA|(1<<ADIF);


ADIF는 컨버터 변환완료 인터럽트 요청 하는것이다. 



 분주비설정을 먼저 해놓은 상태에서 컨버터 변환이나 완료를 시켜야 안전하기 때문에 한번에 

'|'시키지 않고 차례대로 위의 두줄을 아래로 내려서 썼다.

ADCSRA=ADCSRA|(1<<ADSC); 


ADCSRA=ADCSRA|(1<<ADIF);




ADCSRA의 레지스터 이중에서 8비트인 ADCL을 사용한다.









위의 그림은 중에 ADCL을 표시한다.


































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

9월 16일 usart복습  (1) 2013.09.16
7월 24일 오실로스코프를 이용한 시간 지연.  (0) 2013.07.24
6월 3일 usart  (0) 2013.06.11
5월 30일 lcd에 숫자를 출력하는 함수.  (0) 2013.06.10
5월 31일 atmega timer  (0) 2013.06.03
posted by 송시혁
2013. 6. 11. 17:15 임베디드/Atmega










UCSR0B= 

1<<RXCIE0;

해당 비트에 1을 넣고, 상태레지스터가 I가 1이 되면, 

한 문자가 수신되고 수신완료 인터럽트 발생.


UCSR0A = (0<<MPCM0)|(0<<U2X0)|(0<<UPE0)|(0<<DOR0)|

 (0<<FE0)|(0<<UDRE0)|(0<<TXC0)|(0<<RXC0);


수신부=1<<RXEN0,

USART0포트의 수신부가 동작하도록 하는 레지스터

수신부 활성화 


송신부 동작=1<<TXEN0. p224

USART0포트의 송신부가 동작하도록 하는 레지스터

송신부 활성화



UCSR0C = (0<<UCPOL0)|(1<<UCSZ00)|(1<<UCSZ01)|(0<<USBS0)|

 (0<<UPM00)|(1<<UPM01)|(0<<UMSEL00)|(0<<UMSEL01);


UCSR0C= 


(0<<UMSEL00)|(0<<UMSEL01)은 동작모드 설정 부분.




 (0<<UPM00)|(1<<UPM01)






이 부분은 패리트 비트를 설정하는 부분이다. 

위에서부터 차례대로 설명하면, 패리티 체크 기능 사용안함(0,0)

사용하지 않음.(0,1)

짝수 패리티 사용(1,0)

홀수 패리티 사용(1,1)

여기서는 짝수 패리티 사용.


(1<<UCSZ01)|(1<<UCSZ00);

이부분은 전송데이터 길이를  설정하는 부분이다. 8비트를 사용하기 위해서 

UCSZ01과 UCSZ00에 각각 1,1을 넣는다.



UCPOL0은 동기 모드에서만 유효하다.


UDRR레지스터는 보어레이트 속도에 관련된 레지스터. 8BIT를 전송하지만, 12비트가 붙어있는 형태

우리는 그냥 8을 보내기 위하여 (여기서 8은 오차가 가장적은 분주비8)

UBRR0H를 0으로 넣고 UBRR0L=8로 직접넣는다.


UBRR0H

 -

 -

 -

 -

 0

 0

 0

 0

 

UBRR0L

  

 0

 0

 0

 0

 1

 0

 0

 0

형태로 삽입된다.










인터럽트 발생시키는 함수. LED를 켜는데 1번자리에는 불이 다들어오고, 2번은 1번을 제외하고 들어오고, 8번은 8번을  제외하고 불이 꺼지는 형태로 동작시키는것이 목적이다.


따라서, LED가 역방향이므로 GND가 전원이라고 생각하고 1번자리에는 제일 오른쪽에 0을 넣는다.

1111 1110=0XFE;


2번 = 1111 1100=0XFC 이런식으로  PORTA에 대입한다. 





MAIN()함수에는 INIT함수만, 호출한뒤, SLEEP()함수를 호춣한다.

SLEEP()은 CPU가 수행하는 모든 것을 정지, 잠재우는 함수, 단, 인터럽트만 제외한다. 그래서 무한 반복상태이나,

전력을 아낄 수 있는 장점이다.





posted by 송시혁
2013. 6. 10. 17:13 임베디드/Atmega



인자인 iLine은 lcd커서의 위치를 지정, uiNum은 실제로 lcd에 나타낼 숫자.


ucString[]배열에 "00000"문자를 넣어 초기화 시킨다.


5섯자리를 나타내어야 한다. 그래서, 배열 첫 인덱스인 ucString[0] 자리는 가장 왼쪽의자리를

나타내어야 한다. 그래서, uinum/10000을 나눈다. 예를 들어서, 65535/10000을 하면, 6이된다.

ucString[0]='6'이라는 데이터가 들어가게 된다.

ucString[1]은 uiNum%10000을 하여 나머지가 나온다. 그 나머지를 1000으로 나누면, 숫자 2번째

자리를 추출할수 있다. 예)65535%10000=5535, 5535/1000=5

ucString[1]='5'가 된다. 이런식으로 각자리에 해당하는 숫자를 추출한다.


main함수에서 lcd_number함수에 인자에 왼쪽에 1일때,

커서 제일 윗줄에 앞에 해당하는 함수 호출


그 밖에는 아랫줄 외쪽끝에 위치하여 해당하는 함수 호출


lcd_String(ucString);은 숫자를 찍어낸다. 









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

atmega adc컨버젼  (0) 2013.06.12
6월 3일 usart  (0) 2013.06.11
5월 31일 atmega timer  (0) 2013.06.03
5월 30일 atmega 문자출력  (0) 2013.05.31
5월 29일 LCD결선  (0) 2013.05.29
posted by 송시혁

32개의 REGISTER 단순한 기억 장소(GENERAL PURPOSE MEMORY)

0~31 = 0X0000 0000~0X001F

EXTIENDE I/O 레지스터= 확장된 입출력 레지스터


흰색- 호환, 같은 계열의 다른 칩 종류는 똑같이 동작.


ADRESS

0X3F(기본동작)/0X5F확장모드

EEPROM


EEPROM (Electrically Erasable Programmable Read-Only Memory, E2PROM) 

EEPROM은 전기적으로만 지울 수 있는 PROM으로 칩의 한 핀에 전기적 신호를 가해줌으로써 내부 데이터가 지워지게 되어 있는 롬이다.  하나의 롬 라이터를 사용해서 쓰고 지울 수 있다. 그러나 EEPROM은 전기를 노출시킴으로써 한 번에 1 바이트씩만 지울 수 있기 때문에 플래시 메모리와 비교하면 매우 느리며 다시 기록 횟수에 제한이 있는데 약 10만 번 정도까지만 다시 기록할 수 있다.

EEPROM은 인터페이스에 따라 직렬 버스와 병렬 버스로 나뉜다.

  • 직렬 버스
  • 병렬 버스
    • 보통 8비트 데이터 버스로 칩 셀렉트와 쓰기 방지 핀을 가지고 있다.
    • 단순하고 빠르게 작동되지만 크기가 크고 핀 수(32개 이상)가 많다.

EEPROM은 모뎀이나 비디오 카드메인보드SCSI 컨트롤러 등에서 사용된다. 모뎀의 경우에는 내부에 사용자가 AT명령을 통해서 설정한 상태가 전원을 껐다 켠 후에도 그대로 유지되는데. 이것은 EEPROM에서 그 상태를 저장해 놓기 때문이다. 대부분의 비디오카드, 메인보드, SCSI 컨트롤러 등에서 EEPROM을 사용해 점퍼없이 설정상태를 저장한다.

SRAM 전원이 없어도, 데이터가 없어도 손실이 되지 않는다.


EEAR= LCD기법과 유사

주소를 지정하고 데이터를 쓰는 방식.

FLASH 단점= 1BYTE씩 전송을 하지 못한다.(8bit를 한 꺼번에 보내지 못한다.)


mosi

master out slave in(Rx)


miso


master in slave out(Tx)


sck  클럭신호, 속도가 빠르다.


'임베디드 > 임베디드 이론' 카테고리의 다른 글

5월 29일 AVR 기본 개념.  (0) 2013.06.09
5월 28일 atmega2560 개요  (0) 2013.06.09
posted by 송시혁

CODE= TEXT

DATA=

BSS=


ARM의 경우

MEMORY= ARM 버스선이 연결되어있다. 그러나 실행코드를 들고 올때 메모리에 접근 불가

MEMORY=(CODE,BSS,..........)


그래서 AVR은 2개로 나누어져 있다.



CODE(PROGRAM MEMORY,FLASH 영역)=AVR=(DATA, BSS,STATCK), 당연히 운영체제가 존재하지 않으므로 칩에는 HEAP영역이 없다.(SRAM)

이렇게 양쪽으로 버스선이 연결되어 있는 구조를 하버드 구조라고 한다.

장점= 속도가 빠르다.

   동시에 접근이 가능한다.

   하지만, 잘쓰이지 않는다., 그이유는 납땜을 많이 하므로 가격이 비싸다. 그래서, ARM과 같은 폰 노이만 방식의 BUS를 선호한다.

실행시 DATA또한 FLASH영역으로 올라가지만, 실질적으로 FLASH 영역은 CODE이다.


파이프라인

PDF참고

반복문, 제어문


워치독- 지키고 있다, 시한 리셋 장치

BROWN OUT DETECTER- 감지회로, CPU를 안정화, REST

BROWN OUT = 동작은 하나 완전한 동작은 하지 않는다.


원래 5V전압을 받아야 동작을 하는 어떤것이 있다고 가정한다면, 4.5V에서는 동작이 될수도 있고 안 될수도 있다. 이렇듯 애매한 경계상태를

BROWN OUT이라고 한다.


'임베디드 > 임베디드 이론' 카테고리의 다른 글

5월 30일 ATMEGA 데이터 메모리  (0) 2013.06.09
5월 28일 atmega2560 개요  (0) 2013.06.09
posted by 송시혁

mega= 기능, 다리, series. 128kbte/256kbyte

cygwin -gcc(intel)

#65참고

#68 out format-실행파일 형식

#73

#83 SRG=이곳에 함수를 추가시키면, 된다. EX) 한 칸 띄우고 lcd.c라고 입력 저장.

RISC/CISC->2가지 타입

135개의 명령어

한 클럭에 실행된다.

메모리용 REGISTER GENERAL PURPOSE. 32개 8BIT짜리

MIPS 일반적으로 CPU성능

곱셈기-2CYCLE -MULTIPLER

NON VOLATIEL=전기를 끄다(OFF)

EEPROM= Eraiser Electronic Program Rom 전자적으로 프로그램을 지울 수 있다.

security-보안

86개의 입출력I/O




'임베디드 > 임베디드 이론' 카테고리의 다른 글

5월 30일 ATMEGA 데이터 메모리  (0) 2013.06.09
5월 29일 AVR 기본 개념.  (0) 2013.06.09
posted by 송시혁
2013. 6. 3. 08:26 임베디드/Atmega



TCCRnA레지스터 TCCRnB레지스터

n은 번호 0~5까지 사용가능.


TCCRnA= 타이머 카운트를 0~2까지 동작모드를 설정하고, 비교출력신호의 출력방식 설정.

TCCRnB= 타이머 카운트를 0~2까지 동작모드를 설정하고, 분주비 설정(P419)






TCCR0A의 비트를 보면, WGMn비트가 있다. 이것은 타이머카운트의 동작모드를 설정하는 것.

normal mode= 일반 모드를 사용하기 위해서, WGM2=0, WGM1=0, WGM0=0을 쓴다.

(0<<WGM0)



COM0A비트는 비교출력방식을 설정하는 부분.

병렬 입출력(I/O)포트로 동작시키기 때문에 아래 COM0A1=0,COM0A0=0으로 설정.

밑에 TALBLE74는 PWM모드인 경우 사용한다. 현재 사용하지 않으므로 TABLE73을 사용한다.





CS00비트는 분주비를 설정하는 레지스터, 분주비 계산결과 오차가 가장적은 64를 사용한다.

CS02=0, CS02=1CS02=1 로 설정하면, 64PRESCALER의 분주비를 사용한다.




FOC0A와 FOC0B는 특별한 경우가 아니라면, 0으로 둔다. (강제로 출력단자에 OCnA와 OCnB를 출력비교 매치되도록하는 레지스터). , 인터럽트를 발생하는것도 아니기때문에 사용하지 않는다.



다시 돌아와서 TIMER_INIT 함수를 본다.




TCCR0A와 TCCR0B에는 각비트들의 어떤기능을 하는지 알아보고 설정해야 한다. 



데이트시트P194, 책P174참조

PWM모드가 아닐 경우에 비트를 1로하면, OCNX단자의 강제로 출력비교가 매치된다.

그러나 강제로 만들어진, 출력단자 OCNX단자에 신호만 출력한다. (인터럽트를 발생하지 않는다.)

일반적인 경우 0으로 설정한다.



TIMSK0= 인터럽트 마스크 레지스터

TOIEn비트는  overflow방식으로 인터럽트를 방식이다. 현재 이것을 사용하기 위해서 1로 설정하면, 된다.

OCIE0A, OCIE0B는 각각 비교방식인터럽트, OCIE0A의 1을 넣으면, 타이카운트가 

나머지는 0으로 해준다.



SREG= 책 30페이지를 참고하면, SREG에 관한 설명이 나온다. I(7번비트)는 인터럽트를 전체 허용할 수 있도록 만들어 주는 레지스터. 그래서 해당자리인 7번 비트에 1을 넣어서 인터럽트를 켠다.




다음은 벡터 함수.

ARM에서는 인터럽트를 발생시킬 수 있는 주소를 가지는 특정레지스터가 있고, 사용자가 임의로 이름을 정하여 함수를 만들어 사용이 가능했다.

그러나 ARTMEGA에서는 마찬가지로 인터럽트를 발생시키는 주소를 가지고 있으나, 사용자가 임의로 이름을 정할 수 없다. 즉, 정해진 이름의 함수가 있다. 위의 __VECTOR_23과 아래 보이는 헤더파일의 원형은 우리가 만든것이 아니라, 이 칩을 구성할 때, 정해져 나온것이다.


헤더파일에 VECTOR 23을 주목한다.




어쨌든  VECTOR_23()함수에서 전역변수인 ++UICTIC은 한 번만 초기화 되고 함수가 호출 할 때마다 1씩 증가한다.

그리고 타이머가 이것을 카운트 한다.





지연함수. 전역변수 UICTIC을 0으로 초기화.

이것을 타이머가 카운트한다.

그리고 WHILE문에서 인자인 UIMS보다 커지면, WHILE문을 탈출하여 함수가 종료된다. 그와 동시에 인터럽트가 완료된다.





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

6월 3일 usart  (0) 2013.06.11
5월 30일 lcd에 숫자를 출력하는 함수.  (0) 2013.06.10
5월 30일 atmega 문자출력  (0) 2013.05.31
5월 29일 LCD결선  (0) 2013.05.29
5월 28일 atmega2560 컴파일  (0) 2013.05.28
posted by 송시혁
prev 1 2 3 4 next