AVR을 이용한 C-LCD출력(GDM2004D-NSW-FBW).

.

(http://devicemart.co.kr/goods/view.php?seq=1089561#detail)

한 줄에 최대 20개 문자 표현.


clcd.zip

먼저 코드는 위와 같다. URL을 클릭하여 CLCD 제품을 보면, 분명히 소스코드 공개라고 되어있는데 그렇게 쓸만한 소스를 공개한게 아니고 정말 기초적인 것만 공개했다.

먼저 사용할 핀은 아래 사진과 같다.


위에건 백라이트를 위한 블록다이어그램.







기존의 코드를 내가 주로 쓰는 코드에 맞게 변경하기 위해,

위 URL에 공개된 소스코드의 함수를 아래와 같이 변경했다.

void Control ->             LCD_cmd_write ()

void LCD_init->            void CLCD_init(void)

void Data  ->               void LCD_data_write(char *data)

void LCD_string ->       void LCD_printf(char d_line, char * msg,...)


기본적으로 PORTD 하나만을 가지고 제어하기 때문에 좀 더 간결한 배선으로 이용할 수 있다.


소스코드의 함수를 clcd.c에 변경된 함수에 적용시키면 된다. 직접 참조.


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
#include <string.h>
#include "board.h"
#include "clcd.h"
#include <util/delay.h>
 
int main(void)
{
    unsigned char i;
    
//=====CLCD PORT init====//
    DDRD=0xff;                //1. CLCD PORT 제어를 먼저 해주고
    PORTD=0xff;
//========initial========//
 
    CLCD_init();            //2. CLCD initialize를 해준다.
    LCD_printf(LINE1, "Hello1abcdefghijklmnop");
    LCD_printf(LINE2, "Hello2");
    LCD_printf(LINE3, "Hello3");
    LCD_printf(LINE4, "Hello4");
    
    
    while(1)
    {
    
    }
}











설정

트랙백

댓글

7. MC_E02SM3(ATmega128보드)이용. UART

.

먼저 UART를 하기 위해서는 Teraterm이 필요하다.

1. 테라텀을 검색해서 받고.


2. 아래 asp 파일을 받아서 AVRstudio에서 실행시킨다.

UART.zip






2_UCR0A가 조건으로 0x20(위에서 5번 위치)에서 0x00이면 버퍼가 비어있으니까 



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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include "uart.h"
#include <stdio.h>
#include <stdarg.h>
 
volatile U8 usart_data=0;    //UART Data
extern volatile unsigned char temp_uart1;
 
/********************************************
                초기화
*********************************************/
void USART0_init(void){
    cli();    
    UCSR0A=(1<<UDRE0); //송신데이터를 받을 준비가 된 상태.(항상 1로 set!)
    UCSR0B=(1<<RXCIE0)|(1<<RXEN0)|(1<<TXEN0)|(0<<UCSZ02);    //수신인터럽트활성화.
//->78번줄 함수(ISP)로 이동
//수신.송신부 활성화
    UCSR0C=(1<<UCSZ01)|(1<<UCSZ00);        //전송 데이터길이 8bit 결정.
    UBRR0L=25;        //BaudRate=38400. UBRR=(F(16000000)/(16*BaudRate))-1
    sei();
}
 
void USART1_init(void){
    cli();    
    UCSR1A=(1<<UDRE1);        //송신데이터를 받을 준비가 된 상태.
    UCSR1B=(1<<RXCIE1)|(1<<RXEN1)|(1<<TXEN1)|(0<<UCSZ12);    //수신인터럽트활성화.
//->84번 ISP로 이동
//수신.송신부 활성화
    UCSR1C=(1<<UCSZ11)|(1<<UCSZ10);        //전송 데이터길이 8bit.
    UBRR1L=25;                //BaudRate=38400. UBRR=(F(16000000)/(16*BaudRate))-1
    sei();                                          
}
 
/********************************************
                프로그래밍
*********************************************/
/* USART0로 데이터 보내기. */
void TX0_char(unsigned char data){
    while((UCSR0A & 0x20)==0x00);    //송신버퍼가 비워져서 새로운거 보낼 수 있음.
    UDR0=data;
    sei();                      
}
/* USART1로 데이터 보내기. */
void TX1_char(unsigned char data){
    while((UCSR1A & 0x20)==0x00);    //송신버퍼가 비워져서 새로운거 보낼 수 있음.
    UDR1=data;
    sei();
}
/****************************************************
 
 
 
**************************************************/
/* USART0로 printf 함수 사용하기. */
void TX0_printf(char * msg,...)
{
  volatile    unsigned char UARTStr[30];    //unsigned char 8-bit.
  
  /* vsprintf 쓰기 위한 필수. va_list va_start va_end. */
  va_list ap;
  va_start(ap, msg);
  vsprintf((void*)&UARTStr[0], msg,ap);
  va_end(ap);
 
  /* vsprintf는 UARTStr[i]를 하나씩 보내주고
   밑에 있는 TX0_String()은 UARTStr[]을 받아서 UART로 뿌려준다.*/
  TX0_string((void *)&UARTStr[0]);
}
/* USART0로 문장 보내기. */
void TX0_string(unsigned char *string){
    while(*string != '\0'){
    TX0_char(*string);
    string++;
    }//while End
}
/********************************************
                루틴
*********************************************/
/*        Ehco           */
SIGNAL(SIG_UART0_RECV) {  //인터럽트 서비스루틴의 함수 이름 SIGNAL 
 usart_data=UDR0;
TX0_char(0x0D); //ASCII code \n 역슬레쉬
 TX0_char(0x0A); //ASCII code \r 라인 맨 왼쪽으로 보내기
 //UDR0=usart_data;
}
 
SIGNAL(SIG_UART1_RECV) {
// temp_uart1=UDR1;
// SensorDiv();
}
 





설정

트랙백

댓글

6. MC_E02SM3(ATmega128보드)이용. 인터럽트 LED 테스트2 (타이머인터럽트=내부인터럽트)

.


Colored By Color Scripter

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
 
int index = 0;                        //인터럽트 500번을 세기위한 인덱스
 
ISR(TIMER0_OVF_vect) {       
//TIMER/COUNTER0의 TCNT0이 overflow 났을때 발생하는 인터럽트, TIMSK0의 
                                                     //TOIE0 비트 설정되어야 이 인터럽트 발생함
    if(++index == 500) {             //인터럽트 500번 발생하면 if문 실행.
                 //LED 
            PORTD = 0x00;          //LED on-pull up resister.
            _delay_ms(200);        
                       
            PORTD = 0xFF;      // LED off
           TCNT0 = 6;    //인터럽트 발생시 TCNT0 6으로 재 초기화
           index = 0;    //500번 셋으니까 다시 500번 세기위해 0으로 초기화
        }             
           
     
           
}
 
void init_pin(void) {
    DDRD = 0xFF;           //PortD 출력으로 설정
    PORTD = 0B11111111;  //PortD 에 전압 인가
 
}
 
void init_timer(void) {
    cli();                  //전역 인터럽트 블럭
    TCNT0 = 6;              //TCNT0 6으로 초기화-1000ms로 맞추기 위해.
    TIMSK = (1 << TOIE0);   
    //TIMSK0의 TOIE0비트 1로 설정. 즉 TCNT0 reg 오버플로우시 인터럽트 발생
    TCCR0 = 0x00;           
    //Timer/Counter0 operations mode를 일반모드로 설정 p.91,92(표1.13.3)
    TCCR0 = (1 << CS02);     //prescaler 64 p.94 표(1.13.7)
    sei();                  //전역 인터럽트 허용
}
 
int main(void) {
    init_pin();  //핀설정
    init_timer();//타이머 설정
    while(1);   //기다림
    return 0;
}
 



AVR의 처리속도는 16MHz 이다.


      8, 32, 64, 128, 등등으로 나눌 수 있다. pdf자료 참고.

 -- 1/250000 마다 힛

 

AVR0~255까지 clock을 세면서 255이후를 세면서 overflow 발생. ->인터럽트 발생

 

그럼

 250이냐면 6부터 255까지 count 하니까.

 

그러면 1/1000 -> 1ms 마다 인터럽트가 발생한다.

 

416.6666666666667

 

(프리스케일러값) (카운팅 시작상수(0~255))

/8 -52.08333333333333

/32 -13.02083333333333

/64 -6.510416666666667

/128 -3.255208333333333

/256 -1.627604166666667

/1024 -0.4069010416666667

설정

트랙백

댓글

5. MC_E02SM3(ATmega128보드)이용. 외부 인터럽트 LED 테스트1

.

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
32
33
34
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>  //기본적인 인터럽트 헤더
 
ISR(INT0_vect){ //p.446 벡터네임.
 
   unsigned char i; //인터럽트 서비스루틴에서 사용하는 변수
 
   for(i=0x80; i; i>>=1){
      PORTD = ~i;
      _delay_ms(1000);
   }
 
   PORTD = 0B11111111; //0B로 시작하면 binary. 모든 포트를 on
}  //위 Binary를 16진수로 바꾸면 0xFF 인가?????
 
int main(void)
 
{
   DDRD = 0B11111111; //port D를 wirte(출력)으로 사용
   PORTD = 0B11111111; //all port D on
 
   EIMSK = (1 << INT0); //인터럽트0을 사용한다.
 
   EICRA = (1 << ISC01) | (0 << ISC00); //외부인터럽트 A포트 쓴다.
 
   sei(); //인터넷주소 참조. 글로벌 인터럽트 SREG,7 = I(global intruppt)
 
 
   while(1);
 
   return 1;
}
 



설정

트랙백

댓글

4. MC_E02SM3(ATmega128보드)이용. LED테스트

.

보드 위 4개의 LED 테스트


위 스샷처럼 빨간 네모를 눌러서 빌드를 한다.


그리고 경로를 가보면 default 폴더 안에 .hex 파일이 있다.

그걸 ez다운로더로 넣으면 된다.



설정

트랙백

댓글

3. MC_E02SM3(ATmega128보드)이용. 기본설치(MSVBVM50.dll, EZDownloader for AVR, Silicon Lab)

.

일단. ATmega128로 변경이다. USB를 통해 간단하게 통신을 할 수 있고 싼게 장점.

기본적인 정보는 여기 pdf파일에.


AVR128 자료[1].pdf


그러나 이 보드는 AVR studio로 정보전송이 불가능하다. 따라서 보드 드라이버와 기타 장치들을 빠르게 설치해보자.




1. EZDownloader for AVR 설치

EZDownloaderSetup.exe

설치를 완료하고 실행하여 Actions-Open port에 가면 이렇게 문제가 생긴다.




2. 위 문제의 해결파일은 여기 있다.

MSVBVM50.EXE



3. MC_E02SM3 보드 드라이버 설치

무턱대고 보드USB와 노트북을 연결하면 아무것도 잡지 못한다.

아래 파일을 받아서 설치


1_드라이버.exe


포트 9번에 연결된 것을 확인.


.따라서 이렇게 위처럼 연결이 완료된다. Themes의 윈도우 xp는 그대로 해도 상관없다.



이제부터 AVR studio4로 빌드를하고 Hex 파일을 Ez다운로더로 넣으면 된다.


설정

트랙백

댓글

(1.20) 연구실 자리 셋업 및 AVRISP mkII 문제.

.









일단 제일 중요한건 AVRISP mkII라는 시리얼 포트를 이용해서 ATmega168과 연결하는 것인데 큰 문제가 생겼다.


위 사진처럼 포트가 6개가 아니라 10개이다...
아무리 구글링을 해봐도 포트가 6개인 것만 나오는데 10개는 어떻게 쓰는 것인지...


그나마 찾은 독일 사이트(http://www.mikrocontroller.net/articles/AVR_In_System_Programmer#Atmel_Board-Schnittstelle_.26_AVRISP_MkII)

독일 사이트에서는 핀 구성이 이렇게 나와 있다고 하는데... 나와 수퍼바이저는 고민하다가 새로 6핀 커넥터를 사기로 했다 ~_~;



그 전에 Atmel 회사에서 유저가이드를 만들은 것을 알게 되었는데 유용할 듯.


여기에서 User guide를 찾는다.(http://www.atmel.com/tools/avrispmkii.aspx?tab=documents)

-User guide 주소->(http://www.atmel.no/webdoc/)



(http://www.atmel.no/webdoc/avrispmkii/index.html)-(http://www.atmel.no/webdoc/avrispmkii/avrispmkii.hardware_targetinterface.html)


타겟인터페이스-ISP인터페이스.



지금 가장 큰 문제는 Atmega168칩과 연결을 해서 코딩을 시작해야 되는데 할 수가 없고

그리고 일을 빨리 끝내려면 예제 소스가 많아야 하는데 없다는 것이다.

그리고 시간은 한 달 밖에 남지 않았고 허허... 그거참.

설정

트랙백

댓글

2. AVRstudio4 실행법. with ATmega168

참고자료(http://binworld.kr/5)



1. 설치가 완료되었으면 시작 > Atmel AVR tools > AVR Studio 4를 실행.


2. New Project를 눌러 새로운 프로젝트를 시작.


-1. 프로젝트 타입은 C언어로 코딩할것이므로 AVR GCC를 선택.

-2. 파일 이름을 정한다.

-3. Location 코드가 저장될 폴더를 ... 버튼을 눌러 지정.

저장될 장소에 폴더를 만들어 지정해서 저장해도 되나 이미지 처럼 Location을 문서로 지정해

두고 Create folder를 체크해두면 자동으로 폴더가 생성됩니다.

Next를 눌러 다음으로 진행합니다.


3. AVR 시뮬레이터 설정을 해준다.



시뮬레이션을 할때 필요하며 기본을 다지는데는 중요하지 않습니다.

Debug platform에서 AVR Simulator를 선택하고 Device에서 사용하는 AVR을 선택하고

Finish를 눌러서 새 프로젝트 생성을 완료합니다.



=========================================================================================================


이 밑에 더 있지만 다음은 위 스샷과 같이 Device를 알아야 한다.

아마 내가 이번 연구실에서 쓰게 될 IC chip은 ATmega168인 것 같다.

설정

트랙백

댓글