Embedded 10

리눅스 BSP : Raspberry Pi 코드 구현

Raspberry Pi의 상대 경로는 크게 '.' 과 '..' 이렇게 두가지가 있다.'.'는 현재 디렉토리, '..' 는 상위 디렉토리 라고 생각하면 편하다. 현재 디렉토리를 바꾸는 법은 cd 명령어 (change directory)를 활용하면 된다.예를들어 "cd ."을 하면 현재 디렉토리로 변경해주며, pwd는 현재 작업 디렉토리를 보여준다.위 명령어를 실행시키면 아래와 같은 화면이 출력되는 것을 확인할 수 있다. "cd .."을 하면 상위 디렉토리로 변경되는 것을 아래와 같이 확인할 수 있다. 라즈베리파이 내 지니를 사용하여 C언어 코딩을 한 후, 코드 파일 이름을 "Hello"로 임의 설정을 하였다.Hello.c 를 실행시키려면 아래과 같이 터미널에서 실행시켜야한다.터미널에서 "ls -al"명령어..

Language/Linux 2024.06.10

ATmega 128 : 4-Digit FND 동작 구현

이번에는 7 segment가 4개로 구성된 4-Digit FND 동작을 구현해보았다. 부품은 3461AS-1을 사용하였고, 부품에 대한 내용은 아래와 같다.  위 그림을 보아 알 수 있듯이 4-Digit FND는 Common Cathode 방식으로 동작되며 12, 9, 8, 6pin을 Ground에 묶어서 동작을 구현한다. 이전과는 달리, 이번에는 PORT G를 사용하였다. PORT G에는 12, 9, 8, 6번 핀이 연결되어 있으며, 방향설정을 주 목적으로 다룬다. void FND_Display(uint16_t data) // 4자리니까 16비트{ static uint8_t position = 0; // Digit position 변수 설정 uint8_t fndData[]= { 0x3F, 0x06,..

Language/AVR 2024.05.30

ATmega 128 : FND 동작 구현

이번에는 FND (7 Segment)의 동작을 구현해보았다. FND란. Flexible Numeric Display의 약자로 LED의 숫자를 나타내는 부품을 의미한다. 일반적으로 Common Anode와 Common Cathode 방식으로 FND는 구현되는데, 이번에는 Common Cathode 방식으로 다룰 예정이다. Common Cathode는 공통적인 음극(-)를 갖는 구조를 의미한다. 이와 반대인 Common Anode 방식은 공통 양극(+)이라고 생각하면 된다. 이번에 다루게 될 7 segment 소자는 5161AS 소자로, Circuit Diagram은 아래와 같다. 7 segment의 핀번호는 아래와 같다.  DP 제외 A~G까지의 구현을 위해 각각 알맞는 번호의 Pin에 연결을 한 후, 3..

Language/AVR 2024.05.29

ATmega 128 : Led Bar 버튼 인터럽트 동작 구현

이번에는 인터럽트를 사용하여 LED Bar를 제어하는 동작을 구현해보겠다. 인터럽트(Interrupt)란, 외부에서 이벤트가 발생하였을 때 동작하던 프로그램을 잠시 중단하고 해당 이벤트를 동작한 후 다시 프로그램의 동작으로 복귀하는 것을 의미한다. 이벤트가 발생하면 마이크로컨트롤러는 현재 실행 중인 작업을 중단하고 인터럽트 서비스 루틴(Interrupt Service Routine, ISR)이라고 불리는 특정 함수를 실행한다. ATmega128a Datasheet내 인터럽트에 관한 내용은 다음과 같다.  인터럽트가 발생하였을 때 수행하는 동작은 ISR(Interrupt Service Routine) 함수에서 구현된다. 해당 동작을 수행하기 위한 코드는 아래와 같다.#define F_CPU 16000000..

Language/AVR 2024.05.29

ATmega 128 : LED Bar 구조체 동작 구현

이번에는 구조체를 활용하여 LED Bar를 동작시키는 코드를 구현해봤다. 이번에도 포인터 동작때와 같이 헤더파일, 소스파일, 메인파일을 구분하여 진행하였다.  가장 먼저 led 소스파일부터 확인해보겠다. #include "led.h"void ledInit(LED_t *led) //led는 LED 타입{ // 포트에 해당하는 핀을 출력으로 설정함 *(led->port - 1) |= (1 pinNumber); // *(led->port - 1) = *(led->port - 1) | (1 pinNumber); // DDR 레지스터는 PORT레지스터보다 1 낮게 위치하고 있으므로 // *(led->port - 1) 를 이용하여 PORT에서 DDR로 접근한다. (데이터시트 참조) // |= (1 pinNumber..

Language/AVR 2024.05.28

ATmega 128 : LED Bar 포인터 동작 구현

LED Bar를 포인터로 구현하여 진행하였다. 헤더파일, 소스파일, 메인파일로 나누어 진행하였다, 가장 먼저 메인파일의 코드는 다음과 같다.#include "common.h" #include "led.h"int main(void){ ledInit(); uint8_t ledData = 0x01; while (1) { for (uint8_t i = 0; i  메인파일에서 C언어에서 기본 제공해주는 헤더파일을 정리한 "common.h" 헤더파일과, led 동작 구현을 위한 "led.h" 헤더파일을 선언하였다. 다음은 led 동작 구현을 위해 별도로 구현한 led 헤더파일이다.#ifndef LED_H_#define LED_H_#include #define LED_DDR DDRC#define LE..

Language/AVR 2024.05.26

ATmega 128 : LED Bar 배열 동작 구현

이번에는 배열을 사용하여 0번부터 7번까지 순차적으로 점등하는 동작을 구현하였다. 배열 내에는 16진수로 LED를 표현해보았다. 0은 LED OFF, 1은 LED ON을 의미한다.#define F_CPU 16000000UL#include #include uint8_t led_arr[] ={ 0x01, // 0000 0001 0x02, // 0000 0010 0x04, // 0000 0100 0x08, // 0000 1000 0x10, // 0001 0000 0x20, // 0010 0000 0x40, // 0100 0000 0x80 // 1000 0000};int main(void){ DDRC = 0xff; while(1) { for (uint8_t i = 0; i

Language/AVR 2024.05.25

ATmega 128 : LED Bar 중앙에서 밀어내는 동작 구현

| (OR) 연산자를 사용하여 구현을 해봤다.OR 연산자는 하나라도 1의 입력이 있으면, 출력은 1로 되는 논리연산자이다. 0번부터 3번 LED를 순차적으로 점등하고, 7번부터 4번 LED를 순차적으로 점등한다.그 후로는 반대로 작동하여 다시 중앙으로 모이는 동작을 진행한다.#define F_CPU 16000000UL#include #include #define LED_DDR DDRC #define LED_PORT PORTCint main(void){ LED_DDR = 0xff; while(1) { for (uint8_t i = 0; i > i) | (0x10 > i) | (0x01    LED Bar 중앙에서 밀어내기

Language/AVR 2024.05.25

ATmega 128 : LED Bar 순차적 점등하기

이번에는 0번부터 7번까지 왔다 갔다 반복하는 코드를 구현해봤다.  #define 정의 함수를 사용하여 DDR 과 PORT를 묶어 정리한다. uint8_t는 unsigned int 형과 비슷하며 크기는 8bit이다. 즉, 부호없는 8비트 정수를 의미한다.#define F_CPU 16000000UL#include #include #define LED_DDR DDRC // DDRC 포트를 LED_DDR로 정의한다.#define LED_PORT PORTC // PORTC를 LED_PORT로 정의한다.int main(void){ LED_DDR = 0xff; // DDRC 포트를 항상 출력으로 설정. while(1) { for(uint8_t i=0; i 0;..

Language/AVR 2024.05.25

ATmega 128 : LED Bar 점등하기

이번 시간에는 8 LED Bar 전체 출력에 대해서 배웠다. 맨 위에 줄에는 기준 클럭을 정의하여 진행하였다.(클럭이 낮아질수록 빨라진다!) #define F_CPU 16000000UL // 기준 클락 정의#include #include int main(void){ DDRC = 0xff; // C포트 전체를 출력으로 한다. while(1) { PORTC = 0xff; // 8bit 전체를 ON _delay_ms(500); // 0.5초 delay PORTC = 0x00; // 8bit 전체를 OFF _delay_ms(500); // 0.5초 delay }}

Language/AVR 2024.05.25
728x90