르노삼성 판매조건은 6월과 거의 동일 합니다.
다른 부분은 SM3 CE(이제 구형 SM3 라 불러야 겠죠?)의 노후차량 보유고객 지원이 50에서 20으로 -30 되었습니다.

다른 조건은 바뀐것이 없네요.



상세 내용 들어 갑니다.

http://whoisit.tistory.com/

공통 조건
은 아래와 같습니다. [7월 대비 동일]
선택1: 36개월 4.9% 할부, 72개월 6.9% 저리할부 (New SM3 제외)
선택2: 유류비 50원(SM7, SM5, SM3), 20만원(QM5) 지원 (현금구매 및 정상할부시)


차량별 추가 혜택
을 정리하면 아래와 같습니다.

http://whoisit.tistory.com/
SM7    
재 구매 30만
선 포인트 서비스 50만
노후차량 보유고객 20만원 (2005년 7월 31일 이전 등 록차량에 한함)

http://whoisit.tistory.com/
SM5   
재 구매 20만
선 포인트 서비스 30만
노후차량 보유고객 20만(2005년 7월 31일 이전 등 록차량에 한함)
택시고객 추가 혜택
- 개인택시 신규 증차 고객 30만원  - 개인택시 구매고객 30만

http://whoisit.tistory.com/
NEW SM3
재 구매 10만
신규면허 취득고객 20만
Yepp P3 MP3 플레이어(SM3 스페셜 에디션) 8GB 증정

http://whoisit.tistory.com/

SM3 CE
재 구매 10만
선 포인트 서비스 30만
신규면허 취득고객 20만
노후차량 보유고객 20원  [이전달 50만원 에서 축소]

http://whoisit.tistory.com/
QM5
재 구매 20만
선 포인트 서비스 30만

http://whoisit.tistory.com/
**노후차량 보유고객: 2005년 7월 31일 이전 최초 등록 차량



http://whoisit.tistory.com/
르노삼성에서 공개한 공식자료는 아래와 같습니다.


이전에 소개 드렸던 크루즈컨트롤 DIY혹은 열선 스위치 DIY를 위해서는 "클러스트"(=시동 스위치가 붙어 있는 패널부분)를 분리 해야 합니다.
그런데 이 "클러스트"는 바로 위에 위치한 6CD 체인저(1CD 모델은 좀 다릅니다)를 분리 해야만 클러스트를 쉽게 분리 할 수 있는데, 그냥 나사만 풀어서는 뽑혀 나오지 않습니다.

이전 크루즈 DIY하면서 무식하게 안쪽에 숨어 있는 볼트를 풀어서 공조기와 함께 뽑아 버렸는데요.... 이건 이전에 만든 분리용 부품을 잘못 만들고, 잘못 사용해서 뽑아내지 못해서 사용한 정상적이지 못한 방법이었습니다.

이미 해본 경험도 있고, 사용법까지도 원리 이해를 했으니, 이번 수동기어 인디케이터 만들기 때에는 제대로된 분리용 부품을 만들었습니다.

자주 사용될 부품이기도 하고 다른분들께도 안내 하고자 사진 몇장과 함께 설명을 드립니다.

자~ 우선 배경 지식을 쌓아 보도록 하겠습니다.
아래 사진 부터 보겠습니다.


6CD 체인저의 좌측에 위치한 고정부분입니다. 철판으로 된 부품에 의해서 센터페시아에 쑥~ 밀어 넣으면 턱 하고 철판 부품의 장력으로 걸리는 형식 입니다.
역으로 뽑아 내려면 이 철판 부품을 안쪽으로 - 즉 앞에서 본다면(사진상 오른쪽) 오른쪽으로 당겨서 철판 부품이 평평하게(걸리지 않도록)만들어야 해야만 뽑아 낼 수 있게됩니다.

그러기 위해서 부품을 하나 만들어야 한다는 것이죠.

재료:
1. 일반 차량용 윈도 브러시를 지지하는 얇은 철사(얇고 좁은 철판) (브러시 고무쪽에 붙어 있습니다)
   사용하고 버린 부품 재활용 하시면 됩니다.
2. 철사를 굽히기 위한 뺀치(롱노즈 플라이어)
3. 선택적으로 압축 튜브


만들기:
1. 앞서 준비한 얇은 철사를 약 11cm 길이가 되도록 절단 합니다
    - 플라이어로 몇번 굽히면 부러 집니다.

2. 그리고 7cm 는 곧게 두고 나머지는 둥글게 굽혀서 손으로 잡기 편하게 만듭니다.
3. 둥글게 굽힌 부분을 압출 튜브로 감싸서 고정 합니다.


실제 결과물은 아래와 같습니다.

위 사진처럼 만드는 것입니다. 간단하죠!


사용하기:


위 사진처럼 쑥 꼽습니다.
1. 가능하면 꼽는 부분에 수직으로 넣으시되~ 왼쪽에 밀착하여 삽입하면 됩니다.
2. 제대로 삽입 했다면, 사진처럼 넣은 상태에서, 손잡이를 잡고 오른쪽으로 수평으로 이동하는 느낌으로 당기면 왼쪽에 걸려 있는 철판 부품이 평평하게 됩니다. 당겨지는 느낌을 느끼면 정상입니다.
3. 그리고 체인저 본체를 살짝 당기시면 약간 빠지게 됩니다.

4. 동일한 방법으로 우측의 구멍으로 위와 같이(당연히 대칭으로) 조작하시고 당기면 체인저를 쉽게 분리 할 수 있습니다.

즉 부품을 2개 만들 필요는 없습니다. 1개만 만들고 한쪽씩 당기시면 됩니다.

이상입니다.
센터페시아에 장착된 여러 부품을 분리하실 때 참고 하세요. 즐~ DIY 되시길!


참고로 정비 메뉴얼에 나와 있는 설명과 안내 그림입니다. 이것만 보면 삽질 한다는 것이죠 ㅠ.ㅠ

아래 그림에서 위로 넣고, 넣은 상태에서 안쪽으로 당긴다가 빠졌다는 것이죠!

[86A] 오디오시스템 CD체인저 : 탈거 - 장착
1. 특수공구 (09095 - 52820) (2) 를 이용하여 CD 체인저를 탈거한다 .
2. 커넥터를 분리한다 .

QM클럽 김서진(누엘)님의 RE 모델 첫 운행 시승기를 소개 드립니다.

QM을 처음 구입하고, 가족과 테스트 드라이빙을 한 에피소드를 바로 옆에 계신듯 감칠맛 나게 글로 역였습니다.

*저작권은 모두 김서진님께 있습니다.
*원글에서 문단 흐름과 제목색상 일부 조절과 강조할 만한 곳을 밑줄 처리 했습니다.



아래부터 김서진 님의 글입니다



오전 10시 등록완료된 차량을 인수 했습니다.

신차인도시 점검사항을 꼼꼼히 확인하고 썬팅 및 네비는 직접하기로 결정, 지점에서 조심스럽게 켐이를 얼루고 달래며
집으로 조정해 왔습니다.
승차감, 정숙성, 무게감까지...이거뭐~ 자연스럽게 어깨에 힘 팍팍 들어갑니다.
밤사이 쌈박하게 코팅까지 해주신 영걸~~ 번쩍번쩍,
아내와 9,10살 두아들이 이거 참말로 우리차 맞냐며 환호성을 지릅니다. 또한번 어깨에 깁스를 한 느낌입니다...
백문이 불여일시승이라고.......!!!
조수석에 아내를 뒷자석에 두아들을 태우고 새로 개통된 서울춘천간 고속도로에 살포시 켐이를 올려 놓았습니다.
엄지발가락에 예민한 힘을 가하는데도 그 즉시로 쓩쓩 미끄러지듯 치고나가는 부드러움, 캬~ 감탄사가 절로 나왔습니다.
자동변속기스무스함은 도저히 말로는 형언할 수 없는 별미였습니다.
파놀썬룹에 대만족한 울 아내 맨입으로는 국물도 없더니 오늘 바가지로도 아닌 양동이채로 뽀뽀를 뿌려줍니다.
지난날 무쏘의 탱크같은 시끄러움에 질려버려 승용차만을 고집했던 아내...!!!
켐이를 타고 춘천가는길에 어느새 저보다 더 극성스런 켐이 예찬론자가 되어 버렸습니다.
차를타고 하늘을 바라보며 신기해 하는 두아들은 어느새 동화속 주인공이 되어 있습니다.

크루즈컨트롤
~이거 환장하겠더군요

오르막이나 내리막이나 일정한 속도를 유지해 주는데 꼭 기차타고 달리는 느낌~~두아들, 아내 벌어진 입 다물지 못하는 감탄모드..
썬팅을 하지 않은 관계로 뻥뚫린듯한 실내분위가 다소 민망했지만,
그보다도 썬팅은 좋은놈으로 꼭 해야겠다는 생각이 뼛속깊이 사무쳤습니다.
차량 구조가 가히 일조량이 장난 아니군요!!!!
비가 오락가락하던 후덥지근한 날씨에도 썬팅의 필요성을 급절감했습니다.
천만다행인것은 영걸이 해준다는 썬팅 거절했다고 지난 밤새 구박하던 아내가 고급썬팅의 필요성을 역설하던 제게
아낌없는 긍정의 한표를 던지고 있다는 사실이 아주 고무적입니다.
네비매립을 하지 않은 관계로 이리저리 헤매다 겨우 길거리 이정표에 의지하여 소양강댐을 찾아갔는데 그 장엄한 소양호의 풍경이 절세멋쟁이 검둥이 켐이의 자태앞에서 주눅이 팍팍 드는 모습을 지켜보며 목에 힘 한번 힘껏 주었습니다.
켐이에게 소양호의 정기를 힘껏 불어 넣어주려 했는데 데려 켐이의 용솟음치는 활력을 소양호에 아낌없이 뿌려주고 온 느낌입니다.

우와~ 한참 고속도로 주행중에 아들녀석이 새차냄새가 답답했던지 조수석 뒷문짝 창문을 내렸나 봅니다.

이건뭐~ 귓청이 터지는 줄 알았습니다. 우와~ 순간 뒷트렁크 문짝이 날라가 버린 줄 알고 차를 잠시 세울까 고민...ㅎㅎㅎㅎㅎ
춘천명동 닭갈비마을에서 시승회식을 뽀다구나게 한방 때리고 집으로 돌아오는 길!!!!
엄청난 비가 쏟아졌습니다. 하늘에 구멍이 났나? 이건 숱제 디리붓는다는 표현이 적절할 것 같습니다.
시속 60이하로 엉금엉금....!! 총 180km 주행, 평균연비 10.5, 최고속도 120, 평균속도 56,
코너링 좋고 핸들 저속에는 가볍게 고속에는 무겁게...베리굿!!!
아~ 빽밀러 조정간!!! 참 아쉽더군요 로타리식...근데 거 빽밀러 한번 시원하게 크더군요!!
춘천에서 돌아오는길!!! 길을 잘 몰라서 헤매다가 춘천IC아닌 강촌IC를 이용했는데
이거 참 절대로 이용하지 마시길 당부드립니다...걍 춘천IC로 곧장~~
돌아도 엄청 돌아요...뭐 강촌 한방 찍고 간다면 몰라도...
이쯤에서 걷어들인 기막힌 수확하나~~
내비매립에 떨뜨럼하던 아내 입술에서 내일 당장 매립하라는 어명과 함께
제통장에 거금이 핸폰으로 인정사정없이 이체되는 현장을 목격하면서 누군가는 룰루랄라~ 휘파람을 불렀습니다.
내일(토욜)은 온종일 휴가를 내주는 아내~~썬팅과 내비매립하는 조건으로다....ㅎㅎㅎㅎ
락폴까지, 대충 바꿀꺼 몇가지 고민중인데 추천해 주실래요?

오늘은 날밤새면서 사용설명서 독학해 보려 합니다.

한마디로 오늘 켐이 첫시승은 일거 사,오득입니다...!!!
무엇보다도 켐이 정회원이 되었다는 자부심이 또 한번 저를 미치게 하는군요!!!
내용없는 장황한 글 읽어주시느라고 애쓰셨습니다
착하게 봐주십시요....감사합니다!!

추신:인텔리전트스마트키+바이제논 헤드램프........RE25 만세!!


수동기어 인디케이터의 완성

앞서 브레드보드로 만든 회로를 최종적으로 만능기판을 이용하여 구성 했습니다.
향후 확장을 위해 충분한 크기의 기판을 사용 했습니다. 겨우 안쪽에 넣을 크기가 되었더군요 - 좀더 작게 만들 필요가 있어 보입니다.


글은 모두 4개로 구분하여 올렸습니다.




앞쪽 모습입니다. 주문 실수로 저항을 1/2W 용량을 사버렸네요. 굴찍한게 좀 없어 보입니다 ㅎㅎ
중앙 부분에 위치한 풀업 저항 역시 1/2W 용량인데 크기는 1/4W 급과 동일 합니다.




장착 사진을 추가로 소개 드리면 아래와 같습니다.

*실제 최종 완성본에는 뒷쪽에 필터기능용 부품 2개(고전압 필터, 적은 용량 컨덴서 한개)를 추가 했습니다.
오동작 때문에 넣었는데, 필요 없겠더군요. 오동작 원인은 마이컴을 차량 배선에 가까이 붙이지 않으면 됩니다.


세워 둔 곳이 리어덕터 생략된 위치 입니다. 수동모델은 리어덕터가 없기에 공간 확보가 되었네요 @.@


7 Segment 단자를 비교적 길~게 해서 중앙 콘솔까지 연결합니다.


글로브박스를 분리해서 연결하면 매우 쉽습니다. 절대 그냥 하려 하지 마세요 - 분리 할 건 분리 하셔야!




최종 동작 결과 소개를 드립니다.
개별 기어에 맞추어 7-Segment를 통해 현재 기어가 표시가 됨을 확인 할 수 있습니다.
개별 표시는 그냥 바뀌는 것이 아니라 아래의 규칙대로 효과를 보여 줍니다.

기어 변경
해당 기어 숫자가 빠르게 깜빡이면서 눈에 띄도록 표시가 됩니다. 깜빡임에는 몇종류의 형태로 변화 하면서 변화를 보이다가 고정이 됩니다.

기어 변경 조작 중인 경우
기어가 변경중인 경우이고 다음 기어 위치로 고정 되지 않은 상태에서는 점점 희미하게 이전 기어 표시가 어두어 지다가 '-' 표기로 바뀌게 됩니다.

기어 위치 센서에 아무런 값이 입력 되지 않는 경우
이 경우 에러 상태를 알리는 'E'표기가 됩니다.
입력 상태를 확인 할 필요가 있습니다. 특히 센서 동작을 확인 해야 합니다.

후진은 R 표시가 곤란하므로 P. 형태로 표시합니다.
또한 후진 상태에서 일정 시간이 지나면 빠르게 깜빡여서 후진임을 알려줍니다.

중립 상태에서 장시간 대기시에
0으로 표시되던것이 하나의 LED만 점등하면서 회전하는 애니메이션을 보여 줍니다.

다시금 동작 동영상을 소개 드립니다.
시내주행이라 억지로 6단 까지 넣어 봤습니다 ^.^


개별 기어 동작별 표시 변경 내용만 보면 아래와 같습니다.
정차 상태에서 운전석에서 제가 촬영하고, 친구가 조수석에서 조작해서 좀 부드럽지 못합니다.
전체적인 동작을 확인 하는 영상으로 이해 하세요.

*개별 기어 상태에서 변속 동작이 완료 되지 않은 상태로 빠지면 점점 어두워지게 했습니다.
 PWM 동작은 아니고 루프에서 카운트 값을 적당히 조절 했답니다(소스 참조)



개별 기어수에 대한 사진 입니다.














요거이 후진입니다. R 이라 하고 싶었지만 구할 수 있는 표시기가 순수 7 Segment라 P. 으로 표시하고 일정 시간 직후 "깜빡이"게 했습니다.
제가 R에서 실수 해서 한이 맺혀서 말이죠 ㅋㅋㅋ (빵판에서는 부저도 달았었습니다. - 빽빽 거립니다 ㅎㅎ)


이상입니다.
혹시나 수동기어 인디케이터가 필요하신 분께 참고 자료가 되었으면 합니다.



이번 글에는 메인 모듈 회로 구성 회로와 마이컴 모듈인 ATMega128용 소스를 소개 드립니다.

제가 한방에 납땜하고, 설계하고, 코딩하지는 않았습니다.
나름 여러 재료와 함께 브레드보드(일명 빵판)도 생에 처음으로 구입하여 미리 구성하고 확인하여 회로를 완성 했습니다.
전원 연결, 포트 3개를 이용하여 하나는 기어센서로 부터 입력 7개, 디버깅용 - 즉 센서 감지용 LED 7개(실은 미리 8개 연결), 그리고 최종 기어단수 표시용 7-segment용 출력 8단자 입니다.

[수정: 2010-1-8 ]
풀업 저항 10k옴* 8개는 삭제 합니다. 소스코드도 수정 되었습니다.
제가 내부 풀업 셋팅을 몰라서 사용 했는데, 코드 한줄 추가로 설정 했습니다(초자라 이해를...)
파일도 수정된 내용으로 바꾸었습니다.
아래 회로 그림에서 10k부분은 완전히 제거 하시면 됩니다(더 간단하죠)


글은 모두 4개로 구분하여 올렸습니다.
1. 소개글, 개별 단수 인식 방법과 필요한 부품
2. 센서 모듈 만들기와 장착
3. 회로 구성을 위한 회로도와 마이컴 소스코드 [지금 보고있는 글입니다]
4. 완성품 설치와 동작 모습 소개


우선 브레드 보드로 마이컴 모듈을 장착하고, 기어 상태 입력을 위한 부분, 현재 입력 상태 확인용 LED 부분, 최종 기어 단수 표시를 위한 7-Segment 출력 부분으로 구성 했습니다.

입력은 Port A 단자와 연결
입력값 확인용 출력단은 Port C 단자와 연결
7-Segment 출력은 Port  F 단자와 연결 했습니다.

포트 선택의 기준은 한쪽에 몰려 있어서 그냥 사용 했습니다.
AVR은 처음 만져 보는 것이라, 인터럽터, 타이머쪽 고려는 전혀 되지 않았습니다.
- 회로, 코드 보시고 고수분들의 한수 지도 의견 환영 합니다.

상세 연결은 브레드 보드와 연결된 실제 회로 구성 사진으로 대신 하고자 합니다.

위 사진 보고는 느낌밖에 오지 않습니다 ^.^ 밑에 회로도를 보시기 바랍니다.

중요한 핀 번호와 개별 연결 단자와의 구성은 아래와 같이 정리 할 수 있습니다.


네... 회로도가 잘 되었는지 모르겠네요 ^.^


AVR 동작을 위한 code는 아래와 같습니다. 실제 사용하는 code입니다.
제가 AVR 프로그래밍은 처음이라 인터럽트, 타이머는 사용하지 않는 단순한 폴링 방식의 구현임을 감안 하셨으면 합니다. 고수분들의 한수 지도 환영 합니다.
코드에 코멘트를 보시면 이해에 도움이 될 듯 합니다.

다운로드:

/*******************************************************************************
 (C) 2009 Seung-Won Lee   http://whoisit.tistory.com    SoftWareYi@gmail.com


  수동기어 단수표시 장치

  @File  GearPositionIndicator.c
*******************************************************************************/


#include <avr/io.h>

#define    PORT_SEG            PORTF    // Segment 출력용 port
#define    SEG_COMMON_ANODE    1        // Anode 공통 == + 극 공통으로 출력이 0으로 나가야 동작 하는 경우

#ifdef    SEG_COMMON_ANODE
    #define    SEGOUT(value)    (~value)    // Coommon Anode이므로 bit 상태를 뒤집는다
#else
    #define    SEGOUT(value)    (value)
#endif


const unsigned char    SEGMENT_MINUS    = 0b10000000;    // -
const unsigned char    SEGMENT_0        = 0b01110111;    // 0
const unsigned char    SEGMENT_1        = 0b00010100;    // 1
const unsigned char    SEGMENT_2        = 0b10110011;    // 2
const unsigned char    SEGMENT_3        = 0b10110110;    // 3
const unsigned char    SEGMENT_4        = 0b11010100;    // 4
const unsigned char    SEGMENT_5        = 0b11100110;    // 5
const unsigned char    SEGMENT_6        = 0b11100111;    // 6
const unsigned char    SEGMENT_7        = 0b01110100;    // 7
const unsigned char    SEGMENT_8        = 0b11110111;    // 8
const unsigned char    SEGMENT_9        = 0b11110110;    // 9
const unsigned char    SEGMENT_BACK    = 0b11111001;    // P. for Back
const unsigned char    SEGMENT_ERROR    = 0b11101011;    // E. for Error
const unsigned char    SEGMENT_H3        = 0b10100010;    // 한자 3
const unsigned char    SEGMENT_ALL        = 0b11111111;    // All for test


//******************************************************************************
//******************************************************************************
void init( void )
{
    // Enable pull up
    int    SpecialFunctionIO = SFIOR;
    SpecialFunctionIO = ~4 & SpecialFunctionIO;
    SFIOR = SpecialFunctionIO;
}



//******************************************************************************
// 7Segement test 출력
//******************************************************************************
void Display7SegmentOnPortF( void )
{
    const unsigned char    segmentData[] = {
                SEGMENT_0,        // 0
                SEGMENT_1,        // 1
                SEGMENT_2,        // 2
                SEGMENT_3,        // 3
                SEGMENT_4,        // 4
                SEGMENT_5,        // 5
                SEGMENT_6,        // 6
                SEGMENT_7,        // 7
                SEGMENT_8,        // 8
                SEGMENT_9,        // 9
                SEGMENT_H3,        // =
                SEGMENT_BACK,    // R
                SEGMENT_ALL,    // All for test
    };
    static int    index = 0;
    static long int delay = 0;

    if ( ++delay > 10000 )
    {
        delay = 0;
        PORT_SEG = SEGOUT(segmentData[ index++ ]);    // Invert for common Anode LED
        if ( index >= sizeof(segmentData)/sizeof(segmentData[0]) )
            index = 0;
    }
    else
    {
        //PORT_SEG = SEGOUT(0);    // Turn off
    }
}

//******************************************************************************
// Port로 부터 입력된 기어 위치값으로 부터 현재 기어 위치를 char 문자로 돌려준다
//    중립='N'
//    각 단수='1'~'6'
//    후진:'B'
//    기어조작중:'-'
//    에러상태:'E'
//******************************************************************************
typedef struct
{
    char    state;
    char    position;
} stateToPosition;

char getTransmissionValue( char state )
{
    const stateToPosition    stateData[] = {
        { 0b00100010, 'N' },    // Natural
        { 0b00010100, '1' },    // 1
        { 0b01000100, '2' },    // 2
        { 0b00010010, '3' },    // 3
        { 0b01000010, '4' },    // 4
        { 0b00010001, '5' },    // 5
        { 0b01000001, '6' },    // 6
        { 0b00011000, 'B' },    // Back
    };
    char    result = '-';
    int        sensingCount = 0;
    int        i;

    state = state & 0b01111111;    // 상위 1bit 사용 안함 처리
   
    // CheckError - 최소한 하나의 bit는 1이어야 정상이다. (실은 2개)
    if ( !(0b01111111 & state) )
    {
        return 'E';    // 센서로부터 아무런 입력값이 없을 경우 Error처리
    }

    // 변속 중인 상태 확인 -> 앞뒤
    sensingCount += ( state & 0b01000000 ) ? 1 : 0;
    sensingCount += ( state & 0b00100000 ) ? 1 : 0;
    sensingCount += ( state & 0b00010000 ) ? 1 : 0;
    if ( sensingCount > 1 )    // 두 위치값이 동시에 입력되면 변동 중인 경우
        return result;

    // 변속 중인 상태 확인 -> 좌우
    sensingCount = 0;
    sensingCount += ( state & 0b00001000 ) ? 1 : 0;
    sensingCount += ( state & 0b00000100 ) ? 1 : 0;
    sensingCount += ( state & 0b00000010 ) ? 1 : 0;
    sensingCount += ( state & 0b00000001 ) ? 1 : 0;
    if ( sensingCount > 1 )    // 두 위치값이 동시에 입력되면 변동 중인 경우
        return result;

    // 모두 통과 되었다면 단수 확인 과정, 확인 불가시 '-' 처리가 default
    for ( i=0; i<sizeof(stateData)/sizeof(stateData[0]); i++ )
    {
        if ( stateData[i].state == state )
        {
            result = stateData[i].position;
            break;
        }
    }

    return result;
}

//******************************************************************************
// getTransmissionValue로 부터 받아진 결과값을 입력하면 포트출력 값을 돌려준다
//******************************************************************************
typedef struct
{
    char    mode;
    char    segmentData;
} modeToSegment;

char getSegmentData( char currentMode )
{
    const modeToSegment    modeToSegmentData[] = {
        { '-', SEGMENT_MINUS },    // -
        { 'N', SEGMENT_0 },    // 0
        { '1', SEGMENT_1 },    // 1
        { '2', SEGMENT_2 },    // 2
        { '3', SEGMENT_3 },    // 3
        { '4', SEGMENT_4 },    // 4
        { '5', SEGMENT_5 },    // 5
        { '6', SEGMENT_6 },    // 6
        { 'B', SEGMENT_BACK },    // R == P.
        { 'E', SEGMENT_ERROR },    // E.
    };
    int        i;
    char    segmentData = SEGMENT_ERROR;    // Default to Error


    // 입력값에 대응하는 Segment값을 가져온다
    for ( i=0; i<sizeof(modeToSegmentData)/sizeof(modeToSegmentData[0]); i++ )
    {
        if ( modeToSegmentData[i].mode == currentMode )
        {
            segmentData = modeToSegmentData[i].segmentData;
            break;
        }
    }

    return segmentData;
}

/*******************************************************************************
 segmentData를 포트를 이용하여 출력한다
 이어 위치가 변경될 경우 깜빡이는 효과를 시차를 이용하여 보여준다
 중립(0)상태가 일정시간 지속될 경우 animation 효과(뱅글뱅글)를 보여준다

 변속 조작 진행 상태('-')의 경우 이전 단수가 서서이 사라지는 형태로 처리한다.
*******************************************************************************/
void displaySegmentData( char segmentData )
{
    const char segmentAnimationData[] = {        // 왼쪽으로 회전하는 에니메이션
        0b00000001,
        0b00000010,
        0b00000100,
        0b00010000,
        0b00100000,
        0b01000000,
    };
    static char prevData = 0;
    static unsigned long int    timingCount = 0;
    static unsigned int            rotateTimingCount = 0;
    static char dimmingMode = 0;


    // 특정 단수 --> '-' 즉 기어 조작 진행 중인 경우
    // '-' 표시 전에 이전 단수를 희미하게 사라지게 한다
    if ( ( prevData != segmentData ) && ( SEGMENT_MINUS == segmentData ) )
    {
        if ( !dimmingMode )
        {
            dimmingMode = 1;    // Dimming mode전환
            timingCount = 0;
            PORTB = 0;            // Clear
        }

        if ( timingCount < 1000 )        // 조작 직후 이전 기어 위치 유지
            PORT_SEG = SEGOUT( prevData );
        else
        if ( timingCount < 3000 )
            PORT_SEG = ( 90 < timingCount % 100 ) ? SEGOUT(0) : SEGOUT(prevData);
        else
        if ( timingCount < 5000 )
            PORT_SEG = ( 70 < timingCount % 100 ) ? SEGOUT(0) : SEGOUT(prevData);
        else
        if ( timingCount < 7000 )
            PORT_SEG = ( 50 < timingCount % 100 ) ? SEGOUT(0) : SEGOUT(prevData);
        else
        if ( timingCount < 9000 )
            PORT_SEG = ( 30 < timingCount % 100 ) ? SEGOUT(0) : SEGOUT(prevData);
        else
        if ( timingCount < 11000 )
            PORT_SEG = ( 10 < timingCount % 100 ) ? SEGOUT(0) : SEGOUT(prevData);
        else
        if ( timingCount < 13000 )
            PORT_SEG = ( 5 < timingCount % 100 ) ? SEGOUT(0) : SEGOUT(prevData);
        else
        {
            PORT_SEG = (char)SEGOUT(SEGMENT_MINUS);    // '-' 최종 반영
            prevData = segmentData;    // '-'로 이전값 설정
            dimmingMode = 0;        // timingCount reset용
        }
       
        // 효과 과정 까지 timingCount 증가
        ++timingCount;
        return;
    }
    else
    {    // Dimming 도중에 다른 기어로 진입시에 reset 처리하여 차후 기어 조작 진행 상태 반영
        if ( dimmingMode )
        {
            dimmingMode = 0;
            timingCount = 0;
        }
    }


    // 일반적인 변동 상황
    if ( prevData != segmentData )
    {
        PORT_SEG = SEGOUT(segmentData);    // Invert for common Anode LED
        prevData = segmentData;
        timingCount = 0;        // For effect
        rotateTimingCount = 0;
    }
    else
    {
        if ( timingCount < 1000 )
            PORT_SEG = ( 100 < timingCount % 200 ) ? SEGOUT(prevData) : SEGOUT(0);
        else if ( timingCount < 3000 )
            PORT_SEG = ( 200 < timingCount % 500 ) ? SEGOUT(0) : SEGOUT(prevData);
        else if ( timingCount < 6000 )
            PORT_SEG = ( 300 < timingCount % 1000 ) ? SEGOUT(0) : SEGOUT(prevData);
        else if ( timingCount < 10000 )
            PORT_SEG = SEGOUT(prevData);
       
        // 효과 과정 까지 timingCount 증가
        if ( timingCount < 600000 )
        {
            ++timingCount;
            if ( (timingCount > 50000) && (SEGMENT_BACK == prevData) )
            {
                //PORT_SEG = ( 4000 < timingCount % 6000 ) ?  ~0 : ~prevData;
                if ( 4000 < timingCount % 6000 )
                {
                    PORT_SEG = SEGOUT(0);
                    PORTB = 0xFF;
                }
                else
                {
                    PORT_SEG = SEGOUT(prevData);
                    PORTB = 0;               
                }
            }
        }
        // 효과 완료 시점
        else
        {
            if ( SEGMENT_0 == prevData )
            {
                static int segmentIndex = 0;

                // 0 인 경우 뱅글뱅글 돌아가는 animation 출력 시작
                if ( ++rotateTimingCount > 20000 )
                {
                    PORT_SEG = SEGOUT(segmentAnimationData[segmentIndex]);
               
                    if ( ++segmentIndex >= sizeof(segmentAnimationData)/sizeof(segmentAnimationData[0]) )
                        segmentIndex = 0;
                    rotateTimingCount = 0;
                }
            }

        }

    }
   
}

//******************************************************************************
//******************************************************************************
int    main( void )
{
    const unsigned int    inOutTime = 1000;
    unsigned long int    timingCount = 0;
    char    currentMode = 'N';
    char     segmentData = 0;

    init();

    DDRA = 0x00;
    DDRC = 0xFF;
    DDRF = 0xFF;
    DDRB = 0xFF;

    PORTA = 0xFF;        // Input port에 1을 setting하여 Internal pull-up 저항을 활성화
    PORTC = 0x00;

    PORT_SEG = 0xFF;        // Common anode 이므로 1상태가 off 가 된다
    PORTB = 0x00;        // 버즈 출력 시도

    while ( 1 )
    {
        char input = 0;

        if ( 0 == timingCount % inOutTime*10 )
        {
            input = ~PINA;    // N==1 접속==0
            PORTC = input;

            // 상태값으로 부터 기어 단수 위치를 판단한다.
            currentMode = getTransmissionValue( input );
            segmentData = getSegmentData( currentMode );
        }

        displaySegmentData( segmentData );
       




        if ( ++timingCount >= 60000 )
            timingCount = 0;
    }


}

다음글은 최종 완성품 사진과 실제 동작사진, 나머지 동영상 모음을 올려 드리도록 하겠습니다.

+ Recent posts