반응형

스위치를 이용한 입력으로 시리얼 전송

시리얼 문자를 이용한 LED OnOFF

 

1. CUBE MX SET

 

2. Sorce Code

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */
  

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */
HAL_StatusTypeDef RcvStat ;
uint8_t bufftx[10] = "Hello!\n" ;
uint8_t b_in[10] = "b_in\n" ;
uint8_t UsartData[10] ;
uint8_t pin_state ;

HAL_UART_Transmit(&huart2, bufftx, 10, 100) ;
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
RcvStat = HAL_UART_Receive(&huart2, UsartData, 1, 100) ;

if (RcvStat == HAL_OK) {
if (UsartData[0] == 'a') {  // if serial input is 'a', led on
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET) ;
} else if (UsartData[0] == 'b') {  // if serial input is 'a', led off
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET) ;
}

HAL_UART_Transmit(&huart2, UsartData, 1, 100) ;
}

pin_state = HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13) ;

if (!pin_state) {  // if b1 is low, send b_in
HAL_UART_Transmit(&huart2, b_in, 10, 100) ;
}
  }
  /* USER CODE END 3 */
}

 

SWITCH를 누르면 B_IN MSG 송신

시리얼문자 'a' 전송시 LED ON

'b'전송시 LED OFF

반응형

'Project > Nucleo-F103RB' 카테고리의 다른 글

Nucleo-F103RB Serial 통신3  (0) 2019.05.27
Nucleo-F103RB Serial 통신2  (0) 2019.05.21
Nucleo-F103RB Serial 통신1  (0) 2019.05.21
Nucleo-F103RB LED 켜기  (0) 2019.05.21
Nucleo-F103RB 개발환경  (0) 2019.05.21
반응형

1. CUBE MX SET

 

2. GENERATE CODE

 

3. Sorce Code

 

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */
  

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */
HAL_StatusTypeDef RcvStat ;
uint8_t bufftx[10] = "Hello!\n" ;
uint8_t UsartData[10] ;

HAL_UART_Transmit(&huart2, bufftx, 10, 100) ;  // send start data
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
RcvStat = HAL_UART_Receive(&huart2, UsartData, 1, 100) ;  // receive data

if (RcvStat == HAL_OK) {  // receive check
HAL_UART_Transmit(&huart2, UsartData, 1, 100) ;  // send received data
}
  }
  /* USER CODE END 3 */
}

 

코드는 좀더 들여다 봐야 할 것 같다....

 

Interrupt Enable은 왜 했는지?

Serial 확인시 1번만 수신되고, Loopback 기능인 것 같다.

 

 

반응형

'Project > Nucleo-F103RB' 카테고리의 다른 글

Nucleo-F103RB Serial 통신3  (0) 2019.05.27
Nucleo-F103RB Serial 통신2  (0) 2019.05.21
Nucleo-F103RB 시리얼통신 입력으로 제어  (0) 2019.05.21
Nucleo-F103RB LED 켜기  (0) 2019.05.21
Nucleo-F103RB 개발환경  (0) 2019.05.21
반응형

개발환경 CUBE MX + Keil

 

1. 프로젝트 생성 및 RCC 설정

- HSE 외부 크리스탈 사용(이미지 참고)

 

2. PA5 Output 설정

 

3. Code GENERATE 실행

 

4. Source Code 

 

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */
  

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
/*
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
HAL_Delay(1000);

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
HAL_Delay(1000);

*/

// 두 코드 모두 동일 한 기능 수행

 

HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);
HAL_Delay(1000);

HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);
HAL_Delay(1000);
  }
  /* USER CODE END 3 */
}

 

5. F7 빌드 F8 컴파일

 

6. 컴파일 후 적용되지 않아 봤더니 Reset을 한번 해 주어야 함...

- 왜그런지는 잘 모르겠음... 일단 빌드업 부터 동작 확인 완료

 

다음 과제는 UART Serial 통신 구현

반응형

'Project > Nucleo-F103RB' 카테고리의 다른 글

Nucleo-F103RB Serial 통신3  (0) 2019.05.27
Nucleo-F103RB Serial 통신2  (0) 2019.05.21
Nucleo-F103RB 시리얼통신 입력으로 제어  (0) 2019.05.21
Nucleo-F103RB Serial 통신1  (0) 2019.05.21
Nucleo-F103RB 개발환경  (0) 2019.05.21
반응형

CUBE MX + Keil 

HAL 드라이버를 이용한 개발환경 구성

SYS, RCC 클럭 설정 내부클럭, 외부클럭 설정 방법 및 적용 방법

 

1. CUBE MX 새 프로젝트 생성

제품군 선택

 

2. Start Project

 

3. MCU UI와 새로운 프로젝트 생성이 됨.

 

4. 기본적으로 LED를 켜기위해 PA5 Output 설정만으로 LED를 켜고 끌 수 있음.

 

5. 클럭 설정은 PD0, PD1을 RCC_OSC_IN, RCC_OSC_OUT으로 설정한 뒤, 카테고리의 System Core탭 에서 설정이 가능하다.

설정이 되지 않을 경우 해당 핀이 주황색으로 출력이 되는 것을 볼 수 있다.

 

HSE 값을 crystal/ceramic resonator로 설정을 하게 되면 다음과 같이 핀이 녹색으로 정상적으로 적용이 된 것을 볼 수 있다.

 

6. Project Manger탭에 진입하여, 프로젝트 네임과 저장할 경로를 설정한다.

 

7. 나는 Keil V5를 사용할 것이기 때문에 Toolchain/IDE의 선택을 MDK-ARM V5로 선택한다.

자, 이제 설정이 완료되면 우측 상단의 GENERATE CODE버튼을 클릭하면 로딩바가 출력되며 완료시 폴더를 열지 Project를 열지 팝업 창이 출력된다.

 

다음 포스팅에서 LED를 OnOFF 참고.

 

반응형

'Project > Nucleo-F103RB' 카테고리의 다른 글

Nucleo-F103RB Serial 통신3  (0) 2019.05.27
Nucleo-F103RB Serial 통신2  (0) 2019.05.21
Nucleo-F103RB 시리얼통신 입력으로 제어  (0) 2019.05.21
Nucleo-F103RB Serial 통신1  (0) 2019.05.21
Nucleo-F103RB LED 켜기  (0) 2019.05.21
반응형

j-kit-128을 이용하여 전체적인 시스템을 구현중입니다.

현재까지

1.led
2.buzzer(PWM적용 필요)
3.fnd
4.timer
5.switch(Ext interrupt 구현 필요)
6.serial통신

//미구현
7.adc_dimmer
8.cds
9.i2c
10. 추가로 wifi모듈을 달아서 wifi 통신도 해 볼 예정입니다.

미구현 항목들은 기능에 대한 숙지가 부족하여 좀더 공부 할 필요가 있을 것 같습니다.
j-kit-128을 이용하여 복습하고, 해당 키트를 이용하여 공부하시는 분들에게 도움이 되고자? 만들게 되었습니다.

기능 구현 및 개선이 되는대로 업로드 하겠습니다.
저도 부족한 점이 많기에 많은 가르침 부탁드립니다.


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

추가적으로 기능 구현한 내용


1. CDS (adc값 읽기)

2. extSwitch (외부 키 인터럽트)


// 추가 구현 예정

void init_pwmDimmer();//pwm dimmer

void init_i2c();//i2c 온도센서

void init_pwmMotor(); //pwm motor

void init_pwmBuzzer(); //pwm buzzer

void init_INTSerial(); // 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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdio.h>
 
#define FND_NUM0 0x3f
#define FND_NUM1 0x06
#define FND_NUM2 0x5b
#define FND_NUM3 0x4f
#define FND_NUM4 0x66
#define FND_NUM5 0x6d
#define FND_NUM6 0x7d
#define FND_NUM7 0x27
#define FND_NUM8 0x7f
#define FND_NUM9 0x6f
 
#define FND_SEL1 0x01
#define FND_SEL2 0x02
#define FND_SEL3 0x04
#define FND_SEL4 0x08
 
unsigned int fnd[10]= {FND_NUM0,FND_NUM1,FND_NUM2,FND_NUM3,FND_NUM4,FND_NUM5,FND_NUM6,FND_NUM7,FND_NUM8,FND_NUM9};
unsigned int fnd_sel[4= {FND_SEL1,FND_SEL2,FND_SEL3,FND_SEL4};
unsigned int count=0, sec=0;
 
char textBuff[100];
unsigned int extCount=0;
 
void init_led();
void init_buzzer();
void init_fnd();
void init_switch();
void init_timer();
void init_serial();
void init_adc();
void init_extSwitch();
 
/* 미구현
void init_pwmDimmer();//pwm dimmer
void init_i2c();//i2c 온도센서
void init_pwmMotor(); //pwm motor
void init_pwmBuzzer(); //pwm buzzer
void init_INTSerial(); // uart인터럽트
*/
 
void fnd_display(int num);
void SendByte(char data);
void SendLine(char *string);
char ReceiveByte();
uint16_t read_adc(uint8_t channel);
 
void test_led();
void test_buzzer();
void test_fnd();
void test_switch();
void test_serial();
void test_timer();
void test_adc();
void test_extSwitch();
 
int main(void)
{
    init_led();
    init_buzzer();
    init_fnd();
    init_switch();
    init_timer();
    init_serial();
    init_adc();
    init_extSwitch();
    sei();
    while (1)
    {
        //test_led();
        //test_buzzer();
        //test_fnd();
        //test_switch();
        //test_timer();
        //test_serial();
        //test_adc();
        //test_extSwitch();
    }
}
 
void init_led(){
    DDRA = 0xff;
    PORTA = 0x00;
}
void test_led(){
    PORTA = 0x00;
    _delay_ms(1000);
    PORTA = 0xff;
    _delay_ms(1000);
}
void init_buzzer(){
    DDRB = 0x10;
}
void test_buzzer(){
    PORTB = 0x10;
    _delay_ms(10);
    PORTB = 0x10;
    _delay_ms(10);
}
void init_fnd(){
    DDRC = 0xff;
    DDRG = 0x00;
}
void test_fnd(){
    fnd_display(1234);
}
void fnd_display(int num){
    int fnd1,fnd2,fnd3,fnd4;
    fnd1 = num%10;
    fnd2 = (num/10)%10;
    fnd3 = (num/100)%10;
    fnd4 = num/1000;
 
    PORTC = fnd[fnd1];
    PORTG = fnd_sel[0];
    _delay_ms(1);
    PORTC = fnd[fnd2];
    PORTG = fnd_sel[1];
    _delay_ms(1);
    PORTC = fnd[fnd3];
    PORTG = fnd_sel[2];
    _delay_ms(1);
    PORTC = fnd[fnd4];
    PORTG = fnd_sel[3];
    _delay_ms(1);
}
void init_switch(){
    // pull-up
    DDRE = 0x00;
    PORTE = 0x30;
}
void test_switch(){
    init_led();
    if((PINE & 0x20)== 0x00)
    PORTA = 0xff;
    if((PINE & 0x10)== 0x00)
    PORTA = 0x00;
}
void init_timer(){
    TIMSK = 0x01// R/W 선택 TIMER 0 사용
    TCCR0 = 0x04// 분주비 64
    TCNT0 =256-5// 0에서 시작 255가되어 256이 되면 OVF가 되어 인터럽트 구문을 실행한다.
    /*
    Timer set
    1/16000000 = 0.0000000625
    64분주
    0.0000000625* 64 = 0.000004
    0부터 250회 돌면 0.000004 *250 = 0.001
    OVF 발생 count 증가
    1000번 발생하면 1초 가 된다.
    */
}
void test_timer(){
    init_fnd();
    init_serial();
    fnd_display(sec);
    sprintf(textBuff,"%d\r\n",sec);
    SendLine(textBuff);
}
void init_serial(long BaudRate){
    UBRR0H = 0;
    switch(BaudRate)
    {
        case 115200:
        UBRR0L = 8;
        break;
        
        case 57600:
        UBRR0L = 16;
        break;
        
        case 38400:
        UBRR0L = 25;
        break;
        
        case 19200:
        UBRR0L = 51;
        break;
        
        case 14400:
        UBRR0L = 68;
        break;
        
        case 9600:
        UBRR0L = 103;
        break;
        
        // Default 115200
        default:
        UBRR0L = 8;
        break;
    }
    UCSR0A = 0x00;
    UCSR0B = 0x18;
    UCSR0C = 0x06;  // 8 bit
}
void SendByte(char data)
{
    while((UCSR0A & 0x20== 0x00);
    UDR0 = data;
}
/*** Function for sending line ***/
void SendLine(char *string)
{
    while(*string != '\0')
    {
        SendByte(*string);
        string++;
    }
}
 
char ReceiveByte(){
    while(!(UCSR0A & (1<<RXC0)));
    return UDR0;
}
void test_serial(){
    SendByte('A');
    _delay_ms(10);
    SendLine("Hello World");
    
    if((ReceiveByte() == 'a'&& (ReceiveByte() =='b')){
        SendByte('o');
        SendByte('k');
    }
}
void init_adc(){
        ADCSRA |= ((1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)); //16Mhz/128 = 125Khz
        ADMUX |= (1<<REFS0);       //AVCC(5V)
        ADCSRA |= (1<<ADEN);      //ADC 인에이블
}
uint16_t read_adc(uint8_t channel){
    ADMUX &= 0xF0;
    ADMUX |= channel;
    
    ADCSRA |= (1<<ADSC);      //변환 시작
    while(ADCSRA&(1<<ADSC));//변환 완료되기를 기다림.
    
    return ADCW;  //ADC값 반환
}
void test_adc(){
    init_adc();
    init_fnd();
    uint16_t adcValue =0;
    adcValue = read_adc(0);
    sprintf(textBuff,"adcValue : %d\r\n",adcValue);
    SendLine(textBuff);
    fnd_display(adcValue);
    _delay_ms(100);
}
void init_extSwitch(){
    DDRE = 0x00;
    PORTE = 0xf0;
    EICRB =0x0a;
    
    EIMSK = 0x30// INT4, INT5 사용
}
void test_extSwitch(){
    init_fnd();
    fnd_display(extCount);
}
 
ISR(INT4_vect){
    extCount++;
}
ISR(INT5_vect){
    extCount--;
}
ISR(TIMER0_OVF_vect){
    TCNT0 =256-(256-5);
    count++;
    if (count >=1000){
        sec++; count=0;
    }
}
cs



jkit_190122.zip


반응형

'Project > j-kit-128-1실습' 카테고리의 다른 글

[j-kit-128] jkit 128 기능구현하기  (0) 2018.12.10
Sonar_GPS - C#Window Form  (0) 2018.10.21
Sonar_GPS  (0) 2018.10.11
Serial 통신_ 문자열 전송  (0) 2018.10.01
Serial 통신_Uart0_문자 1개  (0) 2018.10.01
반응형

1. MCU(Atmega128A)  VCC를 3.3v로 배선하여 내부 클럭 8Mhz로 사용가능함.

 - VCC수정하여 16Mhz 수정개선 필요


2. ISP  헤더 Drill size 미스매치 작아서 안들어감.


3. ISP 다운로더 pin map miss match 


4. CP2102 RX, TX 반대로 그림.


5. BGA type 손땜 불가능


6. Silk data 누락된 곳 IC


7. TEST LED 추가하면 좋을 것 같음.


8. BLE / wifi 추가 기능


9. 배터리 (충방전 회로) 기능 추가


10. 활용 방안 모색


반응형

'Project > Sensor Board' 카테고리의 다른 글

Sensor_Board AVR Source Code ver.1  (0) 2018.12.03
Project - Sensor Board  (0) 2018.10.01
반응형

j-kit-128을 이용하여 전체적인 시스템을 구현중입니다.

현재까지

1.led
2.buzzer(PWM적용 필요)
3.fnd
4.timer
5.switch(Ext interrupt 구현 필요)
6.serial통신

//미구현
7.adc_dimmer
8.cds
9.i2c
10. 추가로 wifi모듈을 달아서 wifi 통신도 해 볼 예정입니다.

미구현 항목들은 기능에 대한 숙지가 부족하여 좀더 공부 할 필요가 있을 것 같습니다.
j-kit-128을 이용하여 복습하고, 해당 키트를 이용하여 공부하시는 분들에게 도움이 되고자? 만들게 되었습니다.

기능 구현 및 개선이 되는대로 업로드 하겠습니다.
저도 부족한 점이 많기에 많은 가르침 부탁드립니다.

- datasheet 및 회로도 참고 자료 : http://www.devicemart.co.kr/1059759

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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>
#include <avr/interrupt.h>
 
#define FND_NUM0 0x3f
#define FND_NUM1 0x06
#define FND_NUM2 0x5b
#define FND_NUM3 0x4f
#define FND_NUM4 0x66
#define FND_NUM5 0x6d
#define FND_NUM6 0x7d
#define FND_NUM7 0x27
#define FND_NUM8 0x7f
#define FND_NUM9 0x6f
 
#define FND_SEL1 0x01
#define FND_SEL2 0x02
#define FND_SEL3 0x04
#define FND_SEL4 0x08
 
unsigned int fnd[10]= {FND_NUM0,FND_NUM1,FND_NUM2,FND_NUM3,FND_NUM4,FND_NUM5,FND_NUM6,FND_NUM7,FND_NUM8,FND_NUM9};
unsigned int fnd_sel[4= {FND_SEL1,FND_SEL2,FND_SEL3,FND_SEL4};
unsigned int count=0, sec=0;
 
void init_led();
void init_buzzer();
void init_fnd();
void init_switch();
void init_timer();
void init_serial();
 
/* 미구현
void init_adc();
void init_cds();
void init_i2c();
*/
 
void fnd_display(int num);
void SendByte(char data);
void SendLine(char *string);
char ReceiveByte();
 
void test_led();
void test_buzzer();
void test_fnd();
void test_switch();
void test_serial();
void test_timer();
 
int main(void)
{
    init_led();
    init_buzzer();
    init_fnd();
    init_switch();
    init_timer();
    init_serial();
    sei();
    while (1)
    {
        //test_led();
        //test_buzzer();
        //test_fnd();
        //test_switch();
        //test_timer();
        //test_serial();
        
    }
}
 
void init_led(){
    DDRA = 0xff;
    PORTA = 0x00;
}
void test_led(){
    PORTA = 0x00;
    _delay_ms(1000);
    PORTA = 0xff;
    _delay_ms(1000);
}
void init_buzzer(){
    // PWM 제어 필요
    DDRB = 0x10;
}
void test_buzzer(){
    PORTB = 0x10;
    _delay_ms(10);
    PORTB = 0x10;
    _delay_ms(10);
}
void init_fnd(){
    DDRC = 0xff;
    DDRG = 0x00;
}
void test_fnd(){
    fnd_display(1234);
}
void fnd_display(int num){
    int fnd1,fnd2,fnd3,fnd4;
    fnd1 = num%10;
    fnd2 = (num/10)%10;
    fnd3 = (num/100)%10;
    fnd4 = num/1000;
 
    PORTC = fnd[fnd1];
    PORTG = fnd_sel[0];
    _delay_ms(1);
    PORTC = fnd[fnd2];
    PORTG = fnd_sel[1];
    _delay_ms(1);
    PORTC = fnd[fnd3];
    PORTG = fnd_sel[2];
    _delay_ms(1);
    PORTC = fnd[fnd4];
    PORTG = fnd_sel[3];
    _delay_ms(1);
}
void init_switch(){
    // pull-up
    DDRE = 0x00;
    PORTE = 0x30;
}
void test_switch(){
    init_led();
    if((PINE & 0x20)== 0x00)
    PORTA = 0xff;
    if((PINE & 0x10)== 0x00)
    PORTA = 0x00;
}
void init_timer(){
    TIMSK = 0x01// R/W 선택 TIMER 0 사용
    TCCR0 = 0x04// 분주비 64
    TCNT0 =256-5// 0에서 시작 255가되어 256이 되면 OVF가 되어 인터럽트 구문을 실행한다.
    /*
    Timer set
    1/16000000 = 0.0000000625
    64분주
    0.0000000625* 64 = 0.000004
    0부터 250회 돌면 0.000004 *250 = 0.001
    OVF 발생 count 증가
    1000번 발생하면 1초 가 된다.
    */
}
void test_timer(){
    init_fnd();
    fnd_display(sec);
}
void init_serial(long BaudRate){
    UBRR0H = 0;
    switch(BaudRate)
    {
        case 115200:
        UBRR0L = 8;
        break;
        
        case 57600:
        UBRR0L = 16;
        break;
        
        case 38400:
        UBRR0L = 25;
        break;
        
        case 19200:
        UBRR0L = 51;
        break;
        
        case 14400:
        UBRR0L = 68;
        break;
        
        case 9600:
        UBRR0L = 103;
        break;
        
        // Default 115200
        default:
        UBRR0L = 8;
        break;
    }
    UCSR0A = 0x00;
    UCSR0B = 0x18;
    UCSR0C = 0x06;  // 8 bit
}
 
void SendByte(char data)
{
    while((UCSR0A & 0x20== 0x00);
    UDR0 = data;
}
 
/*** Function for sending line ***/
void SendLine(char *string)
{
    while(*string != '\0')
    {
        SendByte(*string);
        string++;
    }
}
 
char ReceiveByte(){
    while(!(UCSR0A & (1<<RXC0)));
    return UDR0;
}
 
void test_serial(){
    SendByte('A');
    _delay_ms(10);
    SendLine("Hello World");
    
    if((ReceiveByte() == 'a'&& (ReceiveByte() =='b')){
        SendByte('o');
        SendByte('k');
    }
}
 
ISR(TIMER0_OVF_vect){
    TCNT0 =256-(256-5);
    count++;
    if (count >=1000){
        sec++; count=0;
    }
}
 
cs


반응형

'Project > j-kit-128-1실습' 카테고리의 다른 글

jkit-128-1 추가 기능 구현  (0) 2019.01.22
Sonar_GPS - C#Window Form  (0) 2018.10.21
Sonar_GPS  (0) 2018.10.11
Serial 통신_ 문자열 전송  (0) 2018.10.01
Serial 통신_Uart0_문자 1개  (0) 2018.10.01
반응형

기능 구현 및 현재 진행 상황


1. buzzer ok

2. serial ok

3. timer ok


*참고

\n \t \b \r \0 등등

\t : 탭키

\b : 백스페이스바

\r : 처음으로 커서를 옮김


* 출력 타입

%d : 10진수 정수형

%f : 실수형

%e : 지수형

%o : 8진수

%x : 16진수

%u : 부호없는 10진수

%g : 실수형 자동출력

%p : 포인터의 주소

%c : 하나의 문자

%s : 문자열


4. I2C

usart 규격정리


- BME280 온습도 센서 

- MAX44009 조도 센서 

- BMI160 자이로 센서 


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
#include <avr/io.h>
#define F_CPU 8000000UL
#define SCL_freq 200000 //TWBR = 16, TWPS = 0
// SCL_freq = F_CPU / (16+2*TWBR*4^TWPS) 
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdio.h>
 
#define I2C_SCL PD0
#define I2C_SDA PD1
 
unsigned int TimerCount =0,sec = 0,min =0;
char buff[100];
 
void init_Buzzer();
void init_Serial();
void init_I2C();
void init_Timer();
 
void test_buzzer();
void test_Serial(int mode);
 
unsigned char USART0_TX();
void USART0_RX(unsigned char data);
void USART0_RX_str(unsigned char *str);
 
int main(void)
{
    init_Buzzer();
    init_I2C();
    init_Serial(115200);
    init_timer();
    sprintf(buff,"Hello\r\n");    
    USART0_RX_str(buff);
    //test_buzzer();
    
    sei();
    
    while (1
    {
        
    }
}
void init_Buzzer(){
    DDRB |= 0x10// PB4
    PORTB &= ~(0x10);
}
void init_Serial(long bautrate){
    UBRR0H = 0;
    switch(bautrate){
        case 115200:
        UBRR0L = 3;
        break;
        
        case 57600:
        UBRR0L = 8;
        break;
    }
    UCSR0A = 0x00;
    UCSR0B = 0x18;
    UCSR0C = 0x06;
}
void test_serial(int mode){
    switch(mode){
        case 0:
        USART0_RX('A');
        break;
        
        case 1:
        if(USART0_TX() == 'h'){
            USART0_RX('B');
        }
        break;
    }
}
void init_I2C(){
    DDRD |= (1 << I2C_SCL);
    DDRD |= (1 << I2C_SDA);
    
    TWBR = 16;
}
void test_buzzer(){
    PORTB = 0x10;
    _delay_ms(10);
    PORTB = ~0x10;
    _delay_ms(10);
}
unsigned char USART0_TX(){
    while(!(UCSR0A & (1<<RXC0)));
    return UDR0;
}
void USART0_RX(unsigned char data){
    while(!(UCSR0A & 0x20));
    UDR0 = data;
}
void USART0_RX_str(unsigned char *str){
    while(*str != '\0'){
        USART0_RX(*str);
        str++;
    }
}
 
void init_timer(){
    TCCR0 = 0x04;
    TIMSK = 0x01;
    TCNT0 = 256-125;    
/*
1/8000000 = 0.000000125
64분주 0.000008
0.000008 *125 = 0.001
TCNT0 = 256-125;
*/
}
 
ISR(TIMER0_OVF_vect){
    TCNT0=256-(256-125);
    TimerCount++;
    if(TimerCount>=1000){
        TimerCount=0;
        sec++;
        /* test_timer
        sprintf(buff, "min : %u, sec : %u \r\n", min,sec);
        USART0_RX_str(buff);
        */
        if(sec>=60){
            min++; sec=0;
            if(min>=60) min=0;
        }
    }
}
cs


반응형

'Project > Sensor Board' 카테고리의 다른 글

[Sensor Board] 개선해야 할 점  (0) 2018.12.10
Project - Sensor Board  (0) 2018.10.01
반응형

// Avr에서 전달 받은 데이터를 이용하여 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
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;
 
 
namespace SonarGPS
{
    public partial class Form1 : Form
    {
        
        int pointX = 0, pointY = 0, pointSizeX = 20, pointSizeY = 20;
        int boardSize_XY = 340;
        int line1_XY = 0, line2_XY = 0, line3_XY = 0;
 
        private SerialPort SerialPort = new SerialPort();  //시리얼 포트 생성
 
        public Form1()
        {          
            InitializeComponent();
            SerialPort.PortName = "COM3";
            SerialPort.BaudRate = 115200;
            SerialPort.DtrEnable = true;
            SerialPort.Open();
 
        }
 
        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            
            int Sensor1_x = 0, Sensor1_y = 0, Sensor_sizeX = 20, Sensor_sizeY = 20;
            int Sensor2_x = 0, Sensor2_y = boardSize_XY - Sensor_sizeY;
            int Sensor3_x = boardSize_XY - Sensor_sizeX, Sensor3_y = boardSize_XY - Sensor_sizeY;
 
            // Sensor png 출력
            Image Sensor1 = Bitmap.FromFile("C:\\Sensor.png");
            e.Graphics.DrawImage(Sensor1, Sensor1_x, Sensor1_y, Sensor_sizeX, Sensor_sizeY);
 
            Image Sensor2 = Bitmap.FromFile("C:\\Sensor.png");
            e.Graphics.DrawImage(Sensor2, Sensor2_x, Sensor2_y, Sensor_sizeX, Sensor_sizeY);
 
            Image Sensor3 = Bitmap.FromFile("C:\\Sensor.png");
            e.Graphics.DrawImage(Sensor3, Sensor3_x, Sensor3_y, Sensor_sizeX, Sensor_sizeY);
 
 
            // x,y좌표로 각 센서에서 해당 좌표까지 선 그리기 
            Pen pen1 = new Pen(Color.FromArgb(255000));
            e.Graphics.DrawLine(pen1, 2020, line1_XY, line1_XY);
 
            Pen pen2 = new Pen(Color.FromArgb(255000));
            e.Graphics.DrawLine(pen2, 20, boardSize_XY - 20, line2_XY, boardSize_XY - line2_XY);
 
            Pen pen3 = new Pen(Color.FromArgb(255000));
            e.Graphics.DrawLine(pen3, boardSize_XY - 20, boardSize_XY - 20, boardSize_XY - line3_XY, boardSize_XY - line3_XY);
 
            // draw point
            SolidBrush Point = new SolidBrush(Color.FromArgb(255000));
            e.Graphics.FillEllipse(Point, pointX - pointSizeX / 2, pointY - pointSizeY / 2, pointSizeX, pointSizeY);
 
            // draw angle
            Pen angle1 = new Pen(Color.FromArgb(255000));
            e.Graphics.DrawLine(angle1, line1_XY, line1_XY, line2_XY, boardSize_XY - line2_XY);
            Pen angle2 = new Pen(Color.FromArgb(255000));
            e.Graphics.DrawLine(angle2, line2_XY, boardSize_XY - line2_XY, boardSize_XY - line3_XY, boardSize_XY - line3_XY);
            Pen angle3 = new Pen(Color.FromArgb(255000));
            e.Graphics.DrawLine(angle3, boardSize_XY - line3_XY, boardSize_XY - line3_XY, line1_XY, line1_XY);
 
        }
        
        private void timer1_Tick(object sender, EventArgs e)
        {
 
            // 문자열 잘라서 Sensor 값 출력
            string str = SerialPort.ReadLine();
            string[] sensor = str.Split(',');
 
            // senser data strint to double
            double Intsensor1 = Convert.ToDouble(sensor[0]);
            double Intsensor2 = Convert.ToDouble(sensor[1]);
            double Intsensor3 = Convert.ToDouble(sensor[2]);
 
            // Sensor data limit 0 ~ 150
            if ((Intsensor1 &gt; 150&amp; (Intsensor1 &lt; 10000)) { sensor[0= "150"; Intsensor1 = 150; }
            else if (Intsensor1 &gt;= 10000) { sensor[0= "0"; Intsensor1 = 0; }
            if ((Intsensor2 &gt; 150&amp; (Intsensor2 &lt; 10000)) { sensor[1= "150"; Intsensor2 = 150; }
            else if (Intsensor2 &gt;= 10000) { sensor[1= "0"; Intsensor2 = 0; }
            if ((Intsensor3 &gt; 150&amp; (Intsensor3 &lt; 10000)) { sensor[2= "150"; Intsensor3 = 150; }
            else if (Intsensor3 &gt;= 10000) { sensor[2= "0"; Intsensor3 = 0; }
 
            // testbox sensor 값 출력
 
            textBox13.Text = sensor[0];
            textBox14.Text = sensor[1];
            textBox15.Text = sensor[2];
 
            // sensor값으로 x,y좌표 구하기
            // int data = Convert.ToInt32((boardSize_XY / 2 + 10) / 1.4142135623731); //max 150일 때의 좌표
            line1_XY = Convert.ToInt32(Intsensor1 + 20 / 1.4142135623731);
 
            if (line1_XY &lt;= 7)
            {
                line1_XY = (Convert.ToInt32(Intsensor1) + 20);
            }
 
            line2_XY = Convert.ToInt32(Intsensor2 + 20 / 1.4142135623731);
            if (line2_XY &lt;= 7)
            {
                line2_XY = Convert.ToInt32(Intsensor2);
            }
 
            line3_XY = Convert.ToInt32(Intsensor3 + 20 / 1.4142135623731);
            if (line3_XY &lt;= 7)
            {
                line3_XY = Convert.ToInt32(Intsensor3);
            }
            // Point x,y 좌표 data
            textBox1.Text = Convert.ToString((pointX - pointSizeX) + 2);
            textBox2.Text = Convert.ToString(300 - ((pointY - pointSizeY) - 2));
 
            // Point 좌표
            pointX = (line1_XY + line2_XY + (boardSize_XY - line3_XY)) / 3;
            pointY = (line1_XY + (boardSize_XY - line2_XY) + (boardSize_XY - line3_XY)) / 3;
            pictureBox1.Invalidate(); // 화면 갱신
            
        }
    }
}
 
cs



Sonar_GPS.zip


반응형

'Project > j-kit-128-1실습' 카테고리의 다른 글

jkit-128-1 추가 기능 구현  (0) 2019.01.22
[j-kit-128] jkit 128 기능구현하기  (0) 2018.12.10
Sonar_GPS  (0) 2018.10.11
Serial 통신_ 문자열 전송  (0) 2018.10.01
Serial 통신_Uart0_문자 1개  (0) 2018.10.01
반응형

J-kit, 초음파센서 SR04 3개를 이용한 GPS 센서


센서에서 전방을 향해 초음파를 발사,

물체에 부딪혀 반사되는 초음파가 돌아오는 시간의 길이를 계산,

ECHO 핀에서 시간의 길이에 비례하는 펄스를 출력한다.


// MCU에서 해 줄 작업은,

10us길이의 TRIGGER 파형을 센서로 출력하고,

그 결과 센서에서 출력되는 ECHO 파형을 감지해 이를 거리로 계산하는 것이다.



if(EICRB==3){    // 라이징엣지에서 인터럽트가 걸리면

        start=TCNT1; // TCNT1값을 저장해두고

        EICRB=2;     // 다음번 인터럽트는 폴링엣지로 설정

    }

    else{            // 폴링엣지에서 인터럽트가 걸리면

        end=TCNT1;   // TCNT1값을 저장해두고

        EICRB=3;     // 다음번 인터럽트는 라이징엣지로 설정

        dist= (int)( (float)(end-start) / 14.5 ); // 58us / 4us = 14.5, cm로 변환

    }



    uS / 58 = centimeters or uS / 148 =inch


    왕복거리이기 때문에 1/2하여 29uS당 1cm


//



Sonar_GPS.zip


// ControlSet.h

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
#ifndef _CONTROL_SET_
#define _CONTROL_SET_
 
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
 
#define TEMPERATURE    25    
 
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |=  _BV(bit))
 
/*** Send start signal to ultrasonic sensor(NT-TS601) ***/    
// number = quantity
void SendSignal_0()
{        
    // Step 1. send signal during 10us
    sbi(PORTD,1);    
    _delay_us(10);            
    cbi(PORTD,1);
}
void SendSignal_1(){
    sbi(PORTD,3);
    _delay_us(10);
    cbi(PORTD,3);
}
void SendSignal_2(){
    sbi(PORTE,7);
    _delay_us(10);
    cbi(PORTE,7);
}
 
#endif
 
cs


//RegSet.h

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
#ifndef _REGISTER_SET_
#define _REGISTER_SET_
 
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
 
/*** Port Setting ***/    
// Quantity of Sonar Sensors : 6
// INT0 ~ INT6    
void PortInit()
{    
    DDRD = 0b00001010// PD0 ~ PD3
    PORTD = 0b00000000;
    DDRE = 0b10000000;
    PORTE = 0b00000000;
}
 
/*** Timer Register Setting ***/    
// 1 cycle(20us) = 1/(16M/(2*8*(19+1))    
void TimerInit()
{        
    TCCR0 = (1<<WGM01)|(1<<CS01); // CTC mode, clk/8
    OCR0 = 58// 58번째 비교 매치 인터럽트 발생
    TCNT0 = 0// 0부터 시작
    TIMSK = (1<<OCIE0); // compare match enable
    TIFR = 0x00// flag 초기화
    //29uS
}
 
/*** External Interrupt Setting ***/
// Refer to the following comments.
void ExtInit()
{    
    EICRA = 0b00110011;    // INT0 ~ INT3 -> Rising Edge Default
    EICRB = 0b00110000// INT4 ~ INT7 -> Rising Edge Default
    EIMSK = 0b01000101// INT0 ~ INT5 -> INT0, INT2, INT4 enable
    EIFR = 0xff;
}
 
#endif
 
/*** 
 
 �� Reference 1 : External Interrupt Control Register (EICR) A, B
 BIT   : [   7   |   6   |   5   |   4   |   3   |   2   |   1   |   0   ]
 EICRA : [ ISC31 | ISC30 | ISC21 | ISC20 | ISC11 | ISC10 | ISC01 | ISC00 ]
 BIT   : [   7   |   6   |   5   |   4   |   3   |   2   |   1   |   0   ]
 EICRB : [ ISC71 | ISC70 | ISC61 | ISC60 | ISC51 | ISC50 | ISC41 | ISC40 ]
 
 �� Reference 2 : Interrupt Sense Control (A)
 [ISCn1 | ISCn0 | Description                                                            ]
    0   |   0   | The low level of INTn generates an Interrupt request.  
    0   |   1   | Reserved
    1   |   0   | The falling edge of INTn generates asynchronously an interrupt request.
    1   |   1   | The rising edge of INTn generates asynchronously an interrupt request.
 �� Reference 3 : Interrupt Sense Control (B)
 [ISCn1 | ISCn0 | Description                                                            ]
    0   |   0   | The low level of INTn generates an Interrupt request.  
    0   |   1   | Any logical change on INTn generates an interrupt request.
    1   |   0   | The falling edge of INTn generates asynchronously an interrupt request.
    1   |   1   | The rising edge of INTn generates asynchronously an interrupt request.
 ***/
 
cs



//SerialSet.h

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
#ifndef _SERIAL_COMMUNICATION_SET_
#define _SERIAL_COMMUNICATION_SET_
 
#include <avr/io.h>
 
/*** Serial Port Setting ***/    
// USART0 (PE0 - RXD, PE1 - TXD)
void SerialOpen(long BaudRate)
{
    UBRR0H = 0;
    switch(BaudRate)
    {        
        case 115200:            
            UBRR0L = 8;            
            break;
 
        case 57600:                
            UBRR0L = 16;
            break;
 
        case 38400:            
            UBRR0L = 25;
            break;
 
        case 19200:            
            UBRR0L = 51;
            break;
 
        case 14400:            
            UBRR0L = 68;
            break;
 
        case 9600:            
            UBRR0L = 103;
            break;
 
        // Default 57600
        default:
            UBRR0L = 16;
            break;
    }
    UCSR0A = 0x00;
    UCSR0B = 0x18;
    UCSR0C = 0x06;  // 8 bit
}
 
/*** Function for sending 1 byte ***/    
void SendByte(char data)
{
    while((UCSR0A & 0x20== 0x00);
    UDR0 = data;
}
 
/*** Function for sending line ***/
void SendLine(char *string)
{
    while(*string != '\0')
    {
        SendByte(*string);
        string++;
    }
}
 
#endif
 
cs



// main

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
#define F_CPU 16000000
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdio.h>
 
#include "RegSet.h"
#include "SerialSet.h"
#include "ControlSet.h"
 
unsigned int tick_0 = 0;
unsigned int pulse_end_0 = 0;
unsigned int tick_1 = 0;
unsigned int pulse_end_1 = 0;
unsigned int tick_2 = 0;
unsigned int pulse_end_2 = 0;
 
/*** Timer Interrupt ***/
ISR (TIMER0_COMP_vect)
{
    tick_0++;
    tick_1++;
    tick_2++;
}
 
/*** External Interrupt (INT0) ***/
ISR(INT0_vect)
{
    unsigned int pulse_tick = 0;
    pulse_tick = tick_0;
 
    if ((EICRA & 0b00000011== 0b00000011)
    {
        cbi(EICRA,0);
        tick_0 = 0;
    }
    else
    {
        sbi(EICRA,0);
        pulse_end_0 = pulse_tick;
    }        
}
ISR(INT2_vect){
    unsigned int pulse_tick = 0;
    pulse_tick = tick_1;
    if ((EICRA & 0b00110000== 0b00110000)
    {
        
        cbi(EICRA,4);
        tick_1 = 0;
    }
    else
    {
        sbi(EICRA,4);
        pulse_end_1 = pulse_tick;
    }
}
ISR(INT6_vect){
    unsigned int pulse_tick = 0;
    pulse_tick = tick_2;
    if ((EICRB & 0b00110000== 0b00110000)
    {
        cbi(EICRB,4);
        tick_2 = 0;
    }
    else
    {
        sbi(EICRB,4);
        pulse_end_2 = pulse_tick;
    }
}
 
int main(void)
{
    PortInit();
    TimerInit();
    ExtInit();
 
    SerialOpen(115200);
 
    _delay_us(20);    // for System Stability.    
    int pulse0 =0;
    int pulse1 =0;
    int pulse2 =0;
    sei();    
    while(1)
    {
        SendSignal_0();
        for (int i =0; i<10;i++){
        pulse0 += pulse_end_0;
        }
        pulse0/=10// 10회 평균값
        pulse0 -=8// calibration
        _delay_ms(10);
        SendSignal_1();
        for (int i =0; i<10;i++){
            pulse1 += pulse_end_1;
        }
        pulse1/=10// 10회 평균값
        _delay_ms(10);
        SendSignal_2();
        for (int i=0;i<10;i++){
            pulse2 += pulse_end_2;
        }
        pulse2/=10// 10회 평균값
        pulse2 -=6// calibration
        char str[20];
        sprintf(str,"%u,%u,%u\r\n",pulse0,pulse1,pulse2);
        SendLine(str);
        
 
        _delay_ms(50);
    }
}
 
 
cs


반응형

'Project > j-kit-128-1실습' 카테고리의 다른 글

[j-kit-128] jkit 128 기능구현하기  (0) 2018.12.10
Sonar_GPS - C#Window Form  (0) 2018.10.21
Serial 통신_ 문자열 전송  (0) 2018.10.01
Serial 통신_Uart0_문자 1개  (0) 2018.10.01
FND_Display with Timer/Counter  (0) 2018.10.01

+ Recent posts