반응형

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

AVR

io레지스터

DDRA = 0b1111 1111; //출력설정

PORTA = 0b1111 1111; // 포트를 출력한다.

DDRA = 0b0000 0000; // 입력설정

PORTA = 0b11111111; // Software pull-up

//

if(PINA == 0b0111 1111) // PIN 레지스터는 Read-Only 읽기만 가능.

{

PORTA = 0b0000 0000; // PORT 레지스터읽기 쓰기 둘다 가능하다.

}

 

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
/*
 * avr_test.cpp
 *
 * Created: 2018-09-03 오전 10:56:46
 * Author : USER
 */ 
#include <avr/io.h>
#define F_CPU 16000000
#include <util/delay.h>
 
#define LED_SEL1 (*(volatile unsigned char *)0xA000)
#define LED_SEL2 (*(volatile unsigned char *)0xB000)
#define FND (*(volatile unsigned char *)0x8000)
 
 
void io_init(void)
{
    MCUCR|=(1<<SRE) | (1<<SRW10);
    XMCRA=(1<<SRL2) | (0<<SRL1) | (0<<SRL0) | (1<<SRW01) | (1<<SRW00) | (1<<SRW11);
    XMCRB |= 0x00;
}
 
void fndController (char loc , char number){
    FND = (number <<3)|loc;
}
void fndDisplay (unsigned long long number){
    fndController(5,number%10);_delay_ms(1);
    fndController(4,(number%100)/10);_delay_ms(1);
    fndController(3,(number%1000)/100);_delay_ms(1);
    fndController(2,(number%10000)/1000);_delay_ms(1);
    fndController(1,(number%100000)/10000);_delay_ms(1);
    fndController(0,number/100000);_delay_ms(1);
    
}
int main(void)
{
    io_init();
    DDRE = 0x00;
    PORTE = 0xff;
    //int count =0;
    
    bool state = false;
    int randnum =0, dispnum =0;
    while (1)
    {
        
        /* //눌렀을 때 증가하는 소스
        if (PINE == 0b11101111 && state ==false){ count ++;state =true;}
        else if (PINE ==0b11111111&& state==true){ state =false;}
        fndDisplay(count);
        */
        // 0~100 사이의 랜덤수 출력하는 소스
        randnum++;
        if (randnum>100) randnum=0;
        if (PINE == 0b11101111 && state ==false){  dispnum= randnum;state =true;}
        else if (PINE ==0b11111111&& state==true){ state =false;}
        fndDisplay(dispnum);
        
    }
}
 
cs

 

 

반응형
반응형

 

// 소스 코드 :

 

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
#include <avr/io.h>
#include <util/delay.h>
#define F_CPU 16000000UL
#include <avr/interrupt.h>
 
#define OFF 0
#define ON 1
volatile unsigned char digit_c[10= {0x000x270x090x030x260x120x100x060x000x02}; // 0 ~ 10
volatile unsigned char digit_b[10= {0x040x04, ~0x04, ~0x04, ~0x04, ~0x04, ~0x040x04, ~0x04, ~0x04}; // 0 ~ 10
volatile unsigned char fnd_sel[4= {0x100x200x400x80}; // fnd_sel c1, c2, c3, c4
 
volatile unsigned int msec, sec,min,hour = 0// time
volatile unsigned int play = ON; // play ON/OFF
 
 
 
int main(){
 
 
 DDRB = 0x04;
 DDRC = 0xff;
 DDRD = 0xf0;
 
 
 while(1){
  
  if ((PIND & 0x01== 0x00){ 
  play = ON; continue;}
  if ((PIND & 0x02== 0x00){
  play = OFF; continue;}
    
  if(play == ON){
  
  msec++
  if(msec>40){msec=0; sec++;}
  if(sec>59){sec=0; min++;}
  if(min>59){min=0; hour++;}
  if(hour>23){hour=0;}
 
  PORTC = digit_c[hour/10]; PORTB = digit_b[hour/10]; PORTD = fnd_sel[3];_delay_ms(3);
  PORTC = digit_c[hour%10]; PORTB = digit_b[hour%10]; PORTD = fnd_sel[2];_delay_ms(3);
  PORTC = digit_c[min/10]; PORTB = digit_b[min/10]; PORTD = fnd_sel[1];_delay_ms(3);
  PORTC = digit_c[min%10]; PORTB = digit_b[min%10]; PORTD = fnd_sel[0];_delay_ms(3);
  }
 
  if(play == OFF){
 
  cli();
  GICR = 0xc0;
  MCUCR = 0x0a;
  GIFR = 0x00;
  sei();
  
  PORTC = digit_c[hour/10]; PORTB = digit_b[hour/10]; PORTD = fnd_sel[3]; _delay_ms(3);
  PORTC = digit_c[hour%10]; PORTB = digit_b[hour%10]; PORTD = fnd_sel[2]; _delay_ms(3);
  PORTC = digit_c[min/10]; PORTB = digit_b[min/10]; PORTD = fnd_sel[1]; _delay_ms(3);
  PORTC = digit_c[min%10]; PORTB = digit_b[min%10]; PORTD = fnd_sel[0]; _delay_ms(3);
 
  }
 }
 
}
 
ISR(INT0_vect){
 if(min <= 59){
 min++;
 }
 if(min >59){
 min = 0; hour++;
 }
}
ISR(INT1_vect){
 if(hour <= 23){hour++;
 }
 if(hour >23){
 hour =0;
 }
}
 
 
/*
SW 1,2,3,4,
SW 1: Play Mode
SW 2: STOP Setting Mode
SW 3: Hour ++;
SW 4: Min ++;
 
스위치 4개로 시간을 설정/재생 할 수 있다.
 
시간측정을해보니 약 5~10초정도 오차가 있다. 몇달 몇년으로 따지면 엄청난 오차.
 
차후엔 ds3231 rtc모듈을 이용하여 만들어 볼 예정.
*/
 

// 그전에 Timer/Counter로 먼저 만들어 봐야 할 것 같다. 

 
cs

 

 

http://cafe.naver.com/carroty/291041

 

반응형

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

[NPAVR Board] AVR -Atmega128 (FND, Switch)  (0) 2018.09.03
[NPAVR Board] AVR -Atmega128 (FND)  (0) 2018.09.03
B/T LED 부품 선정 및 견적서  (1) 2017.04.10
B/T LED Control circuit  (0) 2017.04.10
led 제어 현재 상황  (0) 2016.02.26

+ Recent posts