AVR 임베디드 학습 7

ATmega328 i2c통신 학습하기(feat.mpu6050)(4탄)

3탄에 이어 mpu6050을 통해 가속도 값을 받아보겠다. acceleration sensor(feat.joop Brokking) 가속도계를 상상할 때 다음과 같은 중력이 없는 큐브 모양에 상자를 상상해 보자! 우주라고 생각해 보면 다음과 같이 중력가속도는 0이므로 X, Y, Z = 0이 될 것이다.( 우리는 중력가속도 값을 9.8m/s^2 = 1g으로 생각해야 한다.)두 번째로 상자를 갑자기 왼쪽으로 움직이면 공은 당연하게도 X-벽에 부딪힌다. 이때 공이 벽에 작용하는 압력을 측정하면 X축에 -1g 값을 출력한다. 여기서 가속도계는 실제로 가속도 벡터와 반대 방향으로 향하는 힘을 감지한다. 즉 관성력을 뜻하는데... 이는 겉보기 힘으로 가속도 벡터값과 반대 방향으로 향하는 힘을 뜻한다.다음으로 튜브를 ..

ATmega328 i2c통신 학습하기(feat.mpu6050)(3탄)

2탄에 이어 이제 mpu6050을 활용하여 who am i를 활성화해 보고 다음 4탄에서는 mpu6050이 갖는 가속도, 각속도, 온도 값도 확인해 보겠다.Who Am I  이 레지스터는 모듈 장치에 정체성을 증명하는 데 사용된다고 한다. 또한 AD0 pin에 의해서 고유주소값이 변경될 수도 있다고 하는데 mpu6050을 두 개 사용할 때 AD0 pin을 통해 0x68 0x69와 같이 주소를 두 개로 할 수 있는듯하다. 일단 초기 value는 0x68이라고 하고 내 모듈도 0x68이다. read only 타입으로 읽기만 가능한 레지스터이다.main.c 다음과 같이 who am i 값을 통해 i2c통신이 제대로 되는지 확인을 위한 변수를 지정했다.(가속도 각속도는 4탄에서 다룰 거임)코드는 정말 간단하다...

ATmega328 i2c통신 학습하기(feat.mpu6050)(2탄)

1탄에 이어 i2c 통신 이론을 데이터시트를 통해 학습해 보고 직접 프로그래밍해 보겠다. 우선 1탄에서 설명하려 했던 twi bus이다 레지스터 학습까지 완료했으니 이거부터 설명하고 넘어가도록 하겠다.START비트를 활성화하여 통신을 시작한다.START신호가 보내지고 통신이 시작되면 자동적으로 TWINT는 set 된다. 통신이 제대로 성공했다면 SLA+W(7bit address + 1bit wirte) 값을 TWDR에 싣는다. SLA+W가 보내지면 ACK신호가 수신 측으로부터 보내져 제대로 통신이 되었는지 확인할 수 있다.통신이 제대로 성공했다면 보내고 싶은 데이터를 TWDR에 싣는다.data가 보내지면 ACK신호가 수신 측으로부터 보내져 통신이 되었는지 확인할 수 있다.STOP비트를 활성화하여 통신을 ..

ATmega328 i2c통신 학습하기(feat.mpu6050)(1탄)

ATmega328을 활용하여 i2c통신을 해보려고 한다. 이후 i2c통신을 활용하여 mpu6050 모듈에 who am i를 통해 통신이 제대로 되는지까지 확인해 보도록 하겠다.I2C통신 인터페이스 신호 i2c통신은 두 개의 신호선(SDA, SCL)을 통해 다수의 I2C통신을 지원하는 모듈들과 데이터를 주고받을 수 있게 하는 통신 방식이다. 신호선이 SDA(data), SCL(clock)으로 2개의 신호선으로 통신을 할 수 있다는 장점이 있다.해석해 보자면 twi는 마이크로컨트롤러에 적합한 통신이다. twi는 128개에 다른 장치와 두 개의 선(SDA, SCL)을 갖고 통신을 할 수 있다. 각각 버스 라인에 풀업 저항을 달아 줘야 한다. 각 모듈은 개인의 고유주소를 갖고 있다. 즉 한마디로 모듈이 갖고 있..

ATmega128 디지털 시계 만들기 (3탄)

ATmega128을 활용한 디지털시계 구현 3탄이다. 1탄에서는 대략적인 설명, 2탄부터 코딩 구현 관련 글을 작성하고 있다! 3탄에서는 2탄 다음으로 코드 작성 관련해서 글 작성해 보겠다. timer.c타이머 0번으로 오버플로 인터럽트로 100us 마다 인터럽트가 발생하게 만들었다. 그리고 PORTA, PORTD에 값을 reset 하여 초기화를 진행했다. 그리고 switch case 문을 활용하여 4 fnd, 2 fnd에 숫자 표현을 했는데 case0~6번까지 번호를 지정하여 각 case마다 fnd부분을 담당하게 만들었다.변수 중 time_stop, flag 가 있는 이는 앞서 1탄에서 설명했듯이 디지털시계에 시간을 변경해야 할 상황이 발생했을 때 시간 변경 모드로 진입을 위한 time_stop, fl..

ATmega128 디지털 시계 만들기 (2탄)

2탄에는 직접 구현한 코드를 설명하고 정리하는 단계로 만들려고 한다. 아직 많이 부족한 부분이 있어 감안하고 보완할 부분 댓글 주시면 너무 감사할듯합니다. 다 올려놓으면 너무 지저분에 보여서.. 전체적인 코드는 깃에 따로 정리하려고 한다.main.ctimer0,2와 timer1번 초기화를 진행했다. 8비트 타이머 0,2와 16비트 타이머 1을 사용한 이유는 필요한 모드나 오버플로 인터럽트 발생 빈도수를 다양하게 하고 싶어서 3개 타이머를 사용했다. 이후 관련해서 한번 더 설명하겠다. DDRB --> 부저를 사용하여 다른 기능을 추가, 필요할 때 동작 구현 하였다.DDRF --> switch로 입력으로 설정하여 스위치 입력값을 받을 수 있도록 하였다.DDRC --> FND에 위치 제어 설정을 위해 출력으로..

ATmega128 디지털 시계 만들기 (1탄)

ATmega128을 활용하여 디지털시계를 구현하려 한다. 1탄을 시작으로 개발 진행을 해보겠다. 임베디드를 배우는 입장에서 작성한 글이니... 틀리거나 부족한 부분 그리고 보완해야 할 것들이 많이 보일 것이다. 보일 때마다 도와주시면 감사하겠습니다!!!! Hardware configuration MCU는 ATmega128을 사용했고 마이크컨트롤러 JMOD-128 모듈을 사용했다.PA0~PA6 -> 4 FND digit control PC0~PC5 -> FND digit positionPD0~PD6 -> 2 FND digit controlPF0~PF5 -> switch controlPAx, PDx pin 은 FND에 숫자를 표현할 수 있는 digit control로 사용하였고 PCx pin은 표현한 숫자의..