검색결과 리스트
LaLaLa에 해당되는 글 46건
- 2020.08.10 윈도우 10 기본 시계 요일 표시(년도-월-날짜-요일)
- 2014.10.15 LED PWM을 통한 밝기 제어. 1
- 2014.05.25 AVR을 이용한 C-LCD출력(GDM2004D-NSW-FBW). 1
- 2014.04.16 8. MC_E02SM3(ATmega128보드)이용. IMU센서(EBIMU-9DOFV2)와 통신하기.(roll, pitch, yaw 분할버전) 4
- 2014.04.15 7. MC_E02SM3(ATmega128보드)이용. UART
- 2014.04.08 6. MC_E02SM3(ATmega128보드)이용. 인터럽트 LED 테스트2 (타이머인터럽트=내부인터럽트)
- 2014.04.08 5. MC_E02SM3(ATmega128보드)이용. 외부 인터럽트 LED 테스트1
- 2014.04.07 6-1. Vmware의 OS를 지우고 재설치, root권한 재설정
글
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를 눌러 종료하면 된다.
작동영상과 사진!
'●프로젝트와 세미나 > Raspberry pi' 카테고리의 다른 글
8-2. PWM 서보모터 DC등을 제어 위해 여러개 핀에 PWM 줘서 제대로 나오는지 확인하기. (0) | 2013.08.23 |
---|---|
10. 시리얼 통신 헤더파일(wiringSerial.h) 분석. 인터럽트처럼 동작할 수 있게 코드변환. (2) | 2013.08.22 |
9. 시리얼통신-라즈베리 통신하기-후에 블루투스로 통신 (1) | 2013.08.19 |
8. PWM 이용한 서보모터 제어. (1) | 2013.08.17 |
7.wiringPi를 이용한 PWM 실험. (2) | 2013.08.17 |
글
AVR을 이용한 C-LCD출력(GDM2004D-NSW-FBW).
.
(http://devicemart.co.kr/goods/view.php?seq=1089561#detail)
한 줄에 최대 20개 문자 표현.
먼저 코드는 위와 같다. 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) { } } |
'●프로젝트와 세미나 > AVR-ATmega128' 카테고리의 다른 글
7. MC_E02SM3(ATmega128보드)이용. UART (0) | 2014.04.15 |
---|---|
6. MC_E02SM3(ATmega128보드)이용. 인터럽트 LED 테스트2 (타이머인터럽트=내부인터럽트) (0) | 2014.04.08 |
5. MC_E02SM3(ATmega128보드)이용. 외부 인터럽트 LED 테스트1 (0) | 2014.04.08 |
4. MC_E02SM3(ATmega128보드)이용. LED테스트 (0) | 2014.04.02 |
3. MC_E02SM3(ATmega128보드)이용. 기본설치(MSVBVM50.dll, EZDownloader for AVR, Silicon Lab) (0) | 2014.04.02 |
글
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에서 실행시킨다.
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(); } |
'●프로젝트와 세미나 > AVR-ATmega128' 카테고리의 다른 글
AVR을 이용한 C-LCD출력(GDM2004D-NSW-FBW). (1) | 2014.05.25 |
---|---|
6. MC_E02SM3(ATmega128보드)이용. 인터럽트 LED 테스트2 (타이머인터럽트=내부인터럽트) (0) | 2014.04.08 |
5. MC_E02SM3(ATmega128보드)이용. 외부 인터럽트 LED 테스트1 (0) | 2014.04.08 |
4. MC_E02SM3(ATmega128보드)이용. LED테스트 (0) | 2014.04.02 |
3. MC_E02SM3(ATmega128보드)이용. 기본설치(MSVBVM50.dll, EZDownloader for AVR, Silicon Lab) (0) | 2014.04.02 |
글
6. MC_E02SM3(ATmega128보드)이용. 인터럽트 LED 테스트2 (타이머인터럽트=내부인터럽트)
.
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 마다 힛
AVR은 0~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
'●프로젝트와 세미나 > AVR-ATmega128' 카테고리의 다른 글
AVR을 이용한 C-LCD출력(GDM2004D-NSW-FBW). (1) | 2014.05.25 |
---|---|
7. MC_E02SM3(ATmega128보드)이용. UART (0) | 2014.04.15 |
5. MC_E02SM3(ATmega128보드)이용. 외부 인터럽트 LED 테스트1 (0) | 2014.04.08 |
4. MC_E02SM3(ATmega128보드)이용. LED테스트 (0) | 2014.04.02 |
3. MC_E02SM3(ATmega128보드)이용. 기본설치(MSVBVM50.dll, EZDownloader for AVR, Silicon Lab) (0) | 2014.04.02 |
글
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; } |
'●프로젝트와 세미나 > AVR-ATmega128' 카테고리의 다른 글
7. MC_E02SM3(ATmega128보드)이용. UART (0) | 2014.04.15 |
---|---|
6. MC_E02SM3(ATmega128보드)이용. 인터럽트 LED 테스트2 (타이머인터럽트=내부인터럽트) (0) | 2014.04.08 |
4. MC_E02SM3(ATmega128보드)이용. LED테스트 (0) | 2014.04.02 |
3. MC_E02SM3(ATmega128보드)이용. 기본설치(MSVBVM50.dll, EZDownloader for AVR, Silicon Lab) (0) | 2014.04.02 |
(1.20) 연구실 자리 셋업 및 AVRISP mkII 문제. (2) | 2014.01.21 |
글
6-1. Vmware의 OS를 지우고 재설치, root권한 재설정
.
Vmware의 우분투 OS를 지우고 재설치 하기로 했다.
간단하다 탭 - 우클릭 - Manage - Delete from disk를 해주면 된다.
이제는 한글 설정까지 해서
(http://experience.so/128) 이대로 재설치... 차근차근 따라가면 잘 된다.
용량도 이렇게 10GB 잡아놓고. 행복하다.
완료
'●프로젝트와 세미나 > 임베디드 LINUX공부' 카테고리의 다른 글
6. 우분투 vmware tools 설치 및 용량부족으로 인한 용량 늘리기. (0) | 2014.04.06 |
---|---|
5. 우분투에 Vim 설치 및 세팅, vi 명령어 (2) | 2014.04.05 |
4. VMware를 이용하여 우분투 설치. root권한 설정 (2) | 2014.04.05 |
3. make file 숙제(recursive, macro사용) 해보기. 각각의 함수를 .h를 이용해 .c 로 저장해보기 (0) | 2014.03.29 |
2. Makefile 만들어보기. (0) | 2014.03.26 |