AVR 인공호흡 하기 - ATmega128 로 ATmega128 살리기

글 내용

ATmega128을 가지고 놀다보면.. 전혀 예상치 못한 이유로 ATmega128이 죽어버릴때가 있습니다.
갑작스런 정전기나, 전원을 잘못연결했다거나... 아니면 아무것도 안했는데 동작을 안할때....

이럴땐 보통 오실레이터로 인공호흡을 해주면 살아나는 경우가 있습니다. 
하지만 인공호흡하려고 없는 오실레이터 사다가 인공호흡할수도 없는것이고...
옆에 있는건 아직 목숨이 붙어있는 ATmega128. 이녀석으로 어떻게 살려볼수 없을까 찾아보다 좋은 방법을 찾았습니다.
포트의 핀 출력을 High -> Low -> High -> Low .............  를 반복하면 클럭뛰는 효과를 낼수 있다는.....

일단 오실레이터를 연결해서 클럭이 어떻게 뛰나 확인해 보았습니다.
사용자 삽입 이미지Digimax S500 / Kenox S500 / Digimax Cyber 530 | Normal program | Pattern | 1/8sec | Off Compulsory | 2009:11:15 05:20:58

오실로스코프 회로.. 참 쉽죠잉??


사용자 삽입 이미지Digimax S500 / Kenox S500 / Digimax Cyber 530 | Normal program | Pattern | 1/15sec | Off Compulsory | 2009:11:15 05:21:15

4Mhz 오실레이터의 파형을 오실로스코프로 찍은 모습.



파형이 이쁘게 곡선을 그리며 올라가다가 절벽으로 떨어지는 파형을 보여주고 있습니다.
주기가 4.00114MHz 가 나오네요. 주기가 딱 4MHz가 나오진 않습니다.... 당연한건가요;;;;;;

이젠 살아있는 AVR로 펄스를 만들어 보겠습니다.. 아래의 소스를 컴파일해 살아있는 AVR에 Write해줍니다.

사용자 삽입 이미지

이놈의 파형이 어찌 나오는지 오실로 스코프로 찍어봅니다...
사용자 삽입 이미지Digimax S500 / Kenox S500 / Digimax Cyber 530 | Normal program | Pattern | 1/15sec | Off Compulsory | 2009:11:15 05:24:36
포트F에 설정해놨으니 포트F에 오실로스코프를 연결해야겠지요? ㅎㅎ 파형은 아래와 같습니다.


사용자 삽입 이미지Digimax S500 / Kenox S500 / Digimax Cyber 530 | Normal program | Pattern | 1/15sec | Off Compulsory | 2009:11:15 05:24:57
아까보단 깔끔하진 않네요... 울퉁불퉁... 모양이 산모양 같습니다..ㅎㅎ
주기는 약 2.66749MHz가 나오네요.. 이정도로도 충분히 인공호흡용 클럭이 될수 있을것 같습니다.


인제 준비는 모두 끝났습니다... 실제 AVR을 살해(?)후 인공호흡으로 살려 보겠습니다...
ATmega128은 비싸서 이런 실험 용도로는 부적합하다고 판정! 하나남은 ATmega8을 실험대상으로 삼았습니다
실험용 회로를 아래와 같이 구성하였습니다... (불쌍한 ATmega8....;;)
사용자 삽입 이미지Digimax S500 / Kenox S500 / Digimax Cyber 530 | Normal program | Pattern | 1/10sec | Off Compulsory | 2009:11:15 05:40:11
전원과 ISP만 구성하였습니다... 참 쉽죠잉??

AVR Studio 에서 연결 퓨즈비트와 Signature를 읽어보니 제대로 나오는군요..
사용자 삽입 이미지


이제 ATmega8을 살해하기 위해 퓨즈비트 설정에서 SUT_CKSEL 부분을 Ext. Crystal/Resonator High Freq.; Start-up Time : 16K CK + 64... 라고 써있는걸 선택후  Program 버튼을 지그시 눌러줍니다...
공부를 위한 안락사라고 생각하고 눈물을 머금고 누릅니다........ 클릭~


사용자 삽입 이미지
역시 한방에 가셨습니다.... Signature부분엔 WARNING이 뜨고... 퓨즈비트도 이상하게 읽혀집니다..


이제 아까 제작한 인공 클럭으로 살려보겠습니다... ATmega8의 XTAL1 핀은 9번핀 입니다.
9번핀에 아까 만든 인공호흡용 클럭을 연결시켜줍니다... 아래와 같이요....

사용자 삽입 이미지Digimax S500 / Kenox S500 / Digimax Cyber 530 | Normal program | Pattern | 1/10sec | Off Compulsory | 2009:11:15 05:52:09
이렇게 연결하고 다시 퓨즈비트와 Signature를 읽어 봅니다...


허허 신기합니다. 멀쩡하게 다시 동작을 하는군요!!!!!!
이렇게 멀쩡하게 동작할때 후딱 잘못 설정된 퓨즈비트의 클럭설정용 퓨즈비트를 제대로 설정해줍니다.
사용자 삽입 이미지Digimax S500 / Kenox S500 / Digimax Cyber 530 | Normal program | Pattern | 1/10sec | Off Compulsory | 2009:11:15 05:52:09
위 화면과 같이 SUT_CKSEL을 위와 같이 내부클럭 8MHz로 설정해주고 Program 버튼을 클릭합니다.

휴우~ 다시는 못볼줄 알았던 ATmega8이 살아났군요...ㅎㅎ

다음에도 혹시나 이런 불상사가 생기면 이런 방법으로 살려내면 되겠습니다...~
이 방법으로도 살아나지 않는다면..... 글쎄요... 저도 잘 모르겠습니다...ㅎㅎㅎㅎㅎㅎㅎ;;
  1. user picture
    그런데요. 설정값을 변경했는데 ic가 죽었다고 하기엔 좀 그런거같아보여요. 다시 설정값만 해주면 되는거 아닌가요 ^^; 대부분 타거나 열받아서 죽는게 아닌가요? 그런건 복귀 가능한가요?
    • user picture
      물론 설정값을 바꿨다고 IC가 죽는것은 아니지요.

      위에서 제가 설정을 한 것은 외부 크리스탈이 창작되어있지 않은 상태에서 퓨즈비트를 외부 크리스탈로 설정한 것입니다.
      이 경우 실제로 ATmega128이나 같은 atmega 계열 ic들은 동작을 하지 않게 됩니다.
      이런경우 AVR Studio 에서 hex파일을 write하려고 하면
      device missing or unknown device [-24] 라는 메시지가 뜨게 되지요.

      실제로 물리적으로 부셔졌거나, 과전류로 인해 IC가 타버린 경우가 아니라면 atmega계열의 mcu가 동작하지 않는 이유는 사용자나 또는 다른 이유로(EMI 영향 등..) 퓨즈비트 셋팅이 잘못되어 장치인식을 못하게 되는 경우가 대부분입니다.

      이런경우 강제로 외부 클럭을 넣어주면 ic를 다시 동작하게 할수 있는데요, 이를 인공호흡이라 합니다. 보통의 크리스탈로는 인공호흡을 하지 못하고, 오실레이터나 펑션 제너레이터같이 펄스를 만들어주는 장치로 인공호흡용 클럭을 만듭니다. 위 예제는 avr을 이용해 펄스를 만들어 인공호흡을 한 예제 입니다.

      쉽게말해 퓨즈비트 이상으로 동작하지 않는 avr칩을 인공적으로 클럭을 만들어 강제로 넣어주지 않게되면 못쓰게 되서 죽었다고 표현하는 것이죠. 물론 설정값만 다시 정상값으로 변경해주면 됩니다.

      하지만, 저런 과정 없이 설정값을 다시 셋팅할수 있을까요? 인식조차 되지 않을것입니다.
  2. user picture
    인공호흡이 이런의미였네요
  3. user picture
    좋은 정보 감사드려요. 갑자기 한녀석이 먹통이 되었는데...
    이 방법으로 살렸습니다. 감사합니다. :)
  4. user picture
    안녕하세요! 인공호흡을 찾아보다가 이런글을 보게 되어 질문드립니다. 제가 사용하는 ATMEGA는 내부 클럭을 16MHz로 사용하는 모델인데 위의 설정에서 내부 클럭 설정에 16MHz가 없습니다. ㅠ 이런 경우에는 어떤 설정을 해줘야하는 걸까요?
    • user picture
      atmega 어떤 모델을 사용하시나요?
      제가 알기로 내부 클럭이 16Mhz는 못봤습니다..

      Atmega128-16au 도 내부 클럭은 8Mhz까지 사용 가능하고, 외부 클럭이 16Mhz까지 가능합니다. Datasheet 참조하세요.
  5. user picture
    어제 잘 돌아가던 128이 프로그램이 안들어가더라구요..
    퓨즈비트도 지멋대로 읽혔다 안읽혔다 그러고 시그니쳐는 당연 안맞다고 뜨고,
    그러던중 인공호흡이 생각나서 이곳저곳 찾아보곤 여기와서 그대로 해보니!
    살아났습니다. 감사합니다.
    저의 경우에는 올려주신 코드로하면 아날로그 OSC라 정확한값은 모르겠으나
    4MHz 파형이 찍히더라고요 PORTC=PORTC^0xFF; 하면 1M6 나오고요
    무튼 글잘보고 갑니다 감사합니다. ^_^
  6. user picture
    잘보고 갑니다. 코드비전에서 Fuse bit 설정 잘못해서 몇개 죽여먹었는데, 덕분에 인공호흡 성공했네요.
    다른 인공호흡 설명보다 명확하게 적으셨네요..

티스토리 툴바