질문게시판 > 답변 : 답변 : avreeprom 질문입니다

TODAY778 TOTAL340,641
사이트 이용안내
Login▼/회원가입
최신글보기 질문게시판 기술자료 동영상강좌

아두이노 센서 ATMEGA128 PWM LED 초음파 AVR 블루투스 LCD UART 모터 적외선


BASIC4MCU | 질문게시판 | 답변 : 답변 : avreeprom 질문입니다

페이지 정보

작성자 master 작성일2018-10-17 15:16 조회2,830회 댓글15건

본문

	

 

// DateTime : 2018-10-17 오후 3:20:54
// by Ok-Hyun Park
//
// 수정 사항  2016.12.31 TIMER INTERR 0  Routine
// 080709: 입력 접점이 붙었을때부터 10초 딜레이
//
#include <mega8.h>
#include <delay.h>
//
//#define LED_AC           PORTC.0 // 교류입력에 대한 출력 포트
#define LED_M1_ERROR     PORTC.1
#define LED_EQUALITY     PORTC.2
#define LED_NO_EQUALITY  PORTC.3
#define OUT_M1_PLAY      PORTC.4
#define OUT_R1_PLAY      PORTC.5
#define IN_M2_PLAY       PINB.1
#define IN_M2_FAIL       PINB.0
#define IN_AC            PIND.7 // 교류입력연결 확인 변수
#define IN_EQUALITY      PIND.6
#define IN_AUTO          PIND.5
#define IN_PLAY          PINB.7
#define IN_M1_FAIL       PINB.6
//
#define ON               0 //변수 값 지정
#define OFF              1
#define RUN              1
#define STOP             0
#define FAIL             0
#define normal           1
//
eeprom   char EE_r,EE_m;
         char r,m;
unsigned char r1_play_Cnt=0;
//==========================================================
// 타이머 1 CTC 비교매치 인터럽트 함수
//==========================================================
interrupt [TIM1_COMPAvoid timer1_compa_isr(void){ // 100ms
  flag=1;
  //
  if(OUT_R1_PLAY==OFF){
    if(IN_M2_PLAY==STOP)r1_play_Cnt++;
    else                r1_play_Cnt=0;
  }
}
//
void main(void){ ///풀업저항 사용
  DDRC=0xff;
  TCCR1B=0x0BOCR1A=12499TIMSK=0x10TCNT1=12498// 100ms
  //==========================================================
  #pragma optsize-
  WDTCR=0b00011000WDTCR=0b00001111//WATCHDOG setting // WDTCR=0x1F; WDTCR=0x0F;
  #ifdef _OPTIMIZE_SIZE_
    #pragma optsize+
  #endif
  //==========================================================
  r=EE_rif(r>1){ r=0EE_r=r; } OUT_R1_PLAY=r;
  m=EE_mif(m>1){ m=0EE_m=m; } OUT_M1_PLAY=m;
  //
  SREG|=0x80;
  while(1){
    #asm("wdr")
    //
    if(flag){ flag=0;
      LED_M1_ERROR=~IN_M1_FAIL;
      //
      if(IN_EQUALITY){ LED_EQUALITY=1LED_NO_EQUALITY=0; } // 균등시 1 부동시 0
      else           { LED_EQUALITY=0LED_NO_EQUALITY=1; }
      //
      if(OUT_R1_PLAY==OFF){ LED_M1_ERROR=0LED_EQUALITY=0LED_NO_EQUALITY=0; }
      //----------------------------------------------------------------------------
      if(IN_PLAY==STOP){      // 작동 정지시
        if(eeprom_save_on==1){ eeprom_save_on=0;
          if(r!=OUT_R1_PLAY)EE_r=r=OUT_R1_PLAY;
          if(m!=OUT_M1_PLAY)EE_m=m=OUT_M1_PLAY;
        }
        OUT_R1_PLAY=OFFOUT_M1_PLAY=OFF;
      }
      //----------------------------------------------------------------------------
      else{                  // 작동중
        if(IN_AUTO==0){      // 오토모드
          eeprom_save_on=1;
          if(IN_M1_FAIL==FAIL)OUT_M1_PLAY=OFF;
          else                OUT_M1_PLAY=ON;
          //-----------------------------------------------------------// 수정 한부분  2016.12.31
          if(OUT_R1_PLAY==OFF){
            if((r1_play_Cnt>=7)&&(IN_M2_PLAY==STOP)){ OUT_R1_PLAY=ONr1_play_Cnt=0; } // 7=700ms
            else                                    { OUT_R1_PLAY=OFF;               }
          }
          //-----------------------------------------------------------
          if(IN_M2_FAIL==normal){ OUT_R1_PLAY=OFF; }
        }
        elseOUT_R1_PLAY=ONOUT_M1_PLAY=ON; } // 오토모드 아닐 때
      }
    }
  }
}

 

  • BASIC4MCU 작성글 SNS에 공유하기
  • 페이스북으로 보내기
  • 트위터로 보내기
  • 구글플러스로 보내기

댓글 15

조회수 2,830

율이님의 댓글

율이 작성일

감사합니다. 혹수 추가적으로 간단한 주석으로 이해하는데 힌트를 주실수 없을까요???
제가 궁금했던건 답이 아닌 소스에 대한 내용을 통해서 iar로 직접 스스로 변환해보려고 했었습니다.

master님의 댓글

master 작성일

사이트 왼쪽 메뉴 중 아래에서 12번째에 보면 <AVR 따라하기>가 있습니다.
클릭하면 <2015년 강좌>가 있는데요
8페이지
63 2015년 강좌 001 - 데이터형  이미지
이 강좌글부터 차근차근 공부해보세요

쉬운 예제를 많이 공부해야지 포기하지 않고 초보자를 벗어날 수 있습니다.

율이님의 댓글

율이 댓글의 댓글 작성일

혹시 죄송하지만 위의 프로그램 순서도를 받을 수 있겠습니까??

master님의 댓글

master 댓글의 댓글 작성일

프로그램 순서도는 본인이 그리셔야지요..

율이님의 댓글

율이 댓글의 댓글 작성일

r=EE_r; if(r>1){ r=0; EE_r=r; } OUT_R1_PLAY=r;
  m=EE_m; if(m>1){ m=0; EE_m=m; } OUT_M1_PLAY=m;
부분에 대한 저장값을 통하여 두개의 보드가 어떻게 서로 확인되어지는지가 모르겠습니다. eeprom은 그냥 초기에 초기화시키는 것만 조심하란 말밖에 없어서 이떻게 구동되는지를 모르겠습니다

master님의 댓글

master 댓글의 댓글 작성일

두개의 보드가 어떻게 서로 확인되어지는지가 모르겠습니다. <-- 보드가 두개인가요? 무슨 뜻인지 모르겠습니다.

master님의 댓글

master 댓글의 댓글 작성일

eeprom에 저장하는 이유는
출력중이라면 (정전등의 이유로) 전원을 껏다 키더라도 출력을 계속 하겠다는 뜻이겠죠

율이님의 댓글

율이 댓글의 댓글 작성일

좀더 자세히 설명하겠습니다. 제가 설명이 부족했던거 같습니다.
일단 두개의 파워서플라이가 작동을 하는데 A,B라고 칭하면
일단 각각에 파워서플라이에는 보드가 하나씩 내장되어 있고
출력하던 A가 이상이 생겨서 파워가 약해지거나 하면 B서플라이가 대신 작동되는 소스라고 전해 들었습니다.

master님의 댓글

master 댓글의 댓글 작성일

저에게 설명을 들으시려면 회로도부터 첨부하셔야합니다.
//
소스코드는 몇라인 안되고
c문법적으로 어려운 것은 없으며
장비의 기능을 구현한 것이 대부분입니다.
장비 기능은 알고 계실테고, c문법이 부족하면 c언어만 조금 공부하면 되겠죠?
남에게 물어볼 내용은 아닌 것 같습니다.

율이님의 댓글

율이 댓글의 댓글 작성일

문법적으로는 거의다 이해했습니다.
제가 궁금했던 것은 A파워서플라이에서 IN_M1_FAIL값이 들어와서 출력으로 내보내주는데 반대쪽 B서플라이가 작동을 하게 되는데 어떻게 값이 전달 되는지 궁금했습니다 많은 답변 감사합니다

master님의 댓글

master 댓글의 댓글 작성일

  LED_M1_ERROR=~IN_M1_FAIL;
입력 받아서 LED 표시하고
  if(IN_M1_FAIL==FAIL)OUT_M1_PLAY=OFF;
  else                OUT_M1_PLAY=ON;
OUT_M1_PLAY 출력
//
문법을 다 이해 했는데 이렇게 쉬운 내용이 분석 안되던가요?
//
  if(IN_M1_FAIL==FAIL)OUT_M1_PLAY=OFF;
  else                OUT_M1_PLAY=ON;
이 두 라인도 한라인으로 줄일 수 있습니다.
  OUT_M1_PLAY=~IN_M1_FAIL;

율이님의 댓글

율이 댓글의 댓글 작성일

TCCR1B=0x0B; OCR1A=12499; TIMSK=0x10; TCNT1=12498;        // 100ms
  //==========================================================
  #pragma optsize-
  WDTCR=0b00011000; WDTCR=0b00001111; //WATCHDOG setting // WDTCR=0x1F; WDTCR=0x0F;
  #ifdef _OPTIMIZE_SIZE_
    #pragma optsize+
  #endif

이부분에대한 적용하는 값이 달라진것도 궁금합니다.
인터럽트를 이용하여 원래 1ms를 만들기위해서 계산하여 131을 구한건데 어떻게 변경하신건지 궁금합니다.

master님의 댓글

master 댓글의 댓글 작성일

16비트 타이머를 사용해서 100ms 주기로 바꿨습니다.
16비트 타이머는 (16MHz 클럭에서) 최대 4초까지 가능합니다.
질문 보드는 8MHz를 사용하는 것 같으니 최대 8초까지 가능하겠죠

율이님의 댓글

율이 댓글의 댓글 작성일

위의 코딩에서 혹시 OUT_R1_PLAY값이 초기에 어떻게 되는지 알수있을까요??

master님의 댓글

master 댓글의 댓글 작성일

전원 키지마자 0V
 r=EE_r; if(r>1){ r=0; EE_r=r; } OUT_R1_PLAY=r;
잠시 후 EEPROM에서 읽어서 출력 합니다.

질문게시판HOME > 질문게시판 목록

MCU, AVR, 아두이노 등 전자공학에 관련된 질문을 무료회원가입 후 작성해주시면 전문가가 답변해드립니다.
ATMEGA128PWMLED초음파
아두이노AVR블루투스LCD
UART모터적외선ATMEGA
전체 스위치 센서
게시물 검색

Privacy Policy
MCU BASIC ⓒ 2017
모바일버전으로보기