이 블로그는 임베디드 컴퓨터를 이용한 장치(시스템) 개발과 원격제어에 필요한 지식을 공유 하기 위한 블로그 입니다.
실제 개발과 프로그램 예를 위하여 Microchip 사의 ATmega128를 사용한 보드와 Arduino Mega 보드(ATmega2560), Raspberry Pi, Raspberry Pi Pico, WiFi 모듈을 사용 합니다.

coding-with-ChatGPT

Coding with ChatGPT
  ChatGPT를 이용한 ATMega128 Coding


  • ChatGPT 개요와 실행을 위한 준비
    • ChatGPT 개요
      • ChatGPT는 OpenAI에서 개발한 언어 모델로, 현재 GPT-3.5 또는 GPT-4 아키텍처를 기반으로 합니다. 이 모델은 대화형으로 자연어 이해 및 생성 작업을 수행할 수 있습니다. GPT는 "Generative Pre-trained Transformer"의 약자로, 사전 훈련된 모델을 사용하여 다양한 언어 작업에 적용할 수 있도록 설계되었습니다.

      • ChatGPT를 코딩에 사용하는 경우 아래와 같은 효과를 기대할 수 있습니다.
        • 코드 작성 보조: ChatGPT는 자연어 이해 및 생성 작업에 능숙하므로 코드를 작성하는 도중에 코드 조각, 함수, 루프 등에 대한 도움말을 제공할 수 있습니다. 이는 개발자가 더 빠르게 코드를 작성하고 실수를 줄이는 데 도움이 될 수 있습니다.
        • 문제 해결과 디버깅: ChatGPT를 사용하여 코드 관련 질문을 하면 문제 해결과 디버깅에 대한 힌트를 얻을 수 있습니다. 코드에서 발생한 오류에 대한 해석이나 특정 문제에 대한 접근 방법에 대한 조언을 받을 수 있습니다.
        • 언어 번역 및 설명: 코드를 작성하거나 읽을 때 특정 언어의 이해가 부족한 경우, ChatGPT를 사용하여 코드 블록이나 주석을 번역하거나 해당 언어로 설명을 얻을 수 있습니다.
        • 코드 리뷰 및 개선 제안: ChatGPT는 특정 주제나 기술에 관한 정보를 제공하므로 새로운 기술이나 라이브러리를 학습하고 문서를 검색하는 데 도움을 줄 수 있습니다.
        • 주: 그러나 ChatGPT의 결과물은 항상 검토가 필요하며, 모델이 생성한 코드나 정보를 그대로 사용하는 것은 주의가 필요합니다. 특히 보안 및 안전성과 관련된 부분에서 개발자의 신중한 판단이 필요합니다.


    • ChatGPT를 사용하기 위한 준비
      • ChatGPT 가입하기
        • ChatGPT 홈페이지( https://chat.openai.com/chat )에 접속합니다.
        • 화면의 ‘Sign up’ 버튼을 클릭합니다.
        • 메일 주소와 비밀번호를 입력하고, ‘Continue’ 버튼을 클릭합니다. Google이나 MS 계정으로 연동해 회원가입 할 수도 있습니다.
        • 이메일로 전송된 인증 링크를 클릭하여 계정을 활성화합니다.
        • ChatGPT 홈페이지에 다시 접속하여 로그인합니다.
        • 로그인 후, 왼쪽 상단의 ‘New Chat’ 버튼을 클릭하여 채팅을 시작합니다.
        • 아래 예와 같은 채팅창에서 "Message ChartGPT..." 창에 질의 내용을 입력하고 ↑ 를 클릭하면 질의 내용이 ChartGPT에 전송되고 잠시 후 응답이 출력됩니다.
        • 로그인 후 열리는 ChatGPT 대화창 예

      • ChatGPT 효과적으로 질문하는 방법
        • ChatGPT와 대화 시 아래 내용을 참고하여 질의하면 보다 대화를 명확하고 유익하게 만들 수 있습니다:

        • 간결한 문장 사용: 간결하고 명확한 문장을 사용하면 모델이 이해하기 쉽습니다. 너무 긴 문장이나 복잡한 문장 구조보다 간단하게 전달하는 것이 좋습니다.
        • 구체적인 질문: 모델에게 구체적이고 명확한 질문을 하면 더 정확한 답변을 받을 수 있습니다. 모호한 질문보다 특정 주제나 정보에 관한 질문을 하는 것이 좋습니다.
        • 추가 정보 제공: 모델이 더 잘 이해하고 적절한 답을 제공할 수 있도록 문맥을 제공하세요. 이전에 언급한 내용을 간략하게 요약하거나, 관련된 정보를 추가하여 도움을 줄 수 있습니다.
        • 다시 정의 및 명확화: 모델이 오해할 수 있는 내용이나 모호한 용어가 있다면 다시 정의하고 명확히 설명하세요. 이는 모델이 정확한 의미를 파악하는 데 도움이 됩니다.
        • 대화 유지: 모델에게 이전 대화를 참조하거나 현재 대화의 문맥을 이해하도록 유도하세요. 이전에 논의한 주제나 정보를 활용하여 대화를 계속 발전시킬 수 있습니다.
        • 한 번에 하나의 주제: 모델에게 하나의 주제나 질문에 집중하도록 유도하세요. 여러 주제를 동시에 다루면 혼란을 야기할 수 있습니다.
        • 정보 요약: 모델이 너무 많은 정보를 처리하도록 요구하지 말고, 필요한 정보만 요약하여 전달하세요. 불필요한 세부사항은 최소화하고 핵심적인 내용에 집중하세요.

        위와 같은 방법으로 ChatGPT와 효과적으로 대화할 수 있습니다. 또한, 실험을 통해 여러 방법을 시도하고 모델의 응답에 대한 피드백을 통해 상호작용을 개선하는 것이 좋습니다.


  • ChatGPT를 이용한 Code 생성
    • Push Button Switch의 상태를 읽어 LED에 출력 하는 프로그램 예
      • ChatGPT를 이용하여 생성하려는 프로그램 개요
        • Microchip Studio를 사용하여, Push Button Switch의 상태를 읽어 LED에 출력 하는 ATmega128 Code를 생성한다.
        • Switch의 상태를 입력 받는 Input port는 PD0를 사용한다.
        • LED에 출력 하는 Output port는 PF0를 사용한다.
      • ChatGPT에 질의하기 위한 프롬프트 예
      • ChatGPT로 부터 출력된 결과
        • 아래는 Microchip Studio를 사용하여 ATmega128 마이크로컨트롤러에서 Push Button Switch의 상태를 읽어 LED에 출력하는 간단한 코드입니다. 코드는 C 언어로 작성되었고, AVR 라이브러리를 사용합니다.

        • ChatGPT에 의하여 생성된 Code 예
        • 이 코드는 PD0 핀에 연결된 스위치의 상태를 읽어 PF0 핀에 연결된 LED에 출력합니다. 코드를 빌드하고 ATmega128에 프로그램을 업로드한 후, 스위치를 누르면 LED가 켜지고, 스위치를 놓으면 LED가 꺼집니다.

          코드를 사용하기 전에 Microchip Studio에서 프로젝트를 만들고 AVR 라이브러리를 추가해야 할 수 있습니다. 또한, 프로젝트의 설정에서 사용하는 마이크로컨트롤러(ATmega128)를 선택해야 합니다.

        위 결과와 같이 맨 앞에 코드의 개요, 생성된 Code, 생성된 Code에 대한 간단한 설명이 비교적 적절하게 출력되었다.

        문제점: F_CPU 이 "delay.h"에서 사용되기 때문에 "#include <util/delay.h>" 위에 배치되어야함.


      • 이제 위 코드를 스위치를 누르면 LED가 켜지고, 스위치를 놓으면 LED가 꺼지게 변경하고자 합니다.
        • ChatGPT에게 아래와 같이 코드 변경을 요청합니다.

          위 코드를 스위치를 누르면 LED가 꺼지고, 스위치를 놓으면 LED가 켜지게 변경해 주세요 .

          주: "스위치를 누르면 LED가 켜지고, 스위치를 놓으면 LED가 꺼지게 변경" 한다는 것이 실수로 "스위치를 누르면 LED가 꺼지고, 스위치를 놓으면 LED가 켜지게 변경 주세요"로 프롬프트를 잘 못 작성하였습니다.

      • 잘 못된 질의 대한 ChatGPT로 부터 출력된 결과
        • Sure, 아래는 스위치를 누르면 LED가 꺼지고, 스위치를 놓으면 LED가 켜지도록 변경한 코드입니다.

        • ChatGPT에 의하여 생성된 Code 예
        • 이제 스위치를 누르면 LED가 켜지고, 스위치를 놓으면 LED가 꺼지도록 동작합니다. 코드의 핵심 부분은 스위치 상태를 확인하는 부분이며, 스위치가 눌려진 경우와 눌려지지 않은 경우에 대한 처리가 반대로 변경되었습니다.

        주: ChatGPT는 이전 질의와 답변에 대한 정보를 유지(단기간) 하기 때문에 이전 질의에 연관된 질의를 할 수 있습니다.

        주: 원래 코드가 "스위치를 놓은 상태이면 LED가 켜지고, 스위치를 누르면 LED가 꺼지는 코드" 인 것을 동알한 동작을 표현만 다르게 "스위치를 누르면 LED가 꺼지고, 스위치를 놓으면 LED가 켜지도록 변경"로 하여 잘 못 변경 요구를 한 결과, 생성된 코드는 동일한데 아래 설명이 "이제 스위치를 누르면 LED가 켜지고, 스위치를 놓으면 LED가 꺼지도록 동작합니다. 코드의 핵심 부분은 스위치 상태를 확인하는 부분이며, 스위치가 눌려진 경우와 눌려지지 않은 경우에 대한 처리가 반대로 변경되었습니다." 와 같이 잘 못 되었습니다.

        주: 위 같이 잘 못된 결과를 보여 주는 것은 현재 AI 기술의 한계를 이해하고 바르게 하기 위함입니다.

        주: 처음에 생성된 결과만 보고 이제 코딩 공부는 필요 없다고 판단하는 것은 성급한 판단입니다. AI 기술을 바르게 사용하기 위하여는 보다 정확하고 종합적인 판단을 할 수 있는 더 잘 교육된 인재가 필요합니다. 미래에도 상당 기간 동안 AI 기술은 생산성을 높일 수 있는 기술이지 인간을 완전이 대체하지는 못한다고 생각됩니다.


      • "스위치를 누르면 LED가 켜지고, 스위치를 놓으면 LED가 꺼지도록 다시 변경해 주세요."로 다시 질의한 결과
        • Certainly, 아래는 스위치를 누르면 LED가 켜지고, 스위치를 놓으면 LED가 꺼지도록 변경한 코드입니다.

        • ChatGPT에 의하여 생성된 Code 예
        • 이제 스위치를 누르면 LED가 꺼지고, 스위치를 놓으면 LED가 켜지도록 동작합니다. 코드의 핵심 부분은 스위치 상태를 확인하는 부분이며, 스위치가 눌려진 경우와 눌려지지 않은 경우에 대한 처리가 변경되었습니다.

        주: 이제 코드가 바르게 생성되었습니다. 그러나 아래 요약은 "변경" 이라는 단어에 초점을 맞추었기 때문에 또 틀린 설명을 하고 있습니다.

      • ChatGPT에 의하여 생성된 Code 실행하기
        • Microchip Studio를 이용하여 새 Project를 생성한다.
        • 새 Project의 main.c 에 위에서 생성한 Code를 복사하고 저장한다.
        • Project를 Build 하면 아래와 같은 경고 메세지가 출력된다.
          • #warning "F_CPU not defined for <util/delay.h>" [-Wcpp]
          • "F_CPU" redefined
        • 위 경고 메세지는 "F_CPU" 상수를 <util/delay.h> 파일에서 사용하는데 "#define F_CPU 16000000UL" 문이 "#include <util/delay.h>" 문 아래에 정의되었기 때문이다.
        • 주: 보통 #define 문은 #include 문 보다 아래에 배치하기 때문에 ChatGPT 가 "#define F_CPU 16000000UL" 문을 "#include <util/delay.h>" 아래에 배치하여 발생한 문제임.

        • "#define F_CPU 16000000UL" 문을 "#include <util/delay.h>" 위로 옮기면 문제가 해결된다.
        • Build 한 Hex 파일을 Target Board에 Upload 하고 프로그램을 실행한다.
        • PD0에 연결된 스위치의 상태가 PF0에 연결된 LED에 바르게 출력되는지 확인한다.
        • 주: 위 예와 같이 AVR 과 c 코딩에 대한 올바른 이해 없이 인공지능 Tool(예: ChatGPT) 만 사용하여 코딩을 하는 것은 아직 불가능하다. 그러나 효과적인 Tool(예: ChatGPT)을 사용하면 생산성을 높이고 오류를 줄이는 것이 가능하다.


    • External Interrupt와 Timer를 사용하는 프로그램 예
      • ChatGPT를 이용하여 생성하려는 프로그램 개요
        • Microchip Studio를 사용하여, Push Button Switch의 상태를 읽어 LED의 한 Bit 가 좌 또는 우로 회전하는 ATmega128 Code를 생성한다.
      • ChatGPT에 질의하기 위한 프롬프트 예
      • ChatGPT로 부터 출력된 결과
        • 아래는 Microchip Studio를 사용하여 ATmega128을 위한 요구 사항에 맞게 코드를 작성한 예시입니다. 코드는 8 비트 LED 패턴을 1초 주기로 좌우로 회전하고, Timer1의 Compare Match Interrupt를 사용하여 주기적으로 LED를 제어합니다. 또한 PD0와 PD1의 외부 인터럽트를 사용하여 회전 방향을 변경합니다.

        • ChatGPT에 의하여 생성된 Code 예
        • 이 코드는 주어진 요구 사항에 따라 ATmega128을 사용하여 작성되었습니다. 코드는 예시로 제공되며, 시스템 요구 사항에 따라 수정될 수 있습니다. 코드의 디바운싱이나 다른 세부적인 부분에 대한 조정이 필요할 수 있습니다.


      • ChatGPT에 의하여 생성된 Code 검토
        • 위와 같이 ChatGPT에 의하여 생성된 Code는 전체적으로 비교적 양호하나 아래와 같은 문제점이 있다.

          주: ChatGPT에 의하여 생성되는 Code는 동일한 질의에도 서로 다른 Code 가 생성될 수 있기 떄문에 ChatGPT에 의하여 생성된 코드는 경우에 따라 다른 문제점이 있을 수 있다.

        • 생성된 Code에서는 PORTF에 출력될 Data를 변수(ledPattern)에 저장하고 있으나, ledPattern 을 PORTF에 출력하는 Code 가 생략되어 결과가 LED에 출력되지 못함.
        • 주: Interrupt service routine(ISR(TIMER1_COMPA_vect)) 맨 아래애 "PORTF = ledPattern;" 코드를 삽입하면 문제가 해결됨. 보다 더 좋은 방법은 ATmega128의 PORTF는 Data를 저장하는 변수로서의 기능이 있기 때문에 변수(ledPattern)를 사용하지 읺고 직접 PORTF에 Data를 저장하는 것이 더 효과적임.

        • Delay 함수를 사용하기 위하여 include 한 <util/delay.h> 에서 필요한 F_CPU 정의가 누락되어 경고 메세지가 출력됨.
        • 주: #include <util/delay.h> 문 앞에 #define F_CPU 16000000UL 문을 삽입하면 문제가 해결됨.

        • 외부 인터럽트 핸들러를 종료하기 전에 Bouncing 문제를 줄이기 위한 코드(예: EIFR |= (1 << INTF0); // Clear External Interrupt Flag) 가 있으면 보다 신뢰성있는 동작을 하게됨.
      • ChatGPT에 의하여 생성된 Code 실행하기
        • Microchip Studio를 이용하여 새 Project를 생성한다.
        • 새 Project의 main.c 에 위에서 생성한 Code를 복사하고 저장한다.
        • Project를 Build 하면 아래와 같은 경고 메세지가 출력된다.
          • #warning "F_CPU not defined for <util/delay.h>" [-Wcpp]
          • "F_CPU" redefined
        • "#include <util/delay.h>" 문 위에 "#define F_CPU 16000000UL" 문을 삽입한다.
        • Interrupt service routine(ISR(TIMER1_COMPA_vect)) 맨 아래애 "PORTF = ledPattern;" 코드를 삽입한다.
        • 프로그램을 Build 하고 Hex 파일을 Target Board에 Upload 하여 프로그램을 실행한다.
        • LED 의 회전 상태를 확인하고 PD0, PD1에 연결된 스위치를 사용하여 LED의 회전 방향이 바르게 제어되는지 확인한다.
        • 주: ChatGPT에 의하여 생성된 Code에 오류가 있으나 AI Tool을 사용하면 생산성을 높이고 오류를 줄이는 것이 가능하다.


      • ChatGPT로 부터 출력된 결과를 참고하여 재 작성한 Code 예
        • 아래는 ChatGPT로 부터 출력된 결과를 참고하여 재 작성한 Code 예 이다.

  • ChatGPT를 이용한 Code 설명
    • ChatGPT를 이용하여 Code에 Comment를 삽입하는 예
    • 이 예는 위 ChatGPT를 이용하여 생성한 "Push Button Switch의 상태를 읽어 LED에 출력 하는 프로그램"에서 Comment를 삭제한 하고 ChatGPT를 이용하여 다시 Comment를 생성한 예이다.

      • ChatGPT에 Comment 삽입을 요구하는 프롬프트 예
      • ChatGPT로 부터 출력된 결과
        • ChatGPT에 의하여 생성된 Code 예
        • 해당 코드는 AVR 마이크로컨트롤러를 이용하여 PD0 핀을 입력으로 설정하고 내부에 풀업 저항을 활성화합니다. 또한 PF0 핀을 출력으로 설정하며, PD0 핀의 입력 상태를 확인하고 이에 따라 PF0 핀의 출력을 제어하는 루프를 실행합니다. 100 밀리초의 지연 후에 다시 상태를 확인하고 PF0 핀의 출력을 업데이트합니다.

        주: 위 예는 ChatGPT 가 Comment를 자동으로 생성한 예로 프롬프트를 잘 작성하면 프로그램머의 노력을 줄여 줄 수 있을 것으로 기대된다.


  • ChatGPT를 이용한 Code Review 와 Debugging
    • ChatGPT를 이용한 Code Review 와 Debugging 예
    • 이 예는 위 "Push Button Switch의 상태를 읽어 LED에 출력 하는 프로그램 예"에서 생성한 Code에서 PF0를 출력 포트로 정의하는 "DDRF |= (1 << PF0);" 문을 삭제하고 ChatGPT에게 문제 해결을 요구한 예이다.

      • ChatGPT에게 문제 해결을 요구하는 프롬프트 예
      • ChatGPT로 부터 출력된 결과
        • 제시된 코드에서 문제는 DDRF 레지스터 설정이 없어서 PF0 핀을 출력으로 설정하지 않았다는 점입니다. 따라서 PF0 핀을 출력으로 설정하는 코드를 추가해야 합니다. 아래는 수정된 코드입니다.

        • ChatGPT에 의하여 생성된 Code 예
        • 이제 PF0 핀을 출력으로 설정하는 코드가 추가되었기 때문에, 수정된 코드를 다시 컴파일하고 프로그램을 실행하면 PD0 핀의 상태가 PF0 핀에 올바르게 출력될 것입니다.

        주: 비록 간단한 예지만 ChatGPT 가 만족할 만한 결과를 출력하였다.



  • ChatGPT를 이용한 Code 최적화
    • ChatGPT를 이용한 Code 최적화 예
    • 이 예는 위 Code 최적화를 위하여 위에서 생성한 Code에 불필요한 Code를 삽입한 다음 Code 최적화를 요구하는 예이다.

      • ChatGPT에게 문제 해결을 요구하는 프롬프트 예
      • ChatGPT로 부터 출력된 결과
        • 아래 코드는 불필요한 비트 조작을 줄이고, 가독성을 높이기 위해 몇 가지 최적화가 가능합니다.

          • 상수를 사용하여 코드를 더 명확하게 만듭니다.
          • 비트 연산을 사용하여 LED 상태를 업데이트하는 방식으로 변경합니다.
          • 아래는 최적화된 코드입니다.

        • ChatGPT에 의하여 생성된 Code 예
        • 이 최적화된 코드는 LED 상태를 업데이트하는 방식을 PORTF에 직접 쓰는 방식으로 변경하여 코드를 간결하게 만들었습니다. SWITCH_PIN 및 LED_PIN을 정의하여 코드의 가독성을 높였고, 불필요한 비트 조작을 줄였습니다.

        주: 비록 간단한 예지만 ChatGPT 가 만족할 만한 결과를 출력하였다.


    • ChatGPT가 프로그래머를 대체할 수 있을까?
    • 아직은 ChatGPT가 프로그래머를 완전이 대체할 수 없습니다.

      그러나 코드를 작성하고 정보를 찾는 데 도움이 될 것이라고 생각합니다. 확실히 시간을 절약해 주지만 적어도 현재로서는 아주 간단하고 일상적인 프로젝트를 제외하고, ChatGPT 만으로 프로그래밍 가능한 프로젝트는 거의 없습니다.



  • ChatGPT를 이용한 ATMega128 Coding 관련 페이지 보기