728x90

리눅스 터미널 공부


ls // 디렉토리 및 파일목록출력

ls -a // 숨겨진 파일까지 보여줌 

 

ls -l  //자세한 정보를 보여줌

ls -al // 자세한 정보 및 숨겨진 파일까지 보여줌

 




. bash / rc      // Run Script

.             // 숨겨진 파일

 

환경변수들이 들어있는 파일이라 숨김 ( .)

세팅후에는 다시 로긴해야 함

 



ls aliases 를 통해 별칭을 설정할 수 있다.

 




 

 

 

vi 는 저장하면 .swp파일을 지우고 저장한다.

.swp파일은 일종의 자동 세이브

그러나 강제종료하게 되면 파일이 지워지지 않고 남는다.

 

 


 




touch 명령어

존재하지 않으면 파일을 만들고

존재하면 날짜를 최근으로 바꿔준다.

 

 

리눅스는 printf문에 \n을 넣어줘야 출력이 된다.

 

 

gcc -o main main.c // 컴파일시 main파일로 출력

./main     //main파일 실행

 

될수있으면,소스파일 창은 닫지않고 컴파일 창은 따로 둠

 

:w main2.c // main2.c로 저장

:w // w main2.c를 했어도 main.c로 저장된다

 



set 환경변수

set | grep path

 

env

윈도우,도스는 일단 현재 디렉토리에서 찾고 없으면 path에서 찾는다. ( .|main이 아닌 main만 쳐줘도 됨)

유닉스는 현재 디렉토리에 패스가 있어야 한다.  어디에 있는 파일을 실행할지 명확하게 정해줘야 한다. (./main) 

 


return 0;

0 - 에러하나없이 종료했다는 걸 뜻함(리눅스)

 


 

 

 

 


 

     cp / copy

mv / move


 

리눅스에서 현재디렉토리의 파일 실행시 ./ 를 붙여줘야 함 


rm // remove 


728x90


프로그래밍 공부 과정

C → win32 API  →  C++  → MFC구조와 원리  →  MFC Application Programming

 

한빛

win32 API 정복

상 - 1~9챕터

 

 

오렌지미디어 열혈 C++

한빛 뇌를 자극하는 C++

 

한빛 Unix/Linux 필수 유틸리티

 

 

 

 

비쥬얼 스튜디오 실습

break 포인트를 지정해놓아야 디버그모드를 쓸 때 변수값이 어떻게 변하는지 알기 쉽다.

 

프로시져 단위 실행  (printf와 같은 함수 내부로 들어갈 수 있다)

전체한번에 수행 (f10)

 

ctrl+f5       디버그 하지않고 시작

shift+f5     디버그 모드 나가기

 

 

 

 

 

위와 같이 선택해서 프로젝트 파일 생성


옵션에서 줄 번호가 나오도록 수정 

 


디버그(프로그램상의 오류. 즉, 버그를 바로 잡는 것)를 할 때

f9 혹은 빨간 동그라미가 보이는 곳에 마우스 클릭을 해서 중단점을 설정할 수 있다. 


num값이 5가 되면 while문을 탈출하게 되는데, 중단점을 설정하게 되면 특정위치까지만 디버깅을 할 수 있게 된다.

  

 

아래 부분에 조사식에 num<5를 넣어 값과 참,거짓 여부를 알 수 있다. 



프로시저 단위실행을 했을 때, printf 함수내로 진입한 모습이다. 나가려면 프로시져 나가기를 누른다.


한단계식 코드 실행을 했을 때, 노란색 화살표로 진행지점과 도스창을 통한 출력여부를 확인가능하다. 


지역탭에서 위와 같이 각각의 값을 확인가능하다. result는 쓰레기값임을 알 수 있다. 


위의 소스에서도 조사식을 통해 값과 참, 거짓 여부를 디버깅하면서 볼 수 있다. 


 num1, num2가 더해지고 result 값에 5가 넣어진 걸 볼 수 있다.


printf 함수를 통해 도스창에도 위와 같이 사칙연산의 결과값이 나오고 값이 반환된다. (return 0;)

728x90

라즈베리파이 명령어

 

sudo su - // su 계정으로 변경

 

Ctrl + Alt + "F1~F6"     // 가상콘솔 (마우스 안됨)

Ctrl + Alt + F7          // X-Window 


 

 

원격 네트워크를 위한 설정

wlan0 선택 후, Automatically configure empty options 항목은 체크해제

위의 그림과 같이 설정한다.

 

 

ssh 설정


ssh : 원격으로 다른 컴퓨터에 접속해서 커맨드 라인 명령을 보내서 작업하는걸 도와주는 프로토콜이다. 

즉, Telnet과 같은 기능을 보안성을 높여서 하는 프로토콜

 

sudo halt // sudo 계정으로 시스템 종료 명령어

 

 

네트워크 설정이 끝났으면, 이제 윈도우에서 putty를 통한 원격 접속이 가능해진다.

 

계정명 pi / 비밀번호 입력후 엔터

접속되면 로그인 시각과 계정명을 볼 수 있다.



 

 

편의를 위한 설정

 

계정의 홈 디렉토리 내 .bashrc 파일의

#주석이 붙은 부분을 아래와 같이 수정 및 삽입



 

.vimrc 파일 수정후 위의 명령어들이 visual editor에 계속 적용된다.




비쥬얼 에디터로 main.c 소스 작성


:q!  // vi 강제종료

:wq // 저장후 종료 

 


프리웨어 컴파일러 gcc


(GNU is Not Unix) 프로젝트의 프리웨어(freeware) 컴파일러. 

본래 C 언어용 컴파일러로 시작하였으므로 GNU C Compiler의 약자였으나 후에 여러 언어를 지원하면서 GNU Compiler Collection으로 개명했다.


cc --version이라고 명령어를 쳐도 버전을 확인할 수 있다. //  C Compiler 버전




gcc main main.c 는 main.c를 main이란 파일로 컴파일하라는 명령어이다.


--save-temps -  옵션

// 컴파일 과정에서 생성되는 중간 파일인 전처리 파일(test.i), 과 어셈블리 파일(test.s)을 지우지 않고 현재 디렉토리에 저장된다.


-o 옵션

// 컴파일 과정에서 생성되는 Binary파일(*.o)이 추출된다.









 

TightVNC Viewer로 원격접속하기

1. 최신 패키지 확인
apt-get update

 

2. VNC 서버(tightvncserver) 설치

apt-get install tightvncserver

 

3. VNC 서버 실행(암호 두번 입력, 짧으면 튕김)
vncserver

 

4. 서버 실행 확인(포트 5901, 6001)
netstat -tulpn

 

5. 컴퓨터에 VNC 다운로드 후 설치
http://www.tightvnc.com/download.php


6. 컴퓨터에서 VNC 뷰어실행
IP주소::5901 입력 후 3번의 비번 입력


6-1 android-vnc-viewer 로 안드로이드 폰에서도 접속 가능



위는 윈도우에서 TightVNC Viewer로 라즈베리 파이에 원격접속한 화면이다. 

 

 

 

라즈베리 파이 SD카드를 이미지 파일로 백업하기

 


드라이브 명 잘 확인하고 디렉토리 선택후 Read를 누르면 백업 된다.





 

 


read가 끝나면 백업된 파일을 확인할 수 있다.




인터넷의 역사

unix -  AT&T  벨

BSD : 버클리

 

알파넷(국방성,버클리,AT&T 개발) -> 인터넷으로 발전

 

protocol : 컴퓨터 상호간 혹은 컴퓨터와 단말간에서 통신을 할 때에 필요한 통신규약

TCP/IP 에서 P가 protocol을 말함.



C언어 보강

num10

 

A=++num; // 전치연산의 값은 A 11  num 11

A=num++;  //  후치연산의 값은 A10  num 11

 

c++에서 전자를 쓰는게 속도향상에 도움이 됨 


 

헷갈릴때 둥근 괄호로 싸면 우선순위가 제일 높아 알기 쉽다.

 

 

auto 자동변수 (프로그램 종료하면 사라짐)

 

(auto) int A; // auto가 사실은 생략된 형태이다.



cl /P        // 전처리 파일 생성 main.i

cl /FA        // 어셈블리 파일 생성 main.asm

cl / C        //main.c 기계어 파일 생성 main.ob

 


어셈블리 코드 살펴보기

main.c

1
2
3
4
5
6
7
8
9
#include <stdio.h>

int main()
{
	int iCnt;
	for(iCnt = 0; 100>iCnt ; ++iCnt);

	return 0;
}


main.asm


위는 main.c파일의 어셈블리 소스이다.

; 는 주석을 말한다.




소스를 간단화하면 위와 같다.

명령어 jmp는 점프, cmp는 비교하다, jge는 크거나 같으면(작으면 무효)의 의미이다.


$LN2@main을 보면 ++iCnt가 어셈블리 코드가 대략 어떻게 처리되는지를 알 수 있다.


mov    eax, iCnt

add    eax, 1

mov    iCnt, eax





cl /O2 /Fa main.c는 속도 최적화를 해서 컴파일하라는 명령어이다.


코드가 어떻게 처리되었는지는 위와 같이 실제 어셈블리 코드를 보면 자세히 알 수 있다.


 


 

 

'Linux & Network' 카테고리의 다른 글

2016 04-14 소켓  (0) 2016.04.15
20160401_리눅스 터미널 및 통신  (0) 2016.04.01
20160331_리눅스 터미널과 지역변수  (0) 2016.03.31
20160330_리눅스 터미널  (0) 2016.03.30
라즈베리파이 기본 설정  (0) 2016.03.25
728x90

라즈베리파이 첫 수업

 

홈페이지  https://www.raspberrypi.org/

 

Raspbian Jessie 풀버전 다운로드

https://downloads.raspberrypi.org/raspbian_latest

 

 

Win32DiskImager 다운로드

https://sourceforge.net/projects/win32diskimager/

 

Device항목에 sd카드 드라이브명 확인후,

Raspbian 이미지 쓰기(디스크 모양)

 

 

 

 

네트워크 설정

 


 

인터넷 프로토콜 버전 4 (TCP/IPv4)

ip주소 끝자리를 출석번호 +10으로 줌 (24+10) // 후에 출석번호 +40으로 수정함

 

•Google Public (구글 퍼블릭)
◦기본 DNS 서버 주소 - 8.8.8.8

◦보조 DNS 서버 주소 - 8.8.4.4

 

 

 

IPv4 주소 : 192.168.1.34로 바뀜



[라즈베리 파이, 기본 세팅]

전원을 꼽는 순간 부팅

HDMI 흔들어서 넣지말고 수직으로 주의깊게 넣기 (뺄때도 마찬가지)

처음 세팅때는 usb키보드와 마우스 연결 필요



Shell (사전적 의미론 껍데기) : 명령어를 통해 커널에 접근 가능

unix : 여러 os의 조상


리눅스 명령어

ls -al : 현재 디렉토리 내의 모든 내용 출력

pwd : 현재 디렉토리를 보여줌

tree : 현재 디렉토리를 포함해서 모든 하위 디렉토리와 파일을 보여줌

(화면에 뿌려줄때 ctrl+c로 빠져나올 수 있다)


sudo : SUbstitute user DO 의 줄임말, 관리자 권한의 계정으로 명령을 내림


su - : root권한 획득


$ : 일반계정

# : 루트계정 (sudo)


Ctrl + D : 로그아웃, 한번 더 입력하면 창을 닫는다.


apt-get 프로그램을 받음, 설치시 install 명령어를 뒤에 같이 씀

-> install (대상)


sudo apt-get install vim

sudo raspi-config // 라즈베리 파이 환경설정

1. Expand Filesystem // 파일시스템 확장(SD 카드 전체용량 사용하도록 확장)
2. Change User Password // pi계정 비밀번호 변경

5. Internationalisation Options  //언어, 키보드,타임존 등을 설정

sudo apt-get update  // 각 업데이트 저장소 에서 업데이트 패키지 목록을 갱신

apt-get 프로그램 받아서 설치해줌


 

wlan scan - TESTER 네트워크가 보임






sudo apt-get install vim // vim설치, vim은 visual editor에서 발전한 것



터미널에서 Visual Editor 실행 (main.c 란 파일명으로 편집)



편집 / 명령모드 / 확장명령





visual editor 명령어 배우기

i : insert

o : 한줄 띄우고 insert


esc누르면 명령모드


명령모드

backspace는 커서 왼쪽 이동

h : left j : down k : up l : right


x : 한개의 문자 삭제

dd : 현재 라인 삭제

dw : 단어 삭제

d + (hjkl) : 해당 방향 삭제

d + n + (hjkl) : n개만큼 특정방향 삭제


r : 1개의 문자 바꾸기

R : 수정모드로 글자 덮어씀


dd : 잘라내기

p : 붙여넣기


yy : 현재 라인 복사


$ : 문장의 맨 끝으로 이동

0 : 문장의 맨 처음으로 이동



v 비쥬얼블럭 잡기


shift + colon (:)

:set numer // 줄보이기


:q! : 저장하지 않고 종료



'Linux & Network' 카테고리의 다른 글

2016 04-14 소켓  (0) 2016.04.15
20160401_리눅스 터미널 및 통신  (0) 2016.04.01
20160331_리눅스 터미널과 지역변수  (0) 2016.03.31
20160330_리눅스 터미널  (0) 2016.03.30
라즈베리 파이 원격제어와 C언어  (0) 2016.03.28
728x90

 

써미스터 10k

저항 10k

 

V=IR

5V = I * (R1+R2)

    = I * 20000

 

I=20000/5A

 =0.00025A

 =0.25mA

 

V=iR1

 =0.25mA*10000

 =2.5V

 

 

 


열 감지 실습

 

5v~2.5   : 열에 의해 저항이 변함

 

 

1<<ADLAR : 뒤의 비트만 버리는 방식으로 변경  (뒤의 비트를 버리는 것이 숫자 차이가 적음)

 

 

 128

 64

 32

 16

 8

 4

 2

 1

 

 

3-24_ADC.zip

 

 

 

 

 

Pulse Width Modulator (PWM)

 

펄스폭을 조절

LED의 변화(밝기,RGB)

모터속도의 변화(세게,약하게)

 

시간을 빠르게 하면 빠르게 올라감-분주비와 숫자(200,150)가 영향을 미침

 

CTC 꼭대기에서만 반전이 일어남

PWM

 

 

Toggle : 0->1, 1->0

 

 

AVR PWM실습


AVR-PWM.7z




 

 

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

2016 04 27 논리회로  (0) 2016.04.27
2016-04-25_디지털제어-회로 기초  (0) 2016.04.25
20160323_펌웨어(ADC)  (0) 2016.03.23
20160322_펌웨어(USART)  (0) 2016.03.22
20160321_펌웨어(UART)  (0) 2016.03.21
728x90

 0V(LOW)
 5V(HIGH)

10bit resolution = 2의 10승  / 1024(0~1023)

 

 

 

 

 

 

ADC MULTIPLEXER SELECT (ADMUX)

ADC CTRL & STATUS REGISTER  (ADCSR)

ADC DATA REGISTER (ADCH/ADCL)

mux decoder
여러개중에 하나를 선택(몇번 다리에서 입력받을건지)

ADC[15:0] -> 0번부터 15번 다리까지 있다.  16개

GAIN AMPLIFIER -> AMP(AMPLIFIER)
신호를 키움

CONVERSION LOGIC

PRESCALER 심박수(클럭)이 기준

 

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

2016-04-25_디지털제어-회로 기초  (0) 2016.04.25
20160324_펌웨어(써미스터,PWM)  (0) 2016.03.24
20160322_펌웨어(USART)  (0) 2016.03.22
20160321_펌웨어(UART)  (0) 2016.03.21
20160317-펌웨어(타이머 카운터)  (0) 2016.03.17
728x90

 


115200 bps(bit per sec)가 16mhz인 atmega에 가장 최적 (UBRR = 8)


atmega는 2m bps가 최대

 

 

실수가 버려지고 결과값이 7이 되는 문제가 생김


소스 수정

((OSC/(16.0*BAUD))-0.5); //반올림



UBRR 공식을 define해주고 다음과 같이 코딩한다


#define OSC F_CPU

#define BAUD 115200 //bps

#define UBRR ((OSC/(16.0*BAUD))-0.5);


UBRR0H = UBRR >> 8

UBRR0L = UBRR;





실습


AVR_rx-tx.7z











 




소스컴페어 (두 소스파일을 비교할 수 있는 유용한 프로그램)





DAC(Digital-to-Analog Converter)

ADC(Analog-Digital Converter)

아날로그에서 디지털로.

파형의 곡선을 표로 만드는 것과 같다.






16 Bit / 44.1 KHz 인 CD

3분기준 30MB(스테레오)



RGB 빛은 섞을수록 밝아진다. 색은 섞을수록 어두워진다.


사진의 점 pixel

R 8bit = 0~255 (256단계)

R/G/B = 3byte


3x1024x768=2359296

2359296/1024/1024=2.25  (MB)



24bit_rgb.bmp (1024x768)

2.25 MB


인간은 아주 작은 점을 그림으로 인식





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

20160324_펌웨어(써미스터,PWM)  (0) 2016.03.24
20160323_펌웨어(ADC)  (0) 2016.03.23
20160321_펌웨어(UART)  (0) 2016.03.21
20160317-펌웨어(타이머 카운터)  (0) 2016.03.17
20160316-LCD출력  (0) 2016.03.17
728x90

함수 호출

  • 프로그래밍(s/w) -> 함수                                 호출
  • 회로(h/w) -> 인터럽트 함수 ISR                        IRQ     INT(인터럽트)
  • 운영체제 os(s/w) -> 콜백 함수(call back)          windows에선 Message         

드라이버 - 각 하드웨어 제조사에서 만듬

운영체제 - 운영 및 조율하는 역할

 

atmega - 펌웨어만 짜놓고 return하면 os가 없기 때문에 안됨

 

 

플랫폼 : 안드로이드

 

리눅스(os) + 안드로이드

폰 제조사들이 알아서 한다.

 

에뮬레이터 (플랫폼)  //  Java - JVM

BSD (unix)

 

Java는 임베디드를 타겟으로 만듬, 어플리케이션에 활용

 

 

 

시리얼(직렬)

패러럴(병렬)  

LAN     Local Area Network

WAN    Wide Area Network

 

네트워크 시초는 군사용

 

 

시리얼(직렬) : AVR -> LCD 1bit씩 보냄            1/0/1/1/1/1/0/0

패러럴(병렬) : AVR -> LCD 멀티 bit 를 보냄     10111100         

 

직렬 : 단순, 비용저렴, 속도 느림

병렬 : 복잡, 비용증가, 속도 빠름

 

고속직렬

 Tx

 R

 Rx

 T

 C

 C

 GND

 GND

 VCC

 VCC

 

T (transmit)  R (receive)

C 클럭  

GND 기준전압을 갖게 해주기 위해 무조건 연결

VCC

 

시리얼 방식 대표적인 예 : USB

패러럴 방식 대표적인 예 : BUS

 

 

Atmega2560

 

 

odd(홀수), even(짝수) / parity(점검하다)

 1

 0

 1

 0

 1

 1

 1

 0

 1  (parity bit)

 

갯수를 체크해서 데이터의 손실을 점검

 

 

전이중 : 전화

반이중 : 무전기

 

T,R,G 비동기 (칩에 기본 내장)

 

 

 

 

 

C언어 컴파일 명령어

cl /DF_CPU=8000000 main.c

 

http://codepad.org/YjciuvST

 

결과 :

 

 

전압이 높을수록 0과 1을 구별하기 용이하다.

max3232 신호전압을 조정

 

UART

USART(Universal Synchronous and Asynchronous Receive and Transmitter)

 

max3232  120Kbos x 1024=122,880  (최대속도)

TRANSMIT,RECEIVE SHIFT REGISTER  - 1bit씩 밀어냄

BAUD - 폭이 늘어나면 느려지고, 좁아지면 빨라진다.
BAUD RATE GENERATOR

 

 

 

 

 

 

 

 

 

 

 

 

 

USB 직렬통신 실습

 

 

 

 

 

 

 

 

 

 

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

20160323_펌웨어(ADC)  (0) 2016.03.23
20160322_펌웨어(USART)  (0) 2016.03.22
20160317-펌웨어(타이머 카운터)  (0) 2016.03.17
20160316-LCD출력  (0) 2016.03.17
20160315-펌웨어 분석 및 학습  (0) 2016.03.16
728x90

타이머/카운터


 

클럭 : 동작 주파수

 

클럭-시간

주파수-초당 진동수

 

 

Atmega2560의 클럭 16mhz

16,000,000hz - oscillator(16.000 mhz)

1:1

    

 

빠른 CPU는?

기본외부 주파수 16mhz일때, PLL이 48mhz로 뻥튀기

 

PLL (phase locked loop) ; 위상 동기 루프

 

10진법-인간-1Mhz->1000khz

2진법-컴-1Mbyte->1024kbyte   

 

 

분주비의 개념

 

 

 

No prescaling - 분주를 하지 않음
From prescaler 분주비   (x/n)

 

/1024가 세기에 가장 좋음

 

 

8bit 타이머 카운터를 만드는데는 8/64/256/1024 중에서

오차 없는 분주비 64가 최적

 

 

동작주파수

분주비

클럭당 소요시간

기준시간

카운터

16000000

1

0.00000006250000000000

0.001

16000.000

8

0.00000050000000000000

0.001

2000.000

64

0.00000400000000000000

0.001

250.000

256

0.00001600000000000000

0.001

62.500

1024

0.00006400000000000000

0.001

15.625

 

  

 

 

내부 인터럽트 - 두가지 방식

over flow방식, compare방식

 

over flow방식

CharA=256;   printf 했을 때 0

 

 

Interrupt Vectors in ATmega 2560

Table

 

 

 


 

 

 







 

타이머 카운터 실습


1초마다 A세기

 


타이머카운터(1초마다 a세기).7z








시간 출력(00:00:03)



00_00_03.7z





 

char caTime[]="00:00:00"; 

//0시 0분 0초, 2byte : 0~65535  최대 18시간 저장가능한 시계를 만들수 있다.


 '0'

 '0'

 :

 '0'

 '0'

 :

 '0'

 '0'

 null


[0] [1]  2  [3] [4]  5  [6] [7] 8   - 9개


시 : 0, 1    / 분 : 3, 4    / 초 : 6, 7 

 

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

20160322_펌웨어(USART)  (0) 2016.03.22
20160321_펌웨어(UART)  (0) 2016.03.21
20160316-LCD출력  (0) 2016.03.17
20160315-펌웨어 분석 및 학습  (0) 2016.03.16
20160314-펌웨어 분석(외부 인터럽트)  (0) 2016.03.15
728x90

LCD에 글자 출력하기



MAKEFILE 소스 수정


# List C source files here. (C dependencies are automatically generated.)

SRC = $(TARGET).c lcd.c




LCD_A출력.7z


make하기전에 각 소스의 마지막 줄은 비워둘 것



LCD에 A 출력


lcd.h

#ifndef __LCD_H__
#define __LCD_H__

#include "main.h"

#define RS 4
#define RW 5
#define EN 6

#define BUS PORTA
#define CTL PORTC	//control line

void LCD_Init(void);
void LCD_Inst(unsigned char ucInst);
void LCD_Data(unsigned char ucData);
void LCD_STR(const char* cString);

#define	LCD_CLR		0x01
#define	LCD_HOME	0x02
#define	LCD_ENT		0x06	//S:0Shift OFF, I/D:1 Increase Mode
#define	LCD_DSP		0x0f	//D:1 Display On C:1 Cursor on B:1 Blink On
#define	LCD_CUR		0x14	//S/C:0 Shift Cursor OFF R/L:1 
#define	LCD_FUNC	0x38	//DL:1 Data length 8bit  N:1 2Line F:0 Font 5X8

#endif	//__LCD_H__


lcd.c

#include "lcd.h"

void LCD_Init(void)
{
	DDRC = (1<<RS)|(1<<RW)|(1<<EN);	
	DDRA = 0xff;	//C3개, A8개 연다. 
	CTL = (0<<RS)|(0<<RW)|(0<<EN);	
	BUS = 0x00;	

	LCD_Inst(LCD_FUNC);
	LCD_Inst(LCD_DSP);
	LCD_Inst(LCD_ENT);
	LCD_Inst(LCD_CUR);
	LCD_Inst(LCD_CLR);
	LCD_Inst(LCD_HOME);		
}

void LCD_Inst(unsigned char ucInst)
{
	volatile unsigned int uiCnt;

	CTL = CTL & ~(1<<RS);		
	CTL = CTL & ~(1<<RW);	
	CTL = CTL & ~(1<<EN);	
	BUS = ucInst;
	for(uiCnt = 0; 30000>uiCnt; ++uiCnt); //A

	for(uiCnt = 0; 30000>uiCnt; ++uiCnt); //B

	CTL = CTL | (1<<EN);		
	for(uiCnt = 0; 30000>uiCnt; ++uiCnt);	//C

	CTL = CTL & ~(1<<EN);	
	for(uiCnt = 0; 30000>uiCnt; ++uiCnt); //D

	for(uiCnt = 0; 30000>uiCnt; ++uiCnt);	//E		
	
}

void LCD_Data(unsigned char ucData)
{
	volatile unsigned int uiCnt;

	CTL = CTL | (1<<RS);		
	CTL = CTL & ~(1<<RW);	
	CTL = CTL & ~(1<<EN);	
	BUS = ucData;
	for(uiCnt = 0; 30000>uiCnt; ++uiCnt);	//A

	//CTL = CTL | (1<<RS);
	//CTL = CTL & ~(1<<RW);
	//CTL = CTL & ~(1<<EN);
	//BUS = ucData;
	for(uiCnt = 0; 30000>uiCnt; ++uiCnt);	//B

	//CTL = CTL | (1<<RS);
	//CTL = CTL & ~(1<<RW);
	CTL = CTL | (1<<EN);		
	//BUS = ucData;
	for(uiCnt = 0; 30000>uiCnt; ++uiCnt);	//C

	//CTL = CTL | (1<<RS);
	//CTL = CTL & ~(1<<RW);
	CTL = CTL & ~(1<<EN);	
	//BUS = ucData;
	for(uiCnt = 0; 30000>uiCnt; ++uiCnt);	//D

	//CTL = CTL | (1<<RS);
	//CTL = CTL & ~(1<<RW);
	//CTL = CTL & ~(1<<EN);	
	//BUS = ucData;		
	for(uiCnt = 0; 30000>uiCnt; ++uiCnt);	//E
	
}

void LCD_STR(const char* cString)
{
	while(0!=*cString)
		{
			LCD_Data(*cString);	
			++cString;			 
		}
	
}


main.h

#ifndef __MAIN_H__	
#define __MAIN_H__	

void Init(void);
void Port_Init(void);
void INT_Init(void);

#define PINA	(*((volatile unsigned char *)0x20))
#define DDRA 	(*((volatile unsigned char *)0x21))
#define PORTA	(*((volatile unsigned char *)0x22))

#define PINC	(*((volatile unsigned char *)0x26))
#define DDRC 	(*((volatile unsigned char *)0x27))
#define PORTC 	(*((volatile unsigned char *)0x28))

#define EICRA 	(*((volatile unsigned char *)0x69))
#define EICRB 	(*((volatile unsigned char *)0x6A))
#define EIMSK 	(*((volatile unsigned char *)0x3D))

#define SREG	(*((volatile unsigned char *)0x5F))

#define INT7 7
#define INT6 6
#define INT5 5
#define INT4 4
#define INT3 3
#define INT2 2
#define INT1 1
#define INT0 0

#define ISC7 6
#define ISC6 4
#define ISC5 2
#define ISC4 0
#define ISC3 6
#define ISC2 4
#define ISC1 2
#define ISC0 0

#define sei()   __asm__ __volatile__ ("sei" ::)	
#define sleep() __asm__ __volatile__ ( "sleep" "\n\t" :: )

void __vector_1(void) __attribute__((signal, used, externally_visible));	
void __vector_2(void) __attribute__((signal, used, externally_visible));	

#endif	//__MAIN_H__


main.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "main.h"
#include "lcd.h"

int main(void)
{
	LCD_Init();
	LCD_STR("TEST");
		
	while(1)
	{
	}

	return 0;
}


LCD에 TEST 출력





+ Recent posts