블로그 이미지
송시혁

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. 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 송시혁
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 송시혁
2013. 5. 31. 08:24 임베디드/Atmega







그림을 보면 PORTD,DDRD를 사용해야 한다는 것을 알 수 있다.그림에서 LCD_RS, RW, EN을 확장보드판에 각각 50,49,48번에 연결하였다.
그러나 정의 할 때는 #define LCD_RS 50이라고 정의하면 안된다. 50번은 핀이 50번째 있다는 의미이지,
50을 정의 한다해서 저 핀을 쓸수 있는게 아니다. 




PORTD에 관한 정보이다. 50, 49,48번에 해당하는 핀은 PORTD7,6,5에 1번을 집어넣고 나머지는 0으로 만들어야 된다.

1110 0000을 만들기 위해서는 헤더파일에 다음과 같이 정의한다.



#define LCD_RS (1<<7) 
#define LCD_RW (1<<6)
#define LCD_EN (1<<5)
각각의 쉬프트연산을 하여 7,6,5 번에 1을 넣은뒤, 아래와 같이 |시킨다.

DDRD= (LCD_RS)|(LCD_RW)|(LCD_EN);



아래그림을 보면,  bus선은 53~60에 연결하였다. 그래서 DDRC, PORTC를 사용한다.








LCD 타이밍도 , 아트메가도 마찬가지로 LCD를 사용하기 위해서는 타이밍도를 참조하고 소스를 구성해야 한다.




LCD_EN부분을 비활성화 0으로 만들어 준다. 
LCD_EN이 헤더 파일에 (1<<5)로 정의 되어 있다. 즉, 0001 0000이다.
PORTD =1111 1111이라고 가정한다면,
LCD_EN=0001 0000 에서 5번비트만, 0으로 만들고, 나머지를 1로 만들고 특정 비트만을 바꾸기 위해서는 
먼저 바꾸고자 하는것을 ~(not)연산자를 사용하여 반전시킨 다음에 &시키면,
특정한 위치에 0으로 바꿀 수 있다.

1111 1111
1110 1111-> 반전시킨 것.

결과= 1110 1111이 된다.

PORTD=PORTD|LCD_EN;

PORTD와 LCD_EN을 |시켜서 5번째 자리에 1을 넣어 활성화 시킨다.

데이터를 실제로 쓰는 부분이라고 생각한다.
두번째 지연문이 끝난 다음, 함수의 인자인 ucdata를 PORTC에 넣는다.
기존의 ARM과는 달리, BUS선을 따로 초기화 시킬 필요가 없다.(//PIO_CODR = LCD_BS;)
그 이유는 PORTC자체가 BUS선이므로, 바로 ucdata를 넣으면 된다.


PORTC=ucdata;




PORTD=  PORTD&(~LCD_EN)기법이 사용되었다.

data를 모두 읽었기 때문에 활성화는 low가 된다.
마찬가지로 특정한 자리에 0으로 만들기 위해서

PORTD&(~LCD_EN)기법이 사용되었다.







DATA_WRITE 함수는 위에 빨간네모 말고는 다를 게 없다. 저 부분이 다른 이유는 ARM에서도 이미 다루었듯이

데이터를 입력받기 위해서는 RS가 HIGH가 되어야 하므로, PORTD에 LCD_EN에 해당비트를 1로 맟추어야 한다.

PORTD= PORTD|LCD_EN; 그래서 '|'시키면, 해당비트에 1이 되어 RS는 HIGH값이 되어 데이터를 입력받는다.








마찬가지로 VOID *형 인자로 받는다. main()함수에서 lcd_string()함수 호출시

입력받고자 하는문자를 "000"를 인자로 받는다.

그러면, 반복문이 실행하고 종료조건으로 if문을 써서 0이 되며, 반복문이 종료된다.

한 문자씩 lcd_data_write에 인자로 입력받고 출력된다. 


vp=(unsigned char *)vp+1;은 가르키고 있는 문자에 +1을 하여 다음문자를 vp에 

넣게 된다. 예를 들어서 "test"에서 't'가 실행되고 난뒤, 't'다음에 있는 'e'를 출력한다.







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

6월 3일 usart  (0) 2013.06.11
5월 30일 lcd에 숫자를 출력하는 함수.  (0) 2013.06.10
5월 31일 atmega timer  (0) 2013.06.03
5월 29일 LCD결선  (0) 2013.05.29
5월 28일 atmega2560 컴파일  (0) 2013.05.28
posted by 송시혁
2013. 5. 29. 17:14 임베디드/Atmega

LCD스펙을 참고하면서 ATMEGA를 BOARD에 장착한다.



pc0~pc7까지 bus선 연결, LCD 스펙 10~13페이지를 참고하여 핀을 연결한다.

참고로 위의 VCC와 GND가 서로 잘못 표시되어 있다.

VCC는 62, GND는 61번!!!!이다.

그렇기 때문에 핀을 결선할 때 반대로 결선해야 한다.




LCD RS = 50번 

LCD RW=49번

LCD EN= 48번

연결한다. 



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

6월 3일 usart  (0) 2013.06.11
5월 30일 lcd에 숫자를 출력하는 함수.  (0) 2013.06.10
5월 31일 atmega timer  (0) 2013.06.03
5월 30일 atmega 문자출력  (0) 2013.05.31
5월 28일 atmega2560 컴파일  (0) 2013.05.28
posted by 송시혁
2013. 5. 28. 17:05 임베디드/Atmega







icc avr




code visionavr




avr studio 컴파일








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

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