윈도우 10 기본 시계 요일 표시(년도-월-날짜-요일)

 

이렇게 날짜로 표시되게 바꿀 수 있음

 

 

 

설정

트랙백

댓글

LED PWM을 통한 밝기 제어.

.

http://cafe.naver.com/openrt/6336 참고


우선 라즈베리파이의 핀 배치는 아래와 같다. 우리는 이번 실험에서6번과 12번 핀을 사용!!




위 참고 사이트를 기반으로 입력을 받으면 밝기가 변하는 프로그램을 만들기가 오늘의 목표.


1. 코드는 아래와 같다.


2. 그리고 gcc -o pwm LED_pwm_test1.c -lwiringPi -lpthread 를 입력한 뒤 

새로 생성된 파일을 보면 아래와 같다.

pwm 이라는 초록색 글씨의 실행파일이 컴파일된 후 만들어진 것을 확인할 수 있다.


3. 이제 실행을 해보자! sudo ./pwm 입력!


0~11 까지 입력하면 LED가 점점 밝아진다.

그리고 Ctrl+C를 눌러 종료하면 된다.


작동영상과 사진!







설정

트랙백

댓글

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)
    {
    
    }
}











설정

트랙백

댓글

8. MC_E02SM3(ATmega128보드)이용. IMU센서(EBIMU-9DOFV2)와 통신하기.(roll, pitch, yaw 분할버전)

.


내가 쓰고있 MC_E02SM3는 위와 같은 외부 핀 회로도를 갖는다. 여기서 TXD1을 센서의 RX에

RXD1을 센서의 TX에 교차하여 연결한다.





float로 선언된 숫자들은 uart통해서 확인 못함



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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
struct GYRO{
   float r;   //roll
   float p;   //pitch
   float y;   //yaw
   char r_a[10];   //roll값 하나하나 배열에 저장
   char p_a[10];
   char y_a[10];
} gyro;
 
unsigned char data1[100];
 
unsigned char temp_uart1;
 
SIGNAL(SIG_UART1_RECV)      //데이터가 오면 인터럽트가 일어남
{
   temp_uart1=UDR1;            //rx, 차례대로 각각의 자리에 글자를 받아옴
   gyro_sensor();
}   
 
 
void USART0_Transmit_Str(unsigned char data[])
{
   size_t i=0, len=strlen(data);
 
   
   for(i=0;i<len;i++)
   {
     /* Wait for empty transmit buffer */
      while ( !( UCSR0A & (1<<UDRE)) )   ;
 
      /* Put data into buffer, sends the data */
      UDR0 = data[i];  //tx, data 전송
   }
}
 
 
void gyro_sensor()
{
   if(temp_uart1=='*')   // * 나올때
   {
      i++;
      j=0;
   }
   else if(temp_uart1==',')   // , 나올때
   {
      i++;
      j=0;
   }
   else if(temp_uart1==10)   // 엔터 나올때 모두 출력
   {
      //모터 1,3은 pitch, 2,4는 roll      
    //각각의 값에 -48을 해야하는 이유?  -> ASCII 이기 때문
      if(gyro.r_a[0]=='-')   //-roll condition
      {
         if(gyro.r_a[2]=='.')      //-x.xx
            gyro.r = -1 * ( gyro.r_a[1]-48 + (gyro.r_a[3]-48)*0.1 + (gyro.r_a[4]-48)*0.01 );            
         else if(gyro.r_a[3]=='.')   //-xx.xx
            gyro.r = -1 * ( (gyro.r_a[1]-48)*10 + (gyro.r_a[2]-48) + (gyro.r_a[4]-48)*0.1 + (gyro.r_a[5]-48)*0.01 );
         else if(gyro.r_a[4]=='.')   //-xxx.xx
            gyro.r = -1 * ( (gyro.r_a[1]-48)*100 + (gyro.r_a[2]-48)*10 + (gyro.r_a[3]-48) + (gyro.r_a[5]-48)*0.1 + (gyro.r_a[6]-48)*0.01 );
      }
      else if(gyro.r_a[0]!='-')   //+roll condition
      {
         if(gyro.r_a[1]=='.')      //x.xx
            gyro.r = ( (gyro.r_a[0]-48) + (gyro.r_a[2]-48)*0.1 + (gyro.r_a[3]-48)*0.01 );            
         else if(gyro.r_a[2]=='.')   //xx.xx
            gyro.r = ( (gyro.r_a[0]-48)*10 + (gyro.r_a[1]-48) + (gyro.r_a[3]-48)*0.1 + (gyro.r_a[4]-48)*0.01 );
         else if(gyro.r_a[3]=='.')   //xxx.xx
            gyro.r = ( (gyro.r_a[0]-48)*100 + (gyro.r_a[1]-48)*10 + (gyro.r_a[2]-48) + (gyro.r_a[4]-48)*0.1 + (gyro.r_a[5]-48)*0.01 );
      }
 
      if(gyro.p_a[0]=='-')  //-pitch condition
      {
         if(gyro.p_a[2]=='.')
            gyro.p = -1 * ( gyro.p_a[1]-48 + (gyro.p_a[3]-48)*0.1 + (gyro.p_a[4]-48)*0.01 );            
         else if(gyro.p_a[3]=='.')
            gyro.p = -1 * ( (gyro.p_a[1]-48)*10 + (gyro.p_a[2]-48) + (gyro.p_a[4]-48)*0.1 + (gyro.p_a[5]-48)*0.01 );
         else if(gyro.p_a[4]=='.')
            gyro.p = -1 * ( (gyro.p_a[1]-48)*100 + (gyro.p_a[2]-48)*10 + (gyro.p_a[3]-48) + (gyro.p_a[5]-48)*0.1 + (gyro.p_a[6]-48)*0.01 );
      }
      else if(gyro.p_a[0]!='-'//+pitch condition
      {
         if(gyro.p_a[1]=='.')
            gyro.p = ( (gyro.p_a[0]-48) + (gyro.p_a[2]-48)*0.1 + (gyro.p_a[3]-48)*0.01 );            
         else if(gyro.p_a[2]=='.')
            gyro.p = ( (gyro.p_a[0]-48)*10 + (gyro.p_a[1]-48) + (gyro.p_a[3]-48)*0.1 + (gyro.p_a[4]-48)*0.01 );
         else if(gyro.p_a[3]=='.')
            gyro.p = ( (gyro.p_a[0]-48)*100 + (gyro.p_a[1]-48)*10 + (gyro.p_a[2]-48) + (gyro.p_a[4]-48)*0.1 + (gyro.p_a[5]-48)*0.01 );
      }
 
      if(gyro.y_a[0]=='-')  //-yaw condition
      {
         if(gyro.y_a[2]=='.')
            gyro.y = -1 * ( gyro.y_a[1]-48 + (gyro.y_a[3]-48)*0.1 + (gyro.y_a[4]-48)*0.01 );            
         else if(gyro.y_a[3]=='.')
            gyro.y = -1 * ( (gyro.y_a[1]-48)*10 + (gyro.y_a[2]-48) + (gyro.y_a[4]-48)*0.1 + (gyro.y_a[5]-48)*0.01 );
         else if(gyro.y_a[4]=='.')
            gyro.y = -1 * ( (gyro.y_a[1]-48)*100 + (gyro.y_a[2]-48)*10 + (gyro.y_a[3]-48) + (gyro.y_a[5]-48)*0.1 + (gyro.y_a[6]-48)*0.01 );
      }
      else if(gyro.y_a[0]!='-')  //+yaw condition
      {
         if(gyro.y_a[1]=='.')
            gyro.y = ( (gyro.y_a[0]-48) + (gyro.y_a[2]-48)*0.1 + (gyro.y_a[3]-48)*0.01 );            
         else if(gyro.y_a[2]=='.')
            gyro.y = ( (gyro.y_a[0]-48)*10 + (gyro.y_a[1]-48) + (gyro.y_a[3]-48)*0.1 + (gyro.y_a[4]-48)*0.01 );
         else if(gyro.y_a[3]=='.')
            gyro.y = ( (gyro.y_a[0]-48)*100 + (gyro.y_a[1]-48)*10 + (gyro.y_a[2]-48) + (gyro.y_a[4]-48)*0.1 + (gyro.y_a[5]-48)*0.01 );
      }
 
 
      sprintf(data1,"roll=%s, pitch=%s, yaw=%s\n\r",gyro.r_a, gyro.p_a, gyro.y_a);
      USART0_Transmit_Str(data1);
 
 
      
/*      if(gyro.p<0 & gyro.p>-0.5)
      {
      sprintf(data1," 0>pitch>-0.5 \n\r");
      USART0_Transmit_Str(data1);
      }
      else if(gyro.p>0)
      {
      sprintf(data1," 0<pitch \n\r");
      USART0_Transmit_Str(data1);
      }
*/
      i=0;
      j=0;
   }
   else if(i==1)
   {
      gyro.r_a[j]=temp_uart1;
      j++;
   }
   else if(i==2)
   {
      gyro.p_a[j]=temp_uart1;
      j++;
   }
   else if(i==3)
   {
      gyro.y_a[j]=temp_uart1;
      j++;
   }
}


'●프로젝트와 세미나 > IMU센서 마우스(Atmega128)' 카테고리의 다른 글

센서분석  (0) 2014.03.19

설정

트랙백

댓글

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;
}
 



설정

트랙백

댓글

6-1. Vmware의 OS를 지우고 재설치, root권한 재설정

.

Vmware의 우분투 OS를 지우고 재설치 하기로 했다.

간단하다 탭 - 우클릭 - Manage - Delete from disk를 해주면 된다.


이제는 한글 설정까지 해서

(http://experience.so/128) 이대로 재설치... 차근차근 따라가면 잘 된다.

용량도 이렇게 10GB 잡아놓고. 행복하다.





완료




설정

트랙백

댓글