반응형

https://m.blog.naver.com/PostView.nhn?blogId=ga1267&logNo=220111519302&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F


https://webnautes.tistory.com/991

반응형
반응형

ADC 관련 프로젝트를 하던중, 


ADC값의 노이즈가 검출이 되어, RC 필터를 이용하여 노이즈를 감쇄 시켰다.


RC 필터의 선정은 해당 링크에서 참고.


http://sim.okawa-denshi.jp/en/CRlowkeisan.htm


참고 링크

반응형

'Study > 하드웨어' 카테고리의 다른 글

칩 저항 Size 표  (0) 2019.01.09
led 저항값 계산하기  (0) 2019.01.09
Noise 대책  (0) 2019.01.07
반응형

Sprintf는 stdio.h파일에 선언되어 있다.


sprintf(배열, 서식, 값);

sprintf(배열, 서식, 값1, 값2, ...);

int sprintf(char * const _Buffer, char const * const _Format, ...);

성공하면 만든 문자열의 길이를 반환, 실패하면 음수를 반환


예)

#define _CRT_SECURE_NO_WARNINGS    // sprintf 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>     // sprintf 함수가 선언된 헤더 파일

int main()
{
    char s1[20];    // 크기가 20인 char형 배열을 선언

    sprintf(s1, "Hello, %s", "world!");    // "Hello, %s"로 서식을 지정하여 s1에 저장

    printf("%s\n", s1);    // Hello, world!: 문자열 s1 출력

    return 0;
}



AVR에서 활용한 예


#include <stdio.h>

static unsigned int value[8] ={0};

int main(){


char str[100]; //buff 생성

int value[8];


sprintf(str,"value1 : %u, value2 : %u\r\n",value[0],value[1]); // int 형 value값을 char형 버퍼에 넣는다.

//\r\n : \n만 쓰니 이상한 값이 나옴. 개행문자.확인 필요함.


}

반응형

'Study > C' 카테고리의 다른 글

Sort 정렬 함수  (0) 2019.01.07
itoa, atoi 함수에 대하여  (0) 2019.01.04
C언어 - 자연수의 조합  (0) 2018.09.14
C언어 - 자판기  (0) 2018.09.14
C언어 - 포인터 이해  (0) 2018.09.07
반응형


해당 함수들은 stdio.h에 위치하며,


avr에서도 사용가능하다.


#include <stdio.h>


1. 문자열을 정수형으로 변환 A to I


int atoi (const char* str);



해당 형변환도 있다.


double atof (const char* str);

long atol (const char* str);

long long atoll (const char* str);


atof는 문자열을 배정도형으로 바꿔주는 함수이며, atol은 문자열을 long 형으로 바꿔주고, atoll은 문자열을 long long 형으로 바꿔줍니다.


2. 정수형을 문자열로 변환.


char * itoa(int val, char * buf, int radix);


파라미터 :


변환할 정수

변환받을 문자열을 저장할 문자열 변수

변환할 진수 (10을 입력하면 10진수, 2를 입력하면 2진수)

반환값 : 변환된 문자열의 주소 (2번째 파라미터인 buf의 주소)


기타 : 비표준함수 (마이크로소프트 VS에서만 이용 가능)


char * ltoa (long val, char * buf, int radix);


long 형을 문자열로 바꿔주는 함수입니다.


ftoa 같은 함수는 존재하지 않습니다.


남들도 잘 쓰지 않는 복잡한 함수를 사용하느니, sprintf가 훨씬 간단하고 단순하므로 sprintf를 사용한다.

반응형

'Study > C' 카테고리의 다른 글

Sort 정렬 함수  (0) 2019.01.07
Sprintf에 예제와 사용 예  (0) 2019.01.04
C언어 - 자연수의 조합  (0) 2018.09.14
C언어 - 자판기  (0) 2018.09.14
C언어 - 포인터 이해  (0) 2018.09.07
반응형

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
반응형

/*

flash memory를 사용하여 전원이 On/off시 count


*/




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
#include <stdio.h>
#include "stm32f4xx.h"
#include "lcd.h"
 
uint32_t FLASH_DATA_SECTOR = 0x080E0000// 섹터 11의 시작 메모리 번지
 
int main(void) {
    volatile unsigned short size = *(unsigned short*) (0x1FFF7A22); // Flash Size in KB
 
    volatile int value = ((int*) (FLASH_DATA_SECTOR))[0];
 
    if (value == 0xffffffff// Initial State: 초기화가 필요함.
        value = 0;
 
    value++;
 
    int ret;
 
    FLASH_Unlock();  // 잠금 해제
    FLASH_ClearFlag(
            FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR
                    | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR); //에러 플래그들 초기화함.
    ret = FLASH_EraseSector(FLASH_Sector_11, VoltageRange_3); // 값 저장 전에는 섹터를 초기화해야함.
    ret = FLASH_ProgramWord(FLASH_DATA_SECTOR, value); // 한 바이트씩 저장하는 것은 FLASH_ProgramByte
    FLASH_Lock();  // 잠금
 
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
    lcd_init();
 
    char buf[255];
    sprintf(buf, "%d th boot.", value);
    lcd_printxy(01, buf);
 
    for (;;) {
    }
}
 
cs


반응형

'Study > 32-bit MCUs' 카테고리의 다른 글

[Elevator(ARM)] ADC  (0) 2018.10.25
[Elevator(ARM)] BLE USART  (0) 2018.10.25
[Elevator(ARM)] key Matrix  (0) 2018.10.25
[Elevator(ARM)] DoorLock  (0) 2018.10.25
[Elevator(ARM)] Calculator  (0) 2018.10.25
반응형

// ADC


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
Elevator (ARM)
* ADC 
1. H/W 연결
 - PB0에 가변저항이 연결되어 있음
 /**
  ******************************************************************************
  * @file    main.c
  * @author  Ac6
  * @version V1.0
  * @date    01-December-2013
  * @brief   Default main function.
  ******************************************************************************
*/
 
 
#include "stm32f4xx.h"
#include "stm32f4xx_adc.h"
void ADC_init(){
 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AN;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOB, &GPIO_InitStruct);
 
 
    ADC_InitTypeDef ADC_InitStruct;
    ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;
    ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStruct.ADC_ExternalTrigConv = DISABLE;
    ADC_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
    ADC_InitStruct.ADC_NbrOfConversion =1;
    ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b;
    ADC_InitStruct.ADC_ScanConvMode = DISABLE;
    ADC_Init(ADC1,&ADC_InitStruct);
 
    ADC_Cmd(ADC1, ENABLE);
    ADC_RegularChannelConfig(ADC1, ADC_Channel_8,1,ADC_SampleTime_84Cycles);
}
int ADC_Read(){
    ADC_SoftwareStartConv(ADC1);
    while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));
    return ADC_GetConversionValue(ADC1);
}
int main(void)
{
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
    ADC_init();
    int j = 0;
    while(1){
         j = ADC_Read();
    }
}
 
cs


반응형

'Study > 32-bit MCUs' 카테고리의 다른 글

[Elevator(ARM)] Flash memory  (0) 2018.10.26
[Elevator(ARM)] BLE USART  (0) 2018.10.25
[Elevator(ARM)] key Matrix  (0) 2018.10.25
[Elevator(ARM)] DoorLock  (0) 2018.10.25
[Elevator(ARM)] Calculator  (0) 2018.10.25
반응형

//BLE USART


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
/**
  ******************************************************************************
  * @file    main.c
  * @author  Ac6
  * @version V1.0
  * @date    01-December-2013
  * @brief   Default main function.
  ******************************************************************************
*/
 
#include "stm32f4xx.h"
/* Include my libraries here */
//#include "defines.h"
#include "tm_stm32f4_usart.h"
 
int main(void) {
    uint8_t c;
 
    TM_USART_Init(USART2, TM_USART_PinsPack_1, 9600);
    
    TM_USART_Puts(USART2, "Hello world\n");
    
    while (1) {
 
        /* Get character from internal buffer */
        c = TM_USART_Getc(USART2);
        if (c) {
            /* If anything received, put it back to terminal */
            TM_USART_Putc(USART2, c);
        }
    }
}
 
cs


// BLE USART Scanf

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
/**
  ******************************************************************************
  * @file    main.c
  * @author  Ac6
  * @version V1.0
  * @date    01-December-2013
  * @brief   Default main function.
  ******************************************************************************
*/
 
#include "stm32f4xx.h"
/* Include my libraries here */
//#include "defines.h"
#include "tm_stm32f4_usart.h"
 
char inputbuf[255];
int bufsize = 0;
 
char* ReadUartStr()
{
    int c;
    do {
        c = TM_USART_Getc(USART2);
        if (c) {
            if (c=='\n')
            {
                inputbuf[bufsize] = 0;
                bufsize=0;
                return inputbuf;
            }
            inputbuf[bufsize++= c;
        }
    } while (c);
    return 0;
}
 
int main(void) {
    uint8_t c;
 
    TM_USART_Init(USART2, TM_USART_PinsPack_1, 9600);
    TM_USART_Puts(USART2, "Hello world\n");
 
    int input;
    while (1) {
        char* str = ReadUartStr();
        if(str)
        {
            sscanf(str, "%d"&input);
            if (input == 1)
            {
                TM_USART_Puts(USART2, "hi");
            }
            if (input == 2)
            {
                TM_USART_Puts(USART2, "low");
            }
 
            //TM_USART_Puts(USART2, str);
        }
    }
}
 
 
 
 
cs


반응형

'Study > 32-bit MCUs' 카테고리의 다른 글

[Elevator(ARM)] Flash memory  (0) 2018.10.26
[Elevator(ARM)] ADC  (0) 2018.10.25
[Elevator(ARM)] key Matrix  (0) 2018.10.25
[Elevator(ARM)] DoorLock  (0) 2018.10.25
[Elevator(ARM)] Calculator  (0) 2018.10.25

+ Recent posts